[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-172-gd50d14c

Jeremy Allison jra at samba.org
Sat Nov 3 22:21:26 GMT 2007


The branch, v3-2-test has been updated
       via  d50d14c300abc83b7015718ec48acc8b3227a273 (commit)
      from  ac4f897f0dec0e33e79c316340b47c2803104635 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit d50d14c300abc83b7015718ec48acc8b3227a273
Author: Jeremy Allison <jra at samba.org>
Date:   Sat Nov 3 15:12:42 2007 -0700

    Remove the smb_read_error global variable and replace
    it with accessor functions. "One global or pstring a day...." :-).
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/include/client.h    |    3 +-
 source/include/smb.h       |   15 ++++++----
 source/lib/util_sock.c     |   59 ++++++++++++++++++++++++++++---------------
 source/libsmb/cliconnect.c |    2 +-
 source/libsmb/clientgen.c  |   21 +++++++--------
 source/libsmb/clierror.c   |   20 +++++++-------
 source/smbd/nttrans.c      |    1 -
 source/smbd/oplock.c       |    1 -
 source/smbd/oplock_irix.c  |    5 +--
 source/smbd/process.c      |   51 ++++++++++++++-----------------------
 source/smbd/trans2.c       |    1 -
 11 files changed, 91 insertions(+), 88 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/client.h b/source/include/client.h
index e38017f..d8c3578 100644
--- a/source/include/client.h
+++ b/source/include/client.h
@@ -82,7 +82,8 @@ struct rpc_pipe_client {
 struct cli_state {
 	int port;
 	int fd;
-	int smb_rw_error; /* Copy of last read or write error. */
+	/* Copy of last read or write error. */
+	enum smb_read_errors smb_rw_error;
 	uint16 cnum;
 	uint16 pid;
 	uint16 mid;
diff --git a/source/include/smb.h b/source/include/smb.h
index 303f760..be339f2 100644
--- a/source/include/smb.h
+++ b/source/include/smb.h
@@ -72,12 +72,15 @@
 #include "debug.h"
 
 /* this defines the error codes that receive_smb can put in smb_read_error */
-#define READ_TIMEOUT 1
-#define READ_EOF 2
-#define READ_ERROR 3
-#define WRITE_ERROR 4 /* This error code can go into the client smb_rw_error. */
-#define READ_BAD_SIG 5
-#define DO_NOT_DO_TDIS 6 /* cli_close_connection() check for this when smbfs wants to keep tree connected */
+enum smb_read_errors {
+	SMB_READ_OK = 0,
+	SMB_READ_TIMEOUT,
+	SMB_READ_EOF,
+	SMB_READ_ERROR,
+	SMB_WRITE_ERROR, /* This error code can go into the client smb_rw_error. */
+	SMB_READ_BAD_SIG,
+	SMB_DO_NOT_DO_TDIS /* cli_close_connection() check for this when smbfs wants to keep tree connected */
+};
 
 #define DIR_STRUCT_SIZE 43
 
diff --git a/source/lib/util_sock.c b/source/lib/util_sock.c
index 4a73f92..ea33de8 100644
--- a/source/lib/util_sock.c
+++ b/source/lib/util_sock.c
@@ -673,7 +673,28 @@ int client_socket_port(void)
 	return get_socket_port(client_fd);
 }
 
-int smb_read_error = 0;
+/****************************************************************************
+ Accessor functions to make thread-safe code easier later...
+****************************************************************************/
+
+static enum smb_read_errors smb_read_error = SMB_READ_OK;
+
+enum smb_read_errors get_smb_read_error(void)
+{
+	return smb_read_error;
+}
+
+void set_smb_read_error(enum smb_read_errors newerr)
+{
+	smb_read_error = newerr;
+}
+
+void cond_set_smb_read_error(enum smb_read_errors newerr)
+{
+	if (smb_read_error == SMB_READ_OK) {
+		smb_read_error = newerr;
+	}
+}
 
 /****************************************************************************
  Determine if a file descriptor is in fact a socket.
@@ -897,7 +918,7 @@ ssize_t read_socket_with_timeout(int fd,
 	if (maxcnt <= 0)
 		return(0);
 
-	smb_read_error = 0;
+	set_smb_read_error(SMB_READ_OK);
 
 	/* Blocking read */
 	if (time_out == 0) {
@@ -911,7 +932,7 @@ ssize_t read_socket_with_timeout(int fd,
 			if (readret == 0) {
 				DEBUG(5,("read_socket_with_timeout: "
 					"blocking read. EOF from client.\n"));
-				smb_read_error = READ_EOF;
+				set_smb_read_error(SMB_READ_EOF);
 				return -1;
 			}
 
@@ -928,7 +949,7 @@ ssize_t read_socket_with_timeout(int fd,
 						"read error = %s.\n",
 						strerror(errno) ));
 				}
-				smb_read_error = READ_ERROR;
+				set_smb_read_error(SMB_READ_ERROR);
 				return -1;
 			}
 			nread += readret;
