1bd389b36SDavid du Colombier #include <u.h>
2bd389b36SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier
4219b2ee8SDavid du Colombier /* MAXHOSTNAMELEN is in sys/param.h */
5219b2ee8SDavid du Colombier #define MAXHOSTNAMELEN 64
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier char lockstring[MAXHOSTNAMELEN+8];
8bd389b36SDavid du Colombier
9bd389b36SDavid du Colombier void
main(int argc,char * argv[])10219b2ee8SDavid du Colombier main(int argc, char *argv[]) {
11219b2ee8SDavid du Colombier char *lockfile;
12219b2ee8SDavid du Colombier int fd, ppid, ssize;
13*9a747e4fSDavid du Colombier struct Dir *statbuf;
14219b2ee8SDavid du Colombier
15219b2ee8SDavid du Colombier if (argc != 4) {
16219b2ee8SDavid du Colombier fprint(2, "usage: LOCK lockfile hostname ppid\n");
17219b2ee8SDavid du Colombier exits("lock failed on usage");
18219b2ee8SDavid du Colombier }
19219b2ee8SDavid du Colombier lockfile = argv[1];
20*9a747e4fSDavid du Colombier if ((fd=create(lockfile, ORDWR, DMEXCL|0666)) < 0) {
21219b2ee8SDavid du Colombier exits("lock failed on create");
22219b2ee8SDavid du Colombier }
23219b2ee8SDavid du Colombier ppid = atoi(argv[3]);
24219b2ee8SDavid du Colombier ssize = sprint(lockstring, "%s %s\n", argv[2], argv[3]);
25219b2ee8SDavid du Colombier if (write(fd, lockstring, ssize) != ssize) {
26219b2ee8SDavid du Colombier fprint(2, "LOCK:write(): %r\n");
27219b2ee8SDavid du Colombier exits("lock failed on write to lockfile");
28bd389b36SDavid du Colombier }
29bd389b36SDavid du Colombier
30219b2ee8SDavid du Colombier switch(fork()) {
31219b2ee8SDavid du Colombier default:
32219b2ee8SDavid du Colombier exits("");
33219b2ee8SDavid du Colombier case 0:
34219b2ee8SDavid du Colombier break;
35219b2ee8SDavid du Colombier case -1:
36219b2ee8SDavid du Colombier fprint(2, "LOCK:fork(): %r\n");
37219b2ee8SDavid du Colombier exits("lock failed on fork");
38219b2ee8SDavid du Colombier }
39bd389b36SDavid du Colombier
40219b2ee8SDavid du Colombier for(;;) {
41*9a747e4fSDavid du Colombier statbuf = dirfstat(fd);
42*9a747e4fSDavid du Colombier if(statbuf == nil)
43219b2ee8SDavid du Colombier break;
44*9a747e4fSDavid du Colombier if (statbuf->length == 0){
45*9a747e4fSDavid du Colombier free(statbuf);
46*9a747e4fSDavid du Colombier break;
47*9a747e4fSDavid du Colombier }
48*9a747e4fSDavid du Colombier free(statbuf);
49219b2ee8SDavid du Colombier if (write(fd, "", 0) < 0)
50219b2ee8SDavid du Colombier break;
51219b2ee8SDavid du Colombier sleep(3000);
52bd389b36SDavid du Colombier }
53219b2ee8SDavid du Colombier
54bd389b36SDavid du Colombier close(fd);
55219b2ee8SDavid du Colombier postnote(PNGROUP, ppid, "kill");
56bd389b36SDavid du Colombier exits("");
57bd389b36SDavid du Colombier }
58