]> git.cameronkatri.com Git - cgit.git/blobdiff - cache.c
parsing.c: Remove leading space from committer
[cgit.git] / cache.c
diff --git a/cache.c b/cache.c
index 47cdcb44d5ccdfe9bf95c4a8b7af94ded87bfcf4..fa83ddc33c15d71e6e6372bd6713bbfd9c4ecaa6 100644 (file)
--- a/cache.c
+++ b/cache.c
@@ -1,6 +1,6 @@
 /* cache.c: cache management
  *
- * Copyright (C) 2006 Lars Hjemli
+ * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
  *
  * Licensed under GNU General Public License v2
  *   (see COPYING for full license text)
@@ -15,6 +15,7 @@
 
 #include "cgit.h"
 #include "cache.h"
+#include "html.h"
 
 #define CACHE_BUFSIZE (1024 * 4)
 
@@ -312,10 +313,11 @@ int cache_process(int size, const char *path, const char *key, int ttl,
                  cache_fill_fn fn, void *cbdata)
 {
        unsigned long hash;
-       int len, i;
-       char filename[1024];
-       char lockname[1024 + 5];  /* 5 = ".lock" */
+       int i;
+       struct strbuf filename = STRBUF_INIT;
+       struct strbuf lockname = STRBUF_INIT;
        struct cache_slot slot;
+       int result;
 
        /* If the cache is disabled, just generate the content */
        if (size <= 0) {
@@ -329,41 +331,35 @@ int cache_process(int size, const char *path, const char *key, int ttl,
                fn(cbdata);
                return 0;
        }
-       len = strlen(path);
-       if (len > sizeof(filename) - 10) { /* 10 = "/01234567\0" */
-               cache_log("[cgit] Cache path too long, caching is disabled: %s\n",
-                         path);
-               fn(cbdata);
-               return 0;
-       }
        if (!key)
                key = "";
        hash = hash_str(key) % size;
-       strcpy(filename, path);
-       if (filename[len - 1] != '/')
-               filename[len++] = '/';
+       strbuf_addstr(&filename, path);
+       strbuf_ensure_end(&filename, '/');
        for (i = 0; i < 8; i++) {
-               sprintf(filename + len++, "%x",
-                       (unsigned char)(hash & 0xf));
+               strbuf_addf(&filename, "%x", (unsigned char)(hash & 0xf));
                hash >>= 4;
        }
-       filename[len] = '\0';
-       strcpy(lockname, filename);
-       strcpy(lockname + len, ".lock");
+       strbuf_addbuf(&lockname, &filename);
+       strbuf_addstr(&lockname, ".lock");
        slot.fn = fn;
        slot.cbdata = cbdata;
        slot.ttl = ttl;
-       slot.cache_name = filename;
-       slot.lock_name = lockname;
+       slot.cache_name = filename.buf;
+       slot.lock_name = lockname.buf;
        slot.key = key;
        slot.keylen = strlen(key);
-       return process_slot(&slot);
+       result = process_slot(&slot);
+
+       strbuf_release(&filename);
+       strbuf_release(&lockname);
+       return result;
 }
 
 /* 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 *sprintftime(const char *format, time_t time)
 {
        static char buf[64];
        struct tm *tm;
@@ -380,19 +376,14 @@ int cache_ls(const char *path)
        DIR *dir;
        struct dirent *ent;
        int err = 0;
-       struct cache_slot slot;
-       char fullname[1024];
-       char *name;
+       struct cache_slot slot = { 0 };
+       struct strbuf fullname = STRBUF_INIT;
+       size_t prefixlen;
 
        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;
@@ -400,31 +391,30 @@ int cache_ls(const char *path)
                          path, strerror(err), err);
                return err;
        }
-       strcpy(fullname, path);
-       name = fullname + strlen(path);
-       if (*(name - 1) != '/') {
-               *name++ = '/';
-               *name = '\0';
-       }
-       slot.cache_name = fullname;
+       strbuf_addstr(&fullname, path);
+       strbuf_ensure_end(&fullname, '/');
+       prefixlen = fullname.len;
        while ((ent = readdir(dir)) != NULL) {
                if (strlen(ent->d_name) != 8)
                        continue;
-               strcpy(name, ent->d_name);
+               strbuf_setlen(&fullname, prefixlen);
+               strbuf_addstr(&fullname, ent->d_name);
+               slot.cache_name = fullname.buf;
                if ((err = open_slot(&slot)) != 0) {
                        cache_log("[cgit] unable to open path %s: %s (%d)\n",
-                                 fullname, strerror(err), err);
+                                 fullname.buf, strerror(err), err);
                        continue;
                }
-               printf("%s %s %10"PRIuMAX" %s\n",
-                      name,
-                      sprintftime("%Y-%m-%d %H:%M:%S",
-                                  slot.cache_st.st_mtime),
-                      (uintmax_t)slot.cache_st.st_size,
-                      slot.buf);
+               htmlf("%s %s %10"PRIuMAX" %s\n",
+                     fullname.buf,
+                     sprintftime("%Y-%m-%d %H:%M:%S",
+                                 slot.cache_st.st_mtime),
+                     (uintmax_t)slot.cache_st.st_size,
+                     slot.buf);
                close_slot(&slot);
        }
        closedir(dir);
+       strbuf_release(&fullname);
        return 0;
 }