@@ -966,7 +987,7 @@ ssize_t read_socket_with_timeout(int fd,
 				"read. select error = %s.\n",
 				strerror(errno) ));
 			}
-			smb_read_error = READ_ERROR;
+			set_smb_read_error(SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -974,7 +995,7 @@ ssize_t read_socket_with_timeout(int fd,
 		if (selrtn == 0) {
 			DEBUG(10,("read_socket_with_timeout: timeout read. "
 				"select timed out.\n"));
-			smb_read_error = READ_TIMEOUT;
+			set_smb_read_error(SMB_READ_TIMEOUT);
 			return -1;
 		}
 
@@ -984,7 +1005,7 @@ ssize_t read_socket_with_timeout(int fd,
 			/* we got EOF on the file descriptor */
 			DEBUG(5,("read_socket_with_timeout: timeout read. "
 				"EOF from client.\n"));
-			smb_read_error = READ_EOF;
+			set_smb_read_error(SMB_READ_EOF);
 			return -1;
 		}
 
@@ -1001,7 +1022,7 @@ ssize_t read_socket_with_timeout(int fd,
 					"read. read error = %s.\n",
 					strerror(errno) ));
 			}
-			smb_read_error = READ_ERROR;
+			set_smb_read_error(SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -1021,7 +1042,7 @@ ssize_t read_data(int fd,char *buffer,size_t N)
 	ssize_t ret;
 	size_t total=0;
 
-	smb_read_error = 0;
+	set_smb_read_error(SMB_READ_OK);
 
 	while (total < N) {
 		ret = sys_read(fd,buffer + total,N - total);
@@ -1030,7 +1051,7 @@ ssize_t read_data(int fd,char *buffer,size_t N)
 			DEBUG(10,("read_data: read of %d returned 0. "
 				"Error = %s\n",
 				(int)(N - total), strerror(errno) ));
-			smb_read_error = READ_EOF;
+			set_smb_read_error(SMB_READ_EOF);
 			return 0;
 		}
 
@@ -1049,7 +1070,7 @@ ssize_t read_data(int fd,char *buffer,size_t N)
 					(int)(N - total),
 					strerror(errno) ));
 			}
-			smb_read_error = READ_ERROR;
+			set_smb_read_error(SMB_READ_ERROR);
 			return -1;
 		}
 		total += ret;
@@ -1191,7 +1212,7 @@ ssize_t receive_smb_raw(int fd,
 {
 	ssize_t len,ret;
 
-	smb_read_error = 0;
+	set_smb_read_error(SMB_READ_OK);
 
 	len = read_smb_length_return_keepalive(fd,buffer,timeout);
 	if (len < 0) {
@@ -1203,8 +1224,7 @@ ssize_t receive_smb_raw(int fd,
 		 * variables still suck :-). JRA.
 		 */
 
-		if (smb_read_error == 0)
-			smb_read_error = READ_ERROR;
+		cond_set_smb_read_error(SMB_READ_ERROR);
 		return -1;
 	}
 
@@ -1224,8 +1244,7 @@ ssize_t receive_smb_raw(int fd,
 			 * variables still suck :-). JRA.
 			 */
 
-			if (smb_read_error == 0)
-				smb_read_error = READ_ERROR;
+			cond_set_smb_read_error(SMB_READ_ERROR);
 			return -1;
 		}
 	}
