- } else {
- ot = alarm(0);
- oalrm = signal(SIGALRM, alrm);
- if (t >= 0)
- alarm(t);
- if (fcntl(fd, f & f_wait ? F_SETLKW : F_SETLK, &l) >= 0)
- errno = 0;
+ goto done;
+ }
+ 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));