Browse Source

Add a lockfile function to append to a file

This takes care of copying the original contents into the replacement
file after the lock is held, so that concurrent additions can't miss
each other's changes.

[jc: munged to drop mmap in favor of copy_file.]

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Daniel Barkalow 17 years ago committed by Junio C Hamano
parent
commit
ea3cd5c7c6
  1. 1
      cache.h
  2. 28
      lockfile.c

1
cache.h

@ -391,6 +391,7 @@ struct lock_file { @@ -391,6 +391,7 @@ struct lock_file {
char filename[PATH_MAX];
};
extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
extern int hold_lock_file_for_append(struct lock_file *, const char *path, int);
extern int commit_lock_file(struct lock_file *);

extern int hold_locked_index(struct lock_file *, int);

28
lockfile.c

@ -160,6 +160,34 @@ int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on @@ -160,6 +160,34 @@ int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on
return fd;
}

int hold_lock_file_for_append(struct lock_file *lk, const char *path, int die_on_error)
{
int fd, orig_fd;

fd = lock_file(lk, path);
if (fd < 0) {
if (die_on_error)
die("unable to create '%s.lock': %s", path, strerror(errno));
return fd;
}

orig_fd = open(path, O_RDONLY);
if (orig_fd < 0) {
if (errno != ENOENT) {
if (die_on_error)
die("cannot open '%s' for copying", path);
close(fd);
return error("cannot open '%s' for copying", path);
}
} else if (copy_fd(orig_fd, fd)) {
if (die_on_error)
exit(128);
close(fd);
return -1;
}
return fd;
}

int close_lock_file(struct lock_file *lk)
{
int fd = lk->fd;

Loading…
Cancel
Save