From: Junio C Hamano Date: Thu, 17 Apr 2008 23:51:39 GMT Subject: Re: [PATCH 2/8] Add a lockfile function to append to a file Message-ID: <7vy77ckpkk.fsf@gitster.siamese.dyndns.org> In-Reply-To: Daniel Barkalow writes: > +int hold_lock_file_for_append(struct lock_file *lk, const char *path, int die_on_error) > +{ > + int fd = lock_file(lk, path); > + struct stat st; > + if (!stat(path, &st)) { > + int orig_fd = open(path, O_RDONLY); > + size_t mmap_size = xsize_t(st.st_size); > + void *mmap = xmmap(NULL, mmap_size, PROT_READ, MAP_PRIVATE, > + orig_fd, 0); > + write_or_die(fd, mmap, mmap_size); > + munmap(mmap, mmap_size); > + } > + if (fd < 0 && die_on_error) > + die("unable to create '%s.lock': %s", path, strerror(errno)); > + return fd; > +} Another glitch. What should we do when stat(path) fails but the file cannot be read? I think the sequence actually should be: fd = lock_file(); if (fd < 0) error out; orig_fd = open(path, O_RDONLY); if (orig_fd < 0) { if (errno != ENOENT) die("unable to open %s", path); copy; } return fd;