about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/bits/openat2.h
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2024-04-23 16:45:59 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2024-04-23 16:53:42 -0300
commit921efb18ef26cc0dcd024b083a7b22b6d2ccbc0d (patch)
tree98d9659a9195ad5277f66e20a9a449aca2f681dd /sysdeps/unix/sysv/linux/bits/openat2.h
parentf4724843ada64a51d66f65d3199fe431f9d4c254 (diff)
downloadglibc-921efb18ef26cc0dcd024b083a7b22b6d2ccbc0d.tar.gz
glibc-921efb18ef26cc0dcd024b083a7b22b6d2ccbc0d.tar.xz
glibc-921efb18ef26cc0dcd024b083a7b22b6d2ccbc0d.zip
linux: Add openat2 (BZ 31664) azanella/bz31664-openat2
It was added on Linux 5.6, as an extension of openat.  Different
than other open-like function, the kernel only provides the LFS
variant (so files larger than 4GB always succeed, as other functions
with offset larget than off_t).  Similar to other open function,
the new symbol is a cancellable entrypoint.

The testcase added only stress some of the syscall provided
functionalities and it is based on existent kernel selftest.  Since
the prototype does not use variadic arguments, there is no need to
add fortify wrapper to catch wrong usages.

Checked on x86_64-linux-gnu.
Diffstat (limited to 'sysdeps/unix/sysv/linux/bits/openat2.h')
-rw-r--r--sysdeps/unix/sysv/linux/bits/openat2.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/bits/openat2.h b/sysdeps/unix/sysv/linux/bits/openat2.h
new file mode 100644
index 0000000000..a07984dace
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/openat2.h
@@ -0,0 +1,61 @@
+/* openat2 definition.  Linux specific.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef	_FCNTL_H
+# error "Never use <bits/openat2.h> directly; include <fcntl.h> instead."
+#endif
+
+#ifndef __glibc_has_open_how
+/* Arguments for how openat2 should open the target path.  */
+struct open_how
+{
+  __uint64_t flags;
+  __uint64_t mode;
+  __uint64_t resolve;
+};
+#endif
+
+/* how->resolve flags for openat2. */
+#ifndef RESOLVE_NO_XDEV
+# define RESOLVE_NO_XDEV	0x01 /* Block mount-point crossings
+					(includes bind-mounts).  */
+#endif
+#ifndef RESOLVE_NO_MAGICLINKS
+# define RESOLVE_NO_MAGICLINKS	0x02 /* Block traversal through procfs-style
+					"magic-links".  */
+#endif
+#ifndef RESOLVE_NO_SYMLINKS
+# define RESOLVE_NO_SYMLINKS	0x04 /* Block traversal through all symlinks
+					(implies OEXT_NO_MAGICLINKS).  */
+#endif
+#ifndef RESOLVE_BENEATH
+# define RESOLVE_BENEATH	0x08 /* Block "lexical" trickery like
+					"..", symlinks, and absolute
+					paths which escape the dirfd.  */
+#endif
+#ifndef RESOLVE_IN_ROOT
+# define RESOLVE_IN_ROOT	0x10 /* Make all jumps to "/" and ".."
+					be scoped inside the dirfd
+					(similar to chroot).  */
+#endif
+#ifndef RESOLVE_CACHED
+# define RESOLVE_CACHED		0x20 /* Only complete if resolution can be
+					completed through cached lookup. May
+					return -EAGAIN if that's not
+					possible.  */
+#endif