mirror of
				https://github.com/Zygo/bees.git
				synced 2025-11-04 04:00:36 +01: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:
		@@ -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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user