Merge branch 'ew/rerere'
[gitweb.git] / lockfile.c
index 9bc60837aa12fbe2e659ff6fb5b52e862fbe03c3..2a2fea3cb6bd1de059e7c0f8c2008c5fe8376b93 100644 (file)
@@ -22,20 +22,33 @@ static void remove_lock_file_on_signal(int signo)
        raise(signo);
 }
 
-int hold_lock_file_for_update(struct lock_file *lk, const char *path)
+static int lock_file(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);
+       if (0 <= fd) {
+               if (!lk->next) {
+                       lk->next = lock_file_list;
+                       lock_file_list = lk;
+                       signal(SIGINT, remove_lock_file_on_signal);
+                       atexit(remove_lock_file);
+               }
+               if (adjust_shared_perm(lk->filename))
+                       return error("cannot fix permission bits on %s",
+                                    lk->filename);
        }
        return fd;
 }
 
+int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on_error)
+{
+       int fd = lock_file(lk, path);
+       if (fd < 0 && die_on_error)
+               die("unable to create '%s': %s", path, strerror(errno));
+       return fd;
+}
+
 int commit_lock_file(struct lock_file *lk)
 {
        char result_file[PATH_MAX];