/* Print the content of the active cache slot (but skip the key). */
static int print_slot(struct cache_slot *slot)
{
- ssize_t i;
+ ssize_t i, j;
i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
if (i != slot->keylen + 1)
return errno;
- while((i = xread(slot->cache_fd, slot->buf, sizeof(slot->buf))) > 0)
- i = xwrite(STDOUT_FILENO, slot->buf, i);
+ do {
+ i = j = xread(slot->cache_fd, slot->buf, sizeof(slot->buf));
+ if (i > 0)
+ j = xwrite(STDOUT_FILENO, slot->buf, i);
+ } while (i > 0 && j == i);
- if (i < 0)
+ if (i < 0 || j != i)
return errno;
else
return 0;
if (slot->ttl < 0)
return 0;
else
- return slot->cache_st.st_mtime + slot->ttl*60 < time(NULL);
+ return slot->cache_st.st_mtime + slot->ttl * 60 < time(NULL);
}
/* Check if the slot has been modified since we opened it.
*/
static int lock_slot(struct cache_slot *slot)
{
- slot->lock_fd = open(slot->lock_name, O_RDWR|O_CREAT|O_EXCL,
- S_IRUSR|S_IWUSR);
+ slot->lock_fd = open(slot->lock_name, O_RDWR | O_CREAT | O_EXCL,
+ S_IRUSR | S_IWUSR);
if (slot->lock_fd == -1)
return errno;
if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0)
if (!s)
return h;
- while(*s) {
+ while (*s) {
h *= FNV_PRIME;
h ^= *s++;
}
}
}
}
- print_slot(slot);
+ 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 0;
+ return err;
}
/* If the cache slot does not exist (or its key doesn't match the
// the lock file.
slot->cache_fd = slot->lock_fd;
unlock_slot(slot, 1);
- err = print_slot(slot);
+ 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;
}
strcpy(filename, path);
if (filename[len - 1] != '/')
filename[len++] = '/';
- for(i = 0; i < 8; i++) {
+ for (i = 0; i < 8; i++) {
sprintf(filename + len++, "%x",
(unsigned char)(hash & 0xf));
hash >>= 4;
/* 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;
*name = '\0';
}
slot.cache_name = fullname;
- while((ent = readdir(dir)) != NULL) {
+ while ((ent = readdir(dir)) != NULL) {
if (strlen(ent->d_name) != 8)
continue;
strcpy(name, ent->d_name);
fullname, strerror(err), err);
continue;
}
- printf("%s %s %10lld %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);
}