Module Name: src Committed By: christos Date: Fri Nov 2 17:03:16 UTC 2012
Modified Files: src/usr.bin/flock: flock.c Log Message: - better usage messages - verbose can be local - add static To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/usr.bin/flock/flock.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/flock/flock.c diff -u src/usr.bin/flock/flock.c:1.5 src/usr.bin/flock/flock.c:1.6 --- src/usr.bin/flock/flock.c:1.5 Fri Nov 2 08:47:23 2012 +++ src/usr.bin/flock/flock.c Fri Nov 2 13:03:16 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: flock.c,v 1.5 2012/11/02 12:47:23 christos Exp $ */ +/* $NetBSD: flock.c,v 1.6 2012/11/02 17:03:16 christos Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: flock.c,v 1.5 2012/11/02 12:47:23 christos Exp $"); +__RCSID("$NetBSD: flock.c,v 1.6 2012/11/02 17:03:16 christos Exp $"); #include <stdio.h> #include <string.h> @@ -45,7 +45,7 @@ __RCSID("$NetBSD: flock.c,v 1.5 2012/11/ #include <paths.h> #include <time.h> -struct option flock_longopts[] = { +static struct option flock_longopts[] = { { "debug", no_argument, 0, 'd' }, { "help", no_argument, 0, 'h' }, { "nonblock", no_argument, 0, 'n' }, @@ -61,18 +61,27 @@ struct option flock_longopts[] = { { NULL, 0, 0, 0 }, }; -static int verbose = 0; static sig_atomic_t timeout_expired; -static __dead void usage(void) +static __dead void +usage(const char *fmt, ...) { + if (fmt) { + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s: ", getprogname()); + vfprintf(stderr, fmt, ap); + fputc('\n', stderr); + va_end(ap); + } + fprintf(stderr, "Usage: %s [-dnosvx] [-w timeout] lockfile|lockdir " "[-c command]|command ...\n\t%s [-dnsuvx] [-w timeout] lockfd\n", getprogname(), getprogname()); exit(EXIT_FAILURE); } -static __dead void +static void sigalrm(int sig) { timeout_expired++; @@ -106,6 +115,21 @@ lock2name(int l) } } +static char +lockchar(int l) +{ + switch (l & ~LOCK_NB) { + case LOCK_SH: + return 's'; + case LOCK_EX: + return 'x'; + case LOCK_UN: + return 'u'; + default: + return '*'; + } +} + static char * cmdline(char **av) { @@ -130,6 +154,7 @@ main(int argc, char *argv[]) int cls = 0; int fd = -1; int debug = 0; + int verbose = 0; char *mcargv[] = { __UNCONST(_PATH_BSHELL), __UNCONST("-c"), NULL, NULL }; @@ -145,16 +170,22 @@ main(int argc, char *argv[]) debug++; break; case 'x': - lock = LOCK_EX | (lock & ~LOCK_NB); + if (lock & ~LOCK_NB) + goto badlock; + lock |= LOCK_EX; break; case 'n': lock |= LOCK_NB; break; case 's': - lock = LOCK_SH | (lock & ~LOCK_NB); + if (lock & ~LOCK_NB) + goto badlock; + lock |= LOCK_SH; break; case 'u': - lock = LOCK_UN | (lock & ~LOCK_NB); + if (lock & ~LOCK_NB) + goto badlock; + lock |= LOCK_UN; break; case 'w': timeout = strtod(optarg, NULL); @@ -166,7 +197,9 @@ main(int argc, char *argv[]) cls = 1; break; default: - usage(); + usage("Invalid option '%c'", c); + badlock: + usage("-%c can't be used with -%c", c, lockchar(lock)); } argc -= optind; @@ -174,21 +207,22 @@ main(int argc, char *argv[]) switch (argc) { case 0: - usage(); + usage("Missing lock file argument"); case 1: if (cls) - usage(); + usage("Close is valid only for descriptors"); fd = strtol(argv[0], NULL, 0); // XXX: error checking if (debug) fprintf(stderr, "descriptor %s lock %s\n", argv[0], lock2name(lock)); - if (lock == LOCK_UN) - usage(); default: + if ((lock & LOCK_NB) == LOCK_UN) + usage("Unlock is only valid for descriptors"); if (strcmp(argv[1], "-c") == 0 || strcmp(argv[1], "--command") == 0) { if (argc == 2) - usage(); + usage("Missing argument to %s", strcmp(argv[1], + "-c") == 0 ? "-c" : "--command"); mcargv[2] = argv[2]; cmdargv = mcargv; } else