1 /*
2 * Copyright (c) 2005, Junio C Hamano
3 */
4 #include "cache.h"
6 static struct lock_file *lock_file_list;
8 static void remove_lock_file(void)
9 {
10 while (lock_file_list) {
11 if (lock_file_list->filename[0])
12 unlink(lock_file_list->filename);
13 lock_file_list = lock_file_list->next;
14 }
15 }
17 static void remove_lock_file_on_signal(int signo)
18 {
19 remove_lock_file();
20 signal(SIGINT, SIG_DFL);
21 raise(signo);
22 }
24 static int lock_file(struct lock_file *lk, const char *path)
25 {
26 int fd;
27 sprintf(lk->filename, "%s.lock", path);
28 fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
29 if (0 <= fd) {
30 if (!lk->on_list) {
31 lk->next = lock_file_list;
32 lock_file_list = lk;
33 lk->on_list = 1;
34 }
35 if (lock_file_list) {
36 signal(SIGINT, remove_lock_file_on_signal);
37 atexit(remove_lock_file);
38 }
39 if (adjust_shared_perm(lk->filename))
40 return error("cannot fix permission bits on %s",
41 lk->filename);
42 }
43 else
44 lk->filename[0] = 0;
45 return fd;
46 }
48 int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on_error)
49 {
50 int fd = lock_file(lk, path);
51 if (fd < 0 && die_on_error)
52 die("unable to create '%s.lock': %s", path, strerror(errno));
53 return fd;
54 }
56 int commit_lock_file(struct lock_file *lk)
57 {
58 char result_file[PATH_MAX];
59 int i;
60 strcpy(result_file, lk->filename);
61 i = strlen(result_file) - 5; /* .lock */
62 result_file[i] = 0;
63 i = rename(lk->filename, result_file);
64 lk->filename[0] = 0;
65 return i;
66 }
68 void rollback_lock_file(struct lock_file *lk)
69 {
70 if (lk->filename[0])
71 unlink(lk->filename);
72 lk->filename[0] = 0;
73 }