diff options
author | Volker Lendecke <vl@samba.org> | 2012-01-31 22:26:35 +0100 |
---|---|---|
committer | Volker Lendecke <vlendec@samba.org> | 2012-02-01 01:05:57 +0100 |
commit | 1f328d1e6a820564e9570bc27a018301c7cb453c (patch) | |
tree | 4f68d78b9106f1adb9f87d0376ca5cdcbc39e202 /source3/modules | |
parent | 92b96ac84bea5aa8ca37ea6ca17376199aef4142 (diff) | |
download | samba-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')
-rw-r--r-- | source3/modules/vfs_streams_depot.c | 47 |
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, }; |