]> Sergey Matveev's repositories - nnn.git/commitdiff
Keep local copies of dir entries, just keeping pointers was a bug
authorlostd <lostd@2f30.org>
Wed, 8 Oct 2014 12:50:39 +0000 (15:50 +0300)
committerlostd <lostd@2f30.org>
Wed, 8 Oct 2014 12:50:39 +0000 (15:50 +0300)
noice.c

diff --git a/noice.c b/noice.c
index 9c6aac58b378ccd91f4b2410be6f9d18f9510757..08cc105e63d0613e1c6b8cd6eb229f8f58a5944e 100644 (file)
--- a/noice.c
+++ b/noice.c
@@ -75,10 +75,6 @@ struct assoc assocs[] = {
 
 int die = 0;
 
-struct entry {
-       char name[MAXNAMLEN + 1];
-};
-
 char *
 openwith(char *file)
 {
@@ -104,8 +100,8 @@ dentcmp(const void *va, const void *vb)
 {
        const struct dirent *a, *b;
 
-       a = *(struct dirent **)va;
-       b = *(struct dirent **)vb;
+       a = (struct dirent *)va;
+       b = (struct dirent *)vb;
 
        return strcmp(a->d_name, b->d_name);
 }
@@ -229,7 +225,7 @@ browse(const char *ipath)
 {
        DIR *dirp;
        struct dirent *dp;
-       struct dirent **dents;
+       struct dirent *dents;
        int i, n, cur;
        int r, ret;
        char *path = strdup(ipath);
@@ -255,7 +251,7 @@ begin:
                dents = realloc(dents, (n + 1) * sizeof(*dents));
                if (dents == NULL)
                        printerr(1, "realloc");
-               dents[n] = dp;
+               memcpy(&dents[n], dp, sizeof(*dents));
                n++;
        }
 
@@ -263,7 +259,7 @@ begin:
 
        for (;;) {
                int nlines;
-               struct entry *tmpents;
+               struct dirent *tmpents;
                int odd;
 
 redraw:
@@ -289,11 +285,9 @@ redraw:
 
                /* No text wrapping in entries */
                tmpents = malloc(n * sizeof(*tmpents));
-               for (i = 0; i < n; i++) {
-                       strlcpy(tmpents[i].name, dents[i]->d_name,
-                           sizeof(tmpents[i].name));
-                       tmpents[i].name[COLS - strlen(CURSR) - 1] = '\0';
-               }
+               memcpy(tmpents, dents, n * sizeof(*tmpents));
+               for (i = 0; i < n; i++)
+                       tmpents[i].d_name[COLS - strlen(CURSR) - 1] = '\0';
 
                /* Print cwd.  If empty we are on the root.  We store it
                 * as an empty string so that when we navigate in /mnt
@@ -308,18 +302,18 @@ redraw:
                        for (i = 0; i < nlines; i++)
                                printw("%s%s\n",
                                    i == cur ? CURSR : EMPTY,
-                                   tmpents[i].name);
+                                   tmpents[i].d_name);
                } else if (cur >= n - nlines / 2) {
                        for (i = n - nlines; i < n; i++)
                                printw("%s%s\n",
                                    i == cur ? CURSR : EMPTY,
-                                   tmpents[i].name);
+                                   tmpents[i].d_name);
                } else {
                        for (i = cur - nlines / 2;
                             i < cur + nlines / 2 + odd; i++)
                                printw("%s%s\n",
                                    i == cur ? CURSR : EMPTY,
-                                   tmpents[i].name);
+                                   tmpents[i].d_name);
                }
 
                free(tmpents);
@@ -358,8 +352,8 @@ nochange:
                        if (n == 0)
                                goto nochange;
 
-                       name = dents[cur]->d_name;
-                       type = dents[cur]->d_type;
+                       name = dents[cur].d_name;
+                       type = dents[cur].d_type;
 
                        pathsiz = strlen(path) + 1 + strlen(name) + 1;
                        pathnew = malloc(pathsiz);