diff options
author | Jeremy Allison <jra@samba.org> | 2002-01-19 22:54:13 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2002-01-19 22:54:13 +0000 |
commit | 997d6687fc67e98fe561775b522edfaa00f5ee5f (patch) | |
tree | bb4327afd05ccc5c22c97529c80039a1d1446b39 /source/lib/readline.c | |
parent | 80df5ab07e2149e7cc3a4a0a6695da01e8f9492c (diff) | |
download | samba-997d6687fc67e98fe561775b522edfaa00f5ee5f.tar.gz samba-997d6687fc67e98fe561775b522edfaa00f5ee5f.tar.xz samba-997d6687fc67e98fe561775b522edfaa00f5ee5f.zip |
Readline has problems on non tty fd's. Use readline replacement to in cases
where stdin is !isatty to allow stripts to work.
Jeremy.
Diffstat (limited to 'source/lib/readline.c')
-rw-r--r-- | source/lib/readline.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/source/lib/readline.c b/source/lib/readline.c index 325b70d2cf4..efd198db8df 100644 --- a/source/lib/readline.c +++ b/source/lib/readline.c @@ -29,20 +29,18 @@ # define RL_COMPLETION_CAST #endif /* HAVE_NEW_LIBREADLINE */ - /**************************************************************************** -display the prompt and wait for input. Call callback() regularly + Display the prompt and wait for input. Call callback() regularly ****************************************************************************/ + static char *smb_readline_replacement(char *prompt, void (*callback)(void), - char **(completion_fn)(char *text, - int start, - int end)) + char **(completion_fn)(char *text, int start, int end)) { fd_set fds; static pstring line; struct timeval timeout; int fd = fileno(stdin); - char *ret; + char *ret; x_fprintf(dbf, "%s", prompt); x_fflush(dbf); @@ -58,43 +56,46 @@ static char *smb_readline_replacement(char *prompt, void (*callback)(void), ret = fgets(line, sizeof(line), stdin); return ret; } - if (callback) callback(); + if (callback) + callback(); } } /**************************************************************************** -display the prompt and wait for input. Call callback() regularly + Display the prompt and wait for input. Call callback() regularly. ****************************************************************************/ + char *smb_readline(char *prompt, void (*callback)(void), char **(completion_fn)(char *text, int start, int end)) { #if HAVE_LIBREADLINE - char *ret; + if (isatty(fileno(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. */ - - 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; - } + /* 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 (callback) rl_event_hook = (Function *)callback; - ret = readline(prompt); - if (ret && *ret) add_history(ret); - return ret; -#else - 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 (callback) + rl_event_hook = (Function *)callback; + ret = readline(prompt); + if (ret && *ret) + add_history(ret); + return ret; + } else #endif + return smb_readline_replacement(prompt, callback, completion_fn); } /**************************************************************************** |