lockfile.con commit cvsserver: Introduce new state variable 'method' (80573ba)
   1/*
   2 * Copyright (c) 2005, Junio C Hamano
   3 */
   4#include "cache.h"
   5
   6static struct lock_file *lock_file_list;
   7
   8static void remove_lock_file(void)
   9{
  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;
  14        }
  15}
  16
  17static void remove_lock_file_on_signal(int signo)
  18{
  19        remove_lock_file();
  20        signal(SIGINT, SIG_DFL);
  21        raise(signo);
  22}
  23
  24static int lock_file(struct lock_file *lk, const char *path)
  25{
  26        int fd;
  27        sprintf(lk->filename, "%s.lock", path);
  28        fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
  29        if (0 <= fd) {
  30                if (!lk->on_list) {
  31                        lk->next = lock_file_list;
  32                        lock_file_list = lk;
  33                        lk->on_list = 1;
  34                }
  35                if (lock_file_list) {
  36                        signal(SIGINT, remove_lock_file_on_signal);
  37                        atexit(remove_lock_file);
  38                }
  39                if (adjust_shared_perm(lk->filename))
  40                        return error("cannot fix permission bits on %s",
  41                                     lk->filename);
  42        }
  43        else
  44                lk->filename[0] = 0;
  45        return fd;
  46}
  47
  48int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on_error)
  49{
  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));
  53        return fd;
  54}
  55
  56int commit_lock_file(struct lock_file *lk)
  57{
  58        char result_file[PATH_MAX];
  59        int i;
  60        strcpy(result_file, lk->filename);
  61        i = strlen(result_file) - 5; /* .lock */
  62        result_file[i] = 0;
  63        i = rename(lk->filename, result_file);
  64        lk->filename[0] = 0;
  65        return i;
  66}
  67
  68void rollback_lock_file(struct lock_file *lk)
  69{
  70        if (lk->filename[0])
  71                unlink(lk->filename);
  72        lk->filename[0] = 0;
  73}
  74