]>
Commit | Line | Data |
---|---|---|
021b6e45 JH |
1 | /* |
2 | * Copyright (c) 2005, Junio C Hamano | |
3 | */ | |
4 | #include <signal.h> | |
5 | #include "cache.h" | |
6 | ||
7 | static struct lock_file *lock_file_list; | |
8 | ||
9 | static void remove_lock_file(void) | |
10 | { | |
11 | while (lock_file_list) { | |
12 | if (lock_file_list->filename[0]) | |
13 | unlink(lock_file_list->filename); | |
14 | lock_file_list = lock_file_list->next; | |
15 | } | |
16 | } | |
17 | ||
18 | static void remove_lock_file_on_signal(int signo) | |
19 | { | |
20 | remove_lock_file(); | |
21 | signal(SIGINT, SIG_DFL); | |
22 | raise(signo); | |
23 | } | |
24 | ||
25 | int hold_lock_file_for_update(struct lock_file *lk, const char *path) | |
26 | { | |
27 | int fd; | |
28 | sprintf(lk->filename, "%s.lock", path); | |
29 | fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666); | |
138086a7 JH |
30 | if (0 <= fd) { |
31 | if (!lk->next) { | |
32 | lk->next = lock_file_list; | |
33 | lock_file_list = lk; | |
34 | signal(SIGINT, remove_lock_file_on_signal); | |
35 | atexit(remove_lock_file); | |
36 | } | |
37 | if (adjust_shared_perm(lk->filename)) | |
38 | return error("cannot fix permission bits on %s", | |
39 | lk->filename); | |
021b6e45 JH |
40 | } |
41 | return fd; | |
42 | } | |
43 | ||
44 | int commit_lock_file(struct lock_file *lk) | |
45 | { | |
46 | char result_file[PATH_MAX]; | |
47 | int i; | |
48 | strcpy(result_file, lk->filename); | |
49 | i = strlen(result_file) - 5; /* .lock */ | |
50 | result_file[i] = 0; | |
51 | i = rename(lk->filename, result_file); | |
52 | lk->filename[0] = 0; | |
53 | return i; | |
54 | } | |
55 | ||
56 | void rollback_lock_file(struct lock_file *lk) | |
57 | { | |
58 | if (lk->filename[0]) | |
59 | unlink(lk->filename); | |
60 | lk->filename[0] = 0; | |
61 | } | |
62 |