Blame


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