Files
linux-stable-mirror/tools/include/nolibc/fcntl.h
T
Thomas Weißschuh 219d120c19 tools/nolibc: always pass mode to open syscall
When O_TMPFILE is set, the open mode needs to be passed to the kernel as
per the documentation. Currently this is not done.
Instead of checking for O_TMPFILE explicitly and making the conditionals
more complex, just always pass the mode to the kernel. If no value was
passed the mode will be garbage, but the kernel will ignore it anyways.

Fixes: a7604ba149 ("tools/nolibc/sys: make open() take a vararg on the 3rd argument")
Suggested-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/lkml/afRfjdovT6pNtwtP@1wt.eu/
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-3-b4c6c5efa266@weissschuh.net
2026-05-14 17:41:14 +02:00

75 lines
1.6 KiB
C

/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
/*
* fcntl definition for NOLIBC
* Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
*/
/* make sure to include all global symbols */
#include "nolibc.h"
#ifndef _NOLIBC_FCNTL_H
#define _NOLIBC_FCNTL_H
#include "arch.h"
#include "types.h"
#include "sys.h"
#define __nolibc_open_flags(_flags) ((_flags) | O_LARGEFILE)
#define __nolibc_open_mode(_flags) \
({ \
mode_t _mode; \
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]);
*/
static __attribute__((unused))
int _sys_openat(int dirfd, const char *path, int flags, mode_t mode)
{
return __nolibc_syscall4(__NR_openat, dirfd, path, flags, mode);
}
static __attribute__((unused))
int openat(int dirfd, const char *path, int flags, ...)
{
return __sysret(_sys_openat(dirfd, path, __nolibc_open_flags(flags),
__nolibc_open_mode(flags)));
}
/*
* int open(const char *path, int flags[, mode_t mode]);
*/
static __attribute__((unused))
int _sys_open(const char *path, int flags, mode_t mode)
{
return __nolibc_syscall4(__NR_openat, AT_FDCWD, path, flags, mode);
}
static __attribute__((unused))
int open(const char *path, int flags, ...)
{
return __sysret(_sys_open(path, __nolibc_open_flags(flags), __nolibc_open_mode(flags)));
}
/*
* int creat(const char *path, mode_t mode);
*/
static __attribute__((unused))
int creat(const char *path, mode_t mode)
{
return open(path, O_CREAT | O_WRONLY | O_TRUNC, mode);
}
#endif /* _NOLIBC_FCNTL_H */