summaryrefslogtreecommitdiff
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/Kbuild1
-rw-r--r--lib/libc/mqueue/Kbuild9
-rw-r--r--lib/libc/mqueue/mq_close.c7
-rw-r--r--lib/libc/mqueue/mq_getattr.c7
-rw-r--r--lib/libc/mqueue/mq_notify.c15
-rw-r--r--lib/libc/mqueue/mq_open.c26
-rw-r--r--lib/libc/mqueue/mq_receive.c7
-rw-r--r--lib/libc/mqueue/mq_setattr.c8
-rw-r--r--lib/libc/mqueue/mq_timedreceive.c10
-rw-r--r--lib/libc/mqueue/mq_timedsend.c9
-rw-r--r--lib/libc/mqueue/mq_unlink.c22
11 files changed, 121 insertions, 0 deletions
diff --git a/lib/libc/Kbuild b/lib/libc/Kbuild
index 7de874f6..28ef1c99 100644
--- a/lib/libc/Kbuild
+++ b/lib/libc/Kbuild
@@ -19,6 +19,7 @@ obj-y += inttypes/
obj-y += libgen/
obj-y += mman/
obj-y += monetary/
+obj-y += mqueue/
obj-y += msg/
obj-y += poll/
obj-y += pwd/
diff --git a/lib/libc/mqueue/Kbuild b/lib/libc/mqueue/Kbuild
new file mode 100644
index 00000000..52c3dbbc
--- /dev/null
+++ b/lib/libc/mqueue/Kbuild
@@ -0,0 +1,9 @@
+obj-y += mq_close.o
+obj-y += mq_getattr.o
+obj-y += mq_notify.o
+obj-y += mq_open.o
+obj-y += mq_receive.o
+obj-y += mq_setattr.o
+obj-y += mq_timedreceive.o
+obj-y += mq_timedsend.o
+obj-y += mq_unlink.o
diff --git a/lib/libc/mqueue/mq_close.c b/lib/libc/mqueue/mq_close.c
new file mode 100644
index 00000000..50877fb1
--- /dev/null
+++ b/lib/libc/mqueue/mq_close.c
@@ -0,0 +1,7 @@
+#include <mqueue.h>
+#include <syscall.h>
+
+int mq_close(mqd_t mqdes)
+{
+ return syscall(close, mqdes);
+}
diff --git a/lib/libc/mqueue/mq_getattr.c b/lib/libc/mqueue/mq_getattr.c
new file mode 100644
index 00000000..f5ca62de
--- /dev/null
+++ b/lib/libc/mqueue/mq_getattr.c
@@ -0,0 +1,7 @@
+#include <mqueue.h>
+#include <syscall.h>
+
+int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat)
+{
+ return mq_setattr(mqdes, 0, mqstat);
+}
diff --git a/lib/libc/mqueue/mq_notify.c b/lib/libc/mqueue/mq_notify.c
new file mode 100644
index 00000000..a7617375
--- /dev/null
+++ b/lib/libc/mqueue/mq_notify.c
@@ -0,0 +1,15 @@
+#include <mqueue.h>
+#include <signal.h>
+#include <syscall.h>
+
+int mq_notify(mqd_t mqdes, const struct sigevent *notification)
+{
+ if (notification == NULL ||
+ notification->sigev_notify != SIGEV_THREAD) {
+ return syscall(mq_notify, mqdes, notification);
+ }
+
+ // TODO: implement SIGEV_THREAD notification
+ errno = ENOSYS;
+ return -1;
+}
diff --git a/lib/libc/mqueue/mq_open.c b/lib/libc/mqueue/mq_open.c
new file mode 100644
index 00000000..15ae9e18
--- /dev/null
+++ b/lib/libc/mqueue/mq_open.c
@@ -0,0 +1,26 @@
+#include <fcntl.h>
+#include <mqueue.h>
+#include <stdarg.h>
+#include <syscall.h>
+
+mqd_t mq_open(const char *name, int oflag, ...)
+{
+ mode_t mode;
+ struct mq_attr *attr;
+
+ if (*name == '/')
+ name++;
+
+ if (oflag & O_CREAT) {
+ va_list ap;
+ va_start(ap, oflag);
+ mode = va_arg(ap, mode_t);
+ attr = va_arg(ap, struct mq_attr *);
+ va_end(ap);
+ } else {
+ mode = 0;
+ attr = 0;
+ }
+
+ return syscall(mq_open, name, oflag, mode, attr);
+}
diff --git a/lib/libc/mqueue/mq_receive.c b/lib/libc/mqueue/mq_receive.c
new file mode 100644
index 00000000..98d3cd9e
--- /dev/null
+++ b/lib/libc/mqueue/mq_receive.c
@@ -0,0 +1,7 @@
+#include <mqueue.h>
+
+ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len,
+ unsigned *msg_prio)
+{
+ return mq_timedreceive(mqdes, msg_ptr, msg_len, msg_prio, 0);
+}
diff --git a/lib/libc/mqueue/mq_setattr.c b/lib/libc/mqueue/mq_setattr.c
new file mode 100644
index 00000000..be2a3b3d
--- /dev/null
+++ b/lib/libc/mqueue/mq_setattr.c
@@ -0,0 +1,8 @@
+#include <mqueue.h>
+#include <syscall.h>
+
+int mq_setattr(mqd_t mqdes, const struct mq_attr *restrict mqstat,
+ struct mq_attr *restrict omqstat)
+{
+ return syscall(mq_getsetattr, mqdes, mqstat, omqstat);
+}
diff --git a/lib/libc/mqueue/mq_timedreceive.c b/lib/libc/mqueue/mq_timedreceive.c
new file mode 100644
index 00000000..bf877fa5
--- /dev/null
+++ b/lib/libc/mqueue/mq_timedreceive.c
@@ -0,0 +1,10 @@
+#include <mqueue.h>
+#include <syscall.h>
+
+ssize_t mq_timedreceive(mqd_t mqdes, char *restrict msg_ptr, size_t msg_len,
+ unsigned *restrict msg_prio,
+ const struct timespec *restrict abstime)
+{
+ return syscall(mq_timedreceive, mqdes, msg_ptr, msg_len, msg_prio,
+ abstime);
+}
diff --git a/lib/libc/mqueue/mq_timedsend.c b/lib/libc/mqueue/mq_timedsend.c
new file mode 100644
index 00000000..228a5d06
--- /dev/null
+++ b/lib/libc/mqueue/mq_timedsend.c
@@ -0,0 +1,9 @@
+#include <mqueue.h>
+#include <syscall.h>
+
+int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len,
+ unsigned msg_prio, const struct timespec *abstime)
+{
+ return syscall(mq_timedsend, mqdes, msg_ptr, msg_len, msg_prio,
+ abstime);
+}
diff --git a/lib/libc/mqueue/mq_unlink.c b/lib/libc/mqueue/mq_unlink.c
new file mode 100644
index 00000000..d136f109
--- /dev/null
+++ b/lib/libc/mqueue/mq_unlink.c
@@ -0,0 +1,22 @@
+#include <mqueue.h>
+#include <syscall.h>
+
+int mq_unlink(const char *name)
+{
+ int r;
+
+ if (*name == '/')
+ name++;
+
+ r = __syscall(mq_unlink, name);
+
+ if (r < 0) {
+ // Correct errno for POSIX compliance
+ if (r == -EPERM)
+ r = -EACCES;
+ errno = -r;
+ return -1;
+ }
+
+ return r;
+}