summaryrefslogtreecommitdiff
path: root/do/semop
diff options
context:
space:
mode:
Diffstat (limited to 'do/semop')
-rw-r--r--do/semop27
1 files changed, 27 insertions, 0 deletions
diff --git a/do/semop b/do/semop
new file mode 100644
index 0000000000..9a4ec11f4a
--- /dev/null
+++ b/do/semop
@@ -0,0 +1,27 @@
+int
+do_semop(arglast)
+int *arglast;
+{
+#ifdef HAS_SEM
+ register STR **st = stack->ary_array;
+ register int sp = arglast[0];
+ STR *opstr;
+ char *opbuf;
+ int id, opsize;
+
+ id = (int)str_gnum(st[++sp]);
+ opstr = st[++sp];
+ opbuf = str_get(opstr);
+ opsize = opstr->str_cur;
+ if (opsize < sizeof(struct sembuf)
+ || (opsize % sizeof(struct sembuf)) != 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ errno = 0;
+ return semop(id, (struct sembuf *)opbuf, opsize/sizeof(struct sembuf));
+#else
+ fatal("semop not implemented");
+#endif
+}
+