2 * Copyright (c) 2005, Junio C Hamano
6 static struct lock_file
*lock_file_list
;
8 static void remove_lock_file(void)
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
;
17 static void remove_lock_file_on_signal(int signo
)
20 signal(SIGINT
, SIG_DFL
);
24 static int lock_file(struct lock_file
*lk
, const char *path
)
27 sprintf(lk
->filename
, "%s.lock", path
);
28 fd
= open(lk
->filename
, O_RDWR
| O_CREAT
| O_EXCL
, 0666);
31 lk
->next
= lock_file_list
;
36 signal(SIGINT
, remove_lock_file_on_signal
);
37 atexit(remove_lock_file
);
39 if (adjust_shared_perm(lk
->filename
))
40 return error("cannot fix permission bits on %s",
48 int hold_lock_file_for_update(struct lock_file
*lk
, const char *path
, int die_on_error
)
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
));
56 int commit_lock_file(struct lock_file
*lk
)
58 char result_file
[PATH_MAX
];
60 strcpy(result_file
, lk
->filename
);
61 i
= strlen(result_file
) - 5; /* .lock */
63 i
= rename(lk
->filename
, result_file
);
68 int hold_locked_index(struct lock_file
*lk
, int die_on_error
)
70 return hold_lock_file_for_update(lk
, get_index_file(), die_on_error
);
73 int commit_locked_index(struct lock_file
*lk
)
75 char *output
= getenv(INDEX_OUTPUT_ENVIRONMENT
);
76 if (output
&& *output
) {
77 int result
= rename(lk
->filename
, output
);
82 return commit_lock_file(lk
);
85 void rollback_lock_file(struct lock_file
*lk
)