1b7f5d5b5SBruce Evans /* $Id: sysv_ipc.c,v 1.7 1997/11/06 19:29:22 phk Exp $ */ 23d903220SDoug Rabson /* $NetBSD: sysv_ipc.c,v 1.7 1994/06/29 06:33:11 cgd Exp $ */ 33d903220SDoug Rabson 43d903220SDoug Rabson /* 53d903220SDoug Rabson * Copyright (c) 1994 Herb Peyerl <hpeyerl@novatel.ca> 63d903220SDoug Rabson * All rights reserved. 73d903220SDoug Rabson * 83d903220SDoug Rabson * Redistribution and use in source and binary forms, with or without 93d903220SDoug Rabson * modification, are permitted provided that the following conditions 103d903220SDoug Rabson * are met: 113d903220SDoug Rabson * 1. Redistributions of source code must retain the above copyright 123d903220SDoug Rabson * notice, this list of conditions and the following disclaimer. 133d903220SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 143d903220SDoug Rabson * notice, this list of conditions and the following disclaimer in the 153d903220SDoug Rabson * documentation and/or other materials provided with the distribution. 163d903220SDoug Rabson * 3. All advertising materials mentioning features or use of this software 173d903220SDoug Rabson * must display the following acknowledgement: 183d903220SDoug Rabson * This product includes software developed by Herb Peyerl. 193d903220SDoug Rabson * 4. The name of Herb Peyerl may not be used to endorse or promote products 203d903220SDoug Rabson * derived from this software without specific prior written permission. 213d903220SDoug Rabson * 223d903220SDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 233d903220SDoug Rabson * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 243d903220SDoug Rabson * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 253d903220SDoug Rabson * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 263d903220SDoug Rabson * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 273d903220SDoug Rabson * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 283d903220SDoug Rabson * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 293d903220SDoug Rabson * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 303d903220SDoug Rabson * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 313d903220SDoug Rabson * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 323d903220SDoug Rabson */ 333d903220SDoug Rabson 34511b67b7SGarrett Wollman #include "opt_sysvipc.h" 35511b67b7SGarrett Wollman 363d903220SDoug Rabson #include <sys/param.h> 3781090119SPeter Wemm #include <sys/ipc.h> 38b7f5d5b5SBruce Evans #include <sys/ucred.h> 3981090119SPeter Wemm 4081090119SPeter Wemm #if defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG) 413d903220SDoug Rabson 423d903220SDoug Rabson /* 433d903220SDoug Rabson * Check for ipc permission 443d903220SDoug Rabson */ 453d903220SDoug Rabson 463d903220SDoug Rabson int 473d903220SDoug Rabson ipcperm(cred, perm, mode) 483d903220SDoug Rabson struct ucred *cred; 493d903220SDoug Rabson struct ipc_perm *perm; 503d903220SDoug Rabson int mode; 513d903220SDoug Rabson { 523d903220SDoug Rabson 533d903220SDoug Rabson if (cred->cr_uid == 0) 543d903220SDoug Rabson return (0); 553d903220SDoug Rabson 563d903220SDoug Rabson /* Check for user match. */ 573d903220SDoug Rabson if (cred->cr_uid != perm->cuid && cred->cr_uid != perm->uid) { 583d903220SDoug Rabson if (mode & IPC_M) 593d903220SDoug Rabson return (EPERM); 603d903220SDoug Rabson /* Check for group match. */ 613d903220SDoug Rabson mode >>= 3; 623d903220SDoug Rabson if (!groupmember(perm->gid, cred) && 633d903220SDoug Rabson !groupmember(perm->cgid, cred)) 643d903220SDoug Rabson /* Check for `other' match. */ 653d903220SDoug Rabson mode >>= 3; 663d903220SDoug Rabson } 673d903220SDoug Rabson 683d903220SDoug Rabson if (mode & IPC_M) 693d903220SDoug Rabson return (0); 703d903220SDoug Rabson return ((mode & perm->mode) == mode ? 0 : EACCES); 713d903220SDoug Rabson } 7281090119SPeter Wemm 7381090119SPeter Wemm #endif /* defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG) */ 7481090119SPeter Wemm 7581090119SPeter Wemm 7681090119SPeter Wemm #if !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG) 7781090119SPeter Wemm 78b7f5d5b5SBruce Evans #include <sys/proc.h> 79b7f5d5b5SBruce Evans #include <sys/sem.h> 80b7f5d5b5SBruce Evans #include <sys/shm.h> 81b7f5d5b5SBruce Evans #include <sys/syslog.h> 82b7f5d5b5SBruce Evans #include <sys/sysproto.h> 83b7f5d5b5SBruce Evans #include <sys/systm.h> 84b7f5d5b5SBruce Evans 8581090119SPeter Wemm static void sysv_nosys __P((struct proc *p, char *s)); 8681090119SPeter Wemm 8781090119SPeter Wemm static void 8881090119SPeter Wemm sysv_nosys(p, s) 8981090119SPeter Wemm struct proc *p; 9081090119SPeter Wemm char *s; 9181090119SPeter Wemm { 9281090119SPeter Wemm log(LOG_ERR, "cmd %s pid %d tried to use non-present %s\n", 9381090119SPeter Wemm p->p_comm, p->p_pid, s); 9481090119SPeter Wemm } 9581090119SPeter Wemm 9681090119SPeter Wemm #if !defined(SYSVSEM) 9781090119SPeter Wemm 9881090119SPeter Wemm /* 9981090119SPeter Wemm * SYSVSEM stubs 10081090119SPeter Wemm */ 10181090119SPeter Wemm 10281090119SPeter Wemm int 103cb226aaaSPoul-Henning Kamp semsys(p, uap) 10481090119SPeter Wemm struct proc *p; 10581090119SPeter Wemm struct semsys_args *uap; 10681090119SPeter Wemm { 10781090119SPeter Wemm sysv_nosys(p, "SYSVSEM"); 108cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 10981090119SPeter Wemm }; 11081090119SPeter Wemm 11181090119SPeter Wemm int 112cb226aaaSPoul-Henning Kamp semconfig(p, uap) 11381090119SPeter Wemm struct proc *p; 11481090119SPeter Wemm struct semconfig_args *uap; 11581090119SPeter Wemm { 11681090119SPeter Wemm sysv_nosys(p, "SYSVSEM"); 117cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 11881090119SPeter Wemm }; 11981090119SPeter Wemm 12081090119SPeter Wemm int 121cb226aaaSPoul-Henning Kamp __semctl(p, uap) 12281090119SPeter Wemm struct proc *p; 12381090119SPeter Wemm register struct __semctl_args *uap; 12481090119SPeter Wemm { 12581090119SPeter Wemm sysv_nosys(p, "SYSVSEM"); 126cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 12781090119SPeter Wemm }; 12881090119SPeter Wemm 12981090119SPeter Wemm int 130cb226aaaSPoul-Henning Kamp semget(p, uap) 13181090119SPeter Wemm struct proc *p; 13281090119SPeter Wemm register struct semget_args *uap; 13381090119SPeter Wemm { 13481090119SPeter Wemm sysv_nosys(p, "SYSVSEM"); 135cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 13681090119SPeter Wemm }; 13781090119SPeter Wemm 13881090119SPeter Wemm int 139cb226aaaSPoul-Henning Kamp semop(p, uap) 14081090119SPeter Wemm struct proc *p; 14181090119SPeter Wemm register struct semop_args *uap; 14281090119SPeter Wemm { 14381090119SPeter Wemm sysv_nosys(p, "SYSVSEM"); 144cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 14581090119SPeter Wemm }; 14681090119SPeter Wemm 14781090119SPeter Wemm /* called from kern_exit.c */ 14881090119SPeter Wemm void 14981090119SPeter Wemm semexit(p) 15081090119SPeter Wemm struct proc *p; 15181090119SPeter Wemm { 15281090119SPeter Wemm return; 15381090119SPeter Wemm } 15481090119SPeter Wemm 15581090119SPeter Wemm #endif /* !defined(SYSVSEM) */ 15681090119SPeter Wemm 15781090119SPeter Wemm 15881090119SPeter Wemm #if !defined(SYSVMSG) 15981090119SPeter Wemm 16081090119SPeter Wemm /* 16181090119SPeter Wemm * SYSVMSG stubs 16281090119SPeter Wemm */ 16381090119SPeter Wemm 16481090119SPeter Wemm int 165cb226aaaSPoul-Henning Kamp msgsys(p, uap) 16681090119SPeter Wemm struct proc *p; 16781090119SPeter Wemm /* XXX actually varargs. */ 16881090119SPeter Wemm struct msgsys_args *uap; 16981090119SPeter Wemm { 17081090119SPeter Wemm sysv_nosys(p, "SYSVMSG"); 171cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 17281090119SPeter Wemm }; 17381090119SPeter Wemm 17481090119SPeter Wemm int 175cb226aaaSPoul-Henning Kamp msgctl(p, uap) 17681090119SPeter Wemm struct proc *p; 17781090119SPeter Wemm register struct msgctl_args *uap; 17881090119SPeter Wemm { 17981090119SPeter Wemm sysv_nosys(p, "SYSVMSG"); 180cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 18181090119SPeter Wemm }; 18281090119SPeter Wemm 18381090119SPeter Wemm int 184cb226aaaSPoul-Henning Kamp msgget(p, uap) 18581090119SPeter Wemm struct proc *p; 18681090119SPeter Wemm register struct msgget_args *uap; 18781090119SPeter Wemm { 18881090119SPeter Wemm sysv_nosys(p, "SYSVMSG"); 189cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 19081090119SPeter Wemm }; 19181090119SPeter Wemm 19281090119SPeter Wemm int 193cb226aaaSPoul-Henning Kamp msgsnd(p, uap) 19481090119SPeter Wemm struct proc *p; 19581090119SPeter Wemm register struct msgsnd_args *uap; 19681090119SPeter Wemm { 19781090119SPeter Wemm sysv_nosys(p, "SYSVMSG"); 198cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 19981090119SPeter Wemm }; 20081090119SPeter Wemm 20181090119SPeter Wemm int 202cb226aaaSPoul-Henning Kamp msgrcv(p, uap) 20381090119SPeter Wemm struct proc *p; 20481090119SPeter Wemm register struct msgrcv_args *uap; 20581090119SPeter Wemm { 20681090119SPeter Wemm sysv_nosys(p, "SYSVMSG"); 207cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 20881090119SPeter Wemm }; 20981090119SPeter Wemm 21081090119SPeter Wemm #endif /* !defined(SYSVMSG) */ 21181090119SPeter Wemm 21281090119SPeter Wemm 21381090119SPeter Wemm #if !defined(SYSVSHM) 21481090119SPeter Wemm 21581090119SPeter Wemm /* 21681090119SPeter Wemm * SYSVSHM stubs 21781090119SPeter Wemm */ 21881090119SPeter Wemm 21981090119SPeter Wemm int 220cb226aaaSPoul-Henning Kamp shmdt(p, uap) 22181090119SPeter Wemm struct proc *p; 22281090119SPeter Wemm struct shmdt_args *uap; 22381090119SPeter Wemm { 22481090119SPeter Wemm sysv_nosys(p, "SYSVSHM"); 225cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 22681090119SPeter Wemm }; 22781090119SPeter Wemm 22881090119SPeter Wemm int 229cb226aaaSPoul-Henning Kamp shmat(p, uap) 23081090119SPeter Wemm struct proc *p; 23181090119SPeter Wemm struct shmat_args *uap; 23281090119SPeter Wemm { 23381090119SPeter Wemm sysv_nosys(p, "SYSVSHM"); 234cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 23581090119SPeter Wemm }; 23681090119SPeter Wemm 23781090119SPeter Wemm int 238cb226aaaSPoul-Henning Kamp shmctl(p, uap) 23981090119SPeter Wemm struct proc *p; 24081090119SPeter Wemm struct shmctl_args *uap; 24181090119SPeter Wemm { 24281090119SPeter Wemm sysv_nosys(p, "SYSVSHM"); 243cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 24481090119SPeter Wemm }; 24581090119SPeter Wemm 24681090119SPeter Wemm int 247cb226aaaSPoul-Henning Kamp shmget(p, uap) 24881090119SPeter Wemm struct proc *p; 24981090119SPeter Wemm struct shmget_args *uap; 25081090119SPeter Wemm { 25181090119SPeter Wemm sysv_nosys(p, "SYSVSHM"); 252cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 25381090119SPeter Wemm }; 25481090119SPeter Wemm 25581090119SPeter Wemm int 256cb226aaaSPoul-Henning Kamp shmsys(p, uap) 25781090119SPeter Wemm struct proc *p; 25881090119SPeter Wemm /* XXX actually varargs. */ 25981090119SPeter Wemm struct shmsys_args *uap; 26081090119SPeter Wemm { 26181090119SPeter Wemm sysv_nosys(p, "SYSVSHM"); 262cb226aaaSPoul-Henning Kamp return nosys(p, (struct nosys_args *)uap); 26381090119SPeter Wemm }; 26481090119SPeter Wemm 26581090119SPeter Wemm /* called from kern_fork.c */ 26681090119SPeter Wemm void 267dabee6feSPeter Wemm shmfork(p1, p2) 26881090119SPeter Wemm struct proc *p1, *p2; 26981090119SPeter Wemm { 27081090119SPeter Wemm return; 27181090119SPeter Wemm } 27281090119SPeter Wemm 27381090119SPeter Wemm /* called from kern_exit.c */ 27481090119SPeter Wemm void 27581090119SPeter Wemm shmexit(p) 27681090119SPeter Wemm struct proc *p; 27781090119SPeter Wemm { 27881090119SPeter Wemm return; 27981090119SPeter Wemm } 28081090119SPeter Wemm 28181090119SPeter Wemm #endif /* !defined(SYSVSHM) */ 28281090119SPeter Wemm 28381090119SPeter Wemm #endif /* !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG) */ 284