[SCM] Samba Shared Repository - branch master updated - a9390d3047b7b7aba6f73c20e3dff292f7600a9f

Jeremy Allison jra at samba.org
Fri Oct 3 21:59:29 GMT 2008


The branch, master has been updated
       via  a9390d3047b7b7aba6f73c20e3dff292f7600a9f (commit)
      from  f6c883b4b00f4cd751cd312a27bddffb3be9c059 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a9390d3047b7b7aba6f73c20e3dff292f7600a9f
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 3 14:58:41 2008 -0700

    Correctly fix smbclient to terminate on eof from server.
    Jeremy.

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

Summary of changes:
 source3/client/client.c |   13 +++++++++++--
 source3/include/proto.h |    1 +
 source3/lib/readline.c  |   13 ++++++++++++-
 3 files changed, 24 insertions(+), 3 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/client/client.c b/source3/client/client.c
index 7af7d30..4d6bf8f 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -4345,6 +4345,8 @@ cleanup:
 	}
 }
 
+static bool finished;
+
 /****************************************************************************
  Make sure we swallow keepalives during idle time.
 ****************************************************************************/
@@ -4391,6 +4393,8 @@ static void readline_callback(void)
 			DEBUG(0, ("Read from server failed, maybe it closed "
 				  "the connection\n"));
 
+			finished = true;
+			smb_readline_done();
 			if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
 				set_smb_read_error(&cli->smb_rw_error,
 						   SMB_READ_EOF);
@@ -4419,7 +4423,12 @@ static void readline_callback(void)
 	{
 		unsigned char garbage[16];
 		memset(garbage, 0xf0, sizeof(garbage));
-		cli_echo(cli, 1, data_blob_const(garbage, sizeof(garbage)));
+		if (!cli_echo(cli, 1, data_blob_const(garbage, sizeof(garbage)))) {
+			DEBUG(0, ("SMBecho failed. Maybe server has closed "
+				"the connection\n"));
+			finished = true;
+			smb_readline_done();
+		}
 	}
 }
 
@@ -4431,7 +4440,7 @@ static int process_stdin(void)
 {
 	int rc = 0;
 
-	while (1) {
+	while (!finished) {
 		TALLOC_CTX *frame = talloc_stackframe();
 		char *tok = NULL;
 		char *the_prompt = NULL;
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 6799106..7cdcba1 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -708,6 +708,7 @@ bool privilege_set_to_se_priv( SE_PRIV *mask, struct lsa_PrivilegeSet *privset )
 
 /* The following definitions come from lib/readline.c  */
 
+void smb_readline_done(void);
 char *smb_readline(const char *prompt, void (*callback)(void),
 		   char **(completion_fn)(const char *text, int start, int end));
 const char *smb_readline_get_line_buffer(void);
diff --git a/source3/lib/readline.c b/source3/lib/readline.c
index 254f55c..fd57799 100644
--- a/source3/lib/readline.c
+++ b/source3/lib/readline.c
@@ -45,6 +45,16 @@
 #  define RL_COMPLETION_CAST
 #endif /* HAVE_NEW_LIBREADLINE */
 
+static bool smb_rl_done;
+
+void smb_readline_done(void)
+{
+	smb_rl_done = true;
+#if HAVE_LIBREADLINE
+	rl_done = 1;
+#endif
+}
+
 /****************************************************************************
  Display the prompt and wait for input. Call callback() regularly
 ****************************************************************************/
@@ -69,7 +79,7 @@ static char *smb_readline_replacement(const char *prompt, void (*callback)(void)
 		return NULL;
 	}
 
-	while (1) {
+	while (!smb_rl_done) {
 		timeout.tv_sec = 5;
 		timeout.tv_usec = 0;
 
@@ -87,6 +97,7 @@ static char *smb_readline_replacement(const char *prompt, void (*callback)(void)
 			callback();
 		}
 	}
+	return NULL;
 }
 
 /****************************************************************************


-- 
Samba Shared Repository


More information about the samba-cvs mailing list