ref: ec628c4dfbf62891e311567034936a0b2cb584c4
dir: /sys/src/cmd/lp/LOCK.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(""); }