| #include <u.h> | 
 | #include <libc.h> | 
 |  | 
 | /* MAXHOSTNAMELEN is in sys/param.h */ | 
 | #define MAXHOSTNAMELEN	64 | 
 |  | 
 | char lockstring[MAXHOSTNAMELEN+8]; | 
 |  | 
 | void | 
 | main(int argc, char *argv[]) { | 
 | 	char *lockfile; | 
 | 	int fd, ppid, ssize; | 
 | 	struct Dir *statbuf; | 
 |  | 
 | 	if (argc != 4) { | 
 | 		fprint(2, "usage: LOCK lockfile hostname ppid\n"); | 
 | 		exits("lock failed on usage"); | 
 | 	} | 
 | 	lockfile = argv[1]; | 
 | 	if ((fd=create(lockfile, OLOCK|ORDWR, 0666)) < 0) { | 
 | 		exits("lock failed on create"); | 
 | 	} | 
 | 	ppid = atoi(argv[3]); | 
 | 	ssize = sprint(lockstring, "%s %s\n", argv[2], argv[3]); | 
 | 	if (write(fd, lockstring, ssize) != ssize) { | 
 | 		fprint(2, "LOCK:write(): %r\n"); | 
 | 		exits("lock failed on write to lockfile"); | 
 | 	} | 
 |  | 
 | 	switch(fork()) { | 
 | 	default: | 
 | 		exits(""); | 
 | 	case 0: | 
 | 		break; | 
 | 	case -1: | 
 | 		fprint(2, "LOCK:fork(): %r\n"); | 
 | 		exits("lock failed on fork"); | 
 | 	} | 
 |  | 
 | 	for(;;) { | 
 | 		statbuf = dirfstat(fd); | 
 | 		if(statbuf == nil) | 
 | 			break; | 
 | 		if (statbuf->length == 0){ | 
 | 			free(statbuf); | 
 | 			break; | 
 | 		} | 
 | 		free(statbuf); | 
 | 		if (write(fd, "", 0) < 0) | 
 | 			break; | 
 | 		sleep(3000); | 
 | 	} | 
 |  | 
 | 	close(fd); | 
 | 	postnote(PNGROUP, ppid, "kill"); | 
 | 	exits(""); | 
 | } |