1 #include <unistd.h>
2 #include "lock.h"
3 #include "open.h"
4 #include "strerr.h"
5 #include "pathexec.h"
6 #include "sgetopt.h"
7 
8 #define FATAL "setlock: fatal: "
9 
usage()10 void usage() {
11   strerr_die1x(100,"setlock: usage: setlock [ -nNxX ] file program [ arg ... ]");
12 }
13 
14 int flagndelay = 0;
15 int flagx = 0;
16 
main(int argc,const char * const * argv,const char * const * envp)17 int main(int argc,const char *const *argv,const char *const *envp)
18 {
19   int opt;
20   int fd;
21   const char *file;
22 
23   while ((opt = getopt(argc,argv,"nNxX")) != opteof)
24     switch(opt) {
25       case 'n': flagndelay = 1; break;
26       case 'N': flagndelay = 0; break;
27       case 'x': flagx = 1; break;
28       case 'X': flagx = 0; break;
29       default: usage();
30     }
31 
32   argv += optind;
33   if (!*argv) usage();
34   file = *argv++;
35   if (!*argv) usage();
36 
37   fd = open_append(file);
38   if (fd == -1) {
39     if (flagx) _exit(0);
40     strerr_die4sys(111,FATAL,"unable to open ",file,": ");
41   }
42 
43   if ((flagndelay ? lock_exnb : lock_ex)(fd) == -1) {
44     if (flagx) _exit(0);
45     strerr_die4sys(111,FATAL,"unable to lock ",file,": ");
46   }
47 
48   pathexec_run(*argv,argv,envp);
49   strerr_die4sys(111,FATAL,"unable to run ",*argv,": ");
50 }
51