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