1 /* $FreeBSD: src/sys/kern/sysv_ipc.c,v 1.13.2.2 2000/07/01 14:33:49 bsd Exp $ */ 2 /* $DragonFly: src/sys/kern/sysv_ipc.c,v 1.8 2005/10/08 14:31:26 corecode Exp $ */ 3 /* $NetBSD: sysv_ipc.c,v 1.7 1994/06/29 06:33:11 cgd Exp $ */ 4 5 /* 6 * Copyright (c) 1994 Herb Peyerl <hpeyerl@novatel.ca> 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Herb Peyerl. 20 * 4. The name of Herb Peyerl may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #include "opt_sysvipc.h" 36 37 #include <sys/param.h> 38 #include <sys/ipc.h> 39 #include <sys/proc.h> 40 #include <sys/ucred.h> 41 42 #if defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG) 43 44 /* 45 * Check for ipc permission 46 */ 47 48 int 49 ipcperm(struct proc *p, struct ipc_perm *perm, int mode) 50 { 51 struct ucred *cred = p->p_ucred; 52 53 /* Check for user match. */ 54 if (cred->cr_uid != perm->cuid && cred->cr_uid != perm->uid) { 55 if (mode & IPC_M) 56 return (suser_cred(cred, 0) == 0 ? 0 : EPERM); 57 /* Check for group match. */ 58 mode >>= 3; 59 if (!groupmember(perm->gid, cred) && 60 !groupmember(perm->cgid, cred)) 61 /* Check for `other' match. */ 62 mode >>= 3; 63 } 64 65 if (mode & IPC_M) 66 return (0); 67 return ((mode & perm->mode) == mode || 68 suser_cred(cred, 0) == 0 ? 0 : EACCES); 69 } 70 71 #endif /* defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG) */ 72 73 74 #if !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG) 75 76 #include <sys/proc.h> 77 #include <sys/sem.h> 78 #include <sys/shm.h> 79 #include <sys/syslog.h> 80 #include <sys/sysproto.h> 81 #include <sys/systm.h> 82 83 static void sysv_nosys (char *s); 84 85 static void 86 sysv_nosys(char *s) 87 { 88 struct thread *td = curthread; 89 struct proc *p = td->td_proc; 90 91 log(LOG_ERR, "cmd %s pid %d tried to use non-present %s\n", 92 (p ? p->p_comm : td->td_comm), 93 (p ? p->p_pid : -1), s); 94 } 95 96 #if !defined(SYSVSEM) 97 98 /* 99 * SYSVSEM stubs 100 */ 101 102 int 103 semsys(struct semsys_args *uap) 104 { 105 sysv_nosys("SYSVSEM"); 106 return nosys((struct nosys_args *)uap); 107 }; 108 109 int 110 __semctl(struct __semctl_args *uap) 111 { 112 sysv_nosys("SYSVSEM"); 113 return nosys((struct nosys_args *)uap); 114 }; 115 116 int 117 semget(struct semget_args *uap) 118 { 119 sysv_nosys("SYSVSEM"); 120 return nosys((struct nosys_args *)uap); 121 }; 122 123 int 124 semop(struct semop_args *uap) 125 { 126 sysv_nosys("SYSVSEM"); 127 return nosys((struct nosys_args *)uap); 128 }; 129 130 /* called from kern_exit.c */ 131 void 132 semexit(struct proc *p) 133 { 134 /* empty */ 135 } 136 137 #endif /* !defined(SYSVSEM) */ 138 139 140 #if !defined(SYSVMSG) 141 142 /* 143 * SYSVMSG stubs 144 * 145 * note: msgsys args actually var-args? YYYY 146 */ 147 148 int 149 msgsys(struct msgsys_args *uap) 150 { 151 sysv_nosys("SYSVMSG"); 152 return nosys((struct nosys_args *)uap); 153 }; 154 155 int 156 msgctl(struct msgctl_args *uap) 157 { 158 sysv_nosys("SYSVMSG"); 159 return nosys((struct nosys_args *)uap); 160 }; 161 162 int 163 msgget(struct msgget_args *uap) 164 { 165 sysv_nosys("SYSVMSG"); 166 return nosys((struct nosys_args *)uap); 167 }; 168 169 int 170 msgsnd(struct msgsnd_args *uap) 171 { 172 sysv_nosys("SYSVMSG"); 173 return nosys((struct nosys_args *)uap); 174 }; 175 176 int 177 msgrcv(struct msgrcv_args *uap) 178 { 179 sysv_nosys("SYSVMSG"); 180 return nosys((struct nosys_args *)uap); 181 }; 182 183 #endif /* !defined(SYSVMSG) */ 184 185 186 #if !defined(SYSVSHM) 187 188 /* 189 * SYSVSHM stubs 190 */ 191 192 int 193 shmdt(struct shmdt_args *uap) 194 { 195 sysv_nosys("SYSVSHM"); 196 return nosys((struct nosys_args *)uap); 197 }; 198 199 int 200 shmat(struct shmat_args *uap) 201 { 202 sysv_nosys("SYSVSHM"); 203 return nosys((struct nosys_args *)uap); 204 }; 205 206 int 207 shmctl(struct shmctl_args *uap) 208 { 209 sysv_nosys("SYSVSHM"); 210 return nosys((struct nosys_args *)uap); 211 }; 212 213 int 214 shmget(struct shmget_args *uap) 215 { 216 sysv_nosys("SYSVSHM"); 217 return nosys((struct nosys_args *)uap); 218 }; 219 220 /* XXX actually varargs. */ 221 int 222 shmsys(struct shmsys_args *uap) 223 { 224 sysv_nosys("SYSVSHM"); 225 return nosys((struct nosys_args *)uap); 226 }; 227 228 /* called from kern_fork.c */ 229 void 230 shmfork(struct proc *p1, struct proc *p2) 231 { 232 /* empty */ 233 } 234 235 /* called from kern_exit.c */ 236 void 237 shmexit(struct vmspace *vm) 238 { 239 /* empty */ 240 } 241 242 #endif /* !defined(SYSVSHM) */ 243 244 #endif /* !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG) */ 245