#include "includes.h"
#ifdef HAVE_LIBREADLINE
# ifdef HAVE_READLINE_READLINE_H
# include <readline/readline.h>
# ifdef HAVE_READLINE_HISTORY_H
# include <readline/history.h>
# endif
# else
# ifdef HAVE_READLINE_H
# include <readline.h>
# ifdef HAVE_HISTORY_H
# include <history.h>
# endif
# else
# undef HAVE_LIBREADLINE
# endif
# endif
#endif
#ifdef HAVE_NEW_LIBREADLINE
# define RL_COMPLETION_CAST (rl_completion_func_t *)
#else
# define RL_COMPLETION_CAST
#endif
static char *smb_readline_replacement(const char *prompt, void (*callback)(void),
char **(completion_fn)(const char *text, int start, int end))
{
fd_set fds;
static pstring line;
struct timeval timeout;
int fd = x_fileno(x_stdin);
char *ret;
if (prompt) {
x_fprintf(x_stdout, "%s", prompt);
x_fflush(x_stdout);
}
while (1) {
timeout.tv_sec = 5;
timeout.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(fd,&fds);
if (sys_select_intr(fd+1,&fds,NULL,NULL,&timeout) == 1) {
ret = x_fgets(line, sizeof(line), x_stdin);
return ret;
}
if (callback)
callback();
}
}
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 (getenv("CLI_NO_READLINE"))
return smb_readline_replacement(prompt, callback, completion_fn);
if (completion_fn) {
rl_attempted_completion_function = RL_COMPLETION_CAST completion_fn;
}
#if HAVE_DECL_RL_EVENT_HOOK
if (callback)
rl_event_hook = (Function *)callback;
#endif
ret = readline(prompt);
if (ret && *ret)
add_history(ret);
#else
ret = smb_readline_replacement(prompt, callback, completion_fn);
#endif
return ret;
}
const char *smb_readline_get_line_buffer(void)
{
#if defined(HAVE_LIBREADLINE)
return rl_line_buffer;
#else
return NULL;
#endif
}
void smb_readline_ca_char(char c)
{
#if defined(HAVE_LIBREADLINE)
rl_completion_append_character = c;
#endif
}
int cmd_history(void)
{
#if defined(HAVE_LIBREADLINE) && defined(HAVE_HISTORY_LIST)
HIST_ENTRY **hlist;
int i;
hlist = history_list();
for (i = 0; hlist && hlist[i]; i++) {
DEBUG(0, ("%d: %s\n", i, hlist[i]->line));
}
#else
DEBUG(0,("no history without readline support\n"));
#endif
return 0;
}