diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c index a1deec7002d4..81e00b8b7d1a 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; diff --git a/sys/sys/sem.h b/sys/sys/sem.h index 736a805e4329..1bed0c31591e 100644 --- a/sys/sys/sem.h +++ b/sys/sys/sem.h @@ -58,6 +58,8 @@ union semun { #define GETZCNT 7 /* Return the value of semzcnt {READ} */ #define SETVAL 8 /* Set the value of semval to arg.val {ALTER} */ #define SETALL 9 /* Set semvals from arg.array {ALTER} */ +#define SEM_STAT 10 /* Like IPC_STAT but treats semid as sema-index */ +#define SEM_INFO 11 /* Like IPC_INFO but treats semid as sema-index */ /* * Permissions