- strs = guestfs_ls (g, dir);
-
- /* Prepend directory to names. */
- if (strs) {
- size_t i;
- for (i = 0; strs[i]; ++i) {
- int err;
- if (strcmp (dir, "/") == 0)
- err = asprintf (&p, "/%s", strs[i]);
- else
- err = asprintf (&p, "%s/%s", dir, strs[i]);
- if (0 <= err) {
- free (strs[i]);
- strs[i] = p;
- }
- }
- }
-
- free (dir);
- APPEND_STRS_AND_FREE;
+ 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 (STRNEQ (dirents->val[i].name, ".") &&
+ STRNEQ (dirents->val[i].name, "..")) {
+ if (STREQ (dir, "/"))
+ 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);
+ }