/*
 * 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;
}

