summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormr <mr@FreeBSD.org>2001-09-13 21:06:41 +0000
committermr <mr@FreeBSD.org>2001-09-13 21:06:41 +0000
commit30b1089d33d73e2f1ba32d9f419400d07ebf4b27 (patch)
tree6f692c121a0106d23f1400002b6b06ccecdb6c04 /sys
parent2afc0f9696c6a8e96538fe9e9ee2184ddb23d2a7 (diff)
downloadFreeBSD-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')
-rw-r--r--sys/kern/sysv_sem.c19
-rw-r--r--sys/sys/sem.h2
2 files changed, 21 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;
diff --git a/sys/sys/sem.h b/sys/sys/sem.h
index 736a805e4..1bed0c3 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
OpenPOWER on IntegriCloud