summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2003-08-19 01:53:45 +0000
committerJeremy Allison <jra@samba.org>2003-08-19 01:53:45 +0000
commit6d6401a67a9985c8c51175db520114dc2ef421ce (patch)
tree9392728e28dbd5afee4a72d44e23ed1cdffb68c4 /source3
parentc0236e8ae32af5480b14ac57677dc983e786d3d5 (diff)
downloadsamba-6d6401a67a9985c8c51175db520114dc2ef421ce.tar.gz
samba-6d6401a67a9985c8c51175db520114dc2ef421ce.tar.bz2
samba-6d6401a67a9985c8c51175db520114dc2ef421ce.zip
Implement SMBexit properly. Found by Samba4 tester. You must do a make
clean proto all; after this commit. Jeremy. (This used to be commit 27af1f9feab12542dc538bfceac4593e644ba3b4)
Diffstat (limited to 'source3')
-rw-r--r--source3/include/smb.h1
-rw-r--r--source3/smbd/files.c16
-rw-r--r--source3/smbd/open.c4
-rw-r--r--source3/smbd/reply.c3
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"));