1bd389b36SDavid du Colombier #include <u.h> 2bd389b36SDavid du Colombier #include <libc.h> 3*219b2ee8SDavid du Colombier 4*219b2ee8SDavid du Colombier /* MAXHOSTNAMELEN is in sys/param.h */ 5*219b2ee8SDavid du Colombier #define MAXHOSTNAMELEN 64 6*219b2ee8SDavid du Colombier 7*219b2ee8SDavid du Colombier char lockstring[MAXHOSTNAMELEN+8]; 8bd389b36SDavid du Colombier 9bd389b36SDavid du Colombier void 10*219b2ee8SDavid du Colombier main(int argc, char *argv[]) { 11*219b2ee8SDavid du Colombier char *lockfile; 12*219b2ee8SDavid du Colombier int fd, ppid, ssize; 13*219b2ee8SDavid du Colombier struct Dir statbuf; 14*219b2ee8SDavid du Colombier 15*219b2ee8SDavid du Colombier if (argc != 4) { 16*219b2ee8SDavid du Colombier fprint(2, "usage: LOCK lockfile hostname ppid\n"); 17*219b2ee8SDavid du Colombier exits("lock failed on usage"); 18*219b2ee8SDavid du Colombier } 19*219b2ee8SDavid du Colombier lockfile = argv[1]; 20*219b2ee8SDavid du Colombier if ((fd=create(lockfile, ORDWR, CHEXCL|0666)) < 0) { 21*219b2ee8SDavid du Colombier exits("lock failed on create"); 22*219b2ee8SDavid du Colombier } 23*219b2ee8SDavid du Colombier ppid = atoi(argv[3]); 24*219b2ee8SDavid du Colombier ssize = sprint(lockstring, "%s %s\n", argv[2], argv[3]); 25*219b2ee8SDavid du Colombier if (write(fd, lockstring, ssize) != ssize) { 26*219b2ee8SDavid du Colombier fprint(2, "LOCK:write(): %r\n"); 27*219b2ee8SDavid du Colombier exits("lock failed on write to lockfile"); 28bd389b36SDavid du Colombier } 29bd389b36SDavid du Colombier 30*219b2ee8SDavid du Colombier switch(fork()) { 31*219b2ee8SDavid du Colombier default: 32*219b2ee8SDavid du Colombier exits(""); 33*219b2ee8SDavid du Colombier case 0: 34*219b2ee8SDavid du Colombier break; 35*219b2ee8SDavid du Colombier case -1: 36*219b2ee8SDavid du Colombier fprint(2, "LOCK:fork(): %r\n"); 37*219b2ee8SDavid du Colombier exits("lock failed on fork"); 38*219b2ee8SDavid du Colombier } 39bd389b36SDavid du Colombier 40*219b2ee8SDavid du Colombier for(;;) { 41*219b2ee8SDavid du Colombier if (dirfstat(fd, &statbuf) == -1 || statbuf.Length.length == 0) 42*219b2ee8SDavid du Colombier break; 43*219b2ee8SDavid du Colombier if (write(fd, "", 0) < 0) 44*219b2ee8SDavid du Colombier break; 45*219b2ee8SDavid du Colombier sleep(3000); 46bd389b36SDavid du Colombier } 47*219b2ee8SDavid du Colombier 48bd389b36SDavid du Colombier close(fd); 49*219b2ee8SDavid du Colombier postnote(PNGROUP, ppid, "kill"); 50bd389b36SDavid du Colombier exits(""); 51bd389b36SDavid du Colombier } 52