/* Open and lock file until interupted. Does not change file.*/ /* Usage: lock filename & lockid=$! exclusive use of file called named filename kill -HUP $lockid */ /*Started: RJ Botting, Sep 1999 SunOS ftp 4.1.3_U1 2 sun4m */ #include #include #include #include #include /*flock - apply or remove an advisory lock on an open file*/ int lockfd; /* file descriptor */ void unlock() { int ans; ans=flock( lockfd, LOCK_UN); /*fprintf(stderr, "DBUG5: flock( lockfd, LOCK_UN) returns %d\n", ans);*/ if(ans== -1)perror(""); ans=close(lockfd); if(ans== -1)perror(""); /*fprintf(stderr, "DBUG6: close returns %d\n", ans);*/ exit(0); } main( argc, argv) int argc; char *argv[]; { int fl; if(argc!=2){ fprintf(stderr, "Usage: %s filename.\n", argv[0]); exit(1); } /*fprintf(stderr, "DBUG1: %s %s\n",argv[0], argv[1]);*/ lockfd=open(argv[1], O_RDONLY ); if( -1 == lockfd){ fprintf(stderr, "Open %s failed with errno %d.\n", argv[1], errno); perror(""); exit(1); } /*fprintf(stderr, "DBUG2: %s %s about to flock\n",argv[0], argv[1]);*/ fl= flock( lockfd, LOCK_EX); if(!fl ){ /*fprintf(stderr, "DBUG3: flock returned %d, %s %s can access file\n",fl, argv[0], argv[1]);*/ signal(SIGHUP, unlock); /*fprintf(stderr, "DBUG4: waiting to be HUPped\n");*/ /*Goto sleep until signalled*/ while(1)sleep(1); } else{ fprintf(stderr, "File locking (flock) returned %d with errno %d!\n", fl, errno ); perror(""); } }