X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=fish%2Fdestpaths.c;h=9a3da82b1bf97dc5069d06622a92bfb6fdcf551e;hp=a9d65a51aaf77c2044bd4841eff9af055280b166;hb=3e70b34eed5a48640e20fbf6dcba774aaace1f3c;hpb=2018441f426aac5a6e48fc6d7cf8155122706215 diff --git a/fish/destpaths.c b/fish/destpaths.c index a9d65a5..9a3da82 100644 --- a/fish/destpaths.c +++ b/fish/destpaths.c @@ -18,8 +18,6 @@ #include -#define _GNU_SOURCE // for strndup, asprintf - #include #include #include @@ -61,7 +59,7 @@ struct word { }; static void -free_words (struct word *words, int nr_words) +free_words (struct word *words, size_t nr_words) { size_t i; @@ -112,30 +110,30 @@ complete_dest_paths_generator (const char *text, int state) if (strs) { \ size_t i; \ size_t n = count_strings (strs); \ - \ - if ( ! xalloc_oversized (nr_words + n, sizeof (struct word))) { \ - struct word *w; \ - w = realloc (words, sizeof (struct word) * (nr_words + n)); \ - \ - if (w == NULL) { \ - free_words (words, nr_words); \ - words = NULL; \ - nr_words = 0; \ - } else { \ - words = w; \ - for (i = 0; i < n; ++i) { \ - words[nr_words].name = strs[i]; \ - words[nr_words].is_dir = 0; \ - nr_words++; \ - } \ - } \ - free (strs); \ + \ + if ( n > 0 && ! xalloc_oversized (nr_words + n, sizeof (struct word))) { \ + struct word *w; \ + w = realloc (words, sizeof (struct word) * (nr_words + n)); \ + \ + if (w == NULL) { \ + free_words (words, nr_words); \ + words = NULL; \ + nr_words = 0; \ + } else { \ + words = w; \ + for (i = 0; i < n; ++i) { \ + words[nr_words].name = strs[i]; \ + words[nr_words].is_dir = 0; \ + nr_words++; \ + } \ + } \ } \ + free (strs); \ } \ } while (0) /* Is it a device? */ - if (len < 5 || strncmp (text, "/dev/", 5) == 0) { + if (len < 5 || STREQLEN (text, "/dev/", 5)) { /* Get a list of everything that can possibly begin with /dev/ */ strs = guestfs_list_devices (g); APPEND_STRS_AND_FREE; @@ -157,46 +155,46 @@ complete_dest_paths_generator (const char *text, int state) p = strrchr (text, '/'); dir = p && p > text ? strndup (text, p - text) : strdup ("/"); if (dir) { - dirents = guestfs_readdir (g, dir); - - /* Prepend directory to names before adding them to the list - * of words. - */ - if (dirents) { - size_t i; - - for (i = 0; i < dirents->len; ++i) { - int err; - - if (strcmp (dirents->val[i].name, ".") != 0 && - strcmp (dirents->val[i].name, "..") != 0) { - if (strcmp (dir, "/") == 0) - err = asprintf (&p, "/%s", dirents->val[i].name); - else - err = asprintf (&p, "%s/%s", dir, dirents->val[i].name); - if (err >= 0) { - if (!xalloc_oversized (nr_words+1, sizeof (struct word))) { - struct word *w; - - w = realloc (words, sizeof (struct word) * (nr_words+1)); - if (w == NULL) { - free_words (words, nr_words); - words = NULL; - nr_words = 0; - } - else { - words = w; - words[nr_words].name = p; - words[nr_words].is_dir = dirents->val[i].ftyp == 'd'; - nr_words++; - } - } - } - } - } - - guestfs_free_dirent_list (dirents); - } + dirents = guestfs_readdir (g, dir); + + /* Prepend directory to names before adding them to the list + * of words. + */ + if (dirents) { + size_t i; + + for (i = 0; i < dirents->len; ++i) { + int err; + + if (strcmp (dirents->val[i].name, ".") != 0 && + strcmp (dirents->val[i].name, "..") != 0) { + if (strcmp (dir, "/") == 0) + err = asprintf (&p, "/%s", dirents->val[i].name); + else + err = asprintf (&p, "%s/%s", dir, dirents->val[i].name); + if (err >= 0) { + if (!xalloc_oversized (nr_words+1, sizeof (struct word))) { + struct word *w; + + w = realloc (words, sizeof (struct word) * (nr_words+1)); + if (w == NULL) { + free_words (words, nr_words); + words = NULL; + nr_words = 0; + } + else { + words = w; + words[nr_words].name = p; + words[nr_words].is_dir = dirents->val[i].ftyp == 'd'; + nr_words++; + } + } + } + } + } + + guestfs_free_dirent_list (dirents); + } } } @@ -219,7 +217,7 @@ complete_dest_paths_generator (const char *text, int state) if (strncasecmp (word->name, text, len) == 0) { if (word->is_dir) - rl_completion_append_character = '/'; + rl_completion_append_character = '/'; return strdup (word->name); }