On 05/17/2012 11:40 PM, Christoph Hellwig wrote: > This patch uses lockf on a specially create lock file in the base directory > to detect early on if another sheep is using this directory and abort with > a useful error message. > > Signed-off-by: Christoph Hellwig <hch at lst.de> > > diff --git a/sheep/store.c b/sheep/store.c > index 5d433f3..e93daef 100644 > --- a/sheep/store.c > +++ b/sheep/store.c > @@ -672,11 +672,40 @@ again: > return 0; > } > > +#define LOCK_PATH "/lock" > + > int init_base_path(const char *d) > { > int new = 0; > + int ret; > + int fd; > + char *lock_path; > + > + ret = init_path(d, &new); > + if (ret) > + return ret; > + > + lock_path = zalloc(strlen(d) + strlen(LOCK_PATH) + 1); > + sprintf(lock_path, "%s" LOCK_PATH, d); > + > + fd = open(lock_path, O_WRONLY|O_CREAT, def_fmode); > + if (fd < 0) { > + eprintf("failed to open lock file %s (%s)\n", > + lock_path, strerror(errno)); > + return -1; > + } > + > + if (lockf(fd, F_TLOCK, 1) < 0) { > + if (errno == EACCES || errno == EAGAIN) { > + eprintf("another sheep daemon is using %s\n", d); > + } else { > + eprintf("unable to get base dir lock (%s)\n", > + strerror(errno)); > + } > + return -1; > + } > > - return init_path(d, &new); > + return 0; > } > Should free(lock_path), or use stack to allocate the space. Thanks, Yuan > #define OBJ_PATH "/obj/" |