]> arthur.barton.de Git - netatalk.git/commitdiff
POSIX ACLs VFS/adouble integration
authorFrank Lahm <franklahm@googlemail.com>
Thu, 30 Sep 2010 21:44:01 +0000 (23:44 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Thu, 30 Sep 2010 21:44:01 +0000 (23:44 +0200)
etc/afpd/acls.c
etc/cnid_dbd/Makefile.am
include/atalk/acl.h
include/atalk/vfs.h
libatalk/vfs/vfs.c

index 19b1d95d9f4bda35a432f35c8f7d33f183534092..a3f1d0e4a2e857f3f1d5ee50928c2dea004fc249 100644 (file)
@@ -508,7 +508,6 @@ static int map_aces_darwin_to_posix(const darwin_ace_t *darwin_aces,
     struct group *grp;
     uid_t id;
     uint32_t darwin_ace_flags, darwin_ace_rights;
-    acl_entry_t e;
     acl_tag_t tag;
     acl_perm_t perm;
 
@@ -833,7 +832,7 @@ static int remove_acl(const struct vol *vol,const char *path, int dir)
 {
     int ret = AFP_OK;
 
-#ifdef HAVE_SOLARIS_ACLS
+#if (defined HAVE_SOLARIS_ACLS || defined HAVE_POSIX_ACLS)
     /* Ressource etc. first */
     if ((ret = vol->vfs->vfs_remove_acl(vol, path, dir)) != AFP_OK)
         return ret;
@@ -994,10 +993,13 @@ static int set_acl(const struct vol *vol,
     EC_ZERO_LOG_ERR(acl_valid(acc_acl), AFPERR_MISC);
 
     /* set it */
-    if (def_acl)
-        EC_ZERO_LOG_ERR(acl_set_file(name, ACL_TYPE_DEFAULT, def_acl), AFPERR_MISC);
-
     EC_ZERO_LOG_ERR(acl_set_file(name, ACL_TYPE_ACCESS, acc_acl), AFPERR_MISC);
+    EC_ZERO_LOG_ERR(vol->vfs->vfs_acl(vol, name, ACL_TYPE_ACCESS, 0, acc_acl), AFPERR_MISC);
+
+    if (def_acl) {
+        EC_ZERO_LOG_ERR(acl_set_file(name, ACL_TYPE_DEFAULT, def_acl), AFPERR_MISC);
+        EC_ZERO_LOG_ERR(vol->vfs->vfs_acl(vol, name, ACL_TYPE_DEFAULT, 0, def_acl), AFPERR_MISC);
+    }
 
 EC_CLEANUP:
     acl_free(acc_acl);
index 3f254a3bf065db43197dc810d00e6dcd3c154456..50b3085ebc78aa7f0f40e74afb4564c1b08eec14 100644 (file)
@@ -11,10 +11,10 @@ cnid_dbd_SOURCES = dbif.c pack.c comm.c db_param.c main.c \
                    dbd_add.c dbd_get.c dbd_resolve.c dbd_lookup.c \
                    dbd_update.c dbd_delete.c dbd_getstamp.c \
                    dbd_rebuild_add.c dbd_dbcheck.c
-cnid_dbd_LDADD = $(top_builddir)/libatalk/libatalk.la @BDB_LIBS@
+cnid_dbd_LDADD = $(top_builddir)/libatalk/libatalk.la @BDB_LIBS@ @ACL_LIBS@
 
 cnid_metad_SOURCES = cnid_metad.c usockfd.c db_param.c
-cnid_metad_LDADD = $(top_builddir)/libatalk/libatalk.la
+cnid_metad_LDADD = $(top_builddir)/libatalk/libatalk.la @ACL_LIBS@
 
 dbd_SOURCES = cmd_dbd.c \
        cmd_dbd_scanvol.c \
@@ -26,7 +26,7 @@ dbd_SOURCES = cmd_dbd.c \
        dbd_rebuild_add.c \
        dbd_resolve.c \
        dbd_update.c
-dbd_LDADD = $(top_builddir)/libatalk/libatalk.la @BDB_LIBS@
+dbd_LDADD = $(top_builddir)/libatalk/libatalk.la @BDB_LIBS@ @ACL_LIBS@
 
 noinst_HEADERS = dbif.h pack.h db_param.h dbd.h usockfd.h comm.h cmd_dbd.h
 
index 6b48e5522c1e365a187fb081f2275a81c2704c3d..142ec583c0ecc0baad84115f8c456279012b2dd4 100644 (file)
 #include <sys/acl.h>
 #endif  /* HAVE_SOLARIS_ACLS */
 
+#ifdef HAVE_POSIX_ACLS
+#include <sys/types.h>
+#include <sys/acl.h>
+#endif /* HAVE_POSIX_ACLS */
+
 #ifdef HAVE_SOLARIS_ACLS
 extern int get_nfsv4_acl(const char *name, ace_t **retAces);
 #endif /* HAVE_SOLARIS_ACLS */
index de1c008ce22d2f1b50e82d752cab64d195896fdf..be3fefd467a1b8af0cb5ebd502413303acd84d94 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <atalk/adouble.h>
 #include <atalk/volume.h>
+#include <atalk/acl.h>
 
 #define VFS_FUNC_ARGS_VALIDUPATH const struct vol *vol, const char *name
 #define VFS_FUNC_VARS_VALIDUPATH vol, name
 #define VFS_FUNC_ARGS_COPYFILE const struct vol *vol, int sfd, const char *src, const char *dst
 #define VFS_FUNC_VARS_COPYFILE vol, sfd, src, dst
 
+#ifdef HAVE_SOLARIS_ACLS
 #define VFS_FUNC_ARGS_ACL const struct vol *vol, const char *path, int cmd, int count, void *aces
 #define VFS_FUNC_VARS_ACL vol, path, cmd, count, aces
+#endif
+#ifdef HAVE_POSIX_ACLS
+#define VFS_FUNC_ARGS_ACL const struct vol *vol, const char *path, acl_type_t type, int count, acl_t acl
+#define VFS_FUNC_VARS_ACL vol, path, type, count, acl
+#endif
 
 #define VFS_FUNC_ARGS_REMOVE_ACL const struct vol *vol, const char *path, int dir
 #define VFS_FUNC_VARS_REMOVE_ACL vol, path, dir
index 6b2d5ab27f0f1f2d0f5823e98765fe3bf332fc42..43d37b675cece951c8b8c65f07f79d23ea28a2e8 100644 (file)
@@ -35,6 +35,7 @@
 #include <atalk/vfs.h>
 #include <atalk/directory.h>
 #include <atalk/unix.h>
+#include <atalk/errchk.h>
 
 struct perm {
     uid_t uid;
@@ -372,6 +373,60 @@ static int RF_solaris_remove_acl(VFS_FUNC_ARGS_REMOVE_ACL)
 }
 #endif
 
+#ifdef HAVE_POSIX_ACLS
+static int RF_posix_acl(VFS_FUNC_ARGS_ACL)
+{
+    EC_INIT;
+    static char buf[ MAXPATHLEN + 1];
+    struct stat st;
+    int len;
+
+    if (S_ISDIR(st.st_mode)) {
+        len = snprintf(buf, MAXPATHLEN, "%s/.AppleDouble",path);
+        if (len < 0 || len >=  MAXPATHLEN)
+            EC_FAIL;
+        /* set acl on .AppleDouble dir first */
+        EC_ZERO_LOG(acl_set_file(buf, type, acl));
+
+        if (type == ACL_TYPE_ACCESS)
+            /* set ACL on ressource fork (".Parent") too */
+            EC_ZERO_LOG(acl_set_file(vol->ad_path(path, ADFLAGS_DIR), type, acl));
+    } else {
+        /* set ACL on ressource fork */
+        EC_ZERO_LOG(acl_set_file(vol->ad_path(path, ADFLAGS_HF), type, acl));
+    }
+    
+EC_CLEANUP:
+    if (ret != 0)
+        return AFPERR_MISC;
+    return AFP_OK;
+}
+
+static int RF_posix_remove_acl(VFS_FUNC_ARGS_REMOVE_ACL)
+{
+    EC_INIT;
+    static char buf[ MAXPATHLEN + 1];
+    int len;
+
+    if (dir) {
+        len = snprintf(buf, MAXPATHLEN, "%s/.AppleDouble",path);
+        if (len < 0 || len >=  MAXPATHLEN)
+            return AFPERR_MISC;
+        /* remove ACL from .AppleDouble/.Parent first */
+        EC_ZERO_LOG_ERR(remove_acl_vfs(vol->ad_path(path, ADFLAGS_DIR)), AFPERR_MISC);
+
+        /* now remove from .AppleDouble dir */
+        EC_ZERO_LOG_ERR(remove_acl_vfs(buf), AFPERR_MISC);
+    } else {
+        /* remove ACL from ressource fork */
+        EC_ZERO_LOG_ERR(remove_acl_vfs(vol->ad_path(path, ADFLAGS_HF)), AFPERR_MISC);
+    }
+
+EC_CLEANUP:
+    EC_EXIT;
+}
+#endif
+
 /*********************************************************************************
  * sfm adouble format
  *********************************************************************************/
@@ -996,6 +1051,25 @@ static struct vfs_ops netatalk_solaris_acl_adouble = {
 };
 #endif
 
+#ifdef HAVE_POSIX_ACLS
+static struct vfs_ops netatalk_posix_acl_adouble = {
+    /* validupath:        */ NULL,
+    /* rf_chown:          */ NULL,
+    /* rf_renamedir:      */ NULL,
+    /* rf_deletecurdir:   */ NULL,
+    /* rf_setfilmode:     */ NULL,
+    /* rf_setdirmode:     */ NULL,
+    /* rf_setdirunixmode: */ NULL,
+    /* rf_setdirowner:    */ NULL,
+    /* rf_deletefile:     */ NULL,
+    /* rf_renamefile:     */ NULL,
+    /* vfs_copyfile       */ NULL,
+    /* rf_acl:            */ RF_posix_acl,
+    /* rf_remove_acl      */ RF_posix_remove_acl,
+    NULL
+};
+#endif
+
 /* ---------------- */
 void initvol_vfs(struct vol *vol)
 {
@@ -1030,4 +1104,8 @@ void initvol_vfs(struct vol *vol)
 #ifdef HAVE_SOLARIS_ACLS
     vol->vfs_modules[2] = &netatalk_solaris_acl_adouble;
 #endif
+#ifdef HAVE_POSIX_ACLS
+    vol->vfs_modules[2] = &netatalk_posix_acl_adouble;
+#endif
+
 }