sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 674d1636f858d7c81cdd695634620706a25a37b7
parent b70d2857ab4b62256d6dfd659ea05706d2a8e7ec
Author: Michael Forney <mforney@mforney.org>
Date:   Sat, 31 Oct 2015 13:01:09 -0700

ls: Fix sorting of named entries

Previously, entcmp was being passed struct entry **, when it expected
struct entry *.

Many autoconf-generated configure scripts use `ls -t` to determine whether or
not the system clock is behaving correctly. If they are sorted in the wrong
order, it produces an error.

  checking whether build environment is sane... configure: error: newly created file is older than distributed files!
  Check your system clock

Diffstat:
Mls.c | 22++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/ls.c b/ls.c @@ -358,7 +358,7 @@ usage(void) int main(int argc, char *argv[]) { - struct entry *ent, **dents, **fents; + struct entry *ent, *dents, *fents; size_t i, ds, fs; ARGBEGIN { @@ -447,29 +447,27 @@ main(int argc, char *argv[]) break; default: for (i = ds = fs = 0, fents = dents = NULL; i < argc; ++i) { - ent = emalloc(sizeof(*ent)); - mkent(ent, argv[i], 1, Hflag || Lflag); - if ((!dflag && S_ISDIR(ent->mode)) || ((S_ISLNK(ent->mode) && S_ISDIR(ent->tmode)) && ((Hflag || Lflag) || !(dflag || Fflag || lflag)))) { - dents = ereallocarray(dents, ++ds, sizeof(ent)); - dents[ds - 1] = ent; + dents = ereallocarray(dents, ++ds, sizeof(*dents)); + ent = &dents[ds - 1]; } else { - fents = ereallocarray(fents, ++fs, sizeof(ent)); - fents[fs - 1] = ent; + fents = ereallocarray(fents, ++fs, sizeof(*fents)); + ent = &fents[fs - 1]; } + mkent(ent, argv[i], 1, Hflag || Lflag); } - qsort(fents, fs, sizeof(ent), entcmp); - qsort(dents, ds, sizeof(ent), entcmp); + qsort(fents, fs, sizeof(*fents), entcmp); + qsort(dents, ds, sizeof(*dents), entcmp); for (i = 0; i < fs; ++i) - ls("", fents[i], 0); + ls("", &fents[i], 0); if (fs && ds) putchar('\n'); for (i = 0; i < ds; ++i) - ls("", dents[i], 1); + ls("", &dents[i], 1); } return fshut(stdout, "<stdout>");