summaryrefslogtreecommitdiff
path: root/lib/mlibc/options/posix/generic/sys-sem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mlibc/options/posix/generic/sys-sem.cpp')
-rw-r--r--lib/mlibc/options/posix/generic/sys-sem.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/mlibc/options/posix/generic/sys-sem.cpp b/lib/mlibc/options/posix/generic/sys-sem.cpp
new file mode 100644
index 0000000..ac3df69
--- /dev/null
+++ b/lib/mlibc/options/posix/generic/sys-sem.cpp
@@ -0,0 +1,51 @@
+
+#include <bits/ensure.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/sem.h>
+
+#include <mlibc/posix-sysdeps.hpp>
+
+int semget(key_t key, int n, int fl) {
+ if(n > USHRT_MAX) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ int id = 0;
+ auto sysdep = MLIBC_CHECK_OR_ENOSYS(mlibc::sys_semget, -1);
+ if(int e = sysdep(key, n, fl, &id); e) {
+ errno = e;
+ return -1;
+ }
+ return id;
+}
+
+int semop(int, struct sembuf *, size_t) {
+ __ensure(!"Not implemented");
+ __builtin_unreachable();
+}
+
+union semun {
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
+};
+
+int semctl(int id, int num, int cmd, ...) {
+ union semun semun;
+ int ret = 0;
+
+ va_list ap;
+ va_start(ap, cmd);
+ semun = va_arg(ap, union semun);
+ va_end(ap);
+
+ auto sysdep = MLIBC_CHECK_OR_ENOSYS(mlibc::sys_semctl, -1);
+ if(int e = sysdep(id, num, cmd, semun.buf, &ret); e) {
+ errno = e;
+ return -1;
+ }
+
+ return ret;
+}