seq: sort dir file lists numerically

pull/153/head
Leah Neukirchen 6 years ago
parent 518ff4c148
commit c5cd4df026

@ -28,12 +28,11 @@ $(ALL) : % : %.o
maddr magrep mdeliver mexport mflag mflow mgenmid mhdr mpick mscan msed mshow \ maddr magrep mdeliver mexport mflag mflow mgenmid mhdr mpick mscan msed mshow \
msort mthread : blaze822.o mymemmem.o mytimegm.o msort mthread : blaze822.o mymemmem.o mytimegm.o
maddr magrep mdeliver mexport mflag mgenmid mhdr mlist mpick mscan msed mseq \ maddr magrep mdeliver mexport mflag mgenmid mhdr mlist mpick mscan msed mseq \
mshow msort mthread : seq.o slurp.o mshow msort mthread : seq.o slurp.o mystrverscmp.o
maddr magrep mflow mhdr mpick mscan mshow : rfc2047.o maddr magrep mflow mhdr mpick mscan mshow : rfc2047.o
magrep mflow mhdr mshow : rfc2045.o magrep mflow mhdr mshow : rfc2045.o
mshow : filter.o safe_u8putstr.o rfc2231.o pipeto.o mshow : filter.o safe_u8putstr.o rfc2231.o pipeto.o
mscan : pipeto.o mscan : pipeto.o
msort : mystrverscmp.o
mmime : slurp.o mmime : slurp.o
minc mlist : squeeze_slash.o minc mlist : squeeze_slash.o

59
seq.c

@ -467,44 +467,53 @@ blaze822_seq_next(char *map, char *range, struct blaze822_seq_iter *iter)
return r; return r;
} }
int mystrverscmp(const char *, const char *);
static int
mailsort(const struct dirent **a, const struct dirent **b)
{
return mystrverscmp((*a)->d_name, (*b)->d_name);
}
static long static long
iterdir(char *dir, void (*cb)(char *)) iterdir(char *dir, void (*cb)(char *))
{ {
DIR *fd, *fd2; struct dirent **namelist;
struct dirent *d;
long i = 0; int n;
char sub[PATH_MAX];
snprintf(sub, sizeof sub, "%s/cur", dir);
fd = opendir(dir); char *m = "/cur";
if (!fd) {
n = scandir(sub, &namelist, 0, mailsort);
if (n == -1 && (errno == ENOENT || errno == ENOTDIR)) {
m = "";
n = scandir(dir, &namelist, 0, mailsort);
}
if (n == -1) {
if (errno == ENOTDIR) if (errno == ENOTDIR)
cb(dir); cb(dir);
return 1; return 1;
} }
char sub[PATH_MAX]; long i = 0;
snprintf(sub, sizeof sub, "%s/cur", dir); for (i = 0; i < n; i++) {
fd2 = opendir(sub); if (namelist[i]->d_name[0] != '.')
if (fd2) {
closedir(fd);
fd = fd2;
}
while ((d = readdir(fd))) {
#if defined(DT_REG) && defined(DT_UNKNOWN) #if defined(DT_REG) && defined(DT_UNKNOWN)
if (d->d_type != DT_REG && d->d_type != DT_UNKNOWN) if (namelist[i]->d_type == DT_REG ||
continue; namelist[i]->d_type == DT_UNKNOWN)
#endif #endif
if (d->d_name[0] == '.') {
continue; snprintf(sub, sizeof sub, "%s%s/%s",
if (fd2) dir, m, namelist[i]->d_name);
snprintf(sub, sizeof sub, "%s/cur/%s", dir, d->d_name); cb(sub);
else }
snprintf(sub, sizeof sub, "%s/%s", dir, d->d_name); free(namelist[i]);
cb(sub);
i++;
} }
closedir(fd); free(namelist);
return i; return i;
} }

Loading…
Cancel
Save