]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: Add open_tree_attr() syscall wrapper
authorDaanDeMeyer <daan.j.demeyer@gmail.com>
Fri, 4 Jul 2025 18:18:39 +0000 (20:18 +0200)
committerDaanDeMeyer <daan.j.demeyer@gmail.com>
Mon, 7 Jul 2025 11:35:47 +0000 (13:35 +0200)
meson.build
src/basic/include/sys/mount.h
src/basic/missing_syscall_def.h
src/basic/missing_syscalls.py

index 55874ee6c6adef9ad4ef027b3a1b24e50f293b09..127daa419b712448a1518ec9a670e9bbbdffc9a4 100644 (file)
@@ -607,6 +607,7 @@ foreach ident : [
         ['pivot_root',        '''#include <sys/syscall.h>'''],  # no known header declares pivot_root
         ['setxattrat',        '''#include <sys/xattr.h>'''],    # no known header declares setxattrat
         ['removexattrat',     '''#include <sys/xattr.h>'''],    # no known header declares removexattrat
+        ['open_tree_attr',    '''#include <sys/mount.h>'''],    # no known header declares open_tree_attr
 ]
 
         have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
index 3f42a61233c5e1b929ea10ad224fc6ea2ae5bbe1..3c9cd8ef5bdbfe88196f897293679ba8a7d0b197 100644 (file)
@@ -120,3 +120,13 @@ static inline int missing_mount_setattr(int dfd, const char *path, unsigned flag
 }
 #  define mount_setattr missing_mount_setattr
 #endif
+
+#if HAVE_OPEN_TREE_ATTR
+extern int open_tree_attr(int __dfd, const char *__filename, unsigned int __flags, struct mount_attr *__uattr, size_t __usize) __THROW;
+#else
+static inline int missing_open_tree_attr(int dfd, const char *filename, unsigned int flags, struct mount_attr *attr, size_t size) {
+        return syscall(__NR_open_tree_attr, dfd, filename, flags, attr, size);
+}
+
+#  define open_tree_attr missing_open_tree_attr
+#endif
index 4db051a0b09b3a1edde0092437d4686b3f1eebb0..a34cb36f14d912d7f465b454c4b3b72952e25bfe 100644 (file)
@@ -517,3 +517,71 @@ _Static_assert(__NR_setxattrat == systemd_NR_setxattrat, "");
 #    endif
 #  endif
 #endif
+
+#ifndef __IGNORE_open_tree_attr
+#  if defined(__aarch64__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__alpha__)
+#    define systemd_NR_open_tree_attr 577
+#  elif defined(__arc__) || defined(__tilegx__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__arm__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__i386__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__ia64__)
+#    define systemd_NR_open_tree_attr -1
+#  elif defined(__loongarch_lp64)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__m68k__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(_MIPS_SIM)
+#    if _MIPS_SIM == _MIPS_SIM_ABI32
+#      define systemd_NR_open_tree_attr 4467
+#    elif _MIPS_SIM == _MIPS_SIM_NABI32
+#      define systemd_NR_open_tree_attr 6467
+#    elif _MIPS_SIM == _MIPS_SIM_ABI64
+#      define systemd_NR_open_tree_attr 5467
+#    else
+#      error "Unknown MIPS ABI"
+#    endif
+#  elif defined(__hppa__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__powerpc__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__riscv)
+#    if __riscv_xlen == 32
+#      define systemd_NR_open_tree_attr 467
+#    elif __riscv_xlen == 64
+#      define systemd_NR_open_tree_attr 467
+#    else
+#      error "Unknown RISC-V ABI"
+#    endif
+#  elif defined(__s390__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__sparc__)
+#    define systemd_NR_open_tree_attr 467
+#  elif defined(__x86_64__)
+#    if defined(__ILP32__)
+#      define systemd_NR_open_tree_attr (467 | /* __X32_SYSCALL_BIT */ 0x40000000)
+#    else
+#      define systemd_NR_open_tree_attr 467
+#    endif
+#  elif !defined(missing_arch_template)
+#    warning "open_tree_attr() syscall number is unknown for your architecture"
+#  endif
+
+/* may be an (invalid) negative number due to libseccomp, see PR 13319 */
+#  if defined __NR_open_tree_attr && __NR_open_tree_attr >= 0
+#    if defined systemd_NR_open_tree_attr
+_Static_assert(__NR_open_tree_attr == systemd_NR_open_tree_attr, "");
+#    endif
+#  else
+#    if defined __NR_open_tree_attr
+#      undef __NR_open_tree_attr
+#    endif
+#    if defined systemd_NR_open_tree_attr && systemd_NR_open_tree_attr >= 0
+#      define __NR_open_tree_attr systemd_NR_open_tree_attr
+#    endif
+#  endif
+#endif
index 646ab4e34e3663d43a9a66e40d99312e0da69115..dd26b76b4c93dc5ba4831c0d4344cab02b236f0a 100644 (file)
@@ -9,6 +9,7 @@ SYSCALLS = [
     'close_range',   # defined in glibc header since glibc-2.33
     'fchmodat2',     # defined in glibc header since glibc-2.39
     'mount_setattr', # defined in glibc header since glibc-2.34
+    'open_tree_attr',
     'openat2',       # defined in glibc header since glibc-2.32
     'quotactl_fd',   # defined in glibc header since glibc-2.35
     'removexattrat',