ibcs2_ipc.c (107839) | ibcs2_ipc.c (107849) |
---|---|
1/* 2 * Copyright (c) 1995 Scott Bartram 3 * Copyright (c) 1995 Steven Wallace 4 * 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: --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * | 1/* 2 * Copyright (c) 1995 Scott Bartram 3 * Copyright (c) 1995 Steven Wallace 4 * 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: --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * |
25 * $FreeBSD: head/sys/i386/ibcs2/ibcs2_ipc.c 107839 2002-12-13 22:41:47Z alfred $ | 25 * $FreeBSD: head/sys/i386/ibcs2/ibcs2_ipc.c 107849 2002-12-14 01:56:26Z alfred $ |
26 */ 27 28#include <sys/param.h> 29#include <sys/systm.h> 30#include <sys/msg.h> 31#include <sys/sem.h> 32#include <sys/shm.h> 33#include <sys/sysproto.h> --- 67 unchanged lines hidden (view full) --- 101 return; 102} 103 104int 105ibcs2_msgsys(td, uap) 106 struct thread *td; 107 struct ibcs2_msgsys_args *uap; 108{ | 26 */ 27 28#include <sys/param.h> 29#include <sys/systm.h> 30#include <sys/msg.h> 31#include <sys/sem.h> 32#include <sys/shm.h> 33#include <sys/sysproto.h> --- 67 unchanged lines hidden (view full) --- 101 return; 102} 103 104int 105ibcs2_msgsys(td, uap) 106 struct thread *td; 107 struct ibcs2_msgsys_args *uap; 108{ |
109 switch (SCARG(uap, which)) { | 109 switch (uap->which) { |
110 case 0: /* msgget */ | 110 case 0: /* msgget */ |
111 SCARG(uap, which) = 1; | 111 uap->which = 1; |
112 return msgsys(td, (struct msgsys_args *)uap); 113 case 1: { /* msgctl */ 114 int error; 115 struct msgsys_args margs; 116 caddr_t sg = stackgap_init(); 117 | 112 return msgsys(td, (struct msgsys_args *)uap); 113 case 1: { /* msgctl */ 114 int error; 115 struct msgsys_args margs; 116 caddr_t sg = stackgap_init(); 117 |
118 SCARG(&margs, which) = 0; 119 SCARG(&margs, a2) = SCARG(uap, a2); 120 SCARG(&margs, a4) = | 118 margs.which = 0; 119 margs.a2 = uap->a2; 120 margs.a4 = |
121 (int)stackgap_alloc(&sg, sizeof(struct msqid_ds)); | 121 (int)stackgap_alloc(&sg, sizeof(struct msqid_ds)); |
122 SCARG(&margs, a3) = SCARG(uap, a3); 123 switch (SCARG(&margs, a3)) { | 122 margs.a3 = uap->a3; 123 switch (margs.a3) { |
124 case IBCS2_IPC_STAT: 125 error = msgsys(td, &margs); 126 if (!error) 127 cvt_msqid2imsqid( | 124 case IBCS2_IPC_STAT: 125 error = msgsys(td, &margs); 126 if (!error) 127 cvt_msqid2imsqid( |
128 (struct msqid_ds *)SCARG(&margs, a4), 129 (struct ibcs2_msqid_ds *)SCARG(uap, a4)); | 128 (struct msqid_ds *)margs.a4, 129 (struct ibcs2_msqid_ds *)uap->a4); |
130 return error; 131 case IBCS2_IPC_SET: | 130 return error; 131 case IBCS2_IPC_SET: |
132 cvt_imsqid2msqid((struct ibcs2_msqid_ds *)SCARG(uap, 133 a4), 134 (struct msqid_ds *)SCARG(&margs, a4)); | 132 cvt_imsqid2msqid((struct ibcs2_msqid_ds *)uap->a4, 133 (struct msqid_ds *)margs.a4); |
135 return msgsys(td, &margs); 136 case IBCS2_IPC_RMID: 137 return msgsys(td, &margs); 138 } 139 return EINVAL; 140 } 141 case 2: /* msgrcv */ | 134 return msgsys(td, &margs); 135 case IBCS2_IPC_RMID: 136 return msgsys(td, &margs); 137 } 138 return EINVAL; 139 } 140 case 2: /* msgrcv */ |
142 SCARG(uap, which) = 3; | 141 uap->which = 3; |
143 return msgsys(td, (struct msgsys_args *)uap); 144 case 3: /* msgsnd */ | 142 return msgsys(td, (struct msgsys_args *)uap); 143 case 3: /* msgsnd */ |
145 SCARG(uap, which) = 2; | 144 uap->which = 2; |
146 return msgsys(td, (struct msgsys_args *)uap); 147 default: 148 return EINVAL; 149 } 150} 151 152/* 153 * iBCS2 semsys call --- 80 unchanged lines hidden (view full) --- 234 235int 236ibcs2_semsys(td, uap) 237 struct thread *td; 238 struct ibcs2_semsys_args *uap; 239{ 240 int error; 241 | 145 return msgsys(td, (struct msgsys_args *)uap); 146 default: 147 return EINVAL; 148 } 149} 150 151/* 152 * iBCS2 semsys call --- 80 unchanged lines hidden (view full) --- 233 234int 235ibcs2_semsys(td, uap) 236 struct thread *td; 237 struct ibcs2_semsys_args *uap; 238{ 239 int error; 240 |
242 switch (SCARG(uap, which)) { | 241 switch (uap->which) { |
243 case 0: /* semctl */ | 242 case 0: /* semctl */ |
244 switch(SCARG(uap, a4)) { | 243 switch(uap->a4) { |
245 case IBCS2_IPC_STAT: 246 { 247 struct ibcs2_semid_ds *isp; 248 struct semid_ds *sp; 249 union semun *sup, ssu; 250 caddr_t sg = stackgap_init(); 251 252 | 244 case IBCS2_IPC_STAT: 245 { 246 struct ibcs2_semid_ds *isp; 247 struct semid_ds *sp; 248 union semun *sup, ssu; 249 caddr_t sg = stackgap_init(); 250 251 |
253 ssu = (union semun) SCARG(uap, a5); | 252 ssu = (union semun) uap->a5; |
254 sp = stackgap_alloc(&sg, sizeof(struct semid_ds)); 255 sup = stackgap_alloc(&sg, sizeof(union semun)); 256 sup->buf = sp; | 253 sp = stackgap_alloc(&sg, sizeof(struct semid_ds)); 254 sup = stackgap_alloc(&sg, sizeof(union semun)); 255 sup->buf = sp; |
257 SCARG(uap, a5) = (int)sup; | 256 uap->a5 = (int)sup; |
258 error = semsys(td, (struct semsys_args *)uap); 259 if (!error) { | 257 error = semsys(td, (struct semsys_args *)uap); 258 if (!error) { |
260 SCARG(uap, a5) = (int)ssu.buf; | 259 uap->a5 = (int)ssu.buf; |
261 isp = stackgap_alloc(&sg, sizeof(*isp)); 262 cvt_semid2isemid(sp, isp); 263 error = copyout((caddr_t)isp, 264 (caddr_t)ssu.buf, 265 sizeof(*isp)); 266 } 267 return error; 268 } 269 case IBCS2_IPC_SET: 270 { 271 struct ibcs2_semid_ds *isp; 272 struct semid_ds *sp; 273 caddr_t sg = stackgap_init(); 274 275 isp = stackgap_alloc(&sg, sizeof(*isp)); 276 sp = stackgap_alloc(&sg, sizeof(*sp)); | 260 isp = stackgap_alloc(&sg, sizeof(*isp)); 261 cvt_semid2isemid(sp, isp); 262 error = copyout((caddr_t)isp, 263 (caddr_t)ssu.buf, 264 sizeof(*isp)); 265 } 266 return error; 267 } 268 case IBCS2_IPC_SET: 269 { 270 struct ibcs2_semid_ds *isp; 271 struct semid_ds *sp; 272 caddr_t sg = stackgap_init(); 273 274 isp = stackgap_alloc(&sg, sizeof(*isp)); 275 sp = stackgap_alloc(&sg, sizeof(*sp)); |
277 error = copyin((caddr_t)SCARG(uap, a5), (caddr_t)isp, | 276 error = copyin((caddr_t)uap->a5, (caddr_t)isp, |
278 sizeof(*isp)); 279 if (error) 280 return error; 281 cvt_isemid2semid(isp, sp); | 277 sizeof(*isp)); 278 if (error) 279 return error; 280 cvt_isemid2semid(isp, sp); |
282 SCARG(uap, a5) = (int)sp; | 281 uap->a5 = (int)sp; |
283 return semsys(td, (struct semsys_args *)uap); 284 } 285 case IBCS2_SETVAL: 286 { 287 union semun *sp; 288 caddr_t sg = stackgap_init(); 289 290 sp = stackgap_alloc(&sg, sizeof(*sp)); | 282 return semsys(td, (struct semsys_args *)uap); 283 } 284 case IBCS2_SETVAL: 285 { 286 union semun *sp; 287 caddr_t sg = stackgap_init(); 288 289 sp = stackgap_alloc(&sg, sizeof(*sp)); |
291 sp->val = (int) SCARG(uap, a5); 292 SCARG(uap, a5) = (int)sp; | 290 sp->val = (int) uap->a5; 291 uap->a5 = (int)sp; |
293 return semsys(td, (struct semsys_args *)uap); 294 } 295 } 296 297 return semsys(td, (struct semsys_args *)uap); 298 299 case 1: /* semget */ 300 return semsys(td, (struct semsys_args *)uap); --- 45 unchanged lines hidden (view full) --- 346 347int 348ibcs2_shmsys(td, uap) 349 struct thread *td; 350 struct ibcs2_shmsys_args *uap; 351{ 352 int error; 353 | 292 return semsys(td, (struct semsys_args *)uap); 293 } 294 } 295 296 return semsys(td, (struct semsys_args *)uap); 297 298 case 1: /* semget */ 299 return semsys(td, (struct semsys_args *)uap); --- 45 unchanged lines hidden (view full) --- 345 346int 347ibcs2_shmsys(td, uap) 348 struct thread *td; 349 struct ibcs2_shmsys_args *uap; 350{ 351 int error; 352 |
354 switch (SCARG(uap, which)) { | 353 switch (uap->which) { |
355 case 0: /* shmat */ 356 return shmsys(td, (struct shmsys_args *)uap); 357 358 case 1: /* shmctl */ | 354 case 0: /* shmat */ 355 return shmsys(td, (struct shmsys_args *)uap); 356 357 case 1: /* shmctl */ |
359 switch(SCARG(uap, a3)) { | 358 switch(uap->a3) { |
360 case IBCS2_IPC_STAT: 361 { 362 struct ibcs2_shmid_ds *isp; 363 struct shmid_ds *sp; 364 caddr_t sg = stackgap_init(); 365 | 359 case IBCS2_IPC_STAT: 360 { 361 struct ibcs2_shmid_ds *isp; 362 struct shmid_ds *sp; 363 caddr_t sg = stackgap_init(); 364 |
366 isp = (struct ibcs2_shmid_ds *)SCARG(uap, a4); | 365 isp = (struct ibcs2_shmid_ds *)uap->a4; |
367 sp = stackgap_alloc(&sg, sizeof(*sp)); | 366 sp = stackgap_alloc(&sg, sizeof(*sp)); |
368 SCARG(uap, a4) = (int)sp; | 367 uap->a4 = (int)sp; |
369 error = shmsys(td, (struct shmsys_args *)uap); 370 if (!error) { | 368 error = shmsys(td, (struct shmsys_args *)uap); 369 if (!error) { |
371 SCARG(uap, a4) = (int)isp; | 370 uap->a4 = (int)isp; |
372 isp = stackgap_alloc(&sg, sizeof(*isp)); 373 cvt_shmid2ishmid(sp, isp); 374 error = copyout((caddr_t)isp, | 371 isp = stackgap_alloc(&sg, sizeof(*isp)); 372 cvt_shmid2ishmid(sp, isp); 373 error = copyout((caddr_t)isp, |
375 (caddr_t)SCARG(uap, a4), | 374 (caddr_t)uap->a4, |
376 sizeof(*isp)); 377 } 378 return error; 379 } 380 case IBCS2_IPC_SET: 381 { 382 struct ibcs2_shmid_ds *isp; 383 struct shmid_ds *sp; 384 caddr_t sg = stackgap_init(); 385 386 isp = stackgap_alloc(&sg, sizeof(*isp)); 387 sp = stackgap_alloc(&sg, sizeof(*sp)); | 375 sizeof(*isp)); 376 } 377 return error; 378 } 379 case IBCS2_IPC_SET: 380 { 381 struct ibcs2_shmid_ds *isp; 382 struct shmid_ds *sp; 383 caddr_t sg = stackgap_init(); 384 385 isp = stackgap_alloc(&sg, sizeof(*isp)); 386 sp = stackgap_alloc(&sg, sizeof(*sp)); |
388 error = copyin((caddr_t)SCARG(uap, a4), (caddr_t)isp, | 387 error = copyin((caddr_t)uap->a4, (caddr_t)isp, |
389 sizeof(*isp)); 390 if (error) 391 return error; 392 cvt_ishmid2shmid(isp, sp); | 388 sizeof(*isp)); 389 if (error) 390 return error; 391 cvt_ishmid2shmid(isp, sp); |
393 SCARG(uap, a4) = (int)sp; | 392 uap->a4 = (int)sp; |
394 return shmsys(td, (struct shmsys_args *)uap); 395 } 396 } 397 398 return shmsys(td, (struct shmsys_args *)uap); 399 400 case 2: /* shmdt */ 401 return shmsys(td, (struct shmsys_args *)uap); 402 403 case 3: /* shmget */ 404 return shmsys(td, (struct shmsys_args *)uap); 405 } 406 return EINVAL; 407} | 393 return shmsys(td, (struct shmsys_args *)uap); 394 } 395 } 396 397 return shmsys(td, (struct shmsys_args *)uap); 398 399 case 2: /* shmdt */ 400 return shmsys(td, (struct shmsys_args *)uap); 401 402 case 3: /* shmget */ 403 return shmsys(td, (struct shmsys_args *)uap); 404 } 405 return EINVAL; 406} |