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

Annotation of sys/compat/common/kern_ipc_35.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: kern_ipc_35.c,v 1.3 2004/07/15 11:00:12 millert Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2004 Todd C. Miller <Todd.Miller@courtesan.com>
        !             5:  *
        !             6:  * Permission to use, copy, modify, and distribute this software for any
        !             7:  * purpose with or without fee is hereby granted, provided that the above
        !             8:  * copyright notice and this permission notice appear in all copies.
        !             9:  *
        !            10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            14:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            15:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            16:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            17:  */
        !            18:
        !            19: #include <sys/param.h>
        !            20: #include <sys/systm.h>
        !            21: #include <sys/kernel.h>
        !            22: #include <sys/proc.h>
        !            23: #include <sys/msg.h>
        !            24: #include <sys/sem.h>
        !            25: #include <sys/shm.h>
        !            26:
        !            27: #include <sys/mount.h>
        !            28: #include <sys/syscallargs.h>
        !            29:
        !            30: #ifdef SYSVMSG
        !            31: /*
        !            32:  * Old-style shmget(2) used int for the size parameter, we now use size_t.
        !            33:  */
        !            34: int
        !            35: compat_35_sys_shmget(struct proc *p, void *v, register_t *retval)
        !            36: {
        !            37:        struct compat_35_sys_shmget_args /* {
        !            38:                syscallarg(key_t) key;
        !            39:                syscallarg(int) size;
        !            40:                syscallarg(int) shmflg;
        !            41:        } */ *uap = v;
        !            42:        struct sys_shmget_args /* {
        !            43:                syscallarg(key_t) key;
        !            44:                syscallarg(size_t) size;
        !            45:                syscallarg(int) shmflg;
        !            46:        } */ shmget_args;
        !            47:
        !            48:        SCARG(&shmget_args, key) = SCARG(uap, key);
        !            49:        SCARG(&shmget_args, size) = (size_t)SCARG(uap, size);
        !            50:        SCARG(&shmget_args, shmflg) = SCARG(uap, shmflg);
        !            51:
        !            52:        return (sys_shmget(p, &shmget_args, retval));
        !            53: }
        !            54: #endif
        !            55:
        !            56: #ifdef SYSVSEM
        !            57: /*
        !            58:  * Old-style shmget(2) used u_int for the nsops parameter, we now use size_t.
        !            59:  */
        !            60: int
        !            61: compat_35_sys_semop(struct proc *p, void *v, register_t *retval)
        !            62: {
        !            63:        struct compat_35_sys_semop_args /* {
        !            64:                syscallarg(int) semid;
        !            65:                syscallarg(struct sembuf *) sops;
        !            66:                syscallarg(u_int) nsops;
        !            67:        } */ *uap = v;
        !            68:        struct sys_semop_args /* {
        !            69:                syscallarg(int) semid;
        !            70:                syscallarg(struct sembuf *) sops;
        !            71:                syscallarg(size_t) nsops;
        !            72:        } */ semop_args;
        !            73:
        !            74:        SCARG(&semop_args, semid) = SCARG(uap, semid);
        !            75:        SCARG(&semop_args, sops) = SCARG(uap, sops);
        !            76:        SCARG(&semop_args, nsops) = (size_t)SCARG(uap, nsops);
        !            77:
        !            78:        return (sys_semop(p, &semop_args, retval));
        !            79: }
        !            80: #endif
        !            81:
        !            82: /*
        !            83:  * Convert between new and old struct {msq,sem,shm}id_ds (both ways)
        !            84:  */
        !            85: #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
        !            86: #define cvt_ds(to, from, type, base) do {                              \
        !            87:        (to)->type##_perm.cuid = (from)->type##_perm.cuid;              \
        !            88:        (to)->type##_perm.cgid = (from)->type##_perm.cgid;              \
        !            89:        (to)->type##_perm.uid = (from)->type##_perm.uid;                \
        !            90:        (to)->type##_perm.gid = (from)->type##_perm.gid;                \
        !            91:        (to)->type##_perm.mode = (from)->type##_perm.mode & 0xffffU;    \
        !            92:        (to)->type##_perm.seq = (from)->type##_perm.seq;                \
        !            93:        (to)->type##_perm.key = (from)->type##_perm.key;                \
        !            94:        bcopy((caddr_t)&(from)->base, (caddr_t)&(to)->base,             \
        !            95:            sizeof(*(to)) - ((caddr_t)&(to)->base - (caddr_t)to));      \
        !            96: } while (0)
        !            97: #endif /* SYSVMSG || SYSVSEM || SYSVSHM */
        !            98:
        !            99: #ifdef SYSVMSG
        !           100: /*
        !           101:  * Copy a struct msqid_ds35 from userland and convert to struct msqid_ds
        !           102:  */
        !           103: static int
        !           104: msqid_copyin(const void *uaddr, void *kaddr, size_t len)
        !           105: {
        !           106:        struct msqid_ds *msqbuf = kaddr;
        !           107:        struct msqid_ds35 omsqbuf;
        !           108:        int error;
        !           109:
        !           110:        if (len != sizeof(struct msqid_ds))
        !           111:                return (EFAULT);
        !           112:        if ((error = copyin(uaddr, &omsqbuf, sizeof(omsqbuf))) == 0)
        !           113:                cvt_ds(msqbuf, &omsqbuf, msg, msg_first);
        !           114:        return (error);
        !           115: }
        !           116:
        !           117: /*
        !           118:  * Convert a struct msqid_ds to struct msqid_ds35 and copy to userland
        !           119:  */
        !           120: static int
        !           121: msqid_copyout(const void *kaddr, void *uaddr, size_t len)
        !           122: {
        !           123:        const struct msqid_ds *msqbuf = kaddr;
        !           124:        struct msqid_ds35 omsqbuf;
        !           125:
        !           126:        if (len != sizeof(struct msqid_ds))
        !           127:                return (EFAULT);
        !           128:        cvt_ds(&omsqbuf, msqbuf, msg, msg_first);
        !           129:        return (copyout(&omsqbuf, uaddr, sizeof(omsqbuf)));
        !           130: }
        !           131:
        !           132: /*
        !           133:  * OpenBSD 3.5 msgctl(2) with 16bit mode_t in struct ipcperm.
        !           134:  */
        !           135: int
        !           136: compat_35_sys_msgctl(struct proc *p, void *v, register_t *retval)
        !           137: {
        !           138:        struct compat_35_sys_msgctl_args /* {
        !           139:                syscallarg(int) msqid;
        !           140:                syscallarg(int) cmd;
        !           141:                syscallarg(struct msqid_ds35 *) buf;
        !           142:        } */ *uap = v;
        !           143:
        !           144:        return (msgctl1(p, SCARG(uap, msqid), SCARG(uap, cmd),
        !           145:            (caddr_t)SCARG(uap, buf), msqid_copyin, msqid_copyout));
        !           146: }
        !           147: #endif /* SYSVMSG */
        !           148:
        !           149: #ifdef SYSVSEM
        !           150: /*
        !           151:  * Copy a struct semid_ds35 from userland and convert to struct semid_ds
        !           152:  */
        !           153: static int
        !           154: semid_copyin(const void *uaddr, void *kaddr, size_t len)
        !           155: {
        !           156:        struct semid_ds *sembuf = kaddr;
        !           157:        struct semid_ds35 osembuf;
        !           158:        int error;
        !           159:
        !           160:        if (len != sizeof(struct semid_ds))
        !           161:                return (EFAULT);
        !           162:        if ((error = copyin(uaddr, &osembuf, sizeof(osembuf))) == 0)
        !           163:                cvt_ds(sembuf, &osembuf, sem, sem_base);
        !           164:        return (error);
        !           165: }
        !           166:
        !           167: /*
        !           168:  * Convert a struct semid_ds to struct semid_ds35 and copy to userland
        !           169:  */
        !           170: static int
        !           171: semid_copyout(const void *kaddr, void *uaddr, size_t len)
        !           172: {
        !           173:        const struct semid_ds *sembuf = kaddr;
        !           174:        struct semid_ds35 osembuf;
        !           175:
        !           176:        if (len != sizeof(struct semid_ds))
        !           177:                return (EFAULT);
        !           178:        cvt_ds(&osembuf, sembuf, sem, sem_base);
        !           179:        return (copyout(&osembuf, uaddr, sizeof(osembuf)));
        !           180: }
        !           181:
        !           182: /*
        !           183:  * OpenBSD 3.5 semctl(2) with 16bit mode_t in struct ipcperm.
        !           184:  */
        !           185: int
        !           186: compat_35_sys___semctl(struct proc *p, void *v, register_t *retval)
        !           187: {
        !           188:        struct compat_35_sys___semctl_args /* {
        !           189:                syscallarg(int) semid;
        !           190:                syscallarg(int) semnum;
        !           191:                syscallarg(int) cmd;
        !           192:                syscallarg(union semun *) arg;
        !           193:        } */ *uap = v;
        !           194:        union semun arg;
        !           195:        int error = 0, cmd = SCARG(uap, cmd);
        !           196:
        !           197:        switch (cmd) {
        !           198:        case IPC_SET:
        !           199:        case IPC_STAT:
        !           200:        case GETALL:
        !           201:        case SETVAL:
        !           202:        case SETALL:
        !           203:                error = copyin(SCARG(uap, arg), &arg, sizeof(arg));
        !           204:                break;
        !           205:        }
        !           206:        if (error == 0) {
        !           207:                error = semctl1(p, SCARG(uap, semid), SCARG(uap, semnum),
        !           208:                    cmd, &arg, retval, semid_copyin, semid_copyout);
        !           209:        }
        !           210:        return (error);
        !           211: }
        !           212: #endif /* SYSVSEM */
        !           213:
        !           214: #ifdef SYSVSHM
        !           215: /*
        !           216:  * Copy a struct shmid_ds35 from userland and convert to struct shmid_ds
        !           217:  */
        !           218: static int
        !           219: shmid_copyin(const void *uaddr, void *kaddr, size_t len)
        !           220: {
        !           221:        struct shmid_ds *shmbuf = kaddr;
        !           222:        struct shmid_ds35 oshmbuf;
        !           223:        int error;
        !           224:
        !           225:        if (len != sizeof(struct shmid_ds))
        !           226:                return (EFAULT);
        !           227:        if ((error = copyin(uaddr, &oshmbuf, sizeof(oshmbuf))) == 0)
        !           228:                cvt_ds(shmbuf, &oshmbuf, shm, shm_segsz);
        !           229:        return (error);
        !           230: }
        !           231:
        !           232: /*
        !           233:  * Convert a struct shmid_ds to struct shmid_ds35 and copy to userland
        !           234:  */
        !           235: static int
        !           236: shmid_copyout(const void *kaddr, void *uaddr, size_t len)
        !           237: {
        !           238:        const struct shmid_ds *shmbuf = kaddr;
        !           239:        struct shmid_ds35 oshmbuf;
        !           240:
        !           241:        if (len != sizeof(struct shmid_ds))
        !           242:                return (EFAULT);
        !           243:        cvt_ds(&oshmbuf, shmbuf, shm, shm_segsz);
        !           244:        return (copyout(&oshmbuf, uaddr, sizeof(oshmbuf)));
        !           245: }
        !           246:
        !           247: /*
        !           248:  * OpenBSD 3.5 shmctl(2) with 16bit mode_t in struct ipcperm.
        !           249:  */
        !           250: int
        !           251: compat_35_sys_shmctl(struct proc *p, void *v, register_t *retval)
        !           252: {
        !           253:        struct compat_35_sys_shmctl_args /* {
        !           254:                syscallarg(int) shmid;
        !           255:                syscallarg(int) cmd;
        !           256:                syscallarg(struct shmid_ds35 *) buf;
        !           257:        } */ *uap = v;
        !           258:
        !           259:        return (shmctl1(p, SCARG(uap, shmid), SCARG(uap, cmd),
        !           260:            (caddr_t)SCARG(uap, buf), shmid_copyin, shmid_copyout));
        !           261: }
        !           262: #endif /* SYSVSHM */

CVSweb