Diffstat (limited to 'cache.c')
| -rw-r--r-- | cache.c | 37 |
1 files changed, 23 insertions, 14 deletions
@@ -29,7 +29,6 @@ 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; @@ -198,13 +197,6 @@ 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; @@ -216,24 +208,42 @@ static int unlock_slot(struct cache_slot *slot, int replace_old_slot) */ static int fill_slot(struct cache_slot *slot) { + int tmp; + /* Preserve stdout */ - slot->stdout_fd = dup(STDOUT_FILENO); - if (slot->stdout_fd == -1) + tmp = dup(STDOUT_FILENO); + if (tmp == -1) return errno; /* Redirect stdout to lockfile */ - if (dup2(slot->lock_fd, STDOUT_FILENO) == -1) + if (dup2(slot->lock_fd, STDOUT_FILENO) == -1) { + close(tmp); return errno; + } /* Generate cache content */ slot->fn(); /* Make sure any buffered data is flushed to the file */ - if (fflush(stdout)) + if (fflush(stdout)) { + close(tmp); return errno; + } /* update stat info */ - if (fstat(slot->lock_fd, &slot->cache_st)) + if (fstat(slot->lock_fd, &slot->cache_st)) { + close(tmp); + return errno; + } + + /* Restore stdout */ + if (dup2(tmp, STDOUT_FILENO) == -1) { + close(tmp); + return errno; + } + + /* Close the temporary filedescriptor */ + if (close(tmp)) return errno; return 0; @@ -383,7 +393,6 @@ 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; |