summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/client/client.c36
-rw-r--r--source3/include/proto.h3
-rw-r--r--source3/lib/readline.c7
3 files changed, 43 insertions, 3 deletions
diff --git a/source3/client/client.c b/source3/client/client.c
index 83e1c696a4..059bde3c41 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -1752,6 +1752,40 @@ static void process_command_string(char *cmd)
}
}
+/****************************************************************************
+handle completion of commands for readline
+****************************************************************************/
+static char **completion_fn(char *text, int start, int end)
+{
+#define MAX_COMPLETIONS 100
+ char **matches;
+ int i, count=0;
+
+ /* for words not at the start of the line fallback to filename completion */
+ if (start) return NULL;
+
+ matches = (char **)malloc(sizeof(matches[0])*MAX_COMPLETIONS);
+ if (!matches) return NULL;
+
+ matches[count++] = strdup(text);
+ if (!matches[0]) return NULL;
+
+ for (i=0;commands[i].fn && count < MAX_COMPLETIONS-1;i++) {
+ if (strncmp(text, commands[i].name, strlen(text)) == 0) {
+ matches[count] = strdup(commands[i].name);
+ if (!matches[count]) return NULL;
+ count++;
+ }
+ }
+
+ if (count == 2) {
+ free(matches[0]);
+ matches[0] = strdup(matches[1]);
+ }
+ matches[count] = NULL;
+ return matches;
+}
+
/****************************************************************************
make sure we swallow keepalives during idle time
@@ -1805,7 +1839,7 @@ static void process_stdin(void)
/* display a prompt */
slprintf(prompt, sizeof(prompt), "smb: %s> ", cur_dir);
- line = smb_readline(prompt, readline_callback);
+ line = smb_readline(prompt, readline_callback, completion_fn);
if (!line) break;
diff --git a/source3/include/proto.h b/source3/include/proto.h
index d2d96c4c60..2b79371acc 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -166,7 +166,8 @@ void pidfile_create(char *name);
/*The following definitions come from lib/readline.c */
-char *smb_readline(char *prompt, void (*callback)(void));
+char *smb_readline(char *prompt, void (*callback)(void),
+ char **(completion_fn)(char *text, int start, int end));
void cmd_history(void);
/*The following definitions come from lib/replace.c */
diff --git a/source3/lib/readline.c b/source3/lib/readline.c
index f0d8b1267f..4a3c5434c7 100644
--- a/source3/lib/readline.c
+++ b/source3/lib/readline.c
@@ -43,10 +43,15 @@
/****************************************************************************
display the prompt and wait for input. Call callback() regularly
****************************************************************************/
-char *smb_readline(char *prompt, void (*callback)(void))
+char *smb_readline(char *prompt, void (*callback)(void),
+ char **(completion_fn)(char *text, int start, int end))
{
char *ret;
#if HAVE_LIBREADLINE
+ if (completion_fn) {
+ rl_attempted_completion_function = completion_fn;
+ }
+
rl_event_hook = (Function *)callback;
ret = readline(prompt);
if (ret && *ret) add_history(ret);