X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=cprogs%2Fwith-lock-ex.c;h=d1b23db9064a32bd520783e1473dd9393788442d;hp=f10e68208b72f0ea799a5632cef219f94ea59e1a;hb=92f93b3cda23695e8c10ac611ea3ada274619282;hpb=b95ccd9ef90889e001d9d9061efd94af47466d64 diff --git a/cprogs/with-lock-ex.c b/cprogs/with-lock-ex.c index f10e682..d1b23db 100644 --- a/cprogs/with-lock-ex.c +++ b/cprogs/with-lock-ex.c @@ -26,6 +26,7 @@ * * Copyright 1993-2016 Ian Jackson in some jurisdictions * Copyright 2017 Ian Jackson in all jurisdictions + * Copyright 2017 Genome Research Ltd * * (MIT licence:) * @@ -65,28 +66,42 @@ static void fail(const char *why) { exit(255); } +static void badusage(void) __attribute__((noreturn)); + +static void badusage(void) { + fputs("usage: with-lock-ex -w|-q|-f [-t ] ...\n" + " with-lock-ex -l \n" + " with-lock-ex ...\n", + stderr); + exit(255); +} + +static int mode; + int main(int argc, char **argv) { - int fd, mode, um; + int fd, um, c; struct stat stab, fstab; long cloexec; struct flock fl; - const char *p; - - if (argc >= 3 && !strcmp((p= strrchr(argv[0],'/')) ? ++p : argv[0], "with-lock")) { - mode= 'f'; - } else if (argc < 3 || argv[1][0] != '-' || argv[1][2] || - ((mode= argv[1][1]) != 'w' && mode != 'q' && mode != 'f' - && mode != 'l') || - (mode != 'l' && argc < 4) || - (mode == 'l' && argc != 3)) { - fputs("usage: with-lock-ex -w|-q|-f ...\n" - " with-lock-ex -l \n" - " with-lock ...\n", - stderr); - exit(255); - } else { - argv++; argc--; + + mode= 'x'; + while ((c= getopt(argc,argv,"+wfqlt:")) != -1) { + switch(c) { + case 'l': + case 'w': + case 'f': + case 'q': + if (mode != 'x') badusage(); + mode= c; + break; + default: + badusage(); + } } + + argv += optind-1; argc -= optind-1; + if (argc < 2) badusage(); + cmd= argv[2]; um= umask(0777); if (um==-1) fail("find umask"); if (umask(um)==-1) fail("reset umask");