xref: /plan9-contrib/sys/src/cmd/lp/LOCK.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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