diff options
author | Denys Vlasenko | 2010-09-03 14:11:08 +0200 |
---|---|---|
committer | Denys Vlasenko | 2010-09-03 14:11:08 +0200 |
commit | 3926363214bfa783db08c931d867dbf4855d31ef (patch) | |
tree | 963ffa915ac6cc74df491234c191e41b15f98613 /libbb | |
parent | 76939e7b72937a5a2d00be3f62a6d2fa2757bdc9 (diff) | |
download | busybox-3926363214bfa783db08c931d867dbf4855d31ef.zip busybox-3926363214bfa783db08c931d867dbf4855d31ef.tar.gz |
lineedit: on tab completion, show filenames obly in all cases (bash compat)
function old new delta
complete_cmd_dir_file 731 730 -1
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/lineedit.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index a917c5f..d2b808a 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -751,6 +751,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) continue; /* don't print an error */ while ((next = readdir(dir)) != NULL) { + unsigned len; const char *name_found = next->d_name; /* .../<tab>: bash 3.2.0 shows dotfiles, but not . and .. */ @@ -767,18 +768,15 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) if (stat(found, &st) && lstat(found, &st)) goto cont; /* hmm, remove in progress? */ - /* save only name if we scan PATH */ - if (paths[i] != dirbuf) - strcpy(found, name_found); + /* Save only name */ + len = strlen(name_found); + found = xrealloc(found, len + 2); /* +2: for slash and NUL */ + strcpy(found, name_found); if (S_ISDIR(st.st_mode)) { - unsigned len1 = strlen(found); - /* name is a directory */ - if (found[len1-1] != '/') { - found = xrealloc(found, len1 + 2); - found[len1] = '/'; - found[len1 + 1] = '\0'; - } + /* name is a directory, add slash */ + found[len] = '/'; + found[len + 1] = '\0'; } else { /* skip files if looking for dirs only (example: cd) */ if (type == FIND_DIR_ONLY) @@ -796,10 +794,8 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) if (paths != path1) { free(paths[0]); /* allocated memory is only in first member */ free(paths); - } else if (dirbuf) { - pf_len += strlen(dirbuf); - free(dirbuf); } + free(dirbuf); return pf_len; } |