chiark / gitweb /
with-lock-ex: Replace ad-hoc option parser with getopt.
authorMatthew Vernon <mv3@sanger.ac.uk>
Wed, 3 May 2017 13:30:02 +0000 (14:30 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 3 May 2017 20:37:22 +0000 (21:37 +0100)
Also, fix typo in usage message (missing -ex).

Signed-off-by: Matthew Vernon <mv3@sanger.ac.uk>
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
---
v5: Fix commit message.

v4: make coding style consistent
    fix typo in usage message (missing -ex)

v3: split off from timeout patch
    add copyright notice

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
cprogs/with-lock-ex.c
debian/copyright

index f10e682..d1b23db 100644 (file)
@@ -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 <secs>] <lockfile> <command> <args>...\n"
+         "       with-lock-ex -l       <lockfile>\n"
+         "       with-lock-ex          <lockfile> <command> <args>...\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 <lockfile> <command> <args>...\n"
-         "       with-lock-ex -l       <lockfile>\n"
-         "       with-lock             <lockfile> <command> <args>...\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");
index 4d40a01..1a71958 100644 (file)
@@ -86,6 +86,7 @@ git-cache-proxy
 with-lock-ex
  Copyright 1993-2016 Ian Jackson in some jurisdictions
  Copyright 2017      Ian Jackson in all jurisdictions
+ Copyright 2017      Genome Research Ltd
 
 The chiark utilities are all free software; you can redistribute them
 and/or modify them under the terms of the GNU General Public License