Why on earth was I creating the data file with x permission? Silly
[sgt/agedu] / agedu.c
diff --git a/agedu.c b/agedu.c
index 1a68eb4..76e884c 100644 (file)
--- a/agedu.c
+++ b/agedu.c
@@ -49,6 +49,7 @@ struct ctx {
     struct inclusion_exclusion *inex;
     int ninex;
     int crossfs;
+    int usemtime;
     int fakeatimes;
 };
 
@@ -86,7 +87,7 @@ static int gotdata(void *vctx, const char *pathname, const STRUCT_STAT *st)
        return 0;
 
     file.size = (unsigned long long)512 * st->st_blocks;
-    if (ctx->fakeatimes && S_ISDIR(st->st_mode))
+    if (ctx->usemtime || (ctx->fakeatimes && S_ISDIR(st->st_mode)))
        file.atime = st->st_mtime;
     else
        file.atime = st->st_atime;
@@ -299,6 +300,8 @@ static void text_query(const void *mappedfile, const char *querydir,
         HELPOPT("[--scan,--load] keep real atimes on directories") \
     NOVAL(NODIRATIME) LONG(no_dir_atime) LONG(no_dir_atimes) \
         HELPOPT("[--scan,--load] fake atimes on directories") \
+    NOVAL(MTIME) LONG(mtime) \
+        HELPOPT("[--scan] use mtime instead of atime") \
     VAL(AGERANGE) SHORT(r) LONG(age_range) LONG(range) LONG(ages) \
         HELPARG("age[-age]") HELPOPT("[--web,--html] set limits of colour coding") \
     VAL(SERVERADDR) LONG(address) LONG(addr) LONG(server_address) \
@@ -460,6 +463,7 @@ int main(int argc, char **argv)
     int crossfs = 0;
     int tqdepth = 1;
     int fakediratimes = 1;
+    int mtime = 0;
 
 #ifdef DEBUG_MAD_OPTION_PARSING_MACROS
     {
@@ -710,6 +714,9 @@ int main(int argc, char **argv)
                  case OPT_NODIRATIME:
                    fakediratimes = 1;
                    break;
+                 case OPT_MTIME:
+                   mtime = 1;
+                   break;
                  case OPT_DATAFILE:
                    filename = optval;
                    break;
@@ -880,7 +887,8 @@ int main(int argc, char **argv)
                /*
                 * Prepare to write out the index file.
                 */
-               fd = open(filename, O_RDWR | O_TRUNC | O_CREAT, S_IRWXU);
+               fd = open(filename, O_RDWR | O_TRUNC | O_CREAT,
+                         S_IRUSR | S_IWUSR);
                if (fd < 0) {
                    fprintf(stderr, "%s: %s: open: %s\n", PNAME, filename,
                            strerror(errno));
@@ -912,6 +920,7 @@ int main(int argc, char **argv)
            ctx->ninex = ninex;
            ctx->crossfs = crossfs;
            ctx->fakeatimes = fakediratimes;
+           ctx->usemtime = mtime;
 
            ctx->last_output_update = time(NULL);
 
@@ -1089,6 +1098,8 @@ int main(int argc, char **argv)
                querydir[--pathlen] = '\0';
 
            text_query(mappedfile, querydir, textcutoff, tqdepth);
+
+           munmap(mappedfile, totalsize);
        } else if (mode == HTML) {
            char *querydir = actions[action].arg;
            size_t pathlen;
@@ -1128,6 +1139,8 @@ int main(int argc, char **argv)
            cfg.newest = htmlnewest;
            html = html_query(mappedfile, xi, &cfg);
            fputs(html, stdout);
+
+           munmap(mappedfile, totalsize);
        } else if (mode == DUMP) {
            size_t maxpathlen;
            char *buf;
@@ -1158,6 +1171,8 @@ int main(int argc, char **argv)
            while ((tf = triewalk_next(tw, buf)) != NULL)
                dump_line(buf, tf);
            triewalk_free(tw);
+
+           munmap(mappedfile, totalsize);
        } else if (mode == HTTPD) {
            struct html_config pcfg;
            struct httpd_config dcfg;
@@ -1188,6 +1203,7 @@ int main(int argc, char **argv)
            pcfg.oldest = htmloldest;
            pcfg.newest = htmlnewest;
            run_httpd(mappedfile, auth, &dcfg, &pcfg);
+           munmap(mappedfile, totalsize);
        } else if (mode == REMOVE) {
            if (remove(filename) < 0) {
                fprintf(stderr, "%s: %s: remove: %s\n", PNAME, filename,