Correctly fix smbclient to terminate on eof from server.
authorJeremy Allison <jra@samba.org>
Fri, 3 Oct 2008 21:58:41 +0000 (14:58 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 3 Oct 2008 21:58:41 +0000 (14:58 -0700)
Jeremy.

source3/client/client.c
source3/include/proto.h
source3/lib/readline.c

index 7af7d301084018a0438f03fe4bac03dddb8c8321..4d6bf8f198a8b869f236b9f1c89a6979c56418d2 100644 (file)
@@ -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;
index 6799106217df342bc41a2417e7dd3b11edd4a279..7cdcba19ab203275fb18dd214b1bc9252ce38a27 100644 (file)
@@ -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);
index 254f55c86a14f8dce32e062994cb166970a7684f..fd57799b578ba8e58bb117882bcec10a1d4fabc8 100644 (file)
 #  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;
 }
 
 /****************************************************************************