diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2024-04-22 09:45:54 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2024-04-22 11:19:20 -0400 |
commit | b2d31717511bd21854840bd69875ca80b875137a (patch) | |
tree | 6fff94178bfab41746bcf10e7f5c3f516e9ca92a | |
parent | 569e6758e26e23c27d94c0d132bf5e26ee5af862 (diff) | |
download | bfs-b2d31717511bd21854840bd69875ca80b875137a.tar.xz |
config: Check for acl_get_{entry,tag_type}()
-rw-r--r-- | config/acl-get-entry.c | 8 | ||||
-rw-r--r-- | config/acl-get-tag-type.c | 10 | ||||
-rw-r--r-- | config/header.mk | 2 | ||||
-rw-r--r-- | src/fsade.c | 32 |
4 files changed, 40 insertions, 12 deletions
diff --git a/config/acl-get-entry.c b/config/acl-get-entry.c new file mode 100644 index 0000000..3cce771 --- /dev/null +++ b/config/acl-get-entry.c @@ -0,0 +1,8 @@ +#include <sys/types.h> +#include <sys/acl.h> + +int main(void) { + acl_t acl = acl_get_file(".", ACL_TYPE_DEFAULT); + acl_entry_t entry; + return acl_get_entry(acl, ACL_FIRST_ENTRY, &entry); +} diff --git a/config/acl-get-tag-type.c b/config/acl-get-tag-type.c new file mode 100644 index 0000000..2901956 --- /dev/null +++ b/config/acl-get-tag-type.c @@ -0,0 +1,10 @@ +#include <string.h> +#include <sys/types.h> +#include <sys/acl.h> + +int main(void) { + acl_entry_t entry; + memset(&entry, 0, sizeof(entry)); + acl_tag_t tag; + return acl_get_tag_type(entry, &tag); +} diff --git a/config/header.mk b/config/header.mk index 4da0fd2..c8f8d7c 100644 --- a/config/header.mk +++ b/config/header.mk @@ -9,6 +9,8 @@ include config/exports.mk # All header fragments we generate HEADERS := \ + ${GEN}/acl-get-entry.h \ + ${GEN}/acl-get-tag-type.h \ ${GEN}/acl-is-trivial-np.h \ ${GEN}/aligned-alloc.h \ ${GEN}/confstr.h \ diff --git a/src/fsade.c b/src/fsade.c index 02b12d0..dac2ca6 100644 --- a/src/fsade.c +++ b/src/fsade.c @@ -123,9 +123,19 @@ static bool is_absence_error(int error) { /** Unified interface for incompatible acl_get_entry() implementations. */ static int bfs_acl_entry(acl_t acl, int which, acl_entry_t *entry) { -#if __DragonFly__ && !defined(ACL_FIRST_ENTRY) && !defined(ACL_NEXT_ENTRY) -# define ACL_FIRST_ENTRY 0 -# define ACL_NEXT_ENTRY 1 +#if BFS_HAS_ACL_GET_ENTRY + int ret = acl_get_entry(acl, which, entry); +# if __APPLE__ + // POSIX.1e specifies a return value of 1 for success, but macOS returns 0 instead + return !ret; +# else + return ret; +# endif +#elif __DragonFly__ +# if !defined(ACL_FIRST_ENTRY) && !defined(ACL_NEXT_ENTRY) +# define ACL_FIRST_ENTRY 0 +# define ACL_NEXT_ENTRY 1 +# endif switch (which) { case ACL_FIRST_ENTRY: @@ -142,24 +152,22 @@ static int bfs_acl_entry(acl_t acl, int which, acl_entry_t *entry) { acl_entry_t last = &acl->acl_entry[acl->acl_cnt]; return *entry == last; #else - int ret = acl_get_entry(acl, which, entry); -# if __APPLE__ - // POSIX.1e specifies a return value of 1 for success, but macOS returns 0 instead - return !ret; -# else - return ret; -# endif + errno = ENOTSUP; + return -1; #endif } /** Unified interface for acl_get_tag_type(). */ attr(maybe_unused) static int bfs_acl_tag_type(acl_entry_t entry, acl_tag_t *tag) { -#if __DragonFly__ +#if BFS_HAS_ACL_GET_TAG_TYPE + return acl_get_tag_type(entry, tag); +#elif __DragonFly__ *tag = entry->ae_tag; return 0; #else - return acl_get_tag_type(entry, tag); + errno = ENOTSUP; + return -1; #endif } |