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;
{
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;
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);
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 \
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
#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 */
#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
#include <atalk/vfs.h>
#include <atalk/directory.h>
#include <atalk/unix.h>
+#include <atalk/errchk.h>
struct perm {
uid_t uid;
}
#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
*********************************************************************************/
};
#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)
{
#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
+
}