python:tests: Store keys as bytes rather than as lists of ints
[samba.git] / source3 / modules / vfs_posixacl.c
index 407a3a1724f7f8733b6e04c578aac696dfdfe52d..feb819de98259dc176651e86cde45a5089e67c27 100644 (file)
 
 static bool smb_ace_to_internal(acl_entry_t posix_ace,
                                struct smb_acl_entry *ace);
-static struct smb_acl_t *smb_acl_to_internal(acl_t acl);
+static struct smb_acl_t *smb_acl_to_internal(acl_t acl, TALLOC_CTX *mem_ctx);
 static int smb_acl_set_mode(acl_entry_t entry, SMB_ACL_PERM_T perm);
 static acl_t smb_acl_to_posix(const struct smb_acl_t *acl);
 
 
 /* public functions - the api */
 
-SMB_ACL_T posixacl_sys_acl_get_file(vfs_handle_struct *handle,
-                                   const char *path_p,
-                                   SMB_ACL_TYPE_T type)
+SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
+                                 files_struct *fsp,
+                                 SMB_ACL_TYPE_T type,
+                                 TALLOC_CTX *mem_ctx)
 {
        struct smb_acl_t *result;
+       acl_t acl = NULL;
        acl_type_t acl_type;
-       acl_t acl;
 
        switch(type) {
        case SMB_ACL_TYPE_ACCESS:
@@ -52,43 +53,42 @@ SMB_ACL_T posixacl_sys_acl_get_file(vfs_handle_struct *handle,
                errno = EINVAL;
                return NULL;
        }
-
-       acl = acl_get_file(path_p, acl_type);
-
-       if (acl == NULL) {
-               return NULL;
+       if (!fsp->fsp_flags.is_pathref && (acl_type == ACL_TYPE_ACCESS)) {
+               /* POSIX API only allows ACL_TYPE_ACCESS fetched on fd. */
+               acl = acl_get_fd(fsp_get_io_fd(fsp));
+       } else if (fsp->fsp_flags.have_proc_fds) {
+               int fd = fsp_get_pathref_fd(fsp);
+               struct sys_proc_fd_path_buf buf;
+
+               acl = acl_get_file(sys_proc_fd_path(fd, &buf), acl_type);
+       } else {
+               /*
+                * This is no longer a handle based call.
+                */
+               acl = acl_get_file(fsp->fsp_name->base_name, acl_type);
        }
-
-       result = smb_acl_to_internal(acl);
-       acl_free(acl);
-       return result;
-}
-
-SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
-                                 files_struct *fsp)
-{
-       struct smb_acl_t *result;
-       acl_t acl = acl_get_fd(fsp->fh->fd);
-
        if (acl == NULL) {
                return NULL;
        }
 
-       result = smb_acl_to_internal(acl);
+       result = smb_acl_to_internal(acl, mem_ctx);
        acl_free(acl);
        return result;
 }
 
-int posixacl_sys_acl_set_file(vfs_handle_struct *handle,
-                             const char *name,
-                             SMB_ACL_TYPE_T type,
-                             SMB_ACL_T theacl)
+int posixacl_sys_acl_set_fd(vfs_handle_struct *handle,
+                           files_struct *fsp,
+                           SMB_ACL_TYPE_T type,
+                           SMB_ACL_T theacl)
 {
        int res;
+       acl_t acl = smb_acl_to_posix(theacl);
        acl_type_t acl_type;
-       acl_t acl;
+       int fd = fsp_get_pathref_fd(fsp);
 
-       DEBUG(10, ("Calling acl_set_file: %s, %d\n", name, type));
+       if (acl == NULL) {
+               return -1;
+       }
 
        switch(type) {
        case SMB_ACL_TYPE_ACCESS:
@@ -98,42 +98,46 @@ int posixacl_sys_acl_set_file(vfs_handle_struct *handle,
                acl_type = ACL_TYPE_DEFAULT;
                break;
        default:
+               acl_free(acl);
                errno = EINVAL;
                return -1;
        }
 
-       if ((acl = smb_acl_to_posix(theacl)) == NULL) {
-               return -1;
-       }
-       res = acl_set_file(name, acl_type, acl);
-       if (res != 0) {
-               DEBUG(10, ("acl_set_file failed: %s\n", strerror(errno)));
+       if (!fsp->fsp_flags.is_pathref && type == SMB_ACL_TYPE_ACCESS) {
+               res = acl_set_fd(fd, acl);
+       } else if (fsp->fsp_flags.have_proc_fds) {
+               struct sys_proc_fd_path_buf buf;
+
+               res = acl_set_file(sys_proc_fd_path(fd, &buf), acl_type, acl);
+       } else {
+               /*
+                * This is no longer a handle based call.
+                */
+               res = acl_set_file(fsp->fsp_name->base_name,
+                                  acl_type,
+                                  acl);
        }
+
        acl_free(acl);
        return res;
 }
 
-int posixacl_sys_acl_set_fd(vfs_handle_struct *handle,
-                           files_struct *fsp,
-                           SMB_ACL_T theacl)
+int posixacl_sys_acl_delete_def_fd(vfs_handle_struct *handle,
+                               files_struct *fsp)
 {
-       int res;
-       acl_t acl = smb_acl_to_posix(theacl);
-       if (acl == NULL) {
-               return -1;
+       if (fsp->fsp_flags.have_proc_fds) {
+               int fd = fsp_get_pathref_fd(fsp);
+               struct sys_proc_fd_path_buf buf;
+
+               return acl_delete_def_file(sys_proc_fd_path(fd, &buf));
        }
-       res =  acl_set_fd(fsp->fh->fd, acl);
-       acl_free(acl);
-       return res;
-}
 
-int posixacl_sys_acl_delete_def_file(vfs_handle_struct *handle,
-                                    const char *path)
-{
-       return acl_delete_def_file(path);
+       /*
+        * This is no longer a handle based call.
+        */
+       return acl_delete_def_file(fsp->fsp_name->base_name);
 }
 
-
 /* private functions */
 
 static bool smb_ace_to_internal(acl_entry_t posix_ace,
@@ -166,6 +170,11 @@ static bool smb_ace_to_internal(acl_entry_t posix_ace,
        case ACL_MASK:
                ace->a_type = SMB_ACL_MASK;
                break;
+#ifdef HAVE_ACL_EVERYONE
+       case ACL_EVERYONE:
+               DEBUG(1, ("ACL tag type ACL_EVERYONE. FreeBSD with ZFS? Use 'vfs objects = zfsacl'\n"));
+               return false;
+#endif
        default:
                DEBUG(0, ("unknown tag type %d\n", (unsigned int)tag));
                return False;
@@ -177,18 +186,18 @@ static bool smb_ace_to_internal(acl_entry_t posix_ace,
                        DEBUG(0, ("smb_acl_get_qualifier failed\n"));
                        return False;
                }
-               ace->uid = *puid;
+               ace->info.user.uid = *puid;
                acl_free(puid);
                break;
        }
-               
+
        case SMB_ACL_GROUP: {
                gid_t *pgid = (uid_t *)acl_get_qualifier(posix_ace);
                if (pgid == NULL) {
                        DEBUG(0, ("smb_acl_get_qualifier failed\n"));
                        return False;
                }
-               ace->gid = *pgid;
+               ace->info.group.gid = *pgid;
                acl_free(pgid);
                break;
        }
@@ -212,9 +221,9 @@ static bool smb_ace_to_internal(acl_entry_t posix_ace,
        return True;
 }
 
-static struct smb_acl_t *smb_acl_to_internal(acl_t acl)
+static struct smb_acl_t *smb_acl_to_internal(acl_t acl, TALLOC_CTX *mem_ctx)
 {
-       struct smb_acl_t *result = sys_acl_init(0);
+       struct smb_acl_t *result = sys_acl_init(mem_ctx);
        int entry_id = ACL_FIRST_ENTRY;
        acl_entry_t e;
        if (result == NULL) {
@@ -224,7 +233,7 @@ static struct smb_acl_t *smb_acl_to_internal(acl_t acl)
 
                entry_id = ACL_NEXT_ENTRY;
 
-               result->acl = talloc_realloc(result, result->acl, 
+               result->acl = talloc_realloc(result, result->acl,
                                             struct smb_acl_entry, result->count+1);
                if (result->acl == NULL) {
                        TALLOC_FREE(result);
@@ -266,7 +275,8 @@ static int smb_acl_set_mode(acl_entry_t entry, SMB_ACL_PERM_T perm)
            ((ret = acl_add_perm(permset, ACL_EXECUTE)) != 0)) {
                return ret;
        }
-        return acl_set_permset(entry, permset);
+
+       return 0;
 }
 
 static acl_t smb_acl_to_posix(const struct smb_acl_t *acl)
@@ -323,14 +333,14 @@ static acl_t smb_acl_to_posix(const struct smb_acl_t *acl)
 
                switch (entry->a_type) {
                case SMB_ACL_USER:
-                       if (acl_set_qualifier(e, &entry->uid) != 0) {
+                       if (acl_set_qualifier(e, &entry->info.user.uid) != 0) {
                                DEBUG(1, ("acl_set_qualifiier failed: %s\n",
                                          strerror(errno)));
                                goto fail;
                        }
                        break;
                case SMB_ACL_GROUP:
-                       if (acl_set_qualifier(e, &entry->gid) != 0) {
+                       if (acl_set_qualifier(e, &entry->info.group.gid) != 0) {
                                DEBUG(1, ("acl_set_qualifiier failed: %s\n",
                                          strerror(errno)));
                                goto fail;
@@ -365,15 +375,14 @@ static acl_t smb_acl_to_posix(const struct smb_acl_t *acl)
 /* VFS operations structure */
 
 static struct vfs_fn_pointers posixacl_fns = {
-       .sys_acl_get_file_fn = posixacl_sys_acl_get_file,
        .sys_acl_get_fd_fn = posixacl_sys_acl_get_fd,
-       .sys_acl_set_file_fn = posixacl_sys_acl_set_file,
+       .sys_acl_blob_get_fd_fn = posix_sys_acl_blob_get_fd,
        .sys_acl_set_fd_fn = posixacl_sys_acl_set_fd,
-       .sys_acl_delete_def_file_fn = posixacl_sys_acl_delete_def_file,
+       .sys_acl_delete_def_fd_fn = posixacl_sys_acl_delete_def_fd,
 };
 
-NTSTATUS vfs_posixacl_init(void);
-NTSTATUS vfs_posixacl_init(void)
+static_decl_vfs;
+NTSTATUS vfs_posixacl_init(TALLOC_CTX *ctx)
 {
        return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "posixacl",
                                &posixacl_fns);