Centralise the program name into the main header file. I'm probably
[sgt/agedu] / agedu.c
diff --git a/agedu.c b/agedu.c
index d7d9126..07e9415 100644 (file)
--- a/agedu.c
+++ b/agedu.c
@@ -20,6 +20,7 @@
 #include <sys/ioctl.h>
 #include <fnmatch.h>
 
+#include "agedu.h"
 #include "du.h"
 #include "trie.h"
 #include "index.h"
 #include "httpd.h"
 #include "fgetline.h"
 
-#define PNAME "agedu"
-
-#define lenof(x) (sizeof((x))/sizeof(*(x)))
-
 /*
  * Path separator. This global variable affects the behaviour of
  * various parts of the code when they need to deal with path
@@ -185,9 +182,6 @@ static void text_query(const void *mappedfile, const char *querydir,
     if (s1 == s2)
        return;                        /* no space taken up => no display */
 
-    /* Display in units of 1Kb */
-    printf("%-11llu %s\n", (s2 - s1) / 1024, querydir);
-
     if (depth > 0) {
        /*
         * Now scan for first-level subdirectories and report
@@ -201,6 +195,9 @@ static void text_query(const void *mappedfile, const char *querydir,
            xi1 = trie_before(mappedfile, pathbuf);
        }
     }
+
+    /* Display in units of 1Kb */
+    printf("%-11llu %s\n", (s2 - s1) / 1024, querydir);
 }
 
 /*
@@ -261,7 +258,7 @@ static void text_query(const void *mappedfile, const char *querydir,
  */
 
 #define OPTHELP(NOVAL, VAL, SHORT, LONG, HELPPFX, HELPARG, HELPLINE, HELPOPT) \
-    HELPPFX("usage") HELPLINE("agedu [options] action [action...]") \
+    HELPPFX("usage") HELPLINE(PNAME " [options] action [action...]") \
     HELPPFX("actions") \
     VAL(SCAN) SHORT(s) LONG(scan) \
        HELPARG("directory") HELPOPT("scan and index a directory") \
