1 262ecfed 2005-08-31 devnull #include <u.h>
2 262ecfed 2005-08-31 devnull #include <libc.h>
4 262ecfed 2005-08-31 devnull /* MAXHOSTNAMELEN is in sys/param.h */
5 262ecfed 2005-08-31 devnull #define MAXHOSTNAMELEN 64
7 262ecfed 2005-08-31 devnull char lockstring[MAXHOSTNAMELEN+8];
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;
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");
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");
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");
30 262ecfed 2005-08-31 devnull switch(fork()) {
32 262ecfed 2005-08-31 devnull exits("");
36 262ecfed 2005-08-31 devnull fprint(2, "LOCK:fork(): %r\n");
37 262ecfed 2005-08-31 devnull exits("lock failed on fork");
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)
44 262ecfed 2005-08-31 devnull if (statbuf->length == 0){
45 262ecfed 2005-08-31 devnull free(statbuf);
48 262ecfed 2005-08-31 devnull free(statbuf);
49 262ecfed 2005-08-31 devnull if (write(fd, "", 0) < 0)
51 262ecfed 2005-08-31 devnull sleep(3000);
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("");