Merge branch 'dc/gitweb'
[gitweb.git] / lockfile.c
index 9a1f64d8d71d13ee6be48c539d79764066288f07..f45d3ed54454635b84cfe9b8c1e7d99d33ffd4d9 100644 (file)
@@ -12,8 +12,10 @@ static void remove_lock_file(void)
 
        while (lock_file_list) {
                if (lock_file_list->owner == me &&
-                   lock_file_list->filename[0])
+                   lock_file_list->filename[0]) {
+                       close(lock_file_list->fd);
                        unlink(lock_file_list->filename);
+               }
                lock_file_list = lock_file_list->next;
        }
 }
@@ -92,7 +94,7 @@ static char *resolve_symlink(char *p, size_t s)
                        return p;
                }
 
-               if (link[0] == '/') {
+               if (is_absolute_path(link)) {
                        /* absolute path simply replaces p */
                        if (link_len < s)
                                strcpy(p, link);
@@ -120,8 +122,6 @@ static char *resolve_symlink(char *p, size_t s)
 
 static int lock_file(struct lock_file *lk, const char *path)
 {
-       int fd;
-
        if (strlen(path) >= sizeof(lk->filename)) return -1;
        strcpy(lk->filename, path);
        /*
@@ -130,8 +130,8 @@ static int lock_file(struct lock_file *lk, const char *path)
         */
        resolve_symlink(lk->filename, sizeof(lk->filename)-5);
        strcat(lk->filename, ".lock");
-       fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
-       if (0 <= fd) {
+       lk->fd = open(lk->filename, O_RDWR | O_CREAT | O_EXCL, 0666);
+       if (0 <= lk->fd) {
                if (!lock_file_list) {
                        signal(SIGINT, remove_lock_file_on_signal);
                        atexit(remove_lock_file);
@@ -148,7 +148,7 @@ static int lock_file(struct lock_file *lk, const char *path)
        }
        else
                lk->filename[0] = 0;
-       return fd;
+       return lk->fd;
 }
 
 int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on_error)
@@ -163,6 +163,7 @@ int commit_lock_file(struct lock_file *lk)
 {
        char result_file[PATH_MAX];
        int i;
+       close(lk->fd);
        strcpy(result_file, lk->filename);
        i = strlen(result_file) - 5; /* .lock */
        result_file[i] = 0;
@@ -194,7 +195,9 @@ int commit_locked_index(struct lock_file *lk)
 
 void rollback_lock_file(struct lock_file *lk)
 {
-       if (lk->filename[0])
+       if (lk->filename[0]) {
+               close(lk->fd);
                unlink(lk->filename);
+       }
        lk->filename[0] = 0;
 }