iorder-directories-by-date.patch - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 iorder-directories-by-date.patch (2037B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 diff --git a/handlr.c b/handlr.c Err bitreich.org 70 i 2 index 0c230d3..5f5a767 100644 Err bitreich.org 70 i 3 --- a/handlr.c Err bitreich.org 70 i 4 +++ b/handlr.c Err bitreich.org 70 i 5 @@ -3,6 +3,7 @@ Err bitreich.org 70 i 6 * by 20h Err bitreich.org 70 i 7 */ Err bitreich.org 70 i 8 Err bitreich.org 70 i 9 +#include Err bitreich.org 70 i 10 #include Err bitreich.org 70 i 11 #include Err bitreich.org 70 i 12 #include Err bitreich.org 70 i 13 @@ -21,13 +22,48 @@ Err bitreich.org 70 i 14 #include "ind.h" Err bitreich.org 70 i 15 #include "arg.h" Err bitreich.org 70 i 16 Err bitreich.org 70 i 17 +char dir_path[PATH_MAX]; Err bitreich.org 70 i 18 +int datesort(const struct dirent **, const struct dirent **); Err bitreich.org 70 i 19 + Err bitreich.org 70 i 20 +int Err bitreich.org 70 i 21 +datesort(const struct dirent **a, const struct dirent **b) Err bitreich.org 70 i 22 +{ Err bitreich.org 70 i 23 + struct stat sbuf1, sbuf2; Err bitreich.org 70 i 24 + char path1[PATH_MAX], path2[PATH_MAX]; Err bitreich.org 70 i 25 + int rv; Err bitreich.org 70 i 26 + Err bitreich.org 70 i 27 + rv = snprintf(path1, sizeof(path1), "%s/%s", dir_path, (*a)->d_name); Err bitreich.org 70 i 28 + if (rv < 0 || (size_t)rv >= sizeof(path1)) { Err bitreich.org 70 i 29 + perror("snprintf"); Err bitreich.org 70 i 30 + return 0; Err bitreich.org 70 i 31 + } Err bitreich.org 70 i 32 + rv = snprintf(path2, sizeof(path2), "%s/%s", dir_path, (*b)->d_name); Err bitreich.org 70 i 33 + if (rv < 0 || (size_t)rv >= sizeof(path2)) { Err bitreich.org 70 i 34 + perror("snprintf"); Err bitreich.org 70 i 35 + return 0; Err bitreich.org 70 i 36 + } Err bitreich.org 70 i 37 + Err bitreich.org 70 i 38 + if (stat(path1, &sbuf1)) { Err bitreich.org 70 i 39 + perror("stat"); Err bitreich.org 70 i 40 + return 0; Err bitreich.org 70 i 41 + } Err bitreich.org 70 i 42 + if (stat(path2, &sbuf2)) { Err bitreich.org 70 i 43 + perror("stat"); Err bitreich.org 70 i 44 + return 0; Err bitreich.org 70 i 45 + } Err bitreich.org 70 i 46 + Err bitreich.org 70 i 47 + return sbuf1.st_mtime < sbuf2.st_mtime ? -1 : sbuf1.st_mtime > sbuf2.st_mtime; Err bitreich.org 70 i 48 +} Err bitreich.org 70 i 49 + Err bitreich.org 70 i 50 void Err bitreich.org 70 i 51 handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i 52 char *sear, char *ohost, char *chost, int istls) Err bitreich.org 70 i 53 { Err bitreich.org 70 i 54 + int (*sortorder) (const struct dirent **, const struct dirent **); Err bitreich.org 70 i 55 + char ds[PATH_MAX]; Err bitreich.org 70 i 56 char *pa, *file, *e, *par, *b; Err bitreich.org 70 i 57 struct dirent **dirent; Err bitreich.org 70 i 58 - int ndir, i, ret = 0; Err bitreich.org 70 i 59 + int ndir, i, ret = 0, rv; Err bitreich.org 70 i 60 struct stat st; Err bitreich.org 70 i 61 filetype *type; Err bitreich.org 70 i 62 Err bitreich.org 70 i 63 @@ -48,7 +84,21 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i 64 } Err bitreich.org 70 i 65 free(par); Err bitreich.org 70 i 66 Err bitreich.org 70 i 67 - ndir = scandir(pa[0] ? pa : ".", &dirent, 0, alphasort); Err bitreich.org 70 i 68 + rv = snprintf(dir_path, sizeof(dir_path), "%s", pa); Err bitreich.org 70 i 69 + if (rv < 0 || (size_t)rv >= sizeof(dir_path)) { Err bitreich.org 70 i 70 + perror("snprintf"); Err bitreich.org 70 i 71 + return; Err bitreich.org 70 i 72 + } Err bitreich.org 70 i 73 + Err bitreich.org 70 i 74 + rv = snprintf(ds, sizeof(ds), "%s/.datesort", pa); Err bitreich.org 70 i 75 + if (rv < 0 || (size_t)rv >= sizeof(ds)) { Err bitreich.org 70 i 76 + perror("snprintf"); Err bitreich.org 70 i 77 + return; Err bitreich.org 70 i 78 + } Err bitreich.org 70 i 79 + Err bitreich.org 70 i 80 + sortorder = access(ds, F_OK) != -1 ? datesort : alphasort; Err bitreich.org 70 i 81 + Err bitreich.org 70 i 82 + ndir = scandir(pa[0] ? pa : ".", &dirent, 0, sortorder); Err bitreich.org 70 i 83 if (ndir < 0) { Err bitreich.org 70 i 84 perror("scandir"); Err bitreich.org 70 i 85 free(pa); Err bitreich.org 70 .