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>
This commit is contained in:
parent
2d5c298f91
commit
ea3cd5c7c6
1
cache.h
1
cache.h
@ -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
28
lockfile.c
@ -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…
Reference in New Issue
Block a user