diff options
author | Junio C Hamano <junkio@cox.net> | 2006-06-06 12:51:49 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-06-06 14:30:58 -0700 |
commit | 021b6e454944a4fba878651ebf9bfe0a3f6c3077 (patch) | |
tree | 125f7ae01b9c959782e345baa03c7c786cc3f4ce /lockfile.c | |
parent | dd8239f997962d94162790039b008acb6068a242 (diff) | |
download | git-021b6e454944a4fba878651ebf9bfe0a3f6c3077.tar.gz git-021b6e454944a4fba878651ebf9bfe0a3f6c3077.tar.xz |
Make index file locking code reusable to others.
The framework to create lockfiles that are removed at exit is
first used to reliably write the index file, but it is
applicable to other things, so stop calling it "cache_file".
This also rewords a few remaining error message that called the
index file "cache file".
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'lockfile.c')
-rw-r--r-- | lockfile.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/lockfile.c b/lockfile.c new file mode 100644 index 000000000..9bc60837a --- /dev/null +++ b/lockfile.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2005, Junio C Hamano + */ +#include <signal.h> +#include "cache.h" + +static struct lock_file *lock_file_list; + +static void remove_lock_file(void) +{ + while (lock_file_list) { + if (lock_file_list->filename[0]) + unlink(lock_file_list->filename); + lock_file_list = lock_file_list->next; + } +} + +static void remove_lock_file_on_signal(int signo) +{ + remove_lock_file(); + signal(SIGINT, SIG_DFL); + raise(signo); +} + +int hold_lock_file_for_update(struct lock_file *lk, const char *path) +{ + int fd; + sprintf(lk->filename, "%s.lock", path); + fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666); + if (fd >=0 && !lk->next) { + lk->next = lock_file_list; + lock_file_list = lk; + signal(SIGINT, remove_lock_file_on_signal); + atexit(remove_lock_file); + } + return fd; +} + +int commit_lock_file(struct lock_file *lk) +{ + char result_file[PATH_MAX]; + int i; + strcpy(result_file, lk->filename); + i = strlen(result_file) - 5; /* .lock */ + result_file[i] = 0; + i = rename(lk->filename, result_file); + lk->filename[0] = 0; + return i; +} + +void rollback_lock_file(struct lock_file *lk) +{ + if (lk->filename[0]) + unlink(lk->filename); + lk->filename[0] = 0; +} + |