summaryrefslogtreecommitdiff
path: root/source3/smbd/open.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2001-11-23 11:18:20 +0000
committerJeremy Allison <jra@samba.org>2001-11-23 11:18:20 +0000
commitd05bbf042209b737e42a5daa8d59236d351ec8d0 (patch)
tree343cca67678d4fa8a67157515f15494f89aaa19e /source3/smbd/open.c
parentd2e279ecf2b767a1f5dc119484383f694680e691 (diff)
downloadsamba-d05bbf042209b737e42a5daa8d59236d351ec8d0.tar.gz
samba-d05bbf042209b737e42a5daa8d59236d351ec8d0.tar.bz2
samba-d05bbf042209b737e42a5daa8d59236d351ec8d0.zip
Fixed delete on close bug. Added core dump code to winbindd.
Jeremy. (This used to be commit a58d0f91f9ee7354c01a9c20cfe178d5dc02142d)
Diffstat (limited to 'source3/smbd/open.c')
-rw-r--r--source3/smbd/open.c23
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;