Introduction
Introduction Statistics Contact Development Disclaimer Help
order-directories-by-date.patch - geomyidae - A small C-based gopherd.
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri…
Log
Files
Refs
Tags
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);
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.