author | Lars Hjemli <hjemli@gmail.com> | 2008-05-18 21:26:05 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2008-05-18 21:34:55 (UTC) |
commit | cdc6b2f8e7a8d43dcfe0475a9d3498333ea686b8 (patch) (unidiff) | |
tree | 021c4ef2e82de11ffb27e19ea4e5b7d60f7e0a20 | |
parent | d402811bd2db21c7868411a279fd2d220f54c294 (diff) | |
download | cgit-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>
-rw-r--r-- | cache.c | 12 |
1 files changed, 6 insertions, 6 deletions
@@ -42,25 +42,25 @@ struct cache_slot { | |||
42 | static int open_slot(struct cache_slot *slot) | 42 | static 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 | } |
@@ -72,34 +72,34 @@ static int close_slot(struct cache_slot *slot) | |||
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). */ |
82 | static int print_slot(struct cache_slot *slot) | 82 | static 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 */ |
100 | static int is_expired(struct cache_slot *slot) | 100 | static 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); |
@@ -133,25 +133,25 @@ static int close_lock(struct cache_slot *slot) | |||
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 | */ |
139 | static int lock_slot(struct cache_slot *slot) | 139 | static 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 | */ |
154 | static int unlock_slot(struct cache_slot *slot, int replace_old_slot) | 154 | static int unlock_slot(struct cache_slot *slot, int replace_old_slot) |
155 | { | 155 | { |
156 | int err; | 156 | int err; |
157 | 157 | ||