if (fstat(slot->cache_fd, &slot->cache_st))
return errno;
- slot->bufsize = read(slot->cache_fd, slot->buf, sizeof(slot->buf));
+ slot->bufsize = xread(slot->cache_fd, slot->buf, sizeof(slot->buf));
if (slot->bufsize < 0)
return errno;
}
/* Close the active cache slot */
-static void close_slot(struct cache_slot *slot)
+static int close_slot(struct cache_slot *slot)
{
+ int err = 0;
if (slot->cache_fd > 0) {
- close(slot->cache_fd);
- slot->cache_fd = -1;
+ if (close(slot->cache_fd))
+ err = errno;
+ else
+ slot->cache_fd = -1;
}
+ return err;
}
/* Print the content of the active cache slot (but skip the key). */
static int print_slot(struct cache_slot *slot)
{
- ssize_t i, j = 0;
+ ssize_t i, j;
i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
if (i != slot->keylen + 1)
return errno;
- while((i=read(slot->cache_fd, slot->buf, sizeof(slot->buf))) > 0)
- j = write(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 (j < 0)
+ if (i < 0 || j != i)
return errno;
else
return 0;
}
/* Close an open lockfile */
-static void close_lock(struct cache_slot *slot)
+static int close_lock(struct cache_slot *slot)
{
+ int err = 0;
if (slot->lock_fd > 0) {
- close(slot->lock_fd);
- slot->lock_fd = -1;
+ if (close(slot->lock_fd))
+ err = errno;
+ else
+ slot->lock_fd = -1;
}
+ return err;
}
/* Create a lockfile used to store the generated content for a cache
S_IRUSR|S_IWUSR);
if (slot->lock_fd == -1)
return errno;
- write(slot->lock_fd, slot->key, slot->keylen + 1);
+ if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0)
+ return errno;
return 0;
}
err = rename(slot->lock_name, slot->cache_name);
else
err = unlink(slot->lock_name);
- return err;
+
+ if (err)
+ return errno;
+
+ return 0;
}
/* Generate the content for the current cache slot by redirecting
return errno;
/* Close the temporary filedescriptor */
- close(tmp);
+ if (close(tmp))
+ return errno;
+
return 0;
}
}
}
}
- 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;
}