]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tools/nolibc: split open mode handling into a macro
authorThomas Weißschuh <linux@weissschuh.net>
Thu, 14 May 2026 12:05:12 +0000 (14:05 +0200)
committerThomas Weißschuh <linux@weissschuh.net>
Thu, 14 May 2026 15:41:09 +0000 (17:41 +0200)
This logic is duplicated and some upcoming extensions would require even
more duplicated logic.

Move it into a macro to avoid the duplication and allow cleaner changes.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://patch.msgid.link/20260514-nolibc-open-tmpfile-v2-2-b4c6c5efa266@weissschuh.net
tools/include/nolibc/fcntl.h

index 46f591cf82fd7ec67a727e170d6cc54b3a838e7d..d7ea02e1332d85cc444d2ca79e3c3e98e51f8935 100644 (file)
 
 #define __nolibc_open_flags(_flags) ((_flags) | O_LARGEFILE)
 
+#define __nolibc_open_mode(_flags)                                                     \
+({                                                                                     \
+       mode_t _mode = 0;                                                               \
+                                                                                       \
+       if ((_flags) & O_CREAT) {                                                       \
+               va_list args;                                                           \
+                                                                                       \
+               va_start(args, (_flags));                                               \
+               _mode = va_arg(args, mode_t);                                           \
+               va_end(args);                                                           \
+       }                                                                               \
+                                                                                       \
+       _mode;                                                                          \
+})
+
 /*
  * int openat(int dirfd, const char *path, int flags[, mode_t mode]);
  */
@@ -29,17 +44,8 @@ int _sys_openat(int dirfd, const char *path, int flags, mode_t mode)
 static __attribute__((unused))
 int openat(int dirfd, const char *path, int flags, ...)
 {
-       mode_t mode = 0;
-
-       if (flags & O_CREAT) {
-               va_list args;
-
-               va_start(args, flags);
-               mode = va_arg(args, mode_t);
-               va_end(args);
-       }
-
-       return __sysret(_sys_openat(dirfd, path, __nolibc_open_flags(flags), mode));
+       return __sysret(_sys_openat(dirfd, path, __nolibc_open_flags(flags),
+                                                __nolibc_open_mode(flags)));
 }
 
 /*
@@ -55,17 +61,7 @@ int _sys_open(const char *path, int flags, mode_t mode)
 static __attribute__((unused))
 int open(const char *path, int flags, ...)
 {
-       mode_t mode = 0;
-
-       if (flags & O_CREAT) {
-               va_list args;
-
-               va_start(args, flags);
-               mode = va_arg(args, mode_t);
-               va_end(args);
-       }
-
-       return __sysret(_sys_open(path, __nolibc_open_flags(flags), mode));
+       return __sysret(_sys_open(path, __nolibc_open_flags(flags), __nolibc_open_mode(flags)));
 }
 
 /*