int main(int argc, char **argv) {
int fd, mode, um;
- struct stat stab, fstab;
long cloexec;
struct flock fl;
const char *p;
cmd= argv[2];
um= umask(0777); if (um==-1) fail("find umask");
if (umask(um)==-1) fail("reset umask");
-
- for (;;) {
- fd= open(argv[1],O_RDWR|O_CREAT,0666&~(um|((um&0222)<<1)));
- if (fd<0) fail(argv[1]);
+ fd= open(argv[1],O_RDWR|O_CREAT,0666&~(um|((um&0222)<<1))); if (fd<0) fail(argv[1]);
- for (;;) {
- fl.l_type= F_WRLCK;
- fl.l_whence= SEEK_SET;
- fl.l_start= 0;
- fl.l_len= 1;
- if (fcntl(fd, mode=='w' ? F_SETLKW : F_SETLK, &fl) != -1) break;
- if (mode=='q' &&
- (errno == EAGAIN || errno == EWOULDBLOCK || errno == EBUSY))
- exit(0);
- if (errno != EINTR) fail("could not acquire lock");
- }
-
- if (fstat(fd, &fstab)) fail("could not fstat lock fd");
- if (stat(argv[1], &stab)) {
- if (errno != ENOENT) fail("could not stat lockfile");
- } else {
- if (stab.st_dev == fstab.st_dev &&
- stab.st_ino == fstab.st_ino) break;
- }
- close(fd);
+ for (;;) {
+ fl.l_type= F_WRLCK;
+ fl.l_whence= SEEK_SET;
+ fl.l_start= 0;
+ fl.l_len= 1;
+ if (fcntl(fd, mode=='w' ? F_SETLKW : F_SETLK, &fl) != -1) break;
+ if (mode=='q' && (errno == EAGAIN || errno == EWOULDBLOCK || errno == EBUSY)) exit(0);
+ if (errno != EINTR) fail("could not acquire lock");
}
cloexec= fcntl(fd, F_GETFD); if (cloexec==-1) fail("fcntl F_GETFD");