Home | History | Annotate | Line # | Download | only in common
kern_ipc_10.c revision 1.9.2.1
      1  1.9.2.1    bouyer /*	$NetBSD: kern_ipc_10.c,v 1.9.2.1 2000/11/20 18:08:07 bouyer Exp $	*/
      2      1.1  christos 
      3      1.1  christos /*
      4      1.7   mycroft  * Copyright (c) 1994 Adam Glass and Charles M. Hannum.  All rights reserved.
      5      1.1  christos  *
      6      1.1  christos  * Redistribution and use in source and binary forms, with or without
      7      1.1  christos  * modification, are permitted provided that the following conditions
      8      1.1  christos  * are met:
      9      1.1  christos  * 1. Redistributions of source code must retain the above copyright
     10      1.1  christos  *    notice, this list of conditions and the following disclaimer.
     11      1.1  christos  * 2. Redistributions in binary form must reproduce the above copyright
     12      1.1  christos  *    notice, this list of conditions and the following disclaimer in the
     13      1.1  christos  *    documentation and/or other materials provided with the distribution.
     14      1.1  christos  * 3. All advertising materials mentioning features or use of this software
     15      1.1  christos  *    must display the following acknowledgement:
     16      1.7   mycroft  *	This product includes software developed by Adam Glass and Charles M.
     17      1.1  christos  *	Hannum.
     18      1.1  christos  * 4. The names of the authors may not be used to endorse or promote products
     19      1.1  christos  *    derived from this software without specific prior written permission.
     20      1.1  christos  *
     21      1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
     22      1.1  christos  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23      1.1  christos  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24      1.1  christos  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     25      1.1  christos  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26      1.1  christos  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27      1.1  christos  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28      1.1  christos  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29      1.1  christos  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30      1.1  christos  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31      1.1  christos  */
     32      1.8      tron 
     33      1.8      tron #include "opt_sysv.h"
     34      1.1  christos 
     35      1.1  christos #include <sys/param.h>
     36      1.1  christos #include <sys/systm.h>
     37      1.1  christos #include <sys/kernel.h>
     38      1.1  christos #include <sys/proc.h>
     39      1.1  christos #include <sys/sem.h>
     40      1.1  christos #include <sys/malloc.h>
     41      1.1  christos 
     42      1.1  christos #include <sys/mount.h>
     43      1.1  christos #include <sys/syscallargs.h>
     44      1.1  christos 
     45      1.6    scottb #include <compat/common/compat_util.h>
     46      1.6    scottb 
     47      1.2   mycroft #ifdef SYSVSEM
     48      1.1  christos int
     49      1.4   mycroft compat_10_sys_semsys(p, v, retval)
     50      1.1  christos 	struct proc *p;
     51      1.3   thorpej 	void *v;
     52      1.3   thorpej 	register_t *retval;
     53      1.3   thorpej {
     54      1.4   mycroft 	struct compat_10_sys_semsys_args /* {
     55      1.1  christos 		syscallarg(int) which;
     56      1.1  christos 		syscallarg(int) a2;
     57      1.1  christos 		syscallarg(int) a3;
     58      1.1  christos 		syscallarg(int) a4;
     59      1.1  christos 		syscallarg(int) a5;
     60      1.3   thorpej 	} */ *uap = v;
     61      1.9   thorpej 	struct compat_14_sys___semctl_args /* {
     62      1.1  christos 		syscallarg(int) semid;
     63      1.1  christos 		syscallarg(int) semnum;
     64      1.1  christos 		syscallarg(int) cmd;
     65      1.9   thorpej 		syscallarg(union __semun *) arg;
     66      1.1  christos 	} */ __semctl_args;
     67      1.4   mycroft 	struct sys_semget_args /* {
     68      1.1  christos 		syscallarg(key_t) key;
     69      1.1  christos 		syscallarg(int) nsems;
     70      1.1  christos 		syscallarg(int) semflg;
     71      1.1  christos 	} */ semget_args;
     72      1.4   mycroft 	struct sys_semop_args /* {
     73      1.1  christos 		syscallarg(int) semid;
     74      1.1  christos 		syscallarg(struct sembuf *) sops;
     75      1.1  christos 		syscallarg(u_int) nsops;
     76      1.1  christos 	} */ semop_args;
     77      1.4   mycroft 	struct sys_semconfig_args /* {
     78      1.1  christos 		syscallarg(int) flag;
     79      1.1  christos 	} */ semconfig_args;
     80      1.6    scottb 	caddr_t sg = stackgap_init(p->p_emul);
     81      1.1  christos 
     82      1.1  christos 	switch (SCARG(uap, which)) {
     83      1.1  christos 	case 0:						/* __semctl() */
     84      1.1  christos 		SCARG(&__semctl_args, semid) = SCARG(uap, a2);
     85      1.1  christos 		SCARG(&__semctl_args, semnum) = SCARG(uap, a3);
     86      1.1  christos 		SCARG(&__semctl_args, cmd) = SCARG(uap, a4);
     87      1.6    scottb 		SCARG(&__semctl_args, arg) = stackgap_alloc(&sg,
     88      1.6    scottb 			sizeof(union semun *));
     89      1.6    scottb 		copyout(&SCARG(uap, a5), SCARG(&__semctl_args, arg),
     90      1.9   thorpej 			sizeof(union __semun));
     91      1.9   thorpej 		return (compat_14_sys___semctl(p, &__semctl_args, retval));
     92      1.1  christos 
     93      1.1  christos 	case 1:						/* semget() */
     94      1.1  christos 		SCARG(&semget_args, key) = SCARG(uap, a2);
     95      1.1  christos 		SCARG(&semget_args, nsems) = SCARG(uap, a3);
     96      1.1  christos 		SCARG(&semget_args, semflg) = SCARG(uap, a4);
     97      1.4   mycroft 		return (sys_semget(p, &semget_args, retval));
     98      1.1  christos 
     99      1.1  christos 	case 2:						/* semop() */
    100      1.1  christos 		SCARG(&semop_args, semid) = SCARG(uap, a2);
    101  1.9.2.1    bouyer 		SCARG(&semop_args, sops) =
    102  1.9.2.1    bouyer 		    (struct sembuf *)(u_long)SCARG(uap, a3);
    103      1.1  christos 		SCARG(&semop_args, nsops) = SCARG(uap, a4);
    104      1.4   mycroft 		return (sys_semop(p, &semop_args, retval));
    105      1.1  christos 
    106      1.1  christos 	case 3:						/* semconfig() */
    107      1.1  christos 		SCARG(&semconfig_args, flag) = SCARG(uap, a2);
    108      1.4   mycroft 		return (sys_semconfig(p, &semconfig_args, retval));
    109      1.1  christos 
    110      1.1  christos 	default:
    111      1.1  christos 		return (EINVAL);
    112      1.1  christos 	}
    113      1.1  christos }
    114      1.2   mycroft #endif
    115      1.1  christos 
    116      1.2   mycroft #ifdef SYSVSHM
    117      1.1  christos int
    118      1.4   mycroft compat_10_sys_shmsys(p, v, retval)
    119      1.1  christos 	struct proc *p;
    120      1.3   thorpej 	void *v;
    121      1.3   thorpej 	register_t *retval;
    122      1.3   thorpej {
    123      1.4   mycroft 	struct compat_10_sys_shmsys_args /* {
    124      1.1  christos 		syscallarg(int) which;
    125      1.1  christos 		syscallarg(int) a2;
    126      1.1  christos 		syscallarg(int) a3;
    127      1.1  christos 		syscallarg(int) a4;
    128      1.3   thorpej 	} */ *uap = v;
    129      1.4   mycroft 	struct sys_shmat_args /* {
    130      1.1  christos 		syscallarg(int) shmid;
    131      1.1  christos 		syscallarg(void *) shmaddr;
    132      1.1  christos 		syscallarg(int) shmflg;
    133      1.1  christos 	} */ shmat_args;
    134      1.9   thorpej 	struct compat_14_sys_shmctl_args /* {
    135      1.1  christos 		syscallarg(int) shmid;
    136      1.1  christos 		syscallarg(int) cmd;
    137      1.9   thorpej 		syscallarg(struct shmid14_ds *) buf;
    138      1.1  christos 	} */ shmctl_args;
    139      1.4   mycroft 	struct sys_shmdt_args /* {
    140      1.1  christos 		syscallarg(void *) shmaddr;
    141      1.1  christos 	} */ shmdt_args;
    142      1.4   mycroft 	struct sys_shmget_args /* {
    143      1.1  christos 		syscallarg(key_t) key;
    144      1.1  christos 		syscallarg(int) size;
    145      1.1  christos 		syscallarg(int) shmflg;
    146      1.1  christos 	} */ shmget_args;
    147      1.1  christos 
    148      1.1  christos 	switch (SCARG(uap, which)) {
    149      1.1  christos 	case 0:						/* shmat() */
    150      1.1  christos 		SCARG(&shmat_args, shmid) = SCARG(uap, a2);
    151  1.9.2.1    bouyer 		SCARG(&shmat_args, shmaddr) =
    152  1.9.2.1    bouyer 		    (void *)(u_long)SCARG(uap, a3);
    153      1.1  christos 		SCARG(&shmat_args, shmflg) = SCARG(uap, a4);
    154      1.4   mycroft 		return (sys_shmat(p, &shmat_args, retval));
    155      1.1  christos 
    156      1.1  christos 	case 1:						/* shmctl() */
    157      1.1  christos 		SCARG(&shmctl_args, shmid) = SCARG(uap, a2);
    158      1.1  christos 		SCARG(&shmctl_args, cmd) = SCARG(uap, a3);
    159  1.9.2.1    bouyer 		SCARG(&shmctl_args, buf) =
    160  1.9.2.1    bouyer 		    (struct shmid_ds14 *)(u_long)SCARG(uap, a4);
    161      1.9   thorpej 		return (compat_14_sys_shmctl(p, &shmctl_args, retval));
    162      1.1  christos 
    163      1.1  christos 	case 2:						/* shmdt() */
    164  1.9.2.1    bouyer 		SCARG(&shmdt_args, shmaddr) =
    165  1.9.2.1    bouyer 		    (void *)(u_long)SCARG(uap, a2);
    166      1.4   mycroft 		return (sys_shmdt(p, &shmdt_args, retval));
    167      1.1  christos 
    168      1.1  christos 	case 3:						/* shmget() */
    169      1.1  christos 		SCARG(&shmget_args, key) = SCARG(uap, a2);
    170      1.1  christos 		SCARG(&shmget_args, size) = SCARG(uap, a3);
    171      1.1  christos 		SCARG(&shmget_args, shmflg) = SCARG(uap, a4);
    172      1.4   mycroft 		return (sys_shmget(p, &shmget_args, retval));
    173      1.1  christos 
    174      1.1  christos 	default:
    175      1.1  christos 		return (EINVAL);
    176      1.1  christos 	}
    177      1.1  christos }
    178      1.2   mycroft #endif
    179      1.1  christos 
    180      1.2   mycroft #ifdef SYSVMSG
    181      1.1  christos int
    182      1.4   mycroft compat_10_sys_msgsys(p, v, retval)
    183      1.3   thorpej 	struct proc *p;
    184      1.3   thorpej 	void *v;
    185      1.3   thorpej 	register_t *retval;
    186      1.3   thorpej {
    187      1.4   mycroft 	struct compat_10_sys_msgsys_args /* {
    188      1.1  christos 		syscallarg(int) which;
    189      1.1  christos 		syscallarg(int) a2;
    190      1.1  christos 		syscallarg(int) a3;
    191      1.1  christos 		syscallarg(int) a4;
    192      1.1  christos 		syscallarg(int) a5;
    193      1.1  christos 		syscallarg(int) a6;
    194      1.3   thorpej 	} */ *uap = v;
    195      1.9   thorpej 	struct compat_14_sys_msgctl_args /* {
    196      1.1  christos 		syscallarg(int) msqid;
    197      1.1  christos 		syscallarg(int) cmd;
    198      1.9   thorpej 		syscallarg(struct msqid14_ds *) buf;
    199      1.1  christos 	} */ msgctl_args;
    200      1.4   mycroft 	struct sys_msgget_args /* {
    201      1.1  christos 		syscallarg(key_t) key;
    202      1.1  christos 		syscallarg(int) msgflg;
    203      1.1  christos 	} */ msgget_args;
    204      1.4   mycroft 	struct sys_msgsnd_args /* {
    205      1.1  christos 		syscallarg(int) msqid;
    206      1.1  christos 		syscallarg(void *) msgp;
    207      1.1  christos 		syscallarg(size_t) msgsz;
    208      1.1  christos 		syscallarg(int) msgflg;
    209      1.1  christos 	} */ msgsnd_args;
    210      1.4   mycroft 	struct sys_msgrcv_args /* {
    211      1.1  christos 		syscallarg(int) msqid;
    212      1.1  christos 		syscallarg(void *) msgp;
    213      1.1  christos 		syscallarg(size_t) msgsz;
    214      1.1  christos 		syscallarg(long) msgtyp;
    215      1.1  christos 		syscallarg(int) msgflg;
    216      1.1  christos 	} */ msgrcv_args;
    217      1.1  christos 
    218      1.1  christos 	switch (SCARG(uap, which)) {
    219      1.1  christos 	case 0:					/* msgctl()*/
    220      1.1  christos 		SCARG(&msgctl_args, msqid) = SCARG(uap, a2);
    221      1.1  christos 		SCARG(&msgctl_args, cmd) = SCARG(uap, a3);
    222      1.1  christos 		SCARG(&msgctl_args, buf) =
    223  1.9.2.1    bouyer 		    (struct msqid_ds14 *)(u_long)SCARG(uap, a4);
    224      1.9   thorpej 		return (compat_14_sys_msgctl(p, &msgctl_args, retval));
    225      1.1  christos 
    226      1.1  christos 	case 1:					/* msgget() */
    227      1.1  christos 		SCARG(&msgget_args, key) = SCARG(uap, a2);
    228      1.1  christos 		SCARG(&msgget_args, msgflg) = SCARG(uap, a3);
    229      1.4   mycroft 		return (sys_msgget(p, &msgget_args, retval));
    230      1.1  christos 
    231      1.1  christos 	case 2:					/* msgsnd() */
    232      1.1  christos 		SCARG(&msgsnd_args, msqid) = SCARG(uap, a2);
    233  1.9.2.1    bouyer 		SCARG(&msgsnd_args, msgp) =
    234  1.9.2.1    bouyer 		    (void *)(u_long)SCARG(uap, a3);
    235      1.1  christos 		SCARG(&msgsnd_args, msgsz) = SCARG(uap, a4);
    236      1.1  christos 		SCARG(&msgsnd_args, msgflg) = SCARG(uap, a5);
    237      1.4   mycroft 		return (sys_msgsnd(p, &msgsnd_args, retval));
    238      1.1  christos 
    239      1.1  christos 	case 3:					/* msgrcv() */
    240      1.1  christos 		SCARG(&msgrcv_args, msqid) = SCARG(uap, a2);
    241  1.9.2.1    bouyer 		SCARG(&msgrcv_args, msgp) =
    242  1.9.2.1    bouyer 		    (void *)(u_long)SCARG(uap, a3);
    243      1.1  christos 		SCARG(&msgrcv_args, msgsz) = SCARG(uap, a4);
    244      1.1  christos 		SCARG(&msgrcv_args, msgtyp) = SCARG(uap, a5);
    245      1.1  christos 		SCARG(&msgrcv_args, msgflg) = SCARG(uap, a6);
    246      1.4   mycroft 		return (sys_msgrcv(p, &msgrcv_args, retval));
    247      1.1  christos 
    248      1.1  christos 	default:
    249      1.1  christos 		return (EINVAL);
    250      1.1  christos 	}
    251      1.1  christos }
    252      1.2   mycroft #endif
    253