diff options
author | mr <mr@FreeBSD.org> | 2001-09-13 21:06:41 +0000 |
---|---|---|
committer | mr <mr@FreeBSD.org> | 2001-09-13 21:06:41 +0000 |
commit | 30b1089d33d73e2f1ba32d9f419400d07ebf4b27 (patch) | |
tree | 6f692c121a0106d23f1400002b6b06ccecdb6c04 /sys/kern/sysv_sem.c | |
parent | 2afc0f9696c6a8e96538fe9e9ee2184ddb23d2a7 (diff) | |
download | FreeBSD-src-30b1089d33d73e2f1ba32d9f419400d07ebf4b27.zip FreeBSD-src-30b1089d33d73e2f1ba32d9f419400d07ebf4b27.tar.gz |
PR: kern/29698 (part)
Reviewed by: audit
Implement SEM_STAT (like IPC_STAT but treats semid as sema-index).
The linuxerator will need it.
Diffstat (limited to 'sys/kern/sysv_sem.c')
-rw-r--r-- | sys/kern/sysv_sem.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c index a1deec7..81e00b8 100644 --- a/sys/kern/sysv_sem.c +++ b/sys/kern/sysv_sem.c @@ -499,6 +499,25 @@ __semctl(td, uap) goto done2; } + switch(cmd) { + case SEM_STAT: + if (semid < 0 || semid >= seminfo.semmsl) + return(EINVAL); + semaptr = &sema[semid]; + if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0 ) + return(EINVAL); + if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R))) + return(error); + if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0) + return(error); + error = copyout((caddr_t)semaptr, real_arg.buf, + sizeof(struct semid_ds)); + rval = IXSEQ_TO_IPCID(semid,semaptr->sem_perm); + if (error == 0) + td->td_retval[0] = rval; + goto done2; + } + semid = IPCID_TO_IX(semid); if (semid < 0 || semid >= seminfo.semmsl) { error = EINVAL; |