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