sysv_sem.c (41774) | sysv_sem.c (46116) |
---|---|
1/* $Id: sysv_sem.c,v 1.21 1998/03/30 09:50:41 phk Exp $ */ | 1/* $Id: sysv_sem.c,v 1.22 1998/12/14 08:34:55 dillon Exp $ */ |
2 3/* 4 * Implementation of SVID semaphores 5 * 6 * Author: Daniel Boulet 7 * 8 * This software is provided ``AS IS'' without any warranties of any kind. 9 */ --- 344 unchanged lines hidden (view full) --- 354 semaptr->sem_perm.seq != IPCID_TO_SEQ(uap->semid)) 355 return(EINVAL); 356 357 eval = 0; 358 rval = 0; 359 360 switch (cmd) { 361 case IPC_RMID: | 2 3/* 4 * Implementation of SVID semaphores 5 * 6 * Author: Daniel Boulet 7 * 8 * This software is provided ``AS IS'' without any warranties of any kind. 9 */ --- 344 unchanged lines hidden (view full) --- 354 semaptr->sem_perm.seq != IPCID_TO_SEQ(uap->semid)) 355 return(EINVAL); 356 357 eval = 0; 358 rval = 0; 359 360 switch (cmd) { 361 case IPC_RMID: |
362 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_M))) | 362 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_M))) |
363 return(eval); 364 semaptr->sem_perm.cuid = cred->cr_uid; 365 semaptr->sem_perm.uid = cred->cr_uid; 366 semtot -= semaptr->sem_nsems; 367 for (i = semaptr->sem_base - sem; i < semtot; i++) 368 sem[i] = sem[i + semaptr->sem_nsems]; 369 for (i = 0; i < seminfo.semmni; i++) { 370 if ((sema[i].sem_perm.mode & SEM_ALLOC) && 371 sema[i].sem_base > semaptr->sem_base) 372 sema[i].sem_base -= semaptr->sem_nsems; 373 } 374 semaptr->sem_perm.mode = 0; 375 semundo_clear(semid, -1); 376 wakeup((caddr_t)semaptr); 377 break; 378 379 case IPC_SET: | 363 return(eval); 364 semaptr->sem_perm.cuid = cred->cr_uid; 365 semaptr->sem_perm.uid = cred->cr_uid; 366 semtot -= semaptr->sem_nsems; 367 for (i = semaptr->sem_base - sem; i < semtot; i++) 368 sem[i] = sem[i + semaptr->sem_nsems]; 369 for (i = 0; i < seminfo.semmni; i++) { 370 if ((sema[i].sem_perm.mode & SEM_ALLOC) && 371 sema[i].sem_base > semaptr->sem_base) 372 sema[i].sem_base -= semaptr->sem_nsems; 373 } 374 semaptr->sem_perm.mode = 0; 375 semundo_clear(semid, -1); 376 wakeup((caddr_t)semaptr); 377 break; 378 379 case IPC_SET: |
380 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_M))) | 380 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_M))) |
381 return(eval); 382 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 383 return(eval); 384 if ((eval = copyin(real_arg.buf, (caddr_t)&sbuf, 385 sizeof(sbuf))) != 0) 386 return(eval); 387 semaptr->sem_perm.uid = sbuf.sem_perm.uid; 388 semaptr->sem_perm.gid = sbuf.sem_perm.gid; 389 semaptr->sem_perm.mode = (semaptr->sem_perm.mode & ~0777) | 390 (sbuf.sem_perm.mode & 0777); 391 semaptr->sem_ctime = time_second; 392 break; 393 394 case IPC_STAT: | 381 return(eval); 382 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 383 return(eval); 384 if ((eval = copyin(real_arg.buf, (caddr_t)&sbuf, 385 sizeof(sbuf))) != 0) 386 return(eval); 387 semaptr->sem_perm.uid = sbuf.sem_perm.uid; 388 semaptr->sem_perm.gid = sbuf.sem_perm.gid; 389 semaptr->sem_perm.mode = (semaptr->sem_perm.mode & ~0777) | 390 (sbuf.sem_perm.mode & 0777); 391 semaptr->sem_ctime = time_second; 392 break; 393 394 case IPC_STAT: |
395 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R))) | 395 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_R))) |
396 return(eval); 397 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 398 return(eval); 399 eval = copyout((caddr_t)semaptr, real_arg.buf, 400 sizeof(struct semid_ds)); 401 break; 402 403 case GETNCNT: | 396 return(eval); 397 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 398 return(eval); 399 eval = copyout((caddr_t)semaptr, real_arg.buf, 400 sizeof(struct semid_ds)); 401 break; 402 403 case GETNCNT: |
404 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R))) | 404 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_R))) |
405 return(eval); 406 if (semnum < 0 || semnum >= semaptr->sem_nsems) 407 return(EINVAL); 408 rval = semaptr->sem_base[semnum].semncnt; 409 break; 410 411 case GETPID: | 405 return(eval); 406 if (semnum < 0 || semnum >= semaptr->sem_nsems) 407 return(EINVAL); 408 rval = semaptr->sem_base[semnum].semncnt; 409 break; 410 411 case GETPID: |
412 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R))) | 412 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_R))) |
413 return(eval); 414 if (semnum < 0 || semnum >= semaptr->sem_nsems) 415 return(EINVAL); 416 rval = semaptr->sem_base[semnum].sempid; 417 break; 418 419 case GETVAL: | 413 return(eval); 414 if (semnum < 0 || semnum >= semaptr->sem_nsems) 415 return(EINVAL); 416 rval = semaptr->sem_base[semnum].sempid; 417 break; 418 419 case GETVAL: |
420 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R))) | 420 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_R))) |
421 return(eval); 422 if (semnum < 0 || semnum >= semaptr->sem_nsems) 423 return(EINVAL); 424 rval = semaptr->sem_base[semnum].semval; 425 break; 426 427 case GETALL: | 421 return(eval); 422 if (semnum < 0 || semnum >= semaptr->sem_nsems) 423 return(EINVAL); 424 rval = semaptr->sem_base[semnum].semval; 425 break; 426 427 case GETALL: |
428 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R))) | 428 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_R))) |
429 return(eval); 430 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 431 return(eval); 432 for (i = 0; i < semaptr->sem_nsems; i++) { 433 eval = copyout((caddr_t)&semaptr->sem_base[i].semval, 434 &real_arg.array[i], sizeof(real_arg.array[0])); 435 if (eval != 0) 436 break; 437 } 438 break; 439 440 case GETZCNT: | 429 return(eval); 430 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 431 return(eval); 432 for (i = 0; i < semaptr->sem_nsems; i++) { 433 eval = copyout((caddr_t)&semaptr->sem_base[i].semval, 434 &real_arg.array[i], sizeof(real_arg.array[0])); 435 if (eval != 0) 436 break; 437 } 438 break; 439 440 case GETZCNT: |
441 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_R))) | 441 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_R))) |
442 return(eval); 443 if (semnum < 0 || semnum >= semaptr->sem_nsems) 444 return(EINVAL); 445 rval = semaptr->sem_base[semnum].semzcnt; 446 break; 447 448 case SETVAL: | 442 return(eval); 443 if (semnum < 0 || semnum >= semaptr->sem_nsems) 444 return(EINVAL); 445 rval = semaptr->sem_base[semnum].semzcnt; 446 break; 447 448 case SETVAL: |
449 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_W))) | 449 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_W))) |
450 return(eval); 451 if (semnum < 0 || semnum >= semaptr->sem_nsems) 452 return(EINVAL); 453 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 454 return(eval); 455 semaptr->sem_base[semnum].semval = real_arg.val; 456 semundo_clear(semid, semnum); 457 wakeup((caddr_t)semaptr); 458 break; 459 460 case SETALL: | 450 return(eval); 451 if (semnum < 0 || semnum >= semaptr->sem_nsems) 452 return(EINVAL); 453 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 454 return(eval); 455 semaptr->sem_base[semnum].semval = real_arg.val; 456 semundo_clear(semid, semnum); 457 wakeup((caddr_t)semaptr); 458 break; 459 460 case SETALL: |
461 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_W))) | 461 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_W))) |
462 return(eval); 463 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 464 return(eval); 465 for (i = 0; i < semaptr->sem_nsems; i++) { 466 eval = copyin(&real_arg.array[i], 467 (caddr_t)&semaptr->sem_base[i].semval, 468 sizeof(real_arg.array[0])); 469 if (eval != 0) --- 40 unchanged lines hidden (view full) --- 510 if ((sema[semid].sem_perm.mode & SEM_ALLOC) && 511 sema[semid].sem_perm.key == key) 512 break; 513 } 514 if (semid < seminfo.semmni) { 515#ifdef SEM_DEBUG 516 printf("found public key\n"); 517#endif | 462 return(eval); 463 if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0) 464 return(eval); 465 for (i = 0; i < semaptr->sem_nsems; i++) { 466 eval = copyin(&real_arg.array[i], 467 (caddr_t)&semaptr->sem_base[i].semval, 468 sizeof(real_arg.array[0])); 469 if (eval != 0) --- 40 unchanged lines hidden (view full) --- 510 if ((sema[semid].sem_perm.mode & SEM_ALLOC) && 511 sema[semid].sem_perm.key == key) 512 break; 513 } 514 if (semid < seminfo.semmni) { 515#ifdef SEM_DEBUG 516 printf("found public key\n"); 517#endif |
518 if ((eval = ipcperm(cred, &sema[semid].sem_perm, | 518 if ((eval = ipcperm(p, &sema[semid].sem_perm, |
519 semflg & 0700))) 520 return(eval); 521 if (nsems > 0 && sema[semid].sem_nsems < nsems) { 522#ifdef SEM_DEBUG 523 printf("too small\n"); 524#endif 525 return(EINVAL); 526 } --- 84 unchanged lines hidden (view full) --- 611{ 612 int semid = uap->semid; 613 int nsops = uap->nsops; 614 struct sembuf sops[MAX_SOPS]; 615 register struct semid_ds *semaptr; 616 register struct sembuf *sopptr; 617 register struct sem *semptr; 618 struct sem_undo *suptr = NULL; | 519 semflg & 0700))) 520 return(eval); 521 if (nsems > 0 && sema[semid].sem_nsems < nsems) { 522#ifdef SEM_DEBUG 523 printf("too small\n"); 524#endif 525 return(EINVAL); 526 } --- 84 unchanged lines hidden (view full) --- 611{ 612 int semid = uap->semid; 613 int nsops = uap->nsops; 614 struct sembuf sops[MAX_SOPS]; 615 register struct semid_ds *semaptr; 616 register struct sembuf *sopptr; 617 register struct sem *semptr; 618 struct sem_undo *suptr = NULL; |
619 struct ucred *cred = p->p_ucred; | |
620 int i, j, eval; 621 int do_wakeup, do_undos; 622 623#ifdef SEM_DEBUG 624 printf("call to semop(%d, 0x%x, %d)\n", semid, sops, nsops); 625#endif 626 627 semid = IPCID_TO_IX(semid); /* Convert back to zero origin */ 628 629 if (semid < 0 || semid >= seminfo.semmsl) 630 return(EINVAL); 631 632 semaptr = &sema[semid]; 633 if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0) 634 return(EINVAL); 635 if (semaptr->sem_perm.seq != IPCID_TO_SEQ(uap->semid)) 636 return(EINVAL); 637 | 619 int i, j, eval; 620 int do_wakeup, do_undos; 621 622#ifdef SEM_DEBUG 623 printf("call to semop(%d, 0x%x, %d)\n", semid, sops, nsops); 624#endif 625 626 semid = IPCID_TO_IX(semid); /* Convert back to zero origin */ 627 628 if (semid < 0 || semid >= seminfo.semmsl) 629 return(EINVAL); 630 631 semaptr = &sema[semid]; 632 if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0) 633 return(EINVAL); 634 if (semaptr->sem_perm.seq != IPCID_TO_SEQ(uap->semid)) 635 return(EINVAL); 636 |
638 if ((eval = ipcperm(cred, &semaptr->sem_perm, IPC_W))) { | 637 if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_W))) { |
639#ifdef SEM_DEBUG 640 printf("eval = %d from ipaccess\n", eval); 641#endif 642 return(eval); 643 } 644 645 if (nsops > MAX_SOPS) { 646#ifdef SEM_DEBUG --- 331 unchanged lines hidden --- | 638#ifdef SEM_DEBUG 639 printf("eval = %d from ipaccess\n", eval); 640#endif 641 return(eval); 642 } 643 644 if (nsops > MAX_SOPS) { 645#ifdef SEM_DEBUG --- 331 unchanged lines hidden --- |