mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 21:35:45 +02:00
openat2: supply the missing definitions for building with old headers and new kernel
Apparently Ubuntu 20 has upgraded to kernel 5.15, but still builds things with 5.4 headers. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
parent
874832dc58
commit
ad11db2ee1
@ -1,11 +1,44 @@
|
|||||||
#ifndef CRUCIBLE_OPENAT2_H
|
#ifndef CRUCIBLE_OPENAT2_H
|
||||||
#define CRUCIBLE_OPENAT2_H
|
#define CRUCIBLE_OPENAT2_H
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
// Compatibility for building on old libc for new kernel
|
||||||
|
#include <linux/version.h>
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
|
||||||
|
|
||||||
#include <linux/openat2.h>
|
#include <linux/openat2.h>
|
||||||
|
|
||||||
#include <fcntl.h>
|
#else
|
||||||
#include <sys/syscall.h>
|
|
||||||
#include <unistd.h>
|
#ifndef RESOLVE_NO_XDEV
|
||||||
|
#define RESOLVE_NO_XDEV 1
|
||||||
|
|
||||||
|
// RESOLVE_NO_XDEV was there from the beginning of openat2,
|
||||||
|
// so if that's missing, so is open_how
|
||||||
|
|
||||||
|
struct open_how {
|
||||||
|
__u64 flags;
|
||||||
|
__u64 mode;
|
||||||
|
__u64 resolve;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RESOLVE_NO_MAGICLINKS
|
||||||
|
#define RESOLVE_NO_MAGICLINKS 2
|
||||||
|
#endif
|
||||||
|
#ifndef RESOLVE_NO_SYMLINKS
|
||||||
|
#define RESOLVE_NO_SYMLINKS 4
|
||||||
|
#endif
|
||||||
|
#ifndef RESOLVE_BENEATH
|
||||||
|
#define RESOLVE_BENEATH 8
|
||||||
|
#endif
|
||||||
|
#ifndef RESOLVE_IN_ROOT
|
||||||
|
#define RESOLVE_IN_ROOT 16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // Linux version >= v5.6
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
|
@ -1,5 +1,27 @@
|
|||||||
#include "crucible/openat2.h"
|
#include "crucible/openat2.h"
|
||||||
|
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
|
// Compatibility for building on old libc for new kernel
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0)
|
||||||
|
|
||||||
|
// Every arch that defines this uses 437, except Alpha, where 437 is
|
||||||
|
// mq_getsetattr.
|
||||||
|
|
||||||
|
#ifndef SYS_openat2
|
||||||
|
#ifdef __alpha__
|
||||||
|
#define SYS_openat2 547
|
||||||
|
#else
|
||||||
|
#define SYS_openat2 437
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // Linux version >= v5.6
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -7,7 +29,12 @@ __attribute__((weak))
|
|||||||
openat2(int const dirfd, const char *const pathname, struct open_how *const how, size_t const size)
|
openat2(int const dirfd, const char *const pathname, struct open_how *const how, size_t const size)
|
||||||
throw()
|
throw()
|
||||||
{
|
{
|
||||||
|
#ifdef SYS_openat2
|
||||||
return syscall(SYS_openat2, dirfd, pathname, how, size);
|
return syscall(SYS_openat2, dirfd, pathname, how, size);
|
||||||
|
#else
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user