2 * Copyright (c) 2005, Junio C Hamano
7 static struct lock_file
*lock_file_list
;
9 static void remove_lock_file(void)
13 while (lock_file_list
) {
14 if (lock_file_list
->owner
== me
&&
15 lock_file_list
->filename
[0]) {
16 if (lock_file_list
->fd
>= 0)
17 close(lock_file_list
->fd
);
18 unlink_or_warn(lock_file_list
->filename
);
20 lock_file_list
= lock_file_list
->next
;
24 static void remove_lock_file_on_signal(int signo
)
32 * p = absolute or relative path name
34 * Return a pointer into p showing the beginning of the last path name
35 * element. If p is empty or the root directory ("/"), just return p.
37 static char *last_path_elm(char *p
)
39 /* r starts pointing to null at the end of the string */
40 char *r
= strchr(p
, '\0');
43 return p
; /* just return empty string */
45 r
--; /* back up to last non-null character */
47 /* back up past trailing slashes, if any */
48 while (r
> p
&& *r
== '/')
52 * then go backwards until I hit a slash, or the beginning of
55 while (r
> p
&& *(r
-1) != '/')
61 /* We allow "recursive" symbolic links. Only within reason, though */
65 * p = path that may be a symlink
68 * If p is a symlink, attempt to overwrite p with a path to the real
69 * file or directory (which may or may not exist), following a chain of
70 * symlinks if necessary. Otherwise, leave p unmodified.
72 * This is a best-effort routine. If an error occurs, p will either be
73 * left unmodified or will name a different symlink in a symlink chain
74 * that started with p's initial contents.
79 static char *resolve_symlink(char *p
, size_t s
)
85 int link_len
= readlink(p
, link
, sizeof(link
));
87 /* not a symlink anymore */
90 else if (link_len
< sizeof(link
))
91 /* readlink() never null-terminates */
92 link
[link_len
] = '\0';
94 warning("%s: symlink too long", p
);
98 if (is_absolute_path(link
)) {
99 /* absolute path simply replaces p */
103 warning("%s: symlink too long", p
);
108 * link is a relative path, so I must replace the
109 * last element of p with it.
111 char *r
= (char *)last_path_elm(p
);
112 if (r
- p
+ link_len
< s
)
115 warning("%s: symlink too long", p
);
123 /* Make sure errno contains a meaningful value on error */
124 static int lock_file(struct lock_file
*lk
, const char *path
, int flags
)
127 * subtract 5 from size to make sure there's room for adding
128 * ".lock" for the lock file name
130 static const size_t max_path_len
= sizeof(lk
->filename
) - 5;
132 if (!lock_file_list
) {
133 /* One-time initialization */
134 sigchain_push_common(remove_lock_file_on_signal
);
135 atexit(remove_lock_file
);
139 /* Initialize *lk and add it to lock_file_list: */
143 lk
->next
= lock_file_list
;
148 if (strlen(path
) >= max_path_len
) {
149 errno
= ENAMETOOLONG
;
152 strcpy(lk
->filename
, path
);
153 if (!(flags
& LOCK_NODEREF
))
154 resolve_symlink(lk
->filename
, max_path_len
);
155 strcat(lk
->filename
, ".lock");
156 lk
->fd
= open(lk
->filename
, O_RDWR
| O_CREAT
| O_EXCL
, 0666);
158 lk
->owner
= getpid();
159 if (adjust_shared_perm(lk
->filename
)) {
160 int save_errno
= errno
;
161 error("cannot fix permission bits on %s",
163 rollback_lock_file(lk
);
173 void unable_to_lock_message(const char *path
, int err
, struct strbuf
*buf
)
176 strbuf_addf(buf
, "Unable to create '%s.lock': %s.\n\n"
177 "If no other git process is currently running, this probably means a\n"
178 "git process crashed in this repository earlier. Make sure no other git\n"
179 "process is running and remove the file manually to continue.",
180 absolute_path(path
), strerror(err
));
182 strbuf_addf(buf
, "Unable to create '%s.lock': %s",
183 absolute_path(path
), strerror(err
));
186 int unable_to_lock_error(const char *path
, int err
)
188 struct strbuf buf
= STRBUF_INIT
;
190 unable_to_lock_message(path
, err
, &buf
);
191 error("%s", buf
.buf
);
192 strbuf_release(&buf
);
196 NORETURN
void unable_to_lock_die(const char *path
, int err
)
198 struct strbuf buf
= STRBUF_INIT
;
200 unable_to_lock_message(path
, err
, &buf
);
204 /* This should return a meaningful errno on failure */
205 int hold_lock_file_for_update(struct lock_file
*lk
, const char *path
, int flags
)
207 int fd
= lock_file(lk
, path
, flags
);
208 if (fd
< 0 && (flags
& LOCK_DIE_ON_ERROR
))
209 unable_to_lock_die(path
, errno
);
213 int hold_lock_file_for_append(struct lock_file
*lk
, const char *path
, int flags
)
217 fd
= lock_file(lk
, path
, flags
);
219 if (flags
& LOCK_DIE_ON_ERROR
)
220 unable_to_lock_die(path
, errno
);
224 orig_fd
= open(path
, O_RDONLY
);
226 if (errno
!= ENOENT
) {
227 if (flags
& LOCK_DIE_ON_ERROR
)
228 die("cannot open '%s' for copying", path
);
229 rollback_lock_file(lk
);
230 return error("cannot open '%s' for copying", path
);
232 } else if (copy_fd(orig_fd
, fd
)) {
233 if (flags
& LOCK_DIE_ON_ERROR
)
235 rollback_lock_file(lk
);
241 int close_lock_file(struct lock_file
*lk
)
252 int reopen_lock_file(struct lock_file
*lk
)
255 die(_("BUG: reopen a lockfile that is still open"));
256 if (!lk
->filename
[0])
257 die(_("BUG: reopen a lockfile that has been committed"));
258 lk
->fd
= open(lk
->filename
, O_WRONLY
);
262 int commit_lock_file(struct lock_file
*lk
)
264 char result_file
[PATH_MAX
];
266 if (close_lock_file(lk
))
268 strcpy(result_file
, lk
->filename
);
269 i
= strlen(result_file
) - 5; /* .lock */
271 if (rename(lk
->filename
, result_file
))
277 int hold_locked_index(struct lock_file
*lk
, int die_on_error
)
279 return hold_lock_file_for_update(lk
, get_index_file(),
285 void rollback_lock_file(struct lock_file
*lk
)
287 if (!lk
->filename
[0])
291 unlink_or_warn(lk
->filename
);