From a8856027e29c432b2889aad45580d430ca002c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Thu, 14 May 2026 14:05:12 +0200 Subject: [PATCH] tools/nolibc: split open mode handling into a macro MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- tools/include/nolibc/fcntl.h | 40 ++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/tools/include/nolibc/fcntl.h b/tools/include/nolibc/fcntl.h index 46f591cf82fd..d7ea02e1332d 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))); } /*