diff options
author | Lars Hjemli <hjemli@gmail.com> | 2008-04-28 12:10:13 +0200 |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2008-04-28 12:10:13 +0200 |
commit | 9000bbf865cb3578ba5ed3810dc44253cb46ec7f (patch) | |
tree | a9917628c40301862d1b1d6f5ecaf803ecc0f714 /cache.c | |
parent | Redesign the caching layer (diff) | |
download | cgit-pink-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.tar.gz cgit-pink-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.zip |
Add page 'ls_cache'
This new page will list all entries found in the current cache, which is useful when reviewing the new cache implementation. There are no links to the new page, but it's reachable by adding 'p=ls_cache' to any cgit url. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to '')
-rw-r--r-- | cache.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/cache.c b/cache.c index e590d7b..b701e13 100644 --- a/cache.c +++ b/cache.c @@ -332,6 +332,74 @@ int cache_process(int size, const char *path, const char *key, int ttl, return process_slot(&slot); } +/* 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 */ void cache_log(const char *format, ...) { |