From: Thomas Weißschuh Date: Thu, 14 May 2026 12:05:12 +0000 (+0200) Subject: tools/nolibc: split open mode handling into a macro X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8856027e29c432b2889aad45580d430ca002c87;p=thirdparty%2Flinux.git tools/nolibc: split open mode handling into a macro 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 Acked-by: Willy Tarreau Link: https://patch.msgid.link/20260514-nolibc-open-tmpfile-v2-2-b4c6c5efa266@weissschuh.net --- diff --git a/tools/include/nolibc/fcntl.h b/tools/include/nolibc/fcntl.h index 46f591cf82fd7..d7ea02e1332d8 100644 --- a/tools/include/nolibc/fcntl.h +++ b/tools/include/nolibc/fcntl.h @@ -16,6 +16,21 @@ #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))); } /*