]> git.ipfire.org Git - thirdparty/git.git/blame - lockfile.c
Sync with 2.4.3
[thirdparty/git.git] / lockfile.c
CommitLineData
021b6e45
JH
1/*
2 * Copyright (c) 2005, Junio C Hamano
3 */
021b6e45 4#include "cache.h"
697cc8ef 5#include "lockfile.h"
4a16d072 6#include "sigchain.h"
021b6e45 7
2091c506 8static struct lock_file *volatile lock_file_list;
021b6e45 9
013870cd 10static void remove_lock_files(int skip_fclose)
021b6e45 11{
5e635e39
JH
12 pid_t me = getpid();
13
021b6e45 14 while (lock_file_list) {
013870cd
MH
15 if (lock_file_list->owner == me) {
16 /* fclose() is not safe to call in a signal handler */
17 if (skip_fclose)
18 lock_file_list->fp = NULL;
a1754bcc 19 rollback_lock_file(lock_file_list);
013870cd 20 }
021b6e45
JH
21 lock_file_list = lock_file_list->next;
22 }
23}
24
013870cd
MH
25static void remove_lock_files_on_exit(void)
26{
27 remove_lock_files(0);
28}
29
316683bd 30static void remove_lock_files_on_signal(int signo)
021b6e45 31{
013870cd 32 remove_lock_files(1);
4a16d072 33 sigchain_pop(signo);
021b6e45
JH
34 raise(signo);
35}
36
5d5a7a67 37/*
0c0d6e86 38 * path = absolute or relative path name
5d5a7a67 39 *
0c0d6e86
MH
40 * Remove the last path name element from path (leaving the preceding
41 * "/", if any). If path is empty or the root directory ("/"), set
42 * path to the empty string.
5d5a7a67 43 */
0c0d6e86 44static void trim_last_path_component(struct strbuf *path)
5d5a7a67 45{
0c0d6e86 46 int i = path->len;
5d5a7a67
BS
47
48 /* back up past trailing slashes, if any */
0c0d6e86
MH
49 while (i && path->buf[i - 1] == '/')
50 i--;
5d5a7a67
BS
51
52 /*
0c0d6e86
MH
53 * then go backwards until a slash, or the beginning of the
54 * string
5d5a7a67 55 */
0c0d6e86
MH
56 while (i && path->buf[i - 1] != '/')
57 i--;
58
59 strbuf_setlen(path, i);
5d5a7a67
BS
60}
61
62
63/* We allow "recursive" symbolic links. Only within reason, though */
64#define MAXDEPTH 5
65
66/*
6cad8053 67 * path contains a path that might be a symlink.
5d5a7a67 68 *
6cad8053
MH
69 * If path is a symlink, attempt to overwrite it with a path to the
70 * real file or directory (which may or may not exist), following a
71 * chain of symlinks if necessary. Otherwise, leave path unmodified.
5d5a7a67 72 *
6cad8053
MH
73 * This is a best-effort routine. If an error occurs, path will
74 * either be left unmodified or will name a different symlink in a
75 * symlink chain that started with the original path.
5d5a7a67 76 */
6cad8053 77static void resolve_symlink(struct strbuf *path)
5d5a7a67
BS
78{
79 int depth = MAXDEPTH;
5025d845 80 static struct strbuf link = STRBUF_INIT;
5d5a7a67
BS
81
82 while (depth--) {
6cad8053 83 if (strbuf_readlink(&link, path->buf, path->len) < 0)
5025d845 84 break;
5d5a7a67 85
6cad8053 86 if (is_absolute_path(link.buf))
5d5a7a67 87 /* absolute path simply replaces p */
6cad8053 88 strbuf_reset(path);
0c0d6e86 89 else
5d5a7a67 90 /*
5025d845 91 * link is a relative path, so replace the
5d5a7a67
BS
92 * last element of p with it.
93 */
0c0d6e86 94 trim_last_path_component(path);
6cad8053
MH
95
96 strbuf_addbuf(path, &link);
5d5a7a67 97 }
5025d845 98 strbuf_reset(&link);
5d5a7a67
BS
99}
100
447ff1bf 101/* Make sure errno contains a meaningful value on error */
acd3b9ec 102static int lock_file(struct lock_file *lk, const char *path, int flags)
021b6e45 103{
6cad8053 104 size_t pathlen = strlen(path);
2fbd4f92 105
04e57d4d
MH
106 if (!lock_file_list) {
107 /* One-time initialization */
316683bd 108 sigchain_push_common(remove_lock_files_on_signal);
013870cd 109 atexit(remove_lock_files_on_exit);
04e57d4d
MH
110 }
111
707103fd
MH
112 if (lk->active)
113 die("BUG: cannot lock_file(\"%s\") using active struct lock_file",
114 path);
04e57d4d
MH
115 if (!lk->on_list) {
116 /* Initialize *lk and add it to lock_file_list: */
117 lk->fd = -1;
013870cd 118 lk->fp = NULL;
707103fd 119 lk->active = 0;
04e57d4d 120 lk->owner = 0;
6cad8053 121 strbuf_init(&lk->filename, pathlen + LOCK_SUFFIX_LEN);
04e57d4d
MH
122 lk->next = lock_file_list;
123 lock_file_list = lk;
124 lk->on_list = 1;
cf6950d3
MH
125 } else if (lk->filename.len) {
126 /* This shouldn't happen, but better safe than sorry. */
127 die("BUG: lock_file(\"%s\") called with improperly-reset lock_file object",
128 path);
04e57d4d
MH
129 }
130
fa137f67
NTND
131 if (flags & LOCK_NO_DEREF) {
132 strbuf_add_absolute_path(&lk->filename, path);
133 } else {
134 struct strbuf resolved_path = STRBUF_INIT;
135
136 strbuf_add(&resolved_path, path, pathlen);
137 resolve_symlink(&resolved_path);
138 strbuf_add_absolute_path(&lk->filename, resolved_path.buf);
139 strbuf_release(&resolved_path);
140 }
141
cf6950d3
MH
142 strbuf_addstr(&lk->filename, LOCK_SUFFIX);
143 lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
e31e949b 144 if (lk->fd < 0) {
cf6950d3 145 strbuf_reset(&lk->filename);
2fbd4f92 146 return -1;
447ff1bf 147 }
e31e949b 148 lk->owner = getpid();
707103fd 149 lk->active = 1;
cf6950d3 150 if (adjust_shared_perm(lk->filename.buf)) {
e31e949b 151 int save_errno = errno;
cf6950d3 152 error("cannot fix permission bits on %s", lk->filename.buf);
e31e949b
MH
153 rollback_lock_file(lk);
154 errno = save_errno;
155 return -1;
021b6e45 156 }
4723ee99 157 return lk->fd;
021b6e45
JH
158}
159
044b6a9e
MH
160static int sleep_microseconds(long us)
161{
162 struct timeval tv;
163 tv.tv_sec = 0;
164 tv.tv_usec = us;
165 return select(0, NULL, NULL, NULL, &tv);
166}
167
168/*
169 * Constants defining the gaps between attempts to lock a file. The
170 * first backoff period is approximately INITIAL_BACKOFF_MS
171 * milliseconds. The longest backoff period is approximately
172 * (BACKOFF_MAX_MULTIPLIER * INITIAL_BACKOFF_MS) milliseconds.
173 */
174#define INITIAL_BACKOFF_MS 1L
175#define BACKOFF_MAX_MULTIPLIER 1000
176
177/*
178 * Try locking path, retrying with quadratic backoff for at least
179 * timeout_ms milliseconds. If timeout_ms is 0, try locking the file
180 * exactly once. If timeout_ms is -1, try indefinitely.
181 */
182static int lock_file_timeout(struct lock_file *lk, const char *path,
183 int flags, long timeout_ms)
184{
185 int n = 1;
186 int multiplier = 1;
187 long remaining_us = 0;
188 static int random_initialized = 0;
189
190 if (timeout_ms == 0)
191 return lock_file(lk, path, flags);
192
193 if (!random_initialized) {
194 srandom((unsigned int)getpid());
195 random_initialized = 1;
196 }
197
198 if (timeout_ms > 0) {
199 /* avoid overflow */
200 if (timeout_ms <= LONG_MAX / 1000)
201 remaining_us = timeout_ms * 1000;
202 else
203 remaining_us = LONG_MAX;
204 }
205
206 while (1) {
207 long backoff_ms, wait_us;
208 int fd;
209
210 fd = lock_file(lk, path, flags);
211
212 if (fd >= 0)
213 return fd; /* success */
214 else if (errno != EEXIST)
215 return -1; /* failure other than lock held */
216 else if (timeout_ms > 0 && remaining_us <= 0)
217 return -1; /* failure due to timeout */
218
219 backoff_ms = multiplier * INITIAL_BACKOFF_MS;
220 /* back off for between 0.75*backoff_ms and 1.25*backoff_ms */
221 wait_us = (750 + random() % 500) * backoff_ms;
222 sleep_microseconds(wait_us);
223 remaining_us -= wait_us;
224
225 /* Recursion: (n+1)^2 = n^2 + 2n + 1 */
226 multiplier += 2*n + 1;
227 if (multiplier > BACKOFF_MAX_MULTIPLIER)
228 multiplier = BACKOFF_MAX_MULTIPLIER;
229 else
230 n++;
231 }
232}
233
6af926e8 234void unable_to_lock_message(const char *path, int err, struct strbuf *buf)
e43a6fd3 235{
bdfd739d 236 if (err == EEXIST) {
6af926e8 237 strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n"
e43a6fd3
MM
238 "If no other git process is currently running, this probably means a\n"
239 "git process crashed in this repository earlier. Make sure no other git\n"
240 "process is running and remove the file manually to continue.",
e2a57aac 241 absolute_path(path), strerror(err));
1b018fd9 242 } else
6af926e8 243 strbuf_addf(buf, "Unable to create '%s.lock': %s",
e2a57aac 244 absolute_path(path), strerror(err));
1b018fd9
MV
245}
246
e197c218 247NORETURN void unable_to_lock_die(const char *path, int err)
1b018fd9 248{
6af926e8
RS
249 struct strbuf buf = STRBUF_INIT;
250
251 unable_to_lock_message(path, err, &buf);
252 die("%s", buf.buf);
e43a6fd3
MM
253}
254
447ff1bf 255/* This should return a meaningful errno on failure */
044b6a9e
MH
256int hold_lock_file_for_update_timeout(struct lock_file *lk, const char *path,
257 int flags, long timeout_ms)
40aaae88 258{
044b6a9e 259 int fd = lock_file_timeout(lk, path, flags, timeout_ms);
acd3b9ec 260 if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
e197c218 261 unable_to_lock_die(path, errno);
40aaae88
JH
262 return fd;
263}
264
acd3b9ec 265int hold_lock_file_for_append(struct lock_file *lk, const char *path, int flags)
ea3cd5c7
DB
266{
267 int fd, orig_fd;
268
acd3b9ec 269 fd = lock_file(lk, path, flags);
ea3cd5c7 270 if (fd < 0) {
acd3b9ec 271 if (flags & LOCK_DIE_ON_ERROR)
e197c218 272 unable_to_lock_die(path, errno);
ea3cd5c7
DB
273 return fd;
274 }
275
276 orig_fd = open(path, O_RDONLY);
277 if (orig_fd < 0) {
278 if (errno != ENOENT) {
4d423a3e
MH
279 int save_errno = errno;
280
acd3b9ec 281 if (flags & LOCK_DIE_ON_ERROR)
ea3cd5c7 282 die("cannot open '%s' for copying", path);
ebb8e380 283 rollback_lock_file(lk);
4d423a3e
MH
284 error("cannot open '%s' for copying", path);
285 errno = save_errno;
286 return -1;
ea3cd5c7
DB
287 }
288 } else if (copy_fd(orig_fd, fd)) {
4d423a3e
MH
289 int save_errno = errno;
290
acd3b9ec 291 if (flags & LOCK_DIE_ON_ERROR)
00b7cbfc 292 die("failed to prepare '%s' for appending", path);
b29763aa 293 close(orig_fd);
ebb8e380 294 rollback_lock_file(lk);
4d423a3e 295 errno = save_errno;
ea3cd5c7 296 return -1;
b29763aa
SP
297 } else {
298 close(orig_fd);
ea3cd5c7
DB
299 }
300 return fd;
301}
302
013870cd
MH
303FILE *fdopen_lock_file(struct lock_file *lk, const char *mode)
304{
305 if (!lk->active)
306 die("BUG: fdopen_lock_file() called for unlocked object");
307 if (lk->fp)
308 die("BUG: fdopen_lock_file() called twice for file '%s'", lk->filename.buf);
309
310 lk->fp = fdopen(lk->fd, mode);
311 return lk->fp;
312}
313
ec38b4e4
MH
314char *get_locked_file_path(struct lock_file *lk)
315{
316 if (!lk->active)
317 die("BUG: get_locked_file_path() called for unlocked object");
318 if (lk->filename.len <= LOCK_SUFFIX_LEN)
319 die("BUG: get_locked_file_path() called for malformed lock object");
320 return xmemdupz(lk->filename.buf, lk->filename.len - LOCK_SUFFIX_LEN);
321}
322
d6cf61bf
BC
323int close_lock_file(struct lock_file *lk)
324{
325 int fd = lk->fd;
013870cd
MH
326 FILE *fp = lk->fp;
327 int err;
419f0c0f
MH
328
329 if (fd < 0)
330 return 0;
331
d6cf61bf 332 lk->fd = -1;
013870cd
MH
333 if (fp) {
334 lk->fp = NULL;
335
336 /*
337 * Note: no short-circuiting here; we want to fclose()
338 * in any case!
339 */
340 err = ferror(fp) | fclose(fp);
341 } else {
342 err = close(fd);
343 }
344
345 if (err) {
8e86c155
MH
346 int save_errno = errno;
347 rollback_lock_file(lk);
348 errno = save_errno;
349 return -1;
350 }
013870cd 351
8e86c155 352 return 0;
d6cf61bf
BC
353}
354
93dcaea2
JH
355int reopen_lock_file(struct lock_file *lk)
356{
357 if (0 <= lk->fd)
358 die(_("BUG: reopen a lockfile that is still open"));
707103fd 359 if (!lk->active)
93dcaea2 360 die(_("BUG: reopen a lockfile that has been committed"));
cf6950d3 361 lk->fd = open(lk->filename.buf, O_WRONLY);
93dcaea2
JH
362 return lk->fd;
363}
364
751baced 365int commit_lock_file_to(struct lock_file *lk, const char *path)
021b6e45 366{
707103fd 367 if (!lk->active)
751baced 368 die("BUG: attempt to commit unlocked object to \"%s\"", path);
8a1c7533 369
419f0c0f 370 if (close_lock_file(lk))
d6cf61bf 371 return -1;
4f4713df 372
751baced 373 if (rename(lk->filename.buf, path)) {
1b1648f4
MH
374 int save_errno = errno;
375 rollback_lock_file(lk);
376 errno = save_errno;
d6cf61bf 377 return -1;
1b1648f4
MH
378 }
379
707103fd 380 lk->active = 0;
cf6950d3 381 strbuf_reset(&lk->filename);
d6cf61bf 382 return 0;
021b6e45
JH
383}
384
751baced 385int commit_lock_file(struct lock_file *lk)
30ca07a2 386{
751baced
MH
387 static struct strbuf result_file = STRBUF_INIT;
388 int err;
389
390 if (!lk->active)
391 die("BUG: attempt to commit unlocked object");
392
393 if (lk->filename.len <= LOCK_SUFFIX_LEN ||
394 strcmp(lk->filename.buf + lk->filename.len - LOCK_SUFFIX_LEN, LOCK_SUFFIX))
395 die("BUG: lockfile filename corrupt");
396
397 /* remove ".lock": */
398 strbuf_add(&result_file, lk->filename.buf,
399 lk->filename.len - LOCK_SUFFIX_LEN);
400 err = commit_lock_file_to(lk, result_file.buf);
401 strbuf_reset(&result_file);
402 return err;
30ca07a2
JH
403}
404
021b6e45
JH
405void rollback_lock_file(struct lock_file *lk)
406{
707103fd 407 if (!lk->active)
9085f8e2
MH
408 return;
409
8e86c155 410 if (!close_lock_file(lk)) {
cf6950d3 411 unlink_or_warn(lk->filename.buf);
707103fd 412 lk->active = 0;
cf6950d3 413 strbuf_reset(&lk->filename);
4723ee99 414 }
021b6e45 415}