diff options
| author | Kacper <kacper@mail.openlinux.dev> | 2025-12-15 14:42:29 +0100 |
|---|---|---|
| committer | Kacper <kacper@mail.openlinux.dev> | 2025-12-15 14:42:29 +0100 |
| commit | 7cd3b7caee10d62f7be674afb86a136bf30485d6 (patch) | |
| tree | 121a8c79114174b765713387187d930b102f760f /lib/libc/mqueue | |
| parent | 3b3325f761b09ebbfef04c44eed546cc4fdeb329 (diff) | |
Add mqueue rt api, add header tests
Diffstat (limited to 'lib/libc/mqueue')
| -rw-r--r-- | lib/libc/mqueue/Kbuild | 9 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_close.c | 7 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_getattr.c | 7 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_notify.c | 15 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_open.c | 26 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_receive.c | 7 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_setattr.c | 8 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_timedreceive.c | 10 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_timedsend.c | 9 | ||||
| -rw-r--r-- | lib/libc/mqueue/mq_unlink.c | 22 |
10 files changed, 120 insertions, 0 deletions
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; +} |
