diff options
author | Volker Lendecke <vlendec@samba.org> | 2006-09-11 21:33:53 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:51:22 -0500 |
commit | 0baa3fcfa6b7d39d0f490ad0682042706f2518f2 (patch) | |
tree | 7725aed27c33e0166e0b59e947e13db3d87e7a78 /source/client/client.c | |
parent | e872bacf2850cfb66be1c57be40484fe8e4c2da5 (diff) | |
download | samba-0baa3fcfa6b7d39d0f490ad0682042706f2518f2.tar.gz samba-0baa3fcfa6b7d39d0f490ad0682042706f2518f2.tar.xz samba-0baa3fcfa6b7d39d0f490ad0682042706f2518f2.zip |
r18402: Comment and (hopefully) fix remote command completion for smbclient.
Fix Bug ID 4084.
Volker
Diffstat (limited to 'source/client/client.c')
-rw-r--r-- | source/client/client.c | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/source/client/client.c b/source/client/client.c index 385eb5a7cf5..d5dd93ac195 100644 --- a/source/client/client.c +++ b/source/client/client.c @@ -3173,7 +3173,14 @@ static char **remote_completion(const char *text, int len) if (!info.matches) { return NULL; } + + /* + * We're leaving matches[0] free to fill it later with the text to + * display: Either the one single match or the longest common subset + * of the matches. + */ info.matches[0] = NULL; + info.count = 1; for (i = len-1; i >= 0; i--) { if ((text[i] == '/') || (text[i] == CLI_DIRSEP_CHAR)) { @@ -3195,15 +3202,36 @@ static char **remote_completion(const char *text, int len) if (cli_list(cli, dirmask, aDIR | aSYSTEM | aHIDDEN, completion_remote_filter, &info) < 0) goto cleanup; - if (info.count == 2) - info.matches[0] = SMB_STRDUP(info.matches[1]); - else { - info.matches[0] = (char *)SMB_MALLOC(info.samelen+1); - if (!info.matches[0]) - goto cleanup; - strncpy(info.matches[0], info.matches[1], info.samelen); - info.matches[0][info.samelen] = 0; + if (info.count == 1) { + + /* + * No matches at all, NULL indicates there is nothing + */ + + SAFE_FREE(info.matches[0]); + SAFE_FREE(info.matches); + return NULL; } + + if (info.count == 2) { + + /* + * Exactly one match in matches[1], indicate this is the one + * in matches[0]. + */ + + info.matches[0] = info.matches[1]; + info.matches[1] = NULL; + info.count -= 1; + return info.matches; + } + + /* + * We got more than one possible match, set the result to the maximum + * common subset + */ + + info.matches[0] = SMB_STRNDUP(info.matches[1], info.samelen); info.matches[info.count] = NULL; return info.matches; @@ -3230,10 +3258,13 @@ static char **completion_fn(const char *text, int start, int end) sp = strchr(buf, ' '); if (sp == NULL) return NULL; - - for (i = 0; commands[i].name; i++) - if ((strncmp(commands[i].name, text, sp - buf) == 0) && (commands[i].name[sp - buf] == 0)) + + for (i = 0; commands[i].name; i++) { + if ((strncmp(commands[i].name, buf, sp - buf) == 0) && + (commands[i].name[sp - buf] == 0)) { break; + } + } if (commands[i].name == NULL) return NULL; |