sysv_ipc.c revision 1.12 1 /* $NetBSD: sysv_ipc.c,v 1.12 1997/05/08 17:16:15 mycroft Exp $ */
2
3 /*
4 * Copyright (c) 1995 Charles M. Hannum. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by Charles M. Hannum.
17 * 4. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #include <sys/param.h>
33 #include <sys/kernel.h>
34 #include <sys/proc.h>
35 #include <sys/ipc.h>
36 #include <sys/systm.h>
37 #include <sys/mount.h>
38 #include <sys/vnode.h>
39 #include <sys/stat.h>
40
41 /*
42 * Check for ipc permission
43 */
44
45 int
46 ipcperm(cred, perm, mode)
47 struct ucred *cred;
48 struct ipc_perm *perm;
49 int mode;
50 {
51 mode_t mask;
52
53 if (cred->cr_uid == 0)
54 return (0);
55
56 if (mode == IPC_M) {
57 if (cred->cr_uid == perm->uid ||
58 cred->cr_uid == perm->cuid)
59 return (0);
60 return (EPERM);
61 }
62
63 mask = 0;
64
65 if (cred->cr_uid == perm->uid ||
66 cred->cr_uid == perm->cuid) {
67 if (mode & IPC_R)
68 mask |= S_IRUSR;
69 if (mode & IPC_W)
70 mask |= S_IWUSR;
71 return ((perm->mode & mask) == mask ? 0 : EACCES);
72 }
73
74 if (cred->cr_gid == perm->gid || groupmember(perm->gid, cred) ||
75 cred->cr_gid == perm->cgid || groupmember(perm->cgid, cred)) {
76 if (mode & IPC_R)
77 mask |= S_IRGRP;
78 if (mode & IPC_W)
79 mask |= S_IWGRP;
80 return ((perm->mode & mask) == mask ? 0 : EACCES);
81 }
82
83 if (mode & IPC_R)
84 mask |= S_IROTH;
85 if (mode & IPC_W)
86 mask |= S_IWOTH;
87 return ((perm->mode & mask) == mask ? 0 : EACCES);
88 }
89