diff options
-rw-r--r-- | source3/include/smb.h | 1 | ||||
-rw-r--r-- | source3/smbd/files.c | 16 | ||||
-rw-r--r-- | source3/smbd/open.c | 4 | ||||
-rw-r--r-- | source3/smbd/reply.c | 3 |
4 files changed, 24 insertions, 0 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index 2cafd1b9b1..61cda9465c 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -392,6 +392,7 @@ typedef struct files_struct SMB_BIG_UINT initial_allocation_size; /* Faked up initial allocation on disk. */ SMB_BIG_UINT position_information; mode_t mode; + uint16 file_pid; uint16 vuid; write_bmpx_struct *wbmpx_ptr; write_cache *wcp; diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 186fa96d7d..1fe6f250e5 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -143,6 +143,22 @@ void file_close_conn(connection_struct *conn) } /**************************************************************************** + Close all open files for a pid. +****************************************************************************/ + +void file_close_pid(uint16 smbpid) +{ + files_struct *fsp, *next; + + for (fsp=Files;fsp;fsp=next) { + next = fsp->next; + if (fsp->file_pid == smbpid) { + close_file(fsp,False); + } + } +} + +/**************************************************************************** Initialise file structures. ****************************************************************************/ diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 06f1ddfcf2..71af23aaf9 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -23,6 +23,7 @@ extern userdom_struct current_user_info; extern uint16 global_oplock_port; +extern uint16 global_smbpid; extern BOOL global_client_failed_oplock_break; /**************************************************************************** @@ -226,6 +227,7 @@ static BOOL open_file(files_struct *fsp,connection_struct *conn, fsp->inode = psbuf->st_ino; fsp->dev = psbuf->st_dev; fsp->vuid = current_user.vuid; + fsp->file_pid = global_smbpid; fsp->size = psbuf->st_size; fsp->can_lock = True; fsp->can_read = ((flags & O_WRONLY)==0); @@ -1361,6 +1363,7 @@ files_struct *open_directory(connection_struct *conn, char *fname, SMB_STRUCT_ST fsp->dev = psbuf->st_dev; fsp->size = psbuf->st_size; fsp->vuid = current_user.vuid; + fsp->file_pid = global_smbpid; fsp->can_lock = True; fsp->can_read = False; fsp->can_write = False; @@ -1423,6 +1426,7 @@ files_struct *open_file_stat(connection_struct *conn, char *fname, SMB_STRUCT_ST fsp->dev = (SMB_DEV_T)0; fsp->size = psbuf->st_size; fsp->vuid = current_user.vuid; + fsp->file_pid = global_smbpid; fsp->can_lock = False; fsp->can_read = False; fsp->can_write = False; diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 9577375475..5f2dd91232 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2394,6 +2394,9 @@ int reply_exit(connection_struct *conn, { int outsize; START_PROFILE(SMBexit); + + file_close_pid(SVAL(inbuf,smb_pid)); + outsize = set_message(outbuf,0,0,True); DEBUG(3,("exit\n")); |