+}
+
+int main(int argc, char **argv) {
+ int fd, um, c, r;
+ struct stat stab, fstab;
+ long cloexec, secs=0;
+ struct flock fl;
+ char *endptr;
+ sigset_t sigs, oldsigs;
+ struct sigaction siga;
+ struct itimerval itv;
+
+ mode= 'x';
+ while ((c= getopt(argc,argv,"+wfqlt:")) != -1) {
+ switch(c) {
+ case 'l':
+ case 'w':
+ case 'f':
+ case 'q':
+ if (mode != 'x') badusage();
+ mode= c;
+ break;
+ case 't':
+ errno = 0;
+ secs = strtol(optarg, &endptr, 0);
+ if (*endptr || endptr==optarg || errno==ERANGE)
+ fail("parsing timeout value");
+ if (secs < 0) {
+ fprintf(stderr,"timeout value must be >=0\n");
+ exit(255);
+ }
+ break;
+ default:
+ badusage();
+ }
+ }
+
+ if (secs && (mode=='l' || mode=='w')) {
+ fputs("-t only allowed with -q or -f.\n", stderr);
+ exit(255);
+ }
+
+ argv += optind-1; argc -= optind-1;
+ if (argc < 2) badusage();
+
+ if (secs) {
+ if (sigemptyset(&sigs)) fail("Initialising signal set");
+ if (sigaddset(&sigs,SIGALRM)) fail("Adding SIGALRM to signal set");
+ if (sigprocmask(SIG_BLOCK,&sigs,&oldsigs)) fail("Blocking SIGALRM");
+ memset(&siga,0,sizeof(siga));
+ siga.sa_handler=alrm_handler;
+ if (sigaction(SIGALRM,&siga,NULL)) fail("Installing SIGALRM handler");
+ memset(&itv,0,sizeof(itv));
+ itv.it_value.tv_sec=secs;
+ if (setitimer(ITIMER_REAL,&itv,NULL)) fail("Setting timer");
+ }
+