]> git.ipfire.org Git - thirdparty/git.git/blame - lockfile.c
Merge branch 'maint-2.1' into maint
[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
6cad8053 131 strbuf_add(&lk->filename, path, pathlen);
47ba4662 132 if (!(flags & LOCK_NO_DEREF))
6cad8053 133 resolve_symlink(&lk->filename);
cf6950d3
MH
134 strbuf_addstr(&lk->filename, LOCK_SUFFIX);
135 lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
e31e949b 136 if (lk->fd < 0) {
cf6950d3 137 strbuf_reset(&lk->filename);
2fbd4f92 138 return -1;
447ff1bf 139 }
e31e949b 140 lk->owner = getpid();
707103fd 141 lk->active = 1;
cf6950d3 142 if (adjust_shared_perm(lk->filename.buf)) {
e31e949b 143 int save_errno = errno;
cf6950d3 144 error("cannot fix permission bits on %s", lk->filename.buf);
e31e949b
MH
145 rollback_lock_file(lk);
146 errno = save_errno;
147 return -1;
021b6e45 148 }
4723ee99 149 return lk->fd;
021b6e45
JH
150}
151
6af926e8 152void unable_to_lock_message(const char *path, int err, struct strbuf *buf)
e43a6fd3 153{
bdfd739d 154 if (err == EEXIST) {
6af926e8 155 strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n"
e43a6fd3
MM
156 "If no other git process is currently running, this probably means a\n"
157 "git process crashed in this repository earlier. Make sure no other git\n"
158 "process is running and remove the file manually to continue.",
e2a57aac 159 absolute_path(path), strerror(err));
1b018fd9 160 } else
6af926e8 161 strbuf_addf(buf, "Unable to create '%s.lock': %s",
e2a57aac 162 absolute_path(path), strerror(err));
1b018fd9
MV
163}
164
e197c218 165NORETURN void unable_to_lock_die(const char *path, int err)
1b018fd9 166{
6af926e8
RS
167 struct strbuf buf = STRBUF_INIT;
168
169 unable_to_lock_message(path, err, &buf);
170 die("%s", buf.buf);
e43a6fd3
MM
171}
172
447ff1bf 173/* This should return a meaningful errno on failure */
acd3b9ec 174int hold_lock_file_for_update(struct lock_file *lk, const char *path, int flags)
40aaae88 175{
acd3b9ec
JH
176 int fd = lock_file(lk, path, flags);
177 if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
e197c218 178 unable_to_lock_die(path, errno);
40aaae88
JH
179 return fd;
180}
181
acd3b9ec 182int hold_lock_file_for_append(struct lock_file *lk, const char *path, int flags)
ea3cd5c7
DB
183{
184 int fd, orig_fd;
185
acd3b9ec 186 fd = lock_file(lk, path, flags);
ea3cd5c7 187 if (fd < 0) {
acd3b9ec 188 if (flags & LOCK_DIE_ON_ERROR)
e197c218 189 unable_to_lock_die(path, errno);
ea3cd5c7
DB
190 return fd;
191 }
192
193 orig_fd = open(path, O_RDONLY);
194 if (orig_fd < 0) {
195 if (errno != ENOENT) {
4d423a3e
MH
196 int save_errno = errno;
197
acd3b9ec 198 if (flags & LOCK_DIE_ON_ERROR)
ea3cd5c7 199 die("cannot open '%s' for copying", path);
ebb8e380 200 rollback_lock_file(lk);
4d423a3e
MH
201 error("cannot open '%s' for copying", path);
202 errno = save_errno;
203 return -1;
ea3cd5c7
DB
204 }
205 } else if (copy_fd(orig_fd, fd)) {
4d423a3e
MH
206 int save_errno = errno;
207
acd3b9ec 208 if (flags & LOCK_DIE_ON_ERROR)
ea3cd5c7 209 exit(128);
b29763aa 210 close(orig_fd);
ebb8e380 211 rollback_lock_file(lk);
4d423a3e 212 errno = save_errno;
ea3cd5c7 213 return -1;
b29763aa
SP
214 } else {
215 close(orig_fd);
ea3cd5c7
DB
216 }
217 return fd;
218}
219
013870cd
MH
220FILE *fdopen_lock_file(struct lock_file *lk, const char *mode)
221{
222 if (!lk->active)
223 die("BUG: fdopen_lock_file() called for unlocked object");
224 if (lk->fp)
225 die("BUG: fdopen_lock_file() called twice for file '%s'", lk->filename.buf);
226
227 lk->fp = fdopen(lk->fd, mode);
228 return lk->fp;
229}
230
ec38b4e4
MH
231char *get_locked_file_path(struct lock_file *lk)
232{
233 if (!lk->active)
234 die("BUG: get_locked_file_path() called for unlocked object");
235 if (lk->filename.len <= LOCK_SUFFIX_LEN)
236 die("BUG: get_locked_file_path() called for malformed lock object");
237 return xmemdupz(lk->filename.buf, lk->filename.len - LOCK_SUFFIX_LEN);
238}
239
d6cf61bf
BC
240int close_lock_file(struct lock_file *lk)
241{
242 int fd = lk->fd;
013870cd
MH
243 FILE *fp = lk->fp;
244 int err;
419f0c0f
MH
245
246 if (fd < 0)
247 return 0;
248
d6cf61bf 249 lk->fd = -1;
013870cd
MH
250 if (fp) {
251 lk->fp = NULL;
252
253 /*
254 * Note: no short-circuiting here; we want to fclose()
255 * in any case!
256 */
257 err = ferror(fp) | fclose(fp);
258 } else {
259 err = close(fd);
260 }
261
262 if (err) {
8e86c155
MH
263 int save_errno = errno;
264 rollback_lock_file(lk);
265 errno = save_errno;
266 return -1;
267 }
013870cd 268
8e86c155 269 return 0;
d6cf61bf
BC
270}
271
93dcaea2
JH
272int reopen_lock_file(struct lock_file *lk)
273{
274 if (0 <= lk->fd)
275 die(_("BUG: reopen a lockfile that is still open"));
707103fd 276 if (!lk->active)
93dcaea2 277 die(_("BUG: reopen a lockfile that has been committed"));
cf6950d3 278 lk->fd = open(lk->filename.buf, O_WRONLY);
93dcaea2
JH
279 return lk->fd;
280}
281
751baced 282int commit_lock_file_to(struct lock_file *lk, const char *path)
021b6e45 283{
707103fd 284 if (!lk->active)
751baced 285 die("BUG: attempt to commit unlocked object to \"%s\"", path);
8a1c7533 286
419f0c0f 287 if (close_lock_file(lk))
d6cf61bf 288 return -1;
4f4713df 289
751baced 290 if (rename(lk->filename.buf, path)) {
1b1648f4
MH
291 int save_errno = errno;
292 rollback_lock_file(lk);
293 errno = save_errno;
d6cf61bf 294 return -1;
1b1648f4
MH
295 }
296
707103fd 297 lk->active = 0;
cf6950d3 298 strbuf_reset(&lk->filename);
d6cf61bf 299 return 0;
021b6e45
JH
300}
301
751baced 302int commit_lock_file(struct lock_file *lk)
30ca07a2 303{
751baced
MH
304 static struct strbuf result_file = STRBUF_INIT;
305 int err;
306
307 if (!lk->active)
308 die("BUG: attempt to commit unlocked object");
309
310 if (lk->filename.len <= LOCK_SUFFIX_LEN ||
311 strcmp(lk->filename.buf + lk->filename.len - LOCK_SUFFIX_LEN, LOCK_SUFFIX))
312 die("BUG: lockfile filename corrupt");
313
314 /* remove ".lock": */
315 strbuf_add(&result_file, lk->filename.buf,
316 lk->filename.len - LOCK_SUFFIX_LEN);
317 err = commit_lock_file_to(lk, result_file.buf);
318 strbuf_reset(&result_file);
319 return err;
30ca07a2
JH
320}
321
021b6e45
JH
322void rollback_lock_file(struct lock_file *lk)
323{
707103fd 324 if (!lk->active)
9085f8e2
MH
325 return;
326
8e86c155 327 if (!close_lock_file(lk)) {
cf6950d3 328 unlink_or_warn(lk->filename.buf);
707103fd 329 lk->active = 0;
cf6950d3 330 strbuf_reset(&lk->filename);
4723ee99 331 }
021b6e45 332}