diff options
Diffstat (limited to 'source3')
| -rw-r--r-- | source3/client/client.c | 13 | ||||
| -rw-r--r-- | source3/include/proto.h | 1 | ||||
| -rw-r--r-- | source3/lib/readline.c | 13 | 
3 files changed, 24 insertions, 3 deletions
| diff --git a/source3/client/client.c b/source3/client/client.c index 7af7d30108..4d6bf8f198 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 6799106217..7cdcba19ab 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 254f55c86a..fd57799b57 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;  }  /**************************************************************************** | 
