summaryrefslogtreecommitdiff
path: root/source3/modules/vfs_streams_depot.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2012-01-31 22:26:35 +0100
committerVolker Lendecke <vlendec@samba.org>2012-02-01 01:05:57 +0100
commit1f328d1e6a820564e9570bc27a018301c7cb453c (patch)
tree4f68d78b9106f1adb9f87d0376ca5cdcbc39e202 /source3/modules/vfs_streams_depot.c
parent92b96ac84bea5aa8ca37ea6ca17376199aef4142 (diff)
downloadsamba-1f328d1e6a820564e9570bc27a018301c7cb453c.tar.gz
samba-1f328d1e6a820564e9570bc27a018301c7cb453c.tar.bz2
samba-1f328d1e6a820564e9570bc27a018301c7cb453c.zip
s3: Add rmdir operation to streams_depot
Autobuild-User: Volker Lendecke <vlendec@samba.org> Autobuild-Date: Wed Feb 1 01:05:57 CET 2012 on sn-devel-104
Diffstat (limited to 'source3/modules/vfs_streams_depot.c')
-rw-r--r--source3/modules/vfs_streams_depot.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/source3/modules/vfs_streams_depot.c b/source3/modules/vfs_streams_depot.c
index 68a14539bd..a18827421a 100644
--- a/source3/modules/vfs_streams_depot.c
+++ b/source3/modules/vfs_streams_depot.c
@@ -657,6 +657,52 @@ static int streams_depot_unlink(vfs_handle_struct *handle,
return ret;
}
+static int streams_depot_rmdir(vfs_handle_struct *handle, const char *path)
+{
+ struct smb_filename *smb_fname_base = NULL;
+ NTSTATUS status;
+ int ret = -1;
+
+ DEBUG(10, ("streams_depot_rmdir called for %s\n", path));
+
+ /*
+ * We potentially need to delete the per-inode streams directory
+ */
+
+ status = create_synthetic_smb_fname(talloc_tos(), path,
+ NULL, NULL, &smb_fname_base);
+ if (!NT_STATUS_IS_OK(status)) {
+ errno = map_errno_from_nt_status(status);
+ return -1;
+ }
+
+ if (lp_posix_pathnames()) {
+ ret = SMB_VFS_NEXT_LSTAT(handle, smb_fname_base);
+ } else {
+ ret = SMB_VFS_NEXT_STAT(handle, smb_fname_base);
+ }
+
+ if (ret == -1) {
+ TALLOC_FREE(smb_fname_base);
+ return -1;
+ }
+
+ if (smb_fname_base->st.st_ex_nlink == 2) {
+ char *dirname = stream_dir(handle, smb_fname_base,
+ &smb_fname_base->st, false);
+
+ if (dirname != NULL) {
+ SMB_VFS_NEXT_RMDIR(handle, dirname);
+ }
+ TALLOC_FREE(dirname);
+ }
+
+ ret = SMB_VFS_NEXT_RMDIR(handle, path);
+
+ TALLOC_FREE(smb_fname_base);
+ return ret;
+}
+
static int streams_depot_rename(vfs_handle_struct *handle,
const struct smb_filename *smb_fname_src,
const struct smb_filename *smb_fname_dst)
@@ -868,6 +914,7 @@ static struct vfs_fn_pointers vfs_streams_depot_fns = {
.stat_fn = streams_depot_stat,
.lstat_fn = streams_depot_lstat,
.unlink_fn = streams_depot_unlink,
+ .rmdir_fn = streams_depot_rmdir,
.rename_fn = streams_depot_rename,
.streaminfo_fn = streams_depot_streaminfo,
};