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