@@ -302,6 +299,8 @@ static void text_query(const void *mappedfile, const char *querydir,
         HELPARG("wildcard") HELPOPT("[--scan] prune files matching pattern") \
     VAL(PRUNEPATH) LONG(prune_path) \
         HELPARG("wildcard") HELPOPT("[--scan] prune pathnames matching pattern") \
+    VAL(TQDEPTH) LONG(depth) LONG(max_depth) LONG(maximum_depth) \
+        HELPARG("levels") HELPOPT("[--text] recurse to this many levels") \
     VAL(MINAGE) SHORT(a) LONG(age) LONG(min_age) LONG(minimum_age) \
         HELPARG("age") HELPOPT("[--text] include only files older than this") \
     VAL(AGERANGE) SHORT(r) LONG(age_range) LONG(range) LONG(ages) \
@@ -440,7 +439,7 @@ int main(int argc, char **argv)
     triewalk *tw;
     indexbuild *ib;
     const struct trie_file *tf;
-    char *filename = "agedu.dat";
+    char *filename = PNAME ".dat";
     int doing_opts = 1;
     enum { TEXT, HTML, SCAN, DUMP, SCANDUMP, LOAD, HTTPD };
     struct action {
@@ -459,6 +458,7 @@ int main(int argc, char **argv)
     struct inclusion_exclusion *inex = NULL;
     int ninex = 0, inexsize = 0;
     int crossfs = 0;
+    int tqdepth = 1;
 
 #ifdef DEBUG_MAD_OPTION_PARSING_MACROS
     {
@@ -601,7 +601,15 @@ int main(int argc, char **argv)
                    printf("FIXME: version();\n");
                    return 0;
                  case OPT_LICENCE:
-                   printf("FIXME: licence();\n");
+                   {
+                       extern const char *const licence[];
+                       int i;
+
+                       for (i = 0; licence[i]; i++)
+                           fputs(licence[i], stdout);
+
+                       return 0;
+                   }
                    return 0;
                  case OPT_SCAN:
                    if (nactions >= actionsize) {
@@ -684,6 +692,9 @@ int main(int argc, char **argv)
                  case OPT_DATAFILE:
                    filename = optval;
                    break;
+                 case OPT_TQDEPTH:
+                   tqdepth = atoi(optval);
+                   break;
                  case OPT_MINAGE:
                    textcutoff = parse_age(now, optval);
                    break;
@@ -725,7 +736,7 @@ int main(int argc, char **argv)
                        auth = HTTPD_AUTH_MAGIC | HTTPD_AUTH_BASIC;
                    else if (!strcmp(optval, "help") ||
                             !strcmp(optval, "list")) {
-                       printf("agedu: supported HTTP authentication types"
+                       printf(PNAME ": supported HTTP authentication types"
                               " are:\n"
                               "       magic      use Linux /proc/net/tcp to"
                               " determine owner of peer socket\n"
@@ -834,7 +845,7 @@ int main(int argc, char **argv)
                char *buf = fgetline(stdin);
                unsigned newpathsep;
                buf[strcspn(buf, "\r\n")] = '\0';
-               if (1 != sscanf(buf, "agedu dump file. pathsep=%x",
+               if (1 != sscanf(buf, DUMPHDR "%x",
                                &newpathsep)) {
                    fprintf(stderr, "%s: header in dump file not recognised\n",
                            PNAME);
@@ -855,7 +866,7 @@ int main(int argc, char **argv)
                    return 1;
                }
                if (fstat(fd, &st) < 0) {
-                   perror("agedu: fstat");
+                   perror(PNAME ": fstat");
                    return 1;
                }
                ctx->datafile_dev = st.st_dev;
@@ -895,7 +906,7 @@ int main(int argc, char **argv)
            }
 
            if (mode == SCANDUMP)
-               printf("agedu dump file. pathsep=%02x\n", (unsigned char)pathsep);
+               printf(DUMPHDR "%02x\n", (unsigned char)pathsep);
 
            /*
             * Scan the directory tree, and write out the trie component
@@ -977,7 +988,7 @@ int main(int argc, char **argv)
                 * will take; enlarge the file, and memory-map it.
                 */
                if (fstat(fd, &st) < 0) {
-                   perror("agedu: fstat");
+                   perror(PNAME ": fstat");
                    return 1;
                }
 
@@ -987,11 +998,11 @@ int main(int argc, char **argv)
                totalsize = index_compute_size(st.st_size, count);
 
                if (lseek(fd, totalsize-1, SEEK_SET) < 0) {
-                   perror("agedu: lseek");
+                   perror(PNAME ": lseek");
                    return 1;
                }
                if (write(fd, "\0", 1) < 1) {
-                   perror("agedu: write");
+                   perror(PNAME ": write");
                    return 1;
                }
 
@@ -1000,7 +1011,7 @@ int main(int argc, char **argv)
 
                mappedfile = mmap(NULL, totalsize, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
                if (!mappedfile) {
-                   perror("agedu: mmap");
+                   perror(PNAME ": mmap");
                    return 1;
                }
 
@@ -1028,13 +1039,13 @@ int main(int argc, char **argv)
                return 1;
            }
            if (fstat(fd, &st) < 0) {
-               perror("agedu: fstat");
+               perror(PNAME ": fstat");
                return 1;
            }
            totalsize = st.st_size;
            mappedfile = mmap(NULL, totalsize, PROT_READ, MAP_SHARED, fd, 0);
            if (!mappedfile) {
-               perror("agedu: mmap");
+               perror(PNAME ": mmap");
                return 1;
            }
            pathsep = trie_pathsep(mappedfile);
@@ -1046,7 +1057,7 @@ int main(int argc, char **argv)
            if (pathlen > 0 && querydir[pathlen-1] == pathsep)
                querydir[--pathlen] = '\0';
 
-           text_query(mappedfile, querydir, textcutoff, 1);
+           text_query(mappedfile, querydir, textcutoff, tqdepth);
        } else if (mode == HTML) {
            char *querydir = actions[action].arg;
            size_t pathlen;
@@ -1061,13 +1072,13 @@ int main(int argc, char **argv)
                return 1;
            }
            if (fstat(fd, &st) < 0) {
-               perror("agedu: fstat");
+               perror(PNAME ": fstat");
                return 1;
            }
            totalsize = st.st_size;
            mappedfile = mmap(NULL, totalsize, PROT_READ, MAP_SHARED, fd, 0);
            if (!mappedfile) {
-               perror("agedu: mmap");
+               perror(PNAME ": mmap");
                return 1;
            }
            pathsep = trie_pathsep(mappedfile);
@@ -1097,13 +1108,13 @@ int main(int argc, char **argv)
                return 1;
            }
            if (fstat(fd, &st) < 0) {
-               perror("agedu: fstat");
+               perror(PNAME ": fstat");
                return 1;
            }
            totalsize = st.st_size;
            mappedfile = mmap(NULL, totalsize, PROT_READ, MAP_SHARED, fd, 0);
            if (!mappedfile) {
-               perror("agedu: mmap");
+               perror(PNAME ": mmap");
                return 1;
            }
            pathsep = trie_pathsep(mappedfile);
@@ -1111,7 +1122,7 @@ int main(int argc, char **argv)
            maxpathlen = trie_maxpathlen(mappedfile);
            buf = snewn(maxpathlen, char);
 
-           printf("agedu dump file. pathsep=%02x\n", (unsigned char)pathsep);
+           printf(DUMPHDR "%02x\n", (unsigned char)pathsep);
            tw = triewalk_new(mappedfile);
            while ((tf = triewalk_next(tw, buf)) != NULL)
                dump_line(buf, tf);
@@ -1127,13 +1138,13 @@ int main(int argc, char **argv)
                return 1;
            }
            if (fstat(fd, &st) < 0) {
-               perror("agedu: fstat");
+               perror(PNAME ": fstat");
                return 1;
            }
            totalsize = st.st_size;
            mappedfile = mmap(NULL, totalsize, PROT_READ, MAP_SHARED, fd, 0);
            if (!mappedfile) {
-               perror("agedu: mmap");
+               perror(PNAME ": mmap");
                return 1;
            }
            pathsep = trie_pathsep(mappedfile);