Annotation of sys/compat/ibcs2/ibcs2_ipc.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ibcs2_ipc.c,v 1.7 2002/03/14 01:26:50 millert Exp $ */
! 2: /* $NetBSD: ibcs2_ipc.c,v 1.7 1997/01/18 01:51:41 mycroft Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1995 Scott Bartram
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. The name of the author may not be used to endorse or promote products
! 14: * derived from this software without specific prior written permission
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 19: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 20: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 21: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 22: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 23: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 24: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 25: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 26: */
! 27: #include <sys/param.h>
! 28: #include <sys/systm.h>
! 29: #include <sys/namei.h>
! 30: #include <sys/proc.h>
! 31: #include <sys/file.h>
! 32: #include <sys/stat.h>
! 33: #include <sys/filedesc.h>
! 34: #include <sys/ioctl.h>
! 35: #include <sys/ipc.h>
! 36: #include <sys/kernel.h>
! 37: #include <sys/malloc.h>
! 38: #include <sys/mbuf.h>
! 39: #include <sys/mman.h>
! 40: #include <sys/mount.h>
! 41: #include <sys/reboot.h>
! 42: #include <sys/resource.h>
! 43: #include <sys/resourcevar.h>
! 44: #include <sys/signal.h>
! 45: #include <sys/signalvar.h>
! 46: #include <sys/socket.h>
! 47: #include <sys/time.h>
! 48: #include <sys/times.h>
! 49: #include <sys/vnode.h>
! 50: #include <sys/uio.h>
! 51: #include <sys/wait.h>
! 52: #include <sys/utsname.h>
! 53: #include <sys/unistd.h>
! 54: #include <sys/msg.h>
! 55: #include <sys/sem.h>
! 56: #include <sys/shm.h>
! 57: #include <sys/syscallargs.h>
! 58:
! 59: #include <uvm/uvm_extern.h>
! 60:
! 61: #include <compat/ibcs2/ibcs2_types.h>
! 62: #include <compat/ibcs2/ibcs2_signal.h>
! 63: #include <compat/ibcs2/ibcs2_syscallargs.h>
! 64: #include <compat/ibcs2/ibcs2_util.h>
! 65:
! 66: #define IBCS2_IPC_RMID 0
! 67: #define IBCS2_IPC_SET 1
! 68: #define IBCS2_IPC_STAT 2
! 69:
! 70: #ifdef SYSVMSG
! 71: /*
! 72: * iBCS2 msgsys call
! 73: */
! 74:
! 75: struct ibcs2_msqid_ds {
! 76: struct ipc_perm msg_perm;
! 77: struct msg *msg_first;
! 78: struct msg *msg_last;
! 79: u_short msg_cbytes;
! 80: u_short msg_qnum;
! 81: u_short msg_qbytes;
! 82: u_short msg_lspid;
! 83: u_short msg_lrpid;
! 84: ibcs2_time_t msg_stime;
! 85: ibcs2_time_t msg_rtime;
! 86: ibcs2_time_t msg_ctime;
! 87: };
! 88:
! 89: void cvt_msqid2imsqid(struct msqid_ds *, struct ibcs2_msqid_ds *);
! 90: void cvt_imsqid2msqid(struct ibcs2_msqid_ds *, struct msqid_ds *);
! 91:
! 92: void
! 93: cvt_msqid2imsqid(bp, ibp)
! 94: struct msqid_ds *bp;
! 95: struct ibcs2_msqid_ds *ibp;
! 96: {
! 97: ibp->msg_perm = bp->msg_perm;
! 98: ibp->msg_first = bp->msg_first;
! 99: ibp->msg_last = bp->msg_last;
! 100: ibp->msg_cbytes = (u_short)bp->msg_cbytes;
! 101: ibp->msg_qnum = (u_short)bp->msg_qnum;
! 102: ibp->msg_qbytes = (u_short)bp->msg_qbytes;
! 103: ibp->msg_lspid = (u_short)bp->msg_lspid;
! 104: ibp->msg_lrpid = (u_short)bp->msg_lrpid;
! 105: ibp->msg_stime = bp->msg_stime;
! 106: ibp->msg_rtime = bp->msg_rtime;
! 107: ibp->msg_ctime = bp->msg_ctime;
! 108: return;
! 109: }
! 110:
! 111: void
! 112: cvt_imsqid2msqid(ibp, bp)
! 113: struct ibcs2_msqid_ds *ibp;
! 114: struct msqid_ds *bp;
! 115: {
! 116: bp->msg_perm = ibp->msg_perm;
! 117: bp->msg_first = ibp->msg_first;
! 118: bp->msg_last = ibp->msg_last;
! 119: bp->msg_cbytes = ibp->msg_cbytes;
! 120: bp->msg_qnum = ibp->msg_qnum;
! 121: bp->msg_qbytes = ibp->msg_qbytes;
! 122: bp->msg_lspid = ibp->msg_lspid;
! 123: bp->msg_lrpid = ibp->msg_lrpid;
! 124: bp->msg_stime = ibp->msg_stime;
! 125: bp->msg_rtime = ibp->msg_rtime;
! 126: bp->msg_ctime = ibp->msg_ctime;
! 127: return;
! 128: }
! 129:
! 130: int
! 131: ibcs2_sys_msgsys(p, v, retval)
! 132: struct proc *p;
! 133: void *v;
! 134: register_t *retval;
! 135: {
! 136: struct ibcs2_sys_msgsys_args /* {
! 137: syscallarg(int) which;
! 138: syscallarg(int) a2;
! 139: syscallarg(int) a3;
! 140: syscallarg(int) a4;
! 141: syscallarg(int) a5;
! 142: syscallarg(int) a6;
! 143: } */ *uap = v;
! 144:
! 145: switch (SCARG(uap, which)) {
! 146: case 0: /* msgget */
! 147: SCARG(uap, which) = 1;
! 148: return compat_10_sys_msgsys(p, uap, retval);
! 149: case 1: { /* msgctl */
! 150: int error;
! 151: struct compat_10_sys_msgsys_args margs;
! 152: caddr_t sg = stackgap_init(p->p_emul);
! 153:
! 154: SCARG(&margs, which) = 0;
! 155: SCARG(&margs, a2) = SCARG(uap, a2);
! 156: SCARG(&margs, a4) =
! 157: (int)stackgap_alloc(&sg, sizeof(struct msqid_ds));
! 158: SCARG(&margs, a3) = SCARG(uap, a3);
! 159: switch (SCARG(&margs, a3)) {
! 160: case IBCS2_IPC_STAT:
! 161: error = compat_10_sys_msgsys(p, &margs, retval);
! 162: if (!error)
! 163: cvt_msqid2imsqid((struct msqid_ds *)
! 164: SCARG(&margs, a4),
! 165: (struct ibcs2_msqid_ds *)SCARG(uap, a4));
! 166: return error;
! 167: case IBCS2_IPC_SET:
! 168: cvt_imsqid2msqid((struct ibcs2_msqid_ds *)SCARG(uap,
! 169: a4),
! 170: (struct msqid_ds *) SCARG(&margs, a4));
! 171: return compat_10_sys_msgsys(p, &margs, retval);
! 172: case IBCS2_IPC_RMID:
! 173: return compat_10_sys_msgsys(p, &margs, retval);
! 174: }
! 175: return EINVAL;
! 176: }
! 177: case 2: /* msgrcv */
! 178: SCARG(uap, which) = 3;
! 179: return compat_10_sys_msgsys(p, uap, retval);
! 180: case 3: /* msgsnd */
! 181: SCARG(uap, which) = 2;
! 182: return compat_10_sys_msgsys(p, uap, retval);
! 183: default:
! 184: return EINVAL;
! 185: }
! 186: }
! 187: #endif
! 188:
! 189:
! 190: #ifdef SYSVSEM
! 191: /*
! 192: * iBCS2 semsys call
! 193: */
! 194:
! 195: struct ibcs2_semid_ds {
! 196: struct ipc_perm sem_perm;
! 197: struct ibcs2_sem *sem_base;
! 198: u_short sem_nsems;
! 199: int pad1;
! 200: ibcs2_time_t sem_otime;
! 201: ibcs2_time_t sem_ctime;
! 202: };
! 203:
! 204: struct ibcs2_sem {
! 205: u_short semval;
! 206: ibcs2_pid_t sempid;
! 207: u_short semncnt;
! 208: u_short semzcnt;
! 209: };
! 210:
! 211: void cvt_semid2isemid(struct semid_ds *, struct ibcs2_semid_ds *);
! 212: void cvt_isemid2semid(struct ibcs2_semid_ds *, struct semid_ds *);
! 213: #ifdef notdef
! 214: void cvt_sem2isem(struct sem *, struct ibcs2_sem *);
! 215: void cvt_isem2sem(struct ibcs2_sem *, struct sem *);
! 216:
! 217: void
! 218: cvt_sem2isem(bp, ibp)
! 219: struct sem *bp;
! 220: struct ibcs2_sem *ibp;
! 221: {
! 222: ibp->semval = bp->semval;
! 223: ibp->sempid = bp->sempid;
! 224: ibp->semncnt = bp->semncnt;
! 225: ibp->semzcnt = bp->semzcnt;
! 226: return;
! 227: }
! 228:
! 229: void
! 230: cvt_isem2sem(ibp, bp)
! 231: struct ibcs2_sem *ibp;
! 232: struct sem *bp;
! 233: {
! 234: bp->semval = ibp->semval;
! 235: bp->sempid = ibp->sempid;
! 236: bp->semncnt = ibp->semncnt;
! 237: bp->semzcnt = ibp->semzcnt;
! 238: return;
! 239: }
! 240: #endif
! 241:
! 242: void
! 243: cvt_semid2isemid(bp, ibp)
! 244: struct semid_ds *bp;
! 245: struct ibcs2_semid_ds *ibp;
! 246: {
! 247: ibp->sem_perm = bp->sem_perm;
! 248: ibp->sem_base = (struct ibcs2_sem *)bp->sem_base;
! 249: ibp->sem_nsems = bp->sem_nsems;
! 250: ibp->sem_otime = bp->sem_otime;
! 251: ibp->sem_ctime = bp->sem_ctime;
! 252: return;
! 253: }
! 254:
! 255: void
! 256: cvt_isemid2semid(ibp, bp)
! 257: struct ibcs2_semid_ds *ibp;
! 258: struct semid_ds *bp;
! 259: {
! 260: bp->sem_perm = ibp->sem_perm;
! 261: bp->sem_base = (struct sem *)ibp->sem_base;
! 262: bp->sem_nsems = ibp->sem_nsems;
! 263: bp->sem_otime = ibp->sem_otime;
! 264: bp->sem_ctime = ibp->sem_ctime;
! 265: return;
! 266: }
! 267:
! 268: int
! 269: ibcs2_sys_semsys(p, v, retval)
! 270: struct proc *p;
! 271: void *v;
! 272: register_t *retval;
! 273: {
! 274: struct ibcs2_sys_semsys_args /* {
! 275: syscallarg(int) which;
! 276: syscallarg(int) a2;
! 277: syscallarg(int) a3;
! 278: syscallarg(int) a4;
! 279: syscallarg(int) a5;
! 280: } */ *uap = v;
! 281: int error;
! 282:
! 283: switch (SCARG(uap, which)) {
! 284: case 0: /* semctl */
! 285: switch(SCARG(uap, a4)) {
! 286: case IBCS2_IPC_STAT:
! 287: {
! 288: struct ibcs2_semid_ds *isp;
! 289: struct semid_ds *sp;
! 290: caddr_t sg = stackgap_init(p->p_emul);
! 291:
! 292: isp = (struct ibcs2_semid_ds *)SCARG(uap, a5);
! 293: sp = stackgap_alloc(&sg, sizeof(struct semid_ds));
! 294: SCARG(uap, a5) = (int)sp;
! 295: error = compat_10_sys_semsys(p, uap, retval);
! 296: if (!error) {
! 297: SCARG(uap, a5) = (int)isp;
! 298: isp = stackgap_alloc(&sg, sizeof(*isp));
! 299: cvt_semid2isemid(sp, isp);
! 300: error = copyout((caddr_t)isp,
! 301: (caddr_t)SCARG(uap, a5),
! 302: sizeof(*isp));
! 303: }
! 304: return error;
! 305: }
! 306: case IBCS2_IPC_SET:
! 307: {
! 308: struct ibcs2_semid_ds *isp;
! 309: struct semid_ds *sp;
! 310: caddr_t sg = stackgap_init(p->p_emul);
! 311:
! 312: isp = stackgap_alloc(&sg, sizeof(*isp));
! 313: sp = stackgap_alloc(&sg, sizeof(*sp));
! 314: error = copyin((caddr_t)SCARG(uap, a5), (caddr_t)isp,
! 315: sizeof(*isp));
! 316: if (error)
! 317: return error;
! 318: cvt_isemid2semid(isp, sp);
! 319: SCARG(uap, a5) = (int)sp;
! 320: return compat_10_sys_semsys(p, uap, retval);
! 321: }
! 322: }
! 323: return compat_10_sys_semsys(p, uap, retval);
! 324:
! 325: case 1: /* semget */
! 326: return compat_10_sys_semsys(p, uap, retval);
! 327:
! 328: case 2: /* semop */
! 329: return compat_10_sys_semsys(p, uap, retval);
! 330: }
! 331: return EINVAL;
! 332: }
! 333: #endif
! 334:
! 335:
! 336: #ifdef SYSVSHM
! 337: /*
! 338: * iBCS2 shmsys call
! 339: */
! 340:
! 341: struct ibcs2_shmid_ds {
! 342: struct ipc_perm shm_perm;
! 343: int shm_segsz;
! 344: int pad1;
! 345: char pad2[4];
! 346: u_short shm_lpid;
! 347: u_short shm_cpid;
! 348: u_short shm_nattch;
! 349: u_short shm_cnattch;
! 350: ibcs2_time_t shm_atime;
! 351: ibcs2_time_t shm_dtime;
! 352: ibcs2_time_t shm_ctime;
! 353: };
! 354:
! 355: void cvt_shmid2ishmid(struct shmid_ds *, struct ibcs2_shmid_ds *);
! 356: void cvt_ishmid2shmid(struct ibcs2_shmid_ds *, struct shmid_ds *);
! 357:
! 358: void
! 359: cvt_shmid2ishmid(bp, ibp)
! 360: struct shmid_ds *bp;
! 361: struct ibcs2_shmid_ds *ibp;
! 362: {
! 363: ibp->shm_perm = bp->shm_perm;
! 364: ibp->shm_segsz = bp->shm_segsz;
! 365: ibp->shm_lpid = bp->shm_lpid;
! 366: ibp->shm_cpid = bp->shm_cpid;
! 367: ibp->shm_nattch = bp->shm_nattch;
! 368: ibp->shm_cnattch = 0; /* ignored anyway */
! 369: ibp->shm_atime = bp->shm_atime;
! 370: ibp->shm_dtime = bp->shm_dtime;
! 371: ibp->shm_ctime = bp->shm_ctime;
! 372: return;
! 373: }
! 374:
! 375: void
! 376: cvt_ishmid2shmid(ibp, bp)
! 377: struct ibcs2_shmid_ds *ibp;
! 378: struct shmid_ds *bp;
! 379: {
! 380: bp->shm_perm = ibp->shm_perm;
! 381: bp->shm_segsz = ibp->shm_segsz;
! 382: bp->shm_lpid = ibp->shm_lpid;
! 383: bp->shm_cpid = ibp->shm_cpid;
! 384: bp->shm_nattch = ibp->shm_nattch;
! 385: bp->shm_atime = ibp->shm_atime;
! 386: bp->shm_dtime = ibp->shm_dtime;
! 387: bp->shm_ctime = ibp->shm_ctime;
! 388: bp->shm_internal = (void *)0; /* ignored anyway */
! 389: return;
! 390: }
! 391:
! 392: int
! 393: ibcs2_sys_shmsys(p, v, retval)
! 394: struct proc *p;
! 395: void *v;
! 396: register_t *retval;
! 397: {
! 398: struct ibcs2_sys_shmsys_args /* {
! 399: syscallarg(int) which;
! 400: syscallarg(int) a2;
! 401: syscallarg(int) a3;
! 402: syscallarg(int) a4;
! 403: } */ *uap = v;
! 404: int error;
! 405:
! 406: switch (SCARG(uap, which)) {
! 407: case 0: /* shmat */
! 408: return compat_10_sys_shmsys(p, uap, retval);
! 409:
! 410: case 1: /* shmctl */
! 411: switch(SCARG(uap, a3)) {
! 412: case IBCS2_IPC_STAT:
! 413: {
! 414: struct ibcs2_shmid_ds *isp;
! 415: struct shmid_ds *sp;
! 416: caddr_t sg = stackgap_init(p->p_emul);
! 417:
! 418: isp = (struct ibcs2_shmid_ds *)SCARG(uap, a4);
! 419: sp = stackgap_alloc(&sg, sizeof(*sp));
! 420: SCARG(uap, a4) = (int)sp;
! 421: error = compat_10_sys_shmsys(p, uap, retval);
! 422: if (!error) {
! 423: SCARG(uap, a4) = (int)isp;
! 424: isp = stackgap_alloc(&sg, sizeof(*isp));
! 425: cvt_shmid2ishmid(sp, isp);
! 426: error = copyout((caddr_t)isp,
! 427: (caddr_t)SCARG(uap, a4),
! 428: sizeof(*isp));
! 429: }
! 430: return error;
! 431: }
! 432: case IBCS2_IPC_SET:
! 433: {
! 434: struct ibcs2_shmid_ds *isp;
! 435: struct shmid_ds *sp;
! 436: caddr_t sg = stackgap_init(p->p_emul);
! 437:
! 438: isp = stackgap_alloc(&sg, sizeof(*isp));
! 439: sp = stackgap_alloc(&sg, sizeof(*sp));
! 440: error = copyin((caddr_t)SCARG(uap, a4), (caddr_t)isp,
! 441: sizeof(*isp));
! 442: if (error)
! 443: return error;
! 444: cvt_ishmid2shmid(isp, sp);
! 445: SCARG(uap, a4) = (int)sp;
! 446: return compat_10_sys_shmsys(p, uap, retval);
! 447: }
! 448: }
! 449: return compat_10_sys_shmsys(p, uap, retval);
! 450:
! 451: case 2: /* shmdt */
! 452: return compat_10_sys_shmsys(p, uap, retval);
! 453:
! 454: case 3: /* shmget */
! 455: return compat_10_sys_shmsys(p, uap, retval);
! 456: }
! 457: return EINVAL;
! 458: }
! 459: #endif
CVSweb