The optional mode argument (open is a vararg function),
was only be read and forwarded if the O_CREAT flag is set.

That is not complete, as O_TMPFILE will require this
argument aswell. Fixed in this commit, and a fallback definition
of O_TMPFILE is added, incase libcobalt is built against an
library lacking this macro.

Signed-off-by: Norbert Lange <norbert.la...@andritz.com>
---
 lib/cobalt/rtdm.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/cobalt/rtdm.c b/lib/cobalt/rtdm.c
index 6b8898e70..176210ddc 100644
--- a/lib/cobalt/rtdm.c
+++ b/lib/cobalt/rtdm.c
@@ -30,6 +30,12 @@
 #include <asm/xenomai/syscall.h>
 #include "internal.h"
 
+/* support for very old c libraries not supporting O_TMPFILE */
+#ifndef O_TMPFILE
+#define O_TMPFILE (020000000 | 0200000)
+#endif
+
+
 static inline int set_errno(int ret)
 {
        if (ret >= 0)
@@ -65,7 +71,7 @@ COBALT_IMPL(int, open, (const char *path, int oflag, ...))
        mode_t mode = 0;
        va_list ap;
 
-       if (oflag & O_CREAT) {
+       if ((oflag & O_CREAT)  || (oflag & O_TMPFILE) == O_TMPFILE) {
                va_start(ap, oflag);
                mode = va_arg(ap, int);
                va_end(ap);
@@ -79,7 +85,7 @@ COBALT_IMPL(int, open64, (const char *path, int oflag, ...))
        mode_t mode = 0;
        va_list ap;
 
-       if (oflag & O_CREAT) {
+       if ((oflag & O_CREAT)  || (oflag & O_TMPFILE) == O_TMPFILE) {
                va_start(ap, oflag);
                mode = va_arg(ap, int);
                va_end(ap);
-- 
2.20.1


Reply via email to