about summary refs log tree commit diff
path: root/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'cache.c')
-rw-r--r--cache.c68
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, ...)
 {