summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/readline.c65
-rw-r--r--source3/lib/xfile.c24
2 files changed, 61 insertions, 28 deletions
diff --git a/source3/lib/readline.c b/source3/lib/readline.c
index c1f1dc7f40..1f599dc0a7 100644
--- a/source3/lib/readline.c
+++ b/source3/lib/readline.c
@@ -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. */
-
- 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
+ /* 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;
+ }
+
+ 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;
}
/****************************************************************************
diff --git a/source3/lib/xfile.c b/source3/lib/xfile.c
index 71f8bdbcbb..ef33c7894f 100644
--- a/source3/lib/xfile.c
+++ b/source3/lib/xfile.c
@@ -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;
}