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