mirror of
https://github.com/samba-team/samba.git
synced 2025-08-29 13:49:30 +03:00
r16274: Fix the smbclient prompting behaviour for both systems that have
libreadline and those that don't. We always use the built-in readline
replacement for non-interactive mode. Interactive prompts are always
emitted to stdout and non-interactive mode never prompts at all.
Introduce x_fdup to avoid spuriously closing stdout when a logfile is
specified on the command line and setup_logging is called a second time.
(This used to be commit 848ac756f6
)
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
ae2fb4f109
commit
06491a4cb1
@ -3422,8 +3422,9 @@ static int do_message_op(void)
|
||||
/* set default debug level to 0 regardless of what smb.conf sets */
|
||||
setup_logging( "smbclient", True );
|
||||
DEBUGLEVEL_CLASS[DBGC_ALL] = 1;
|
||||
dbf = x_stderr;
|
||||
x_setbuf( x_stderr, NULL );
|
||||
if ((dbf = x_fdup(x_stderr))) {
|
||||
x_setbuf( dbf, NULL );
|
||||
}
|
||||
|
||||
pc = poptGetContext("smbclient", argc, (const char **) argv, long_options,
|
||||
POPT_CONTEXT_KEEP_FIRST);
|
||||
|
@ -3561,10 +3561,11 @@ static int do_message_op(void)
|
||||
set_global_myname( "" );
|
||||
|
||||
/* set default debug level to 0 regardless of what smb.conf sets */
|
||||
setup_logging( "smbclient", True );
|
||||
setup_logging( "smbctool", True );
|
||||
DEBUGLEVEL_CLASS[DBGC_ALL] = 1;
|
||||
dbf = x_stderr;
|
||||
x_setbuf( x_stderr, NULL );
|
||||
if ((dbf = x_fdup(x_stderr))) {
|
||||
x_setbuf( dbf, NULL );
|
||||
}
|
||||
|
||||
pc = poptGetContext("smbclient", argc, (const char **) argv, long_options,
|
||||
POPT_CONTEXT_KEEP_FIRST);
|
||||
|
@ -59,8 +59,11 @@ static char *smb_readline_replacement(const char *prompt, void (*callback)(void)
|
||||
int fd = x_fileno(x_stdin);
|
||||
char *ret;
|
||||
|
||||
x_fprintf(dbf, "%s", prompt);
|
||||
x_fflush(dbf);
|
||||
/* Prompt might be NULL in non-interactive mode. */
|
||||
if (prompt) {
|
||||
x_fprintf(x_stdout, "%s", prompt);
|
||||
x_fflush(x_stdout);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
timeout.tv_sec = 5;
|
||||
@ -85,34 +88,42 @@ static char *smb_readline_replacement(const char *prompt, void (*callback)(void)
|
||||
char *smb_readline(const char *prompt, void (*callback)(void),
|
||||
char **(completion_fn)(const char *text, int start, int end))
|
||||
{
|
||||
char *ret;
|
||||
BOOL interactive;
|
||||
|
||||
interactive = isatty(x_fileno(x_stdin)) || getenv("CLI_FORCE_INTERACTIVE");
|
||||
if (!interactive) {
|
||||
return smb_readline_replacement(NULL, callback, completion_fn);
|
||||
}
|
||||
|
||||
#if HAVE_LIBREADLINE
|
||||
if (isatty(x_fileno(x_stdin))) {
|
||||
char *ret;
|
||||
|
||||
/* Aargh! Readline does bizzare things with the terminal width
|
||||
that mucks up expect(1). Set CLI_NO_READLINE in the environment
|
||||
to force readline not to be used. */
|
||||
/* Aargh! Readline does bizzare things with the terminal width
|
||||
that mucks up expect(1). Set CLI_NO_READLINE in the environment
|
||||
to force readline not to be used. */
|
||||
|
||||
if (getenv("CLI_NO_READLINE"))
|
||||
return smb_readline_replacement(prompt, callback, completion_fn);
|
||||
if (getenv("CLI_NO_READLINE"))
|
||||
return smb_readline_replacement(prompt, callback, completion_fn);
|
||||
|
||||
if (completion_fn) {
|
||||
/* The callback prototype has changed slightly between
|
||||
different versions of Readline, so the same function
|
||||
works in all of them to date, but we get compiler
|
||||
warnings in some. */
|
||||
rl_attempted_completion_function = RL_COMPLETION_CAST completion_fn;
|
||||
}
|
||||
if (completion_fn) {
|
||||
/* The callback prototype has changed slightly between
|
||||
different versions of Readline, so the same function
|
||||
works in all of them to date, but we get compiler
|
||||
warnings in some. */
|
||||
rl_attempted_completion_function = RL_COMPLETION_CAST completion_fn;
|
||||
}
|
||||
|
||||
if (callback)
|
||||
rl_event_hook = (Function *)callback;
|
||||
ret = readline(prompt);
|
||||
if (ret && *ret)
|
||||
add_history(ret);
|
||||
return ret;
|
||||
} else
|
||||
if (callback)
|
||||
rl_event_hook = (Function *)callback;
|
||||
ret = readline(prompt);
|
||||
if (ret && *ret)
|
||||
add_history(ret);
|
||||
|
||||
#else
|
||||
ret = smb_readline_replacement(prompt, callback, completion_fn);
|
||||
#endif
|
||||
return smb_readline_replacement(prompt, callback, completion_fn);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -123,6 +123,28 @@ XFILE *x_fopen(const char *fname, int flags, mode_t mode)
|
||||
return ret;
|
||||
}
|
||||
|
||||
XFILE *x_fdup(const XFILE *f)
|
||||
{
|
||||
XFILE *ret;
|
||||
int fd;
|
||||
|
||||
fd = dup(x_fileno(f));
|
||||
if (fd < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = SMB_CALLOC_ARRAY(XFILE, 1);
|
||||
if (!ret) {
|
||||
close(fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->fd = fd;
|
||||
ret->open_flags = f->open_flags;
|
||||
x_setvbuf(ret, NULL, X_IOFBF, XBUFSIZE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* simulate fclose() */
|
||||
int x_fclose(XFILE *f)
|
||||
{
|
||||
@ -220,7 +242,7 @@ size_t x_fwrite(const void *p, size_t size, size_t nmemb, XFILE *f)
|
||||
}
|
||||
|
||||
/* at least fileno() is simple! */
|
||||
int x_fileno(XFILE *f)
|
||||
int x_fileno(const XFILE *f)
|
||||
{
|
||||
return f->fd;
|
||||
}
|
||||
|
Reference in New Issue
Block a user