diff options
Diffstat (limited to 'source3/smbd/open.c')
-rw-r--r-- | source3/smbd/open.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 325913c3d9..1eae228f40 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -618,6 +618,7 @@ files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_S int deny_mode = GET_DENY_MODE(share_mode); BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode); BOOL delete_access_requested = GET_DELETE_ACCESS_REQUESTED(share_mode); + BOOL delete_on_close = GET_DELETE_ON_CLOSE_FLAG(share_mode); BOOL file_existed = VALID_STAT(*psbuf); BOOL fcbopen = False; SMB_DEV_T dev = 0; @@ -905,6 +906,17 @@ flags=0x%X flags2=0x%X mode=0%o returned %d\n", set_share_mode(fsp, port, oplock_request); + if (delete_on_close) { + NTSTATUS result = set_delete_on_close_internal(fsp, delete_on_close); + + if (NT_STATUS_V(result) != NT_STATUS_V(NT_STATUS_OK)) { + unlock_share_entry_fsp(fsp); + fd_close(conn,fsp); + file_free(fsp); + return NULL; + } + } + unlock_share_entry_fsp(fsp); conn->num_files_open++; @@ -1019,11 +1031,12 @@ int close_file_fchmod(files_struct *fsp) ****************************************************************************/ files_struct *open_directory(connection_struct *conn, char *fname, - SMB_STRUCT_STAT *psbuf, int smb_ofun, mode_t unixmode, int *action) + SMB_STRUCT_STAT *psbuf, int share_mode, int smb_ofun, mode_t unixmode, int *action) { extern struct current_user current_user; BOOL got_stat = False; files_struct *fsp = file_new(conn); + BOOL delete_on_close = GET_DELETE_ON_CLOSE_FLAG(share_mode); if(!fsp) return NULL; @@ -1126,6 +1139,14 @@ files_struct *open_directory(connection_struct *conn, char *fname, fsp->conn = conn; string_set(&fsp->fsp_name,fname); + if (delete_on_close) { + NTSTATUS result = set_delete_on_close_internal(fsp, delete_on_close); + + if (NT_STATUS_V(result) != NT_STATUS_V(NT_STATUS_OK)) { + file_free(fsp); + return NULL; + } + } conn->num_files_open++; return fsp; |