xref: /freebsd/sys/kern/sysv_ipc.c (revision 1c308b817a866f9cd41dd238a709e248d021f5c1)
11c308b81SPoul-Henning Kamp /*	$Id: sysv_ipc.c,v 1.10 1999/04/27 11:16:15 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>
381c308b81SPoul-Henning Kamp #include <sys/proc.h>
39b7f5d5b5SBruce Evans #include <sys/ucred.h>
4081090119SPeter Wemm 
4181090119SPeter Wemm #if defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG)
423d903220SDoug Rabson 
433d903220SDoug Rabson /*
443d903220SDoug Rabson  * Check for ipc permission
453d903220SDoug Rabson  */
463d903220SDoug Rabson 
473d903220SDoug Rabson int
481c308b81SPoul-Henning Kamp ipcperm(p, perm, mode)
491c308b81SPoul-Henning Kamp 	struct proc *p;
503d903220SDoug Rabson 	struct ipc_perm *perm;
513d903220SDoug Rabson 	int mode;
523d903220SDoug Rabson {
531c308b81SPoul-Henning Kamp 	struct ucred *cred = p->p_ucred;
543d903220SDoug Rabson 
551c308b81SPoul-Henning Kamp 	if (suser(p))
563d903220SDoug Rabson 		return (0);
573d903220SDoug Rabson 
583d903220SDoug Rabson 	/* Check for user match. */
593d903220SDoug Rabson 	if (cred->cr_uid != perm->cuid && cred->cr_uid != perm->uid) {
603d903220SDoug Rabson 		if (mode & IPC_M)
613d903220SDoug Rabson 			return (EPERM);
623d903220SDoug Rabson 		/* Check for group match. */
633d903220SDoug Rabson 		mode >>= 3;
643d903220SDoug Rabson 		if (!groupmember(perm->gid, cred) &&
653d903220SDoug Rabson 		    !groupmember(perm->cgid, cred))
663d903220SDoug Rabson 			/* Check for `other' match. */
673d903220SDoug Rabson 			mode >>= 3;
683d903220SDoug Rabson 	}
693d903220SDoug Rabson 
703d903220SDoug Rabson 	if (mode & IPC_M)
713d903220SDoug Rabson 		return (0);
723d903220SDoug Rabson 	return ((mode & perm->mode) == mode ? 0 : EACCES);
733d903220SDoug Rabson }
7481090119SPeter Wemm 
7581090119SPeter Wemm #endif /* defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG) */
7681090119SPeter Wemm 
7781090119SPeter Wemm 
7881090119SPeter Wemm #if !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG)
7981090119SPeter Wemm 
80b7f5d5b5SBruce Evans #include <sys/proc.h>
81b7f5d5b5SBruce Evans #include <sys/sem.h>
82b7f5d5b5SBruce Evans #include <sys/shm.h>
83b7f5d5b5SBruce Evans #include <sys/syslog.h>
84b7f5d5b5SBruce Evans #include <sys/sysproto.h>
85b7f5d5b5SBruce Evans #include <sys/systm.h>
86b7f5d5b5SBruce Evans 
8781090119SPeter Wemm static void sysv_nosys __P((struct proc *p, char *s));
8881090119SPeter Wemm 
8981090119SPeter Wemm static void
9081090119SPeter Wemm sysv_nosys(p, s)
9181090119SPeter Wemm 	struct proc *p;
9281090119SPeter Wemm 	char *s;
9381090119SPeter Wemm {
9481090119SPeter Wemm 	log(LOG_ERR, "cmd %s pid %d tried to use non-present %s\n",
9581090119SPeter Wemm 			p->p_comm, p->p_pid, s);
9681090119SPeter Wemm }
9781090119SPeter Wemm 
9881090119SPeter Wemm #if !defined(SYSVSEM)
9981090119SPeter Wemm 
10081090119SPeter Wemm /*
10181090119SPeter Wemm  * SYSVSEM stubs
10281090119SPeter Wemm  */
10381090119SPeter Wemm 
10481090119SPeter Wemm int
105cb226aaaSPoul-Henning Kamp semsys(p, uap)
10681090119SPeter Wemm 	struct proc *p;
10781090119SPeter Wemm 	struct semsys_args *uap;
10881090119SPeter Wemm {
10981090119SPeter Wemm 	sysv_nosys(p, "SYSVSEM");
110cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
11181090119SPeter Wemm };
11281090119SPeter Wemm 
11381090119SPeter Wemm int
114cb226aaaSPoul-Henning Kamp semconfig(p, uap)
11581090119SPeter Wemm 	struct proc *p;
11681090119SPeter Wemm 	struct semconfig_args *uap;
11781090119SPeter Wemm {
11881090119SPeter Wemm 	sysv_nosys(p, "SYSVSEM");
119cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
12081090119SPeter Wemm };
12181090119SPeter Wemm 
12281090119SPeter Wemm int
123cb226aaaSPoul-Henning Kamp __semctl(p, uap)
12481090119SPeter Wemm 	struct proc *p;
12581090119SPeter Wemm 	register struct __semctl_args *uap;
12681090119SPeter Wemm {
12781090119SPeter Wemm 	sysv_nosys(p, "SYSVSEM");
128cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
12981090119SPeter Wemm };
13081090119SPeter Wemm 
13181090119SPeter Wemm int
132cb226aaaSPoul-Henning Kamp semget(p, uap)
13381090119SPeter Wemm 	struct proc *p;
13481090119SPeter Wemm 	register struct semget_args *uap;
13581090119SPeter Wemm {
13681090119SPeter Wemm 	sysv_nosys(p, "SYSVSEM");
137cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
13881090119SPeter Wemm };
13981090119SPeter Wemm 
14081090119SPeter Wemm int
141cb226aaaSPoul-Henning Kamp semop(p, uap)
14281090119SPeter Wemm 	struct proc *p;
14381090119SPeter Wemm 	register struct semop_args *uap;
14481090119SPeter Wemm {
14581090119SPeter Wemm 	sysv_nosys(p, "SYSVSEM");
146cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
14781090119SPeter Wemm };
14881090119SPeter Wemm 
14981090119SPeter Wemm /* called from kern_exit.c */
15081090119SPeter Wemm void
15181090119SPeter Wemm semexit(p)
15281090119SPeter Wemm 	struct proc *p;
15381090119SPeter Wemm {
15481090119SPeter Wemm 	return;
15581090119SPeter Wemm }
15681090119SPeter Wemm 
15781090119SPeter Wemm #endif /* !defined(SYSVSEM) */
15881090119SPeter Wemm 
15981090119SPeter Wemm 
16081090119SPeter Wemm #if !defined(SYSVMSG)
16181090119SPeter Wemm 
16281090119SPeter Wemm /*
16381090119SPeter Wemm  * SYSVMSG stubs
16481090119SPeter Wemm  */
16581090119SPeter Wemm 
16681090119SPeter Wemm int
167cb226aaaSPoul-Henning Kamp msgsys(p, uap)
16881090119SPeter Wemm 	struct proc *p;
16981090119SPeter Wemm 	/* XXX actually varargs. */
17081090119SPeter Wemm 	struct msgsys_args *uap;
17181090119SPeter Wemm {
17281090119SPeter Wemm 	sysv_nosys(p, "SYSVMSG");
173cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
17481090119SPeter Wemm };
17581090119SPeter Wemm 
17681090119SPeter Wemm int
177cb226aaaSPoul-Henning Kamp msgctl(p, uap)
17881090119SPeter Wemm 	struct proc *p;
17981090119SPeter Wemm 	register struct msgctl_args *uap;
18081090119SPeter Wemm {
18181090119SPeter Wemm 	sysv_nosys(p, "SYSVMSG");
182cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
18381090119SPeter Wemm };
18481090119SPeter Wemm 
18581090119SPeter Wemm int
186cb226aaaSPoul-Henning Kamp msgget(p, uap)
18781090119SPeter Wemm 	struct proc *p;
18881090119SPeter Wemm 	register struct msgget_args *uap;
18981090119SPeter Wemm {
19081090119SPeter Wemm 	sysv_nosys(p, "SYSVMSG");
191cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
19281090119SPeter Wemm };
19381090119SPeter Wemm 
19481090119SPeter Wemm int
195cb226aaaSPoul-Henning Kamp msgsnd(p, uap)
19681090119SPeter Wemm 	struct proc *p;
19781090119SPeter Wemm 	register struct msgsnd_args *uap;
19881090119SPeter Wemm {
19981090119SPeter Wemm 	sysv_nosys(p, "SYSVMSG");
200cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
20181090119SPeter Wemm };
20281090119SPeter Wemm 
20381090119SPeter Wemm int
204cb226aaaSPoul-Henning Kamp msgrcv(p, uap)
20581090119SPeter Wemm 	struct proc *p;
20681090119SPeter Wemm 	register struct msgrcv_args *uap;
20781090119SPeter Wemm {
20881090119SPeter Wemm 	sysv_nosys(p, "SYSVMSG");
209cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
21081090119SPeter Wemm };
21181090119SPeter Wemm 
21281090119SPeter Wemm #endif /* !defined(SYSVMSG) */
21381090119SPeter Wemm 
21481090119SPeter Wemm 
21581090119SPeter Wemm #if !defined(SYSVSHM)
21681090119SPeter Wemm 
21781090119SPeter Wemm /*
21881090119SPeter Wemm  * SYSVSHM stubs
21981090119SPeter Wemm  */
22081090119SPeter Wemm 
22181090119SPeter Wemm int
222cb226aaaSPoul-Henning Kamp shmdt(p, uap)
22381090119SPeter Wemm 	struct proc *p;
22481090119SPeter Wemm 	struct shmdt_args *uap;
22581090119SPeter Wemm {
22681090119SPeter Wemm 	sysv_nosys(p, "SYSVSHM");
227cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
22881090119SPeter Wemm };
22981090119SPeter Wemm 
23081090119SPeter Wemm int
231cb226aaaSPoul-Henning Kamp shmat(p, uap)
23281090119SPeter Wemm 	struct proc *p;
23381090119SPeter Wemm 	struct shmat_args *uap;
23481090119SPeter Wemm {
23581090119SPeter Wemm 	sysv_nosys(p, "SYSVSHM");
236cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
23781090119SPeter Wemm };
23881090119SPeter Wemm 
23981090119SPeter Wemm int
240cb226aaaSPoul-Henning Kamp shmctl(p, uap)
24181090119SPeter Wemm 	struct proc *p;
24281090119SPeter Wemm 	struct shmctl_args *uap;
24381090119SPeter Wemm {
24481090119SPeter Wemm 	sysv_nosys(p, "SYSVSHM");
245cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
24681090119SPeter Wemm };
24781090119SPeter Wemm 
24881090119SPeter Wemm int
249cb226aaaSPoul-Henning Kamp shmget(p, uap)
25081090119SPeter Wemm 	struct proc *p;
25181090119SPeter Wemm 	struct shmget_args *uap;
25281090119SPeter Wemm {
25381090119SPeter Wemm 	sysv_nosys(p, "SYSVSHM");
254cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
25581090119SPeter Wemm };
25681090119SPeter Wemm 
25781090119SPeter Wemm int
258cb226aaaSPoul-Henning Kamp shmsys(p, uap)
25981090119SPeter Wemm 	struct proc *p;
26081090119SPeter Wemm 	/* XXX actually varargs. */
26181090119SPeter Wemm 	struct shmsys_args *uap;
26281090119SPeter Wemm {
26381090119SPeter Wemm 	sysv_nosys(p, "SYSVSHM");
264cb226aaaSPoul-Henning Kamp 	return nosys(p, (struct nosys_args *)uap);
26581090119SPeter Wemm };
26681090119SPeter Wemm 
26781090119SPeter Wemm /* called from kern_fork.c */
26881090119SPeter Wemm void
269dabee6feSPeter Wemm shmfork(p1, p2)
27081090119SPeter Wemm 	struct proc *p1, *p2;
27181090119SPeter Wemm {
27281090119SPeter Wemm 	return;
27381090119SPeter Wemm }
27481090119SPeter Wemm 
27581090119SPeter Wemm /* called from kern_exit.c */
27681090119SPeter Wemm void
27781090119SPeter Wemm shmexit(p)
27881090119SPeter Wemm 	struct proc *p;
27981090119SPeter Wemm {
28081090119SPeter Wemm 	return;
28181090119SPeter Wemm }
28281090119SPeter Wemm 
28381090119SPeter Wemm #endif /* !defined(SYSVSHM) */
28481090119SPeter Wemm 
28581090119SPeter Wemm #endif /* !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG) */
286