aboutsummaryrefslogtreecommitdiff
path: root/REORG.TODO/sysdeps/unix/sysv/linux/mq_open.c
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/sysdeps/unix/sysv/linux/mq_open.c')
-rw-r--r--REORG.TODO/sysdeps/unix/sysv/linux/mq_open.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/unix/sysv/linux/mq_open.c b/REORG.TODO/sysdeps/unix/sysv/linux/mq_open.c
new file mode 100644
index 0000000000..760f2db342
--- /dev/null
+++ b/REORG.TODO/sysdeps/unix/sysv/linux/mq_open.c
@@ -0,0 +1,66 @@
+/* Copyright (C) 2004-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <mqueue.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sysdep.h>
+
+#ifdef __NR_mq_open
+
+/* Establish connection between a process and a message queue NAME and
+ return message queue descriptor or (mqd_t) -1 on error. OFLAG determines
+ the type of access used. If O_CREAT is on OFLAG, the third argument is
+ taken as a `mode_t', the mode of the created message queue, and the fourth
+ argument is taken as `struct mq_attr *', pointer to message queue
+ attributes. If the fourth argument is NULL, default attributes are
+ used. */
+mqd_t
+__mq_open (const char *name, int oflag, ...)
+{
+ if (name[0] != '/')
+ return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
+
+ mode_t mode = 0;
+ struct mq_attr *attr = NULL;
+ 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);
+ }
+
+ return INLINE_SYSCALL (mq_open, 4, name + 1, oflag, mode, attr);
+}
+strong_alias (__mq_open, mq_open);
+
+mqd_t
+__mq_open_2 (const char *name, int oflag)
+{
+ if (oflag & O_CREAT)
+ __fortify_fail ("invalid mq_open call: O_CREAT without mode and attr");
+
+ return __mq_open (name, oflag);
+}
+#else
+# include <rt/mq_open.c>
+#endif