X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/misc/blobdiff_plain/b7ec4e9118fa390ec20408390a06f3c51a035155..ed1b4ef8dff60ba943f553d5faeb049df9b621b7:/locking.c diff --git a/locking.c b/locking.c index 68cbc74..bfc5c77 100644 --- a/locking.c +++ b/locking.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -95,6 +96,7 @@ int main(int argc, char *argv[]) int t = -1; int oflag; unsigned int ot = 0; + struct stat st, nst; time_t nt; pid_t kid; int rc; @@ -184,9 +186,18 @@ doneopts: ot = alarm(0); oalrm = signal(SIGALRM, alrm); if (t >= 0) alarm(t); +again: if ((fd = open(file, oflag, 0666)) < 0) die(111, "error opening `%s': %s", file, strerror(errno)); + if (fstat(fd, &st)) + die(111, "error from fstat on `%s': %s", file, strerror(errno)); err = fcntl(fd, f & f_wait ? F_SETLKW : F_SETLK, &l) >= 0 ? 0 : errno; + if (stat(file, &nst)) { + if (errno == ENOENT) { close(fd); goto again; } + else die(111, "error from stat on `%s': %s", file, strerror(errno)); + } + if (st.st_dev != nst.st_dev || st.st_ino != nst.st_ino) + { close(fd); goto again; } done: signal(SIGALRM, oalrm); if (!ot)