 d6e548d61f
			
		
	
	d6e548d61f
	
	
	
		
			
			Set up atexit only if the .lock-file was opened successfully. Signed-off-by: Alex Riesen <raa.lkml@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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();
 | |
| }
 | |
| 
 | |
| 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;
 | |
| }
 | |
| 
 |