X-Git-Url: https://git.cameronkatri.com/cgit.git/blobdiff_plain/3fbfced7401cfcbb8006a9a6ce4add6b37a41a55..824138e59194acaf5efe53690d4ef6eaf38e1549:/cache.c diff --git a/cache.c b/cache.c index df1b4a3..2c70be7 100644 --- a/cache.c +++ b/cache.c @@ -29,6 +29,7 @@ struct cache_slot { cache_fill_fn fn; int cache_fd; int lock_fd; + int stdout_fd; const char *cache_name; const char *lock_name; int match; @@ -61,8 +62,9 @@ static int open_slot(struct cache_slot *slot) if (bufz) bufkeylen = bufz - slot->buf; - slot->match = bufkeylen == slot->keylen && - !memcmp(slot->key, slot->buf, bufkeylen + 1); + if (slot->key) + slot->match = bufkeylen == slot->keylen && + !memcmp(slot->key, slot->buf, bufkeylen + 1); return 0; } @@ -196,6 +198,13 @@ static int unlock_slot(struct cache_slot *slot, int replace_old_slot) else err = unlink(slot->lock_name); + /* Restore stdout and close the temporary FD. */ + if (slot->stdout_fd >= 0) { + dup2(slot->stdout_fd, STDOUT_FILENO); + close(slot->stdout_fd); + slot->stdout_fd = -1; + } + if (err) return errno; @@ -207,36 +216,24 @@ static int unlock_slot(struct cache_slot *slot, int replace_old_slot) */ static int fill_slot(struct cache_slot *slot) { - int tmp; - /* Preserve stdout */ - tmp = dup(STDOUT_FILENO); - if (tmp == -1) + slot->stdout_fd = dup(STDOUT_FILENO); + if (slot->stdout_fd == -1) return errno; /* Redirect stdout to lockfile */ - if (dup2(slot->lock_fd, STDOUT_FILENO) == -1) { - close(tmp); + if (dup2(slot->lock_fd, STDOUT_FILENO) == -1) return errno; - } /* Generate cache content */ slot->fn(); - /* update stat info */ - if (fstat(slot->lock_fd, &slot->cache_st)) { - close(tmp); - return errno; - } - - /* Restore stdout */ - if (dup2(tmp, STDOUT_FILENO) == -1) { - close(tmp); + /* Make sure any buffered data is flushed to the file */ + if (fflush(stdout)) return errno; - } - /* Close the temporary filedescriptor */ - if (close(tmp)) + /* update stat info */ + if (fstat(slot->lock_fd, &slot->cache_st)) return errno; return 0; @@ -311,7 +308,7 @@ static int process_slot(struct cache_slot *slot) /* If the cache slot does not exist (or its key doesn't match the * current key), lets try to create a new cache slot for this * request. If this fails (for whatever reason), lets just generate - * the content without caching it and fool the caller to belive + * the content without caching it and fool the caller to believe * everything worked out (but print a warning on stdout). */ @@ -386,6 +383,7 @@ int cache_process(int size, const char *path, const char *key, int ttl, strbuf_addstr(&lockname, ".lock"); slot.fn = fn; slot.ttl = ttl; + slot.stdout_fd = -1; slot.cache_name = filename.buf; slot.lock_name = lockname.buf; slot.key = key;