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