Deleted Added
full compact
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 ---