* Main program for agedu.
*/
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <time.h>
-#include <assert.h>
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <termios.h>
-#include <sys/ioctl.h>
-#include <fnmatch.h>
-
#include "agedu.h"
+
#include "du.h"
#include "trie.h"
#include "index.h"
struct inclusion_exclusion *inex;
int ninex;
int crossfs;
+ int usemtime;
int fakeatimes;
};
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;
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) \
int crossfs = 0;
int tqdepth = 1;
int fakediratimes = 1;
+ int mtime = 0;
#ifdef DEBUG_MAD_OPTION_PARSING_MACROS
{
case OPT_NODIRATIME:
fakediratimes = 1;
break;
+ case OPT_MTIME:
+ mtime = 1;
+ break;
case OPT_DATAFILE:
filename = optval;
break;
ctx->ninex = ninex;
ctx->crossfs = crossfs;
ctx->fakeatimes = fakediratimes;
+ ctx->usemtime = mtime;
ctx->last_output_update = time(NULL);
return 1;
}
- printf("Built pathname index, %d entries, %ju bytes\n", count,
- (intmax_t)st.st_size);
+ printf("Built pathname index, %d entries, %llu bytes\n", count,
+ (unsigned long long)st.st_size);
totalsize = index_compute_size(st.st_size, count);
return 1;
}
- printf("Upper bound on index file size = %ju bytes\n",
- (intmax_t)totalsize);
+ printf("Upper bound on index file size = %llu bytes\n",
+ (unsigned long long)totalsize);
mappedfile = mmap(NULL, totalsize, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
if (!mappedfile) {
munmap(mappedfile, totalsize);
ftruncate(fd, realsize);
close(fd);
- printf("Actual index file size = %ju bytes\n", (intmax_t)realsize);
+ printf("Actual index file size = %llu bytes\n",
+ (unsigned long long)realsize);
}
} else if (mode == TEXT) {
char *querydir = actions[action].arg;
querydir[--pathlen] = '\0';
text_query(mappedfile, querydir, textcutoff, tqdepth);
+
+ munmap(mappedfile, totalsize);
} else if (mode == HTML) {
char *querydir = actions[action].arg;
size_t pathlen;
cfg.newest = htmlnewest;
html = html_query(mappedfile, xi, &cfg);
fputs(html, stdout);
+
+ munmap(mappedfile, totalsize);
} else if (mode == DUMP) {
size_t maxpathlen;
char *buf;
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;
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,