commit 7028eb1838e43ec695e9a1421c264bc5e64f2ac1
parent bc766bc4a88accf873d9ec29e7c274804065a916
Author: lostd <lostd@2f30.org>
Date: Wed, 8 Oct 2014 15:50:39 +0300
Keep local copies of dir entries, just keeping pointers was a bug
Diffstat:
M | noice.c | | | 32 | +++++++++++++------------------- |
1 file changed, 13 insertions(+), 19 deletions(-)
diff --git 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);