[BACK]Return to ibcs2_ipc.c CVS log [TXT][DIR] Up to [local] / sys / compat / ibcs2

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