summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cache.c4
-rw-r--r--ui-plain.c2
2 files changed, 3 insertions, 3 deletions
diff --git a/cache.c b/cache.c
index 57068a1..d7a8d5a 100644
--- a/cache.c
+++ b/cache.c
@@ -291,149 +291,149 @@ static int process_slot(struct cache_slot *slot)
// We've got a valid cache slot in the lock file, which
// is about to replace the old cache slot. But if we
// release the lockfile and then try to open the new cache
// slot, we might get a race condition with a concurrent
// writer for the same cache slot (with a different key).
// Lets avoid such a race by just printing the content of
// the lock file.
slot->cache_fd = slot->lock_fd;
unlock_slot(slot, 1);
if ((err = print_slot(slot)) != 0) {
cache_log("[cgit] error printing cache %s: %s (%d)\n",
slot->cache_name,
strerror(err),
err);
}
close_slot(slot);
return err;
}
/* Print cached content to stdout, generate the content if necessary. */
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" */
struct cache_slot slot;
/* If the cache is disabled, just generate the content */
if (size <= 0) {
fn(cbdata);
return 0;
}
/* Verify input, calculate filenames */
if (!path) {
cache_log("[cgit] Cache path not specified, caching is disabled\n");
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++] = '/';
for(i = 0; i < 8; i++) {
sprintf(filename + len++, "%x",
(unsigned char)(hash & 0xf));
hash >>= 4;
}
filename[len] = '\0';
strcpy(lockname, filename);
strcpy(lockname + len, ".lock");
slot.fn = fn;
slot.cbdata = cbdata;
slot.ttl = ttl;
slot.cache_name = filename;
slot.lock_name = lockname;
slot.key = key;
slot.keylen = strlen(key);
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 %10zd %s\n",
+ printf("%s %s %10"PRIuMAX" %s\n",
name,
sprintftime("%Y-%m-%d %H:%M:%S",
slot.cache_st.st_mtime),
- slot.cache_st.st_size,
+ (uintmax_t)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, ...)
{
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
}
diff --git a/ui-plain.c b/ui-plain.c
index be559e0..5addd9e 100644
--- a/ui-plain.c
+++ b/ui-plain.c
@@ -1,79 +1,79 @@
/* ui-plain.c: functions for output of plain blobs by path
*
* Copyright (C) 2008 Lars Hjemli
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
#include "html.h"
#include "ui-shared.h"
char *curr_rev;
char *match_path;
int match;
static void print_object(const unsigned char *sha1, const char *path)
{
enum object_type type;
char *buf;
- size_t size;
+ unsigned long size;
type = sha1_object_info(sha1, &size);
if (type == OBJ_BAD) {
html_status(404, "Not found", 0);
return;
}
buf = read_sha1_file(sha1, &type, &size);
if (!buf) {
html_status(404, "Not found", 0);
return;
}
ctx.page.mimetype = "text/plain";
ctx.page.filename = fmt("%s", path);
ctx.page.size = size;
cgit_print_http_headers(&ctx);
html_raw(buf, size);
match = 1;
}
static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
const char *pathname, unsigned mode, int stage,
void *cbdata)
{
if (S_ISDIR(mode))
return READ_TREE_RECURSIVE;
if (S_ISREG(mode))
print_object(sha1, pathname);
return 0;
}
void cgit_print_plain(struct cgit_context *ctx)
{
const char *rev = ctx->qry.sha1;
unsigned char sha1[20];
struct commit *commit;
const char *paths[] = {ctx->qry.path, NULL};
if (!rev)
rev = ctx->qry.head;
curr_rev = xstrdup(rev);
if (get_sha1(rev, sha1)) {
html_status(404, "Not found", 0);
return;
}
commit = lookup_commit_reference(sha1);
if (!commit || parse_commit(commit)) {
html_status(404, "Not found", 0);
return;
}
match_path = ctx->qry.path;
read_tree_recursive(commit->tree, NULL, 0, 0, paths, walk_tree, NULL);
if (!match)
html_status(404, "Not found", 0);
}