-rw-r--r-- | cache.c | 68 | ||||
-rw-r--r-- | cache.h | 3 | ||||
-rw-r--r-- | cmd.c | 21 |
3 files changed, 87 insertions, 5 deletions
@@ -334,2 +334,70 @@ int cache_process(int size, const char *path, const char *key, int ttl, +/* Return a strftime formatted date/time + * NB: the result from this function is to shared memory + */ +char *sprintftime(const char *format, time_t time) +{ + static char buf[64]; + struct tm *tm; + + if (!time) + return NULL; + tm = gmtime(&time); + strftime(buf, sizeof(buf)-1, format, tm); + return buf; +} + +int cache_ls(const char *path) +{ + DIR *dir; + struct dirent *ent; + int err = 0; + struct cache_slot slot; + char fullname[1024]; + char *name; + + if (!path) { + cache_log("[cgit] cache path not specified\n"); + return -1; + } + if (strlen(path) > 1024 - 10) { + cache_log("[cgit] cache path too long: %s\n", + path); + return -1; + } + dir = opendir(path); + if (!dir) { + err = errno; + cache_log("[cgit] unable to open path %s: %s (%d)\n", + path, strerror(err), err); + return err; + } + strcpy(fullname, path); + name = fullname + strlen(path); + if (*(name - 1) != '/') { + *name++ = '/'; + *name = '\0'; + } + slot.cache_name = fullname; + while((ent = readdir(dir)) != NULL) { + if (strlen(ent->d_name) != 8) + continue; + strcpy(name, ent->d_name); + if ((err = open_slot(&slot)) != 0) { + cache_log("[cgit] unable to open path %s: %s (%d)\n", + fullname, strerror(err), err); + continue; + } + printf("%s %s %10lld %s\n", + name, + sprintftime("%Y-%m-%d %H:%M:%S", + slot.cache_st.st_mtime), + slot.cache_st.st_size, + slot.buf); + close_slot(&slot); + } + closedir(dir); + return 0; +} + /* Print a message to stdout */ @@ -28,2 +28,5 @@ extern int cache_process(int size, const char *path, const char *key, int ttl, +/* List info about all cache entries on stdout */ +extern int cache_ls(const char *path); + /* Print a message to stdout */ @@ -10,2 +10,4 @@ #include "cmd.h" +#include "cache.h" +#include "ui-shared.h" #include "ui-blob.h" @@ -37,7 +39,2 @@ static void diff_fn(struct cgit_context *ctx) -static void repolist_fn(struct cgit_context *ctx) -{ - cgit_print_repolist(); -} - static void log_fn(struct cgit_context *ctx) @@ -48,2 +45,15 @@ static void log_fn(struct cgit_context *ctx) +static void ls_cache_fn(struct cgit_context *ctx) +{ + ctx->page.mimetype = "text/plain"; + ctx->page.filename = "ls-cache.txt"; + cgit_print_http_headers(ctx); + cache_ls(ctx->cfg.cache_root); +} + +static void repolist_fn(struct cgit_context *ctx) +{ + cgit_print_repolist(); +} + static void patch_fn(struct cgit_context *ctx) @@ -90,2 +100,3 @@ struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) def_cmd(log, 1, 1), + def_cmd(ls_cache, 0, 0), def_cmd(patch, 1, 0), |