@@ -1246,9 +1265,7 @@ ssize_t receive_smb_raw(int fd,
 		}
 
 		if (ret != len) {
-			if (smb_read_error == 0) {
-				smb_read_error = READ_ERROR;
-			}
+			cond_set_smb_read_error(SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -1276,8 +1293,8 @@ bool receive_smb(int fd, char *buffer, unsigned int timeout)
 	if (!srv_check_sign_mac(buffer, true)) {
 		DEBUG(0, ("receive_smb: SMB Signature verification "
 			"failed on incoming packet!\n"));
-		if (smb_read_error == 0) {
-			smb_read_error = READ_BAD_SIG;
+		if (get_smb_read_error() == 0) {
+			smb_read_error = SMB_READ_BAD_SIG;
 		}
 		return false;
 	}
diff --git a/source/libsmb/cliconnect.c b/source/libsmb/cliconnect.c
index 448bfd7..b86939a 100644
--- a/source/libsmb/cliconnect.c
+++ b/source/libsmb/cliconnect.c
@@ -699,7 +699,7 @@ static NTSTATUS cli_session_setup_ntlmssp(struct cli_state *cli, const char *use
 				
 				nt_status = cli_nt_error(cli);
 				if (cli_is_error(cli) && NT_STATUS_IS_OK(nt_status)) {
-					if (cli->smb_rw_error == READ_BAD_SIG) {
+					if (cli->smb_rw_error == SMB_READ_BAD_SIG) {
 						nt_status = NT_STATUS_ACCESS_DENIED;
 					} else {
 						nt_status = NT_STATUS_UNSUCCESSFUL;
diff --git a/source/libsmb/clientgen.c b/source/libsmb/clientgen.c
index 19210dd..0a8ff4e 100644
--- a/source/libsmb/clientgen.c
+++ b/source/libsmb/clientgen.c
@@ -20,8 +20,6 @@
 
 #include "includes.h"
 
-extern int smb_read_error;
-
 /****************************************************************************
  Change the timeout (in milliseconds).
 ****************************************************************************/
@@ -112,7 +110,7 @@ bool cli_receive_smb(struct cli_state *cli)
 	/* If the server is not responding, note that now */
 	if (len < 0) {
                 DEBUG(0, ("Receiving SMB: Server stopped responding\n"));
-		cli->smb_rw_error = smb_read_error;
+		cli->smb_rw_error = get_smb_read_error();
 		close(cli->fd);
 		cli->fd = -1;
 		return False;
@@ -135,12 +133,12 @@ bool cli_receive_smb(struct cli_state *cli)
 			 * Reflected signature on login error. 
 			 * Set bad sig but don't close fd.
 			 */
-			cli->smb_rw_error = READ_BAD_SIG;
+			cli->smb_rw_error = SMB_READ_BAD_SIG;
 			return True;
 		}
 
 		DEBUG(0, ("SMB Signature verification failed on incoming packet!\n"));
-		cli->smb_rw_error = READ_BAD_SIG;
+		cli->smb_rw_error = SMB_READ_BAD_SIG;
 		close(cli->fd);
 		cli->fd = -1;
 		return False;
@@ -242,7 +240,8 @@ bool cli_receive_smb_readX_header(struct cli_state *cli)
 
   read_err:
 
-	cli->smb_rw_error = smb_read_error = READ_ERROR;
+	set_smb_read_error(SMB_READ_ERROR);
+	cli->smb_rw_error = SMB_READ_ERROR;
 	close(cli->fd);
 	cli->fd = -1;
 	return False;
@@ -286,7 +285,7 @@ bool cli_send_smb(struct cli_state *cli)
 		if (ret <= 0) {
 			close(cli->fd);
 			cli->fd = -1;
-			cli->smb_rw_error = WRITE_ERROR;
+			cli->smb_rw_error = SMB_WRITE_ERROR;
 			DEBUG(0,("Error writing %d bytes to client. %d (%s)\n",
 				(int)len,(int)ret, strerror(errno) ));
 			return False;
@@ -328,7 +327,7 @@ bool cli_send_smb_direct_writeX(struct cli_state *cli,
 		if (ret <= 0) {
 			close(cli->fd);
 			cli->fd = -1;
-			cli->smb_rw_error = WRITE_ERROR;
+			cli->smb_rw_error = SMB_WRITE_ERROR;
 			DEBUG(0,("Error writing %d bytes to client. %d (%s)\n",
 				(int)len,(int)ret, strerror(errno) ));
 			return false;
@@ -343,7 +342,7 @@ bool cli_send_smb_direct_writeX(struct cli_state *cli,
 		if (ret <= 0) {
 			close(cli->fd);
 			cli->fd = -1;
-			cli->smb_rw_error = WRITE_ERROR;
+			cli->smb_rw_error = SMB_WRITE_ERROR;
 			DEBUG(0,("Error writing %d extradata "
 				"bytes to client. %d (%s)\n",
 				(int)extradata,(int)ret, strerror(errno) ));
@@ -590,11 +589,11 @@ void cli_shutdown(struct cli_state *cli)
 	 * later.  This tree disconnect forces the peer to clean up, since the
 	 * connection will be going away.
 	 *
-	 * Also, do not do tree disconnect when cli->smb_rw_error is DO_NOT_DO_TDIS
+	 * Also, do not do tree disconnect when cli->smb_rw_error is SMB_DO_NOT_DO_TDIS
 	 * the only user for this so far is smbmount which passes opened connection
 	 * down to kernel's smbfs module.
 	 */
-	if ( (cli->cnum != (uint16)-1) && (cli->smb_rw_error != DO_NOT_DO_TDIS ) ) {
+	if ( (cli->cnum != (uint16)-1) && (cli->smb_rw_error != SMB_DO_NOT_DO_TDIS ) ) {
 		cli_tdis(cli);
 	}
         
diff --git a/source/libsmb/clierror.c b/source/libsmb/clierror.c
index 4ab1c23..1c35bcf 100644
--- a/source/libsmb/clierror.c
+++ b/source/libsmb/clierror.c
@@ -72,17 +72,17 @@ static const char *cli_smb_errstr(struct cli_state *cli)
 static NTSTATUS cli_smb_rw_error_to_ntstatus(struct cli_state *cli)
 {
 	switch(cli->smb_rw_error) {
-		case READ_TIMEOUT:
+		case SMB_READ_TIMEOUT:
 			return NT_STATUS_IO_TIMEOUT;
-		case READ_EOF:
+		case SMB_READ_EOF:
 			return NT_STATUS_END_OF_FILE;
 		/* What we shoud really do for read/write errors is convert from errno. */
 		/* FIXME. JRA. */
-		case READ_ERROR:
+		case SMB_READ_ERROR:
 			return NT_STATUS_INVALID_NETWORK_RESPONSE;
-		case WRITE_ERROR:
+		case SMB_WRITE_ERROR:
 			return NT_STATUS_UNEXPECTED_NETWORK_ERROR;
-	        case READ_BAD_SIG:
+	        case SMB_READ_BAD_SIG:
 			return NT_STATUS_INVALID_PARAMETER;
 	        default:
 			break;
@@ -111,24 +111,24 @@ const char *cli_errstr(struct cli_state *cli)
 	/* Was it server socket error ? */
 	if (cli->fd == -1 && cli->smb_rw_error) {
 		switch(cli->smb_rw_error) {
-			case READ_TIMEOUT:
+			case SMB_READ_TIMEOUT:
 				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
 					"Call timed out: server did not respond after %d milliseconds",
 					cli->timeout);
 				break;
-			case READ_EOF:
+			case SMB_READ_EOF:
 				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
 					"Call returned zero bytes (EOF)" );
 				break;
-			case READ_ERROR:
+			case SMB_READ_ERROR:
 				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
 					"Read error: %s", strerror(errno) );
 				break;
-			case WRITE_ERROR:
+			case SMB_WRITE_ERROR:
 				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
 					"Write error: %s", strerror(errno) );
 				break;
-		        case READ_BAD_SIG:
+		        case SMB_READ_BAD_SIG:
 				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
 					"Server packet had invalid SMB signature!");
 				break;
diff --git a/source/smbd/nttrans.c b/source/smbd/nttrans.c
index da926d1..4bd4571 100644
--- a/source/smbd/nttrans.c
+++ b/source/smbd/nttrans.c
@@ -22,7 +22,6 @@
 
 extern int max_send;
 extern enum protocol_types Protocol;
-extern int smb_read_error;
 extern struct current_user current_user;
 
 static const char *known_nt_pipes[] = {
diff --git a/source/smbd/oplock.c b/source/smbd/oplock.c
index a84a9db..961abd2 100644
--- a/source/smbd/oplock.c
+++ b/source/smbd/oplock.c
@@ -28,7 +28,6 @@ static int32 level_II_oplocks_open = 0;
 bool global_client_failed_oplock_break = False;
 
 extern uint32 global_client_caps;
-extern int smb_read_error;
 
 static struct kernel_oplocks *koplocks;
 
diff --git a/source/smbd/oplock_irix.c b/source/smbd/oplock_irix.c
index 8dd4e27..b8d49f0 100644
--- a/source/smbd/oplock_irix.c
+++ b/source/smbd/oplock_irix.c
@@ -104,7 +104,6 @@ static bool irix_oplocks_available(void)
 
 static files_struct *irix_oplock_receive_message(fd_set *fds)
 {
-	extern int smb_read_error;
 	oplock_stat_t os;
 	char dummy;
 	struct file_id fileid;
@@ -122,7 +121,7 @@ static files_struct *irix_oplock_receive_message(fd_set *fds)
 		DEBUG(0,("irix_oplock_receive_message: read of kernel "
 			 "notification failed. Error was %s.\n",
 			 strerror(errno) ));
-		smb_read_error = READ_ERROR;
+		set_smb_read_error(SMB_READ_ERROR);
 		return NULL;
 	}
 
@@ -142,7 +141,7 @@ static files_struct *irix_oplock_receive_message(fd_set *fds)
 			 */
 			return NULL;
 		}
-		smb_read_error = READ_ERROR;
+		set_smb_read_error(SMB_READ_ERROR);
 		return NULL;
 	}
 
diff --git a/source/smbd/process.c b/source/smbd/process.c
index eca51a7..11fdb03 100644
--- a/source/smbd/process.c
+++ b/source/smbd/process.c
@@ -22,7 +22,6 @@
 
 extern struct auth_context *negprot_global_auth_context;
 extern int smb_echo_count;
-extern int smb_read_error;
 
 const int total_buffer_size = (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
 
@@ -39,7 +38,6 @@ int max_send = BUFFER_SIZE;
 int max_recv = BUFFER_SIZE;
 
 extern int last_message;
-extern int smb_read_error;
 SIG_ATOMIC_T reload_after_sighup = 0;
 SIG_ATOMIC_T got_sig_term = 0;
 extern bool global_machine_password_needs_changing;
@@ -65,8 +63,7 @@ static bool valid_packet_size(len)
 			 * variables still suck :-). JRA.
 			 */
 
-			if (smb_read_error == 0)
-				smb_read_error = READ_ERROR;
+			cond_set_smb_read_error(SMB_READ_ERROR);
 			return false;
 		}
 	}
@@ -95,9 +92,7 @@ static ssize_t read_packet_remainder(int fd,
 	}
 
 	if (ret != len) {
-		if (smb_read_error == 0) {
-			smb_read_error = READ_ERROR;
-		}
+		cond_set_smb_read_error(SMB_READ_ERROR);
 		return -1;
 	}
 
@@ -148,9 +143,7 @@ ssize_t receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
 	}
 
 	if (ret != STANDARD_WRITE_AND_X_HEADER_SIZE) {
-		if (smb_read_error == 0) {
-			smb_read_error = READ_ERROR;
-		}
+		cond_set_smb_read_error(SMB_READ_ERROR);
 		return -1;
 	}
 
@@ -190,8 +183,7 @@ ssize_t receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
 		if (*buffer == NULL) {
 			DEBUG(0, ("Could not allocate inbuf of length %d\n",
 				  (int)sizeof(writeX_header)));
-			if (smb_read_error == 0)
-				smb_read_error = READ_ERROR;
+			cond_set_smb_read_error(SMB_READ_ERROR);
 			return -1;
 		}
 
@@ -215,8 +207,7 @@ ssize_t receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
 	if (*buffer == NULL) {
 		DEBUG(0, ("Could not allocate inbuf of length %d\n",
 			  (int)len+4));
-		if (smb_read_error == 0)
-			smb_read_error = READ_ERROR;
+		cond_set_smb_read_error(SMB_READ_ERROR);
 		return -1;
 	}
 
@@ -249,7 +240,7 @@ static ssize_t receive_smb_raw_talloc(TALLOC_CTX *mem_ctx,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list