summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorRalph Boehme <slow@samba.org>2016-08-24 10:30:15 +0200
committerJeremy Allison <jra@samba.org>2016-08-30 21:12:25 +0200
commit10959698e20de381beec7ab532c8bdc32fa6401c (patch)
treea393e721b24262ba4a0b669be2e1987113ece06a /source3
parent61c3d2124fb1a180fae4c8c0b5ab5b32bd56c8ad (diff)
downloadsamba-10959698e20de381beec7ab532c8bdc32fa6401c.tar.gz
vfs_acl_common: move stat stuff to a helper function
Will be reused in the next commit when moving the make_default_filesystem_acl() stuff to a different place. Bug: https://bugzilla.samba.org/show_bug.cgi?id=12177 Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3')
-rw-r--r--source3/modules/vfs_acl_common.c79
1 files changed, 48 insertions, 31 deletions
diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c
index 5e0b1bf5aca..ccb9b4b575e 100644
--- a/source3/modules/vfs_acl_common.c
+++ b/source3/modules/vfs_acl_common.c
@@ -697,6 +697,48 @@ fail:
return status;
}
+static NTSTATUS stat_fsp_or_smb_fname(vfs_handle_struct *handle,
+ files_struct *fsp,
+ const struct smb_filename *smb_fname,
+ SMB_STRUCT_STAT *sbuf,
+ SMB_STRUCT_STAT **psbuf)
+{
+ NTSTATUS status;
+ int ret;
+
+ if (fsp) {
+ status = vfs_stat_fsp(fsp);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+ *psbuf = &fsp->fsp_name->st;
+ } else {
+ /*
+ * https://bugzilla.samba.org/show_bug.cgi?id=11249
+ *
+ * We are currently guaranteed that 'name' here is a
+ * smb_fname->base_name, which *cannot* contain a stream name
+ * (':'). vfs_stat_smb_fname() splits a name into a base name +
+ * stream name, which when we get here we know we've already
+ * done. So we have to call the stat or lstat VFS calls
+ * directly here. Else, a base_name that contains a ':' (from a
+ * demangled name) will get split again.
+ *
+ * FIXME.
+ * This uglyness will go away once smb_fname is fully plumbed
+ * through the VFS.
+ */
+ ret = vfs_stat_smb_basename(handle->conn,
+ smb_fname,
+ sbuf);
+ if (ret == -1) {
+ return map_nt_error_from_unix(errno);
+ }
+ }
+
+ return NT_STATUS_OK;
+}
+
/*******************************************************************
Pull a DATA_BLOB from an xattr given a pathname.
If the hash doesn't match, or doesn't exist - return the underlying
@@ -784,38 +826,13 @@ static NTSTATUS get_nt_acl_internal(vfs_handle_struct *handle,
* filesystem. If it's a directory, and has no
* inheritable ACE entries we have to fake them.
*/
- if (fsp) {
- status = vfs_stat_fsp(fsp);
- if (!NT_STATUS_IS_OK(status)) {
- goto fail;
- }
- psbuf = &fsp->fsp_name->st;
- } else {
- /*
- * https://bugzilla.samba.org/show_bug.cgi?id=11249
- *
- * We are currently guaranteed that 'name' here is
- * a smb_fname->base_name, which *cannot* contain
- * a stream name (':'). vfs_stat_smb_fname() splits
- * a name into a base name + stream name, which
- * when we get here we know we've already done.
- * So we have to call the stat or lstat VFS
- * calls directly here. Else, a base_name that
- * contains a ':' (from a demangled name) will
- * get split again.
- *
- * FIXME.
- * This uglyness will go away once smb_fname
- * is fully plumbed through the VFS.
- */
- int ret = vfs_stat_smb_basename(handle->conn,
- smb_fname,
- &sbuf);
- if (ret == -1) {
- status = map_nt_error_from_unix(errno);
- goto fail;
- }
+
+ status = stat_fsp_or_smb_fname(handle, fsp, smb_fname,
+ &sbuf, &psbuf);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto fail;
}
+
is_directory = S_ISDIR(psbuf->st_ex_mode);
if (config->ignore_system_acls) {