| /* |
| * Copyright (c) 2005, Junio C Hamano |
| */ |
| #include <signal.h> |
| #include "cache.h" |
| |
| static struct cache_file *cache_file_list; |
| |
| static void remove_lock_file(void) |
| { |
| while (cache_file_list) { |
| if (cache_file_list->lockfile[0]) |
| unlink(cache_file_list->lockfile); |
| cache_file_list = cache_file_list->next; |
| } |
| } |
| |
| static void remove_lock_file_on_signal(int signo) |
| { |
| remove_lock_file(); |
| signal(SIGINT, SIG_DFL); |
| raise(signo); |
| } |
| |
| int hold_index_file_for_update(struct cache_file *cf, const char *path) |
| { |
| int fd; |
| sprintf(cf->lockfile, "%s.lock", path); |
| fd = open(cf->lockfile, O_RDWR | O_CREAT | O_EXCL, 0666); |
| if (fd >=0 && !cf->next) { |
| cf->next = cache_file_list; |
| cache_file_list = cf; |
| signal(SIGINT, remove_lock_file_on_signal); |
| atexit(remove_lock_file); |
| } |
| return fd; |
| } |
| |
| int commit_index_file(struct cache_file *cf) |
| { |
| char indexfile[PATH_MAX]; |
| int i; |
| strcpy(indexfile, cf->lockfile); |
| i = strlen(indexfile) - 5; /* .lock */ |
| indexfile[i] = 0; |
| i = rename(cf->lockfile, indexfile); |
| cf->lockfile[0] = 0; |
| return i; |
| } |
| |
| void rollback_index_file(struct cache_file *cf) |
| { |
| if (cf->lockfile[0]) |
| unlink(cf->lockfile); |
| cf->lockfile[0] = 0; |
| } |
| |