diff options
| -rw-r--r-- | cache.c | 15 |
1 files changed, 14 insertions, 1 deletions
| @@ -161,10 +161,23 @@ static int close_lock(struct cache_slot *slot) | |||
| 161 | */ | 161 | */ |
| 162 | static int lock_slot(struct cache_slot *slot) | 162 | static int lock_slot(struct cache_slot *slot) |
| 163 | { | 163 | { |
| 164 | slot->lock_fd = open(slot->lock_name, O_RDWR | O_CREAT | O_EXCL, | 164 | struct flock lock = { |
| 165 | .l_type = F_WRLCK, | ||
| 166 | .l_whence = SEEK_SET, | ||
| 167 | .l_start = 0, | ||
| 168 | .l_len = 0, | ||
| 169 | }; | ||
| 170 | |||
| 171 | slot->lock_fd = open(slot->lock_name, O_RDWR | O_CREAT, | ||
| 165 | S_IRUSR | S_IWUSR); | 172 | S_IRUSR | S_IWUSR); |
| 166 | if (slot->lock_fd == -1) | 173 | if (slot->lock_fd == -1) |
| 167 | return errno; | 174 | return errno; |
| 175 | if (fcntl(slot->lock_fd, F_SETLK, &lock) < 0) { | ||
| 176 | int saved_errno = errno; | ||
| 177 | close(slot->lock_fd); | ||
| 178 | slot->lock_fd = -1; | ||
| 179 | return saved_errno; | ||
| 180 | } | ||
| 168 | if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0) | 181 | if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0) |
| 169 | return errno; | 182 | return errno; |
| 170 | return 0; | 183 | return 0; |
