From 5182c89919ebdaf0c00689ca944b97137bf756f4 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Wed, 11 May 2011 16:29:22 +0200 Subject: [PATCH 1/1] FreeBSD compatibility fixes --- bin/ad/ad.h | 4 +++- bin/ad/ad_cp.c | 6 ++++++ configure.in | 2 ++ etc/afpd/acls.c | 19 ++++++++++++++++++- libatalk/util/socket.c | 18 ++++++++++-------- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/bin/ad/ad.h b/bin/ad/ad.h index 9f8fd4b5..ee22654c 100644 --- a/bin/ad/ad.h +++ b/bin/ad/ad.h @@ -15,7 +15,9 @@ #ifndef AD_H #define AD_H -#define _XOPEN_SOURCE 600 +#if !defined(__FreeBSD__) +# define _XOPEN_SOURCE 600 +#endif #include #include diff --git a/bin/ad/ad_cp.c b/bin/ad/ad_cp.c index ac0a737a..720ea6d3 100644 --- a/bin/ad/ad_cp.c +++ b/bin/ad/ad_cp.c @@ -841,8 +841,14 @@ static int setfile(const struct stat *fs, int fd) islink = !fdval && S_ISLNK(fs->st_mode); mode = fs->st_mode & (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO); +#if defined(__FreeBSD__) + TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atimespec); + TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtimespec); +#else TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atim); TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtim); +#endif + if (utimes(to.p_path, tv)) { SLOG("utimes: %s", to.p_path); rval = 1; diff --git a/configure.in b/configure.in index 48449921..3e6df4d9 100644 --- a/configure.in +++ b/configure.in @@ -1090,6 +1090,8 @@ if test x"$with_acl_support" = x"yes" ; then fi if test x"$with_acl_support" = x"yes" ; then + AC_CHECK_HEADERS([acl/libacl.h]) + AC_CHECK_FUNCS(acl_get_perm_np acl_from_mode) AC_DEFINE(HAVE_ACLS,1,[Whether ACLs support is available]) AC_SUBST(ACL_LIBS) fi diff --git a/etc/afpd/acls.c b/etc/afpd/acls.c index 43e91042..4dd127b1 100644 --- a/etc/afpd/acls.c +++ b/etc/afpd/acls.c @@ -28,6 +28,8 @@ #endif #ifdef HAVE_POSIX_ACLS #include +#endif +#ifdef HAVE_ACL_LIBACL_H #include #endif @@ -342,12 +344,20 @@ static uint32_t posix_permset_to_darwin_rights(acl_entry_t e, int is_dir) EC_ZERO_LOG(acl_get_permset(e, &permset)); +#ifdef HAVE_ACL_GET_PERM_NP + if (acl_get_perm_np(permset, ACL_READ)) +#else if (acl_get_perm(permset, ACL_READ)) +#endif rights = DARWIN_ACE_READ_DATA | DARWIN_ACE_READ_EXTATTRIBUTES | DARWIN_ACE_READ_ATTRIBUTES | DARWIN_ACE_READ_SECURITY; +#ifdef HAVE_ACL_GET_PERM_NP + if (acl_get_perm_np(permset, ACL_WRITE)) { +#else if (acl_get_perm(permset, ACL_WRITE)) { +#endif rights |= DARWIN_ACE_WRITE_DATA | DARWIN_ACE_APPEND_DATA | DARWIN_ACE_WRITE_EXTATTRIBUTES @@ -355,7 +365,11 @@ static uint32_t posix_permset_to_darwin_rights(acl_entry_t e, int is_dir) if (is_dir) rights |= DARWIN_ACE_DELETE_CHILD; } +#ifdef HAVE_ACL_GET_PERM_NP + if (acl_get_perm_np(permset, ACL_EXECUTE)) +#else if (acl_get_perm(permset, ACL_EXECUTE)) +#endif rights |= DARWIN_ACE_EXECUTE; EC_CLEANUP: @@ -1043,8 +1057,11 @@ static int set_acl(const struct vol *vol, /* for files def_acl will be NULL */ /* create access acl from mode */ +#ifdef HAVE_ACL_FROM_MODE EC_NULL_LOG_ERR(acc_acl = acl_from_mode(st.st_mode), AFPERR_MISC); - +#else +#error "Missing acl_from_mode() replacement" +#endif /* adds the clients aces */ EC_ZERO_ERR(map_aces_darwin_to_posix(daces, &def_acl, &acc_acl, ace_count), AFPERR_MISC); diff --git a/libatalk/util/socket.c b/libatalk/util/socket.c index 5bdc03c3..5c938638 100644 --- a/libatalk/util/socket.c +++ b/libatalk/util/socket.c @@ -21,14 +21,16 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ -#ifndef _XOPEN_SOURCE -# define _XOPEN_SOURCE 600 -#endif -#ifndef __EXTENSIONS__ -# define __EXTENSIONS__ -#endif -#ifndef _GNU_SOURCE -# define _GNU_SOURCE +#if !defined(__FreeBSD__) +# ifndef _XOPEN_SOURCE +# define _XOPEN_SOURCE 600 +# endif +# ifndef __EXTENSIONS__ +# define __EXTENSIONS__ +# endif +# ifndef _GNU_SOURCE +# define _GNU_SOURCE +# endif #endif #include #include -- 2.39.2