summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2008-05-18 21:26:05 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-05-18 21:34:55 (UTC)
commitcdc6b2f8e7a8d43dcfe0475a9d3498333ea686b8 (patch) (unidiff)
tree021c4ef2e82de11ffb27e19ea4e5b7d60f7e0a20
parentd402811bd2db21c7868411a279fd2d220f54c294 (diff)
downloadcgit-cdc6b2f8e7a8d43dcfe0475a9d3498333ea686b8.zip
cgit-cdc6b2f8e7a8d43dcfe0475a9d3498333ea686b8.tar.gz
cgit-cdc6b2f8e7a8d43dcfe0475a9d3498333ea686b8.tar.bz2
cache.c: use xread()/xwrite() from libgit
These functions handles EINTR/EAGAIN errors during read/write operations, which is something cache.c didn't. While at it, fix a bug in print_slot() where errors during reading from the cache slot might go by unnoticed. Noticed-by: Jim Meyering <jim@meyering.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cache.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/cache.c b/cache.c
index 6847202..a996109 100644
--- a/cache.c
+++ b/cache.c
@@ -38,72 +38,72 @@ struct cache_slot {
38/* Open an existing cache slot and fill the cache buffer with 38/* Open an existing cache slot and fill the cache buffer with
39 * (part of) the content of the cache file. Return 0 on success 39 * (part of) the content of the cache file. Return 0 on success
40 * and errno otherwise. 40 * and errno otherwise.
41 */ 41 */
42static int open_slot(struct cache_slot *slot) 42static int open_slot(struct cache_slot *slot)
43{ 43{
44 char *bufz; 44 char *bufz;
45 int bufkeylen = -1; 45 int bufkeylen = -1;
46 46
47 slot->cache_fd = open(slot->cache_name, O_RDONLY); 47 slot->cache_fd = open(slot->cache_name, O_RDONLY);
48 if (slot->cache_fd == -1) 48 if (slot->cache_fd == -1)
49 return errno; 49 return errno;
50 50
51 if (fstat(slot->cache_fd, &slot->cache_st)) 51 if (fstat(slot->cache_fd, &slot->cache_st))
52 return errno; 52 return errno;
53 53
54 slot->bufsize = read(slot->cache_fd, slot->buf, sizeof(slot->buf)); 54 slot->bufsize = xread(slot->cache_fd, slot->buf, sizeof(slot->buf));
55 if (slot->bufsize < 0) 55 if (slot->bufsize < 0)
56 return errno; 56 return errno;
57 57
58 bufz = memchr(slot->buf, 0, slot->bufsize); 58 bufz = memchr(slot->buf, 0, slot->bufsize);
59 if (bufz) 59 if (bufz)
60 bufkeylen = bufz - slot->buf; 60 bufkeylen = bufz - slot->buf;
61 61
62 slot->match = bufkeylen == slot->keylen && 62 slot->match = bufkeylen == slot->keylen &&
63 !memcmp(slot->key, slot->buf, bufkeylen + 1); 63 !memcmp(slot->key, slot->buf, bufkeylen + 1);
64 64
65 return 0; 65 return 0;
66} 66}
67 67
68/* Close the active cache slot */ 68/* Close the active cache slot */
69static int close_slot(struct cache_slot *slot) 69static int close_slot(struct cache_slot *slot)
70{ 70{
71 int err = 0; 71 int err = 0;
72 if (slot->cache_fd > 0) { 72 if (slot->cache_fd > 0) {
73 if (close(slot->cache_fd)) 73 if (close(slot->cache_fd))
74 err = errno; 74 err = errno;
75 else 75 else
76 slot->cache_fd = -1; 76 slot->cache_fd = -1;
77 } 77 }
78 return err; 78 return err;
79} 79}
80 80
81/* Print the content of the active cache slot (but skip the key). */ 81/* Print the content of the active cache slot (but skip the key). */
82static int print_slot(struct cache_slot *slot) 82static int print_slot(struct cache_slot *slot)
83{ 83{
84 ssize_t i, j = 0; 84 ssize_t i;
85 85
86 i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET); 86 i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
87 if (i != slot->keylen + 1) 87 if (i != slot->keylen + 1)
88 return errno; 88 return errno;
89 89
90 while((i=read(slot->cache_fd, slot->buf, sizeof(slot->buf))) > 0) 90 while((i = xread(slot->cache_fd, slot->buf, sizeof(slot->buf))) > 0)
91 j = write(STDOUT_FILENO, slot->buf, i); 91 i = xwrite(STDOUT_FILENO, slot->buf, i);
92 92
93 if (j < 0) 93 if (i < 0)
94 return errno; 94 return errno;
95 else 95 else
96 return 0; 96 return 0;
97} 97}
98 98
99/* Check if the slot has expired */ 99/* Check if the slot has expired */
100static int is_expired(struct cache_slot *slot) 100static int is_expired(struct cache_slot *slot)
101{ 101{
102 if (slot->ttl < 0) 102 if (slot->ttl < 0)
103 return 0; 103 return 0;
104 else 104 else
105 return slot->cache_st.st_mtime + slot->ttl*60 < time(NULL); 105 return slot->cache_st.st_mtime + slot->ttl*60 < time(NULL);
106} 106}
107 107
108/* Check if the slot has been modified since we opened it. 108/* Check if the slot has been modified since we opened it.
109 * NB: If stat() fails, we pretend the file is modified. 109 * NB: If stat() fails, we pretend the file is modified.
@@ -129,33 +129,33 @@ static int close_lock(struct cache_slot *slot)
129 else 129 else
130 slot->lock_fd = -1; 130 slot->lock_fd = -1;
131 } 131 }
132 return err; 132 return err;
133} 133}
134 134
135/* Create a lockfile used to store the generated content for a cache 135/* Create a lockfile used to store the generated content for a cache
136 * slot, and write the slot key + \0 into it. 136 * slot, and write the slot key + \0 into it.
137 * Returns 0 on success and errno otherwise. 137 * Returns 0 on success and errno otherwise.
138 */ 138 */
139static int lock_slot(struct cache_slot *slot) 139static int lock_slot(struct cache_slot *slot)
140{ 140{
141 slot->lock_fd = open(slot->lock_name, O_RDWR|O_CREAT|O_EXCL, 141 slot->lock_fd = open(slot->lock_name, O_RDWR|O_CREAT|O_EXCL,
142 S_IRUSR|S_IWUSR); 142 S_IRUSR|S_IWUSR);
143 if (slot->lock_fd == -1) 143 if (slot->lock_fd == -1)
144 return errno; 144 return errno;
145 if (write(slot->lock_fd, slot->key, slot->keylen + 1) < 0) 145 if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0)
146 return errno; 146 return errno;
147 return 0; 147 return 0;
148} 148}
149 149
150/* Release the current lockfile. If `replace_old_slot` is set the 150/* Release the current lockfile. If `replace_old_slot` is set the
151 * lockfile replaces the old cache slot, otherwise the lockfile is 151 * lockfile replaces the old cache slot, otherwise the lockfile is
152 * just deleted. 152 * just deleted.
153 */ 153 */
154static int unlock_slot(struct cache_slot *slot, int replace_old_slot) 154static int unlock_slot(struct cache_slot *slot, int replace_old_slot)
155{ 155{
156 int err; 156 int err;
157 157
158 if (replace_old_slot) 158 if (replace_old_slot)
159 err = rename(slot->lock_name, slot->cache_name); 159 err = rename(slot->lock_name, slot->cache_name);
160 else 160 else
161 err = unlink(slot->lock_name); 161 err = unlink(slot->lock_name);