fd-util: Move RAW_O_LARGEFILE and O_ACCMODE_STRICT definitions to fd-util.h (#38051)

This commit is contained in:
Mike Yuan
2025-07-03 22:27:39 +02:00
committed by GitHub
5 changed files with 39 additions and 36 deletions
+32
View File
@@ -18,6 +18,38 @@
#define EBADF_PAIR { -EBADF, -EBADF }
#define EBADF_TRIPLET { -EBADF, -EBADF, -EBADF }
/* So O_LARGEFILE is generally implied by glibc, and defined to zero hence, because we only build in LFS
* mode. However, when invoking fcntl(F_GETFL) the flag is ORed into the result anyway — glibc does not mask
* it away. Which sucks. Let's define the actual value here, so that we can mask it ourselves.
*
* The precise definition is arch specific, so we use the values defined in the kernel (note that some
* are hexa and others are octal; duplicated as-is from the kernel definitions):
* - alpha, arm, arm64, m68k, mips, parisc, powerpc, sparc: each has a specific value;
* - others: they use the "generic" value (defined in include/uapi/asm-generic/fcntl.h) */
#if O_LARGEFILE != 0
# define RAW_O_LARGEFILE O_LARGEFILE
#else
# if defined(__alpha__) || defined(__arm__) || defined(__aarch64__) || defined(__m68k__)
# define RAW_O_LARGEFILE 0400000
# elif defined(__mips__)
# define RAW_O_LARGEFILE 0x2000
# elif defined(__parisc__) || defined(__hppa__)
# define RAW_O_LARGEFILE 000004000
# elif defined(__powerpc__)
# define RAW_O_LARGEFILE 0200000
# elif defined(__sparc__)
# define RAW_O_LARGEFILE 0x40000
# else
# define RAW_O_LARGEFILE 00100000
# endif
#endif
/* On musl, O_ACCMODE is defined as (03|O_SEARCH), unlike glibc which defines it as
* (O_RDONLY|O_WRONLY|O_RDWR). Additionally, O_SEARCH is simply defined as O_PATH. This changes the behaviour
* of O_ACCMODE in certain situations, which we don't want. This definition is copied from glibc and works
* around the problems with musl's definition. */
#define O_ACCMODE_STRICT (O_RDONLY|O_WRONLY|O_RDWR)
int close_nointr(int fd);
int safe_close(int fd);
void safe_close_pair(int p[static 2]);
-32
View File
@@ -13,39 +13,7 @@
#define F_SEAL_EXEC 0x0020 /* prevent chmod modifying exec bits */
#endif
/* So O_LARGEFILE is generally implied by glibc, and defined to zero hence, because we only build in LFS
* mode. However, when invoking fcntl(F_GETFL) the flag is ORed into the result anyway — glibc does not mask
* it away. Which sucks. Let's define the actual value here, so that we can mask it ourselves.
*
* The precise definition is arch specific, so we use the values defined in the kernel (note that some
* are hexa and others are octal; duplicated as-is from the kernel definitions):
* - alpha, arm, arm64, m68k, mips, parisc, powerpc, sparc: each has a specific value;
* - others: they use the "generic" value (defined in include/uapi/asm-generic/fcntl.h) */
#if O_LARGEFILE != 0
#define RAW_O_LARGEFILE O_LARGEFILE
#else
#if defined(__alpha__) || defined(__arm__) || defined(__aarch64__) || defined(__m68k__)
#define RAW_O_LARGEFILE 0400000
#elif defined(__mips__)
#define RAW_O_LARGEFILE 0x2000
#elif defined(__parisc__) || defined(__hppa__)
#define RAW_O_LARGEFILE 000004000
#elif defined(__powerpc__)
#define RAW_O_LARGEFILE 0200000
#elif defined(__sparc__)
#define RAW_O_LARGEFILE 0x40000
#else
#define RAW_O_LARGEFILE 00100000
#endif
#endif
/* This is defined since glibc-2.39. */
#ifndef AT_HANDLE_FID
#define AT_HANDLE_FID AT_REMOVEDIR
#endif
/* On musl, O_ACCMODE is defined as (03|O_SEARCH), unlike glibc which defines it as
* (O_RDONLY|O_WRONLY|O_RDWR). Additionally, O_SEARCH is simply defined as O_PATH. This changes the behaviour
* of O_ACCMODE in certain situations, which we don't want. This definition is copied from glibc and works
* around the problems with musl's definition. */
#define O_ACCMODE_STRICT (O_RDONLY|O_WRONLY|O_RDWR)
+5
View File
@@ -4694,6 +4694,11 @@ bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec, int log
return false;
}
bool journal_file_writable(JournalFile *f) {
assert(f);
return (f->open_flags & O_ACCMODE_STRICT) != O_RDONLY;
}
static const char * const journal_object_type_table[] = {
[OBJECT_UNUSED] = "unused",
[OBJECT_DATA] = "data",
+1 -4
View File
@@ -378,7 +378,4 @@ static inline uint32_t COMPRESSION_TO_HEADER_INCOMPATIBLE_FLAG(Compression c) {
}
}
static inline bool journal_file_writable(JournalFile *f) {
assert(f);
return (f->open_flags & O_ACCMODE_STRICT) != O_RDONLY;
}
bool journal_file_writable(JournalFile *f);
+1
View File
@@ -9,6 +9,7 @@
#include "chattr-util.h"
#include "copy.h"
#include "errno-util.h"
#include "fd-util.h"
#include "journal-authenticate.h"
#include "journal-file-util.h"
#include "log.h"