geomyidae

A small C-based gopherd. (gopher://bitreich.org/1/scm/geomyidae)
git clone git://r-36.net/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_name);
     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_name);
     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 > sbuf2.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 *base, char *args,
     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);