58 lines
1 KiB
C
58 lines
1 KiB
C
#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, ORDWR, DMEXCL|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("");
|
|
}
|