From 5c753ed9cc34497dc7770b3d16022123b1ce4489 Mon Sep 17 00:00:00 2001 From: Ilya Lipnitskiy Date: Sat, 13 Feb 2021 20:05:17 -0800 Subject: [PATCH 6/6] OS X portability OS X portability work from OpenWrt. Cc: Felix Fietkau Signed-off-by: Ilya Lipnitskiy --- configure.ac | 1 + libfakeroot.c | 36 ++++++++++++++++++++++++++++++++++-- wrapawk_macosx | 10 +++++++--- wrapfunc.inp | 4 ++-- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index d85566f..35f9ecf 100644 --- a/configure.ac +++ b/configure.ac @@ -146,6 +146,7 @@ for first in size_t int; do #include #endif #include +#include #ifdef HAVE_GRP_H #include #endif diff --git a/libfakeroot.c b/libfakeroot.c index 169f4da..7593dd6 100644 --- a/libfakeroot.c +++ b/libfakeroot.c @@ -122,8 +122,16 @@ #define INT_SEND_STAT(a,b) SEND_STAT(a,b,_STAT_VER) #define INT_SEND_GET_XATTR(a,b) SEND_GET_XATTR(a,b,_STAT_VER) #define INT_SEND_GET_STAT(a,b) SEND_GET_STAT(a,b) + +/* 10.10 uses id_t in getpriority/setpriority calls, so pretend + id_t is used everywhere, just happens to be int on some OSes */ +#ifndef _ID_T +#define _ID_T +typedef int id_t; +#endif #endif +#include #include #include #include @@ -135,7 +143,6 @@ #include #include #include -#include #ifdef HAVE_SYS_ACL_H #include #endif /* HAVE_SYS_ACL_H */ @@ -198,6 +205,15 @@ extern int unsetenv (const char *name); #undef __lxstat64 #undef _FILE_OFFSET_BITS + +#ifndef AT_EMPTY_PATH +#define AT_EMPTY_PATH 0 +#endif + +#ifndef AT_NO_AUTOMOUNT +#define AT_NO_AUTOMOUNT 0 +#endif + /* // next_wrap_st: // this structure is used in next_wrap, which is defined in @@ -1969,7 +1985,7 @@ ssize_t fremovexattr(int fd, const char *name) } #endif /* HAVE_FREMOVEXATTR */ -int setpriority(int which, int who, int prio){ +int setpriority(int which, id_t who, int prio){ if (fakeroot_disabled) return next_setpriority(which, who, prio); next_setpriority(which, who, prio); @@ -2570,3 +2586,19 @@ int sysinfo(int command, char *buf, long count) } } #endif + +#ifdef HAVE_OPENAT +int openat(int dir_fd, const char *pathname, int flags, ...) +{ + mode_t mode; + + if (flags & O_CREAT) { + va_list args; + va_start(args, flags); + mode = va_arg(args, int); + va_end(args); + } + + return next_openat(dir_fd, pathname, flags, mode); +} +#endif diff --git a/wrapawk_macosx b/wrapawk_macosx index 088a7f4..f783219 100644 --- a/wrapawk_macosx +++ b/wrapawk_macosx @@ -46,26 +46,30 @@ BEGIN{ argtype=$3; argname=$4; MACRO=$5; + argtype_def=$6 + if(!argtype_def) { + argtype_def = argtype + } if(MACRO){ print "extern " ret " MY_DEF(" name ")" argtype " __attribute__((visibility(\"hidden\")));" > headerfile; print "INTERPOSE(MY_DEF(" name "_RAW)," name "_RAW);" > structfile; print "#undef " name > deffile print "#define " name " MY_DEF(" name "_RAW)" > deffile - print "extern " ret, name, argtype ";" > tmpffile; + print "extern " ret, name, argtype_def ";" > tmpffile; print "static __inline__ " ret " NEXT_" MACRO "_NOARG " argtype " __attribute__((always_inline));" > tmpffile; print "static __inline__ " ret " NEXT_" MACRO "_NOARG " argtype " {" > tmpffile; print " return " name, argname ";" > tmpffile; print "}" > tmpffile; print "" > tmpffile; } else { - print "extern " ret " my_" name, argtype " __attribute__((visibility(\"hidden\")));" > headerfile; + print "extern " ret " my_" name, argtype_def " __attribute__((visibility(\"hidden\")));" > headerfile; print "#undef " name > structfile; print "INTERPOSE(my_" name "," name ");" > structfile; print "#define " name " my_" name > structfile print "#define " name " my_" name > deffile - print "extern " ret, name, argtype ";" > tmpffile; + print "extern " ret, name, argtype_def ";" > tmpffile; if(argname){ print "static __inline__ " ret " next_" name, argtype " __attribute__((always_inline));" > tmpffile; print "static __inline__ " ret " next_" name, argtype " {" > tmpffile; diff --git a/wrapfunc.inp b/wrapfunc.inp index f7ad186..556af34 100644 --- a/wrapfunc.inp +++ b/wrapfunc.inp @@ -146,7 +146,7 @@ setfsgid;gid_t;(gid_t fsgid);(fsgid) initgroups;int;(const char *user, INITGROUPS_SECOND_ARG group);(user, group) getgroups;int;(int size, gid_t list[]);(size, list) setgroups;int;(SETGROUPS_SIZE_TYPE size, const gid_t *list);(size, list) -setpriority;int;(int which, int who, int prio);(which, who, prio) +setpriority;int;(int which, id_t who, int prio);(which, who, prio) #ifdef HAVE_CAPSET capset;int;(cap_user_header_t hdrp, const cap_user_data_t datap);(hdrp, datap) #endif /* HAVE_CAPSET */ @@ -198,7 +198,7 @@ fchownat;int;(int dir_fd, const char *path, uid_t owner, gid_t group, int flags) mkdirat;int;(int dir_fd, const char *pathname, mode_t mode);(dir_fd, pathname, mode) #endif /* HAVE_MKDIRAT */ #ifdef HAVE_OPENAT -openat;int;(int dir_fd, const char *pathname, int flags);(dir_fd, pathname, flags) +openat;int;(int dir_fd, const char *pathname, int flags, mode_t mode);(dir_fd, pathname, flags, mode);;(int dir_fd, const char *pathname, int flags, ...) #endif /* HAVE_OPENAT */ #ifdef HAVE_RENAMEAT renameat;int;(int olddir_fd, const char *oldpath, int newdir_fd, const char *newpath);(olddir_fd, oldpath, newdir_fd, newpath) -- 2.30.1