14 #define failf(name) do { fprintf(stderr,"%s: ",pname); perror(name"()"); exit(EXIT_FAILURE); } while (0)
15 const char version[]="This is FLock, version 1.0\n";
21 static void usage(void) __attribute__((noreturn));
22 static void usage(void)
26 This command acts as an interface to flock(2):\n\
28 Usage: flock [{-s|--shared}|{-x|--exclusive}] [-n|--nonblock]\n\
29 [-v|--verbose] [-h|--help] [-V|--version]\n\
30 <lockname> <command>\n\
32 -s, --shared\tCreate shared lock (LOCK_SH) - DEFAULT\n\
33 -x, --exclusive\tCreate exclusive lock (LOCK_EX)\n\
34 -n, --nonblock\tFail immediately if req. lock is busy\n\
35 -v, --verbose\tDisplay progress during locking\n\
36 -h, --help\tPrint a summary of the options\n\
37 -V, --version\tPrint the version number\n\
42 const struct option longopts[]={
44 {"exclusive",0,0,'x'},
45 {"nonblock" ,0,0,'n'},
51 int main(int argc,char **argv)
54 int locktype=LOCK_SH,nonblock=0,fd,optc;
57 while ((optc=getopt_long(argc,argv,"sxnvhV",longopts,NULL))!=EOF) switch (optc) {
71 fprintf(stderr,version);
73 default: /* also 'h' */
78 fprintf(stderr,"%s: Incorrect number of parameters (command needs quoting?)!\n",pname);
83 if (verbose) { fprintf(stderr,"%s: Opening \"%s\"...",pname,fn); fflush(stderr); }
84 if ((fd=open(fn,O_RDONLY|(nonblock?O_NONBLOCK:0)))==-1) failf("open");
85 if (verbose) { fprintf(stderr,"done\n%s: Locking \"%s\"...",pname,fn); fflush(stderr); }
86 if (flock(fd,locktype|nonblock)) failf("flock");
87 if (verbose) { fprintf(stderr,"done\n%s: Running \"%s\"...",pname,cmd); fflush(stderr); }
88 if (system(cmd)==-1) failf("system");
89 if (verbose) { fprintf(stderr,"done\n%s: Finishing - removing lock.\n",pname); }