Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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("");
}