Module Name:    src
Committed By:   christos
Date:           Sun Nov 23 15:43:49 UTC 2014

Modified Files:
        src/sbin/dkctl: dkctl.c

Log Message:
- pass the proper argument vector so that subcommands can use getopt.
- add -q and -e for listwedges.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sbin/dkctl/dkctl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/dkctl/dkctl.c
diff -u src/sbin/dkctl/dkctl.c:1.21 src/sbin/dkctl/dkctl.c:1.22
--- src/sbin/dkctl/dkctl.c:1.21	Tue Nov  4 03:00:44 2014
+++ src/sbin/dkctl/dkctl.c	Sun Nov 23 10:43:49 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkctl.c,v 1.21 2014/11/04 08:00:44 mlelstv Exp $	*/
+/*	$NetBSD: dkctl.c,v 1.22 2014/11/23 15:43:49 christos Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -41,10 +41,9 @@
 #include <sys/cdefs.h>
 
 #ifndef lint
-__RCSID("$NetBSD: dkctl.c,v 1.21 2014/11/04 08:00:44 mlelstv Exp $");
+__RCSID("$NetBSD: dkctl.c,v 1.22 2014/11/23 15:43:49 christos Exp $");
 #endif
 
-
 #include <sys/param.h>
 #include <sys/ioctl.h>
 #include <sys/dkio.h>
@@ -55,6 +54,7 @@ __RCSID("$NetBSD: dkctl.c,v 1.21 2014/11
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdbool.h>
 #include <string.h>     
 #include <unistd.h>
 #include <util.h>
@@ -86,7 +86,6 @@ static void	showall(void);
 static int	fd;				/* file descriptor for device */
 static const	char *dvname;			/* device name */
 static char	dvname_store[MAXPATHLEN];	/* for opendisk(3) */
-static const	char *cmdname;			/* command user issued */
 
 static int dkw_sort(const void *, const void *);
 static int yesno(const char *);
@@ -177,15 +176,10 @@ main(int argc, char *argv[])
 	dvname = argv[1];
 	if (argc == 2)
 		showall();
-	else {
-		/* Skip program name, get and skip device name and command. */
-		cmdname = argv[2];
-		argv += 3;
-		argc -= 3;
-		run(argc, argv);
-	}
+	else
+		run(argc - 2, argv + 2);
 
-	exit(0);
+	return EXIT_SUCCESS;
 }
 
 static void
@@ -193,13 +187,13 @@ run(int argc, char *argv[])
 {
 	struct command *command;
 
-	command = lookup(cmdname);
+	command = lookup(argv[0]);
 
 	/* Open the device. */
 	fd = opendisk(dvname, command->open_flags, dvname_store,
 	    sizeof(dvname_store), 0);
 	if (fd == -1)
-		err(1, "%s", dvname);
+		err(EXIT_FAILURE, "%s", dvname);
 	dvname = dvname_store;
 
 	(*command->cmd_func)(argc, argv);
@@ -218,7 +212,7 @@ lookup(const char *name)
 		if (strcmp(name, commands[i].cmd_name) == 0)
 			break;
 	if (commands[i].cmd_name == NULL)
-		errx(1, "unknown command: %s", name);
+		errx(EXIT_FAILURE, "unknown command: %s", name);
 
 	return &commands[i];
 }
@@ -229,7 +223,7 @@ usage(void)
 	int i;
 
 	fprintf(stderr,
-	    "usage: %s device\n"
+	    "Usage: %s device\n"
 	    "       %s device command [arg [...]]\n",
 	    getprogname(), getprogname());
 
@@ -238,27 +232,23 @@ usage(void)
 		fprintf(stderr, "\t%s %s\n", commands[i].cmd_name,
 		    commands[i].arg_names);
 
-	exit(1);
+	exit(EXIT_FAILURE);
 }
 
 static void
 showall(void)
 {
-	printf("strategy:\n");
-	cmdname = "strategy";
-	run(0, NULL);
-
-	putchar('\n');
-
-	printf("cache:\n");
-	cmdname = "getcache";
-	run(0, NULL);
-
-	putchar('\n');
-
-	printf("wedges:\n");
-	cmdname = "listwedges";
-	run(0, NULL);
+	static const char *cmds[] = { "strategy", "getcache", "listwedges" };
+	size_t i;
+	char *args[2];
+
+	args[1] = NULL;
+	for (i = 0; i < __arraycount(cmds); i++) {
+		printf("%s:\n", cmds[i]);
+		args[0] = __UNCONST(cmds[i]);
+		run(1, args);
+		putchar('\n');
+	}
 }
 
 static void
@@ -274,17 +264,17 @@ disk_strategy(int argc, char *argv[])
 
 	memset(&dks, 0, sizeof(dks));
 	switch (argc) {
-	case 0:
+	case 1:
 		/* show the buffer queue strategy used */
 		printf("%s: %s\n", dvname, odks.dks_name);
 		return;
-	case 1:
+	case 2:
 		/* set the buffer queue strategy */
-		strlcpy(dks.dks_name, argv[0], sizeof(dks.dks_name));
+		strlcpy(dks.dks_name, argv[1], sizeof(dks.dks_name));
 		if (ioctl(fd, DIOCSSTRATEGY, &dks) == -1) {
 			err(EXIT_FAILURE, "%s: DIOCSSTRATEGY", dvname);
 		}
-		printf("%s: %s -> %s\n", dvname, odks.dks_name, argv[0]);
+		printf("%s: %s -> %s\n", dvname, odks.dks_name, argv[1]);
 		break;
 	default:
 		usage();
@@ -298,7 +288,7 @@ disk_getcache(int argc, char *argv[])
 	int bits;
 
 	if (ioctl(fd, DIOCGCACHE, &bits) == -1)
-		err(1, "%s: getcache", dvname);
+		err(EXIT_FAILURE, "%s: getcache", dvname);
 
 	if ((bits & (DKCACHE_READ|DKCACHE_WRITE)) == 0)
 		printf("%s: No caches enabled\n", dvname);
@@ -323,29 +313,29 @@ disk_setcache(int argc, char *argv[])
 {
 	int bits;
 
-	if (argc > 2 || argc == 0)
+	if (argc > 3 || argc == 1)
 		usage();
 
-	if (strcmp(argv[0], "none") == 0)
+	if (strcmp(argv[1], "none") == 0)
 		bits = 0;
-	else if (strcmp(argv[0], "r") == 0)
+	else if (strcmp(argv[1], "r") == 0)
 		bits = DKCACHE_READ;
-	else if (strcmp(argv[0], "w") == 0)
+	else if (strcmp(argv[1], "w") == 0)
 		bits = DKCACHE_WRITE;
-	else if (strcmp(argv[0], "rw") == 0)
+	else if (strcmp(argv[1], "rw") == 0)
 		bits = DKCACHE_READ|DKCACHE_WRITE;
 	else
 		usage();
 
-	if (argc == 2) {
-		if (strcmp(argv[1], "save") == 0)
+	if (argc == 3) {
+		if (strcmp(argv[2], "save") == 0)
 			bits |= DKCACHE_SAVE;
 		else
 			usage();
 	}
 
 	if (ioctl(fd, DIOCSCACHE, &bits) == -1)
-		err(1, "%s: setcache", dvname);
+		err(EXIT_FAILURE, "%s: %s", dvname, argv[0]);
 }
 
 static void
@@ -354,12 +344,12 @@ disk_synccache(int argc, char *argv[])
 	int force;
 
 	switch (argc) {
-	case 0:
+	case 1:
 		force = 0;
 		break;
 
-	case 1:
-		if (strcmp(argv[0], "force") == 0)
+	case 2:
+		if (strcmp(argv[1], "force") == 0)
 			force = 1;
 		else
 			usage();
@@ -370,7 +360,7 @@ disk_synccache(int argc, char *argv[])
 	}
 
 	if (ioctl(fd, DIOCCACHESYNC, &force) == -1)
-		err(1, "%s: sync cache", dvname);
+		err(EXIT_FAILURE, "%s: %s", dvname, argv[0]);
 }
 
 static void
@@ -379,17 +369,17 @@ disk_keeplabel(int argc, char *argv[])
 	int keep;
 	int yn;
 
-	if (argc != 1)
+	if (argc != 2)
 		usage();
 
-	yn = yesno(argv[0]);
+	yn = yesno(argv[1]);
 	if (yn < 0)
 		usage();
 
 	keep = yn == YES;
 
 	if (ioctl(fd, DIOCKLABEL, &keep) == -1)
-		err(1, "%s: keep label", dvname);
+		err(EXIT_FAILURE, "%s: %s", dvname, argv[0]);
 }
 
 
@@ -405,10 +395,10 @@ disk_badsectors(int argc, char *argv[])
 	u_char *block;
 	time_t tm;
 
-	if (argc != 1)
+	if (argc != 2)
 		usage();
 
-	if (strcmp(argv[0], "list") == 0) {
+	if (strcmp(argv[1], "list") == 0) {
 		/*
 		 * Copy the list of kernel bad sectors out in chunks that fit
 		 * into buffer[].  Updating dbsi_skip means we don't sit here
@@ -422,7 +412,7 @@ disk_badsectors(int argc, char *argv[])
 
 		do {
 			if (ioctl(fd, DIOCBSLIST, (caddr_t)&dbsi) == -1)
-				err(1, "%s: badsectors list", dvname);
+				err(EXIT_FAILURE, "%s: badsectors list", dvname);
 
 			dbs = (struct disk_badsectors *)dbsi.dbsi_buffer;
 			for (count = dbsi.dbsi_copied; count > 0; count--) {
@@ -435,11 +425,11 @@ disk_badsectors(int argc, char *argv[])
 			dbsi.dbsi_skip += dbsi.dbsi_copied;
 		} while (dbsi.dbsi_left != 0);
 
-	} else if (strcmp(argv[0], "flush") == 0) {
+	} else if (strcmp(argv[1], "flush") == 0) {
 		if (ioctl(fd, DIOCBSFLUSH) == -1)
-			err(1, "%s: badsectors flush", dvname);
+			err(EXIT_FAILURE, "%s: badsectors flush", dvname);
 
-	} else if (strcmp(argv[0], "retry") == 0) {
+	} else if (strcmp(argv[1], "retry") == 0) {
 		/*
 		 * Enforce use of raw device here because the block device
 		 * causes access to blocks to be clustered in a larger group,
@@ -447,7 +437,7 @@ disk_badsectors(int argc, char *argv[])
 		 * are the cause of a problem.
 		 */ 
 		if (fstat(fd, &sb) == -1)
-			err(1, "fstat");
+			err(EXIT_FAILURE, "fstat");
 
 		if (!S_ISCHR(sb.st_mode)) {
 			fprintf(stderr, "'badsector retry' must be used %s\n",
@@ -470,13 +460,13 @@ disk_badsectors(int argc, char *argv[])
 
 		do {
 			if (ioctl(fd, DIOCBSLIST, (caddr_t)&dbsi) == -1)
-				err(1, "%s: badsectors list", dvname);
+				err(EXIT_FAILURE, "%s: badsectors list", dvname);
 
 			dbs = (struct disk_badsectors *)dbsi.dbsi_buffer;
 			for (count = dbsi.dbsi_copied; count > 0; count--) {
 				dbs2 = malloc(sizeof *dbs2);
 				if (dbs2 == NULL)
-					err(1, NULL);
+					err(EXIT_FAILURE, NULL);
 				*dbs2 = *dbs;
 				SLIST_INSERT_HEAD(&dbstop, dbs2, dbs_next);
 				dbs++;
@@ -492,7 +482,7 @@ disk_badsectors(int argc, char *argv[])
 		bad = 0;
 		totbad = 0;
 		if ((block = calloc(1, DEV_BSIZE)) == NULL)
-			err(1, NULL);
+			err(EXIT_FAILURE, NULL);
 		SLIST_FOREACH(dbs, &dbstop, dbs_next) {
 			bad++;
 			totbad += dbs->dbs_max - dbs->dbs_min + 1;
@@ -506,7 +496,7 @@ disk_badsectors(int argc, char *argv[])
 		 * to test all those it thought were bad.
 		 */
 		if (ioctl(fd, DIOCBSFLUSH) == -1)
-			err(1, "%s: badsectors flush", dvname);
+			err(EXIT_FAILURE, "%s: badsectors flush", dvname);
 
 		printf("%s: bad sectors flushed\n", dvname);
 
@@ -549,42 +539,42 @@ disk_addwedge(int argc, char *argv[])
 	daddr_t start;
 	uint64_t size;
 
-	if (argc != 4)
+	if (argc != 5)
 		usage();
 
 	/* XXX Unicode: dkw_wname is supposed to be utf-8 */
-	if (strlcpy((char *)dkw.dkw_wname, argv[0], sizeof(dkw.dkw_wname)) >=
+	if (strlcpy((char *)dkw.dkw_wname, argv[1], sizeof(dkw.dkw_wname)) >=
 	    sizeof(dkw.dkw_wname))
-		errx(1, "Wedge name too long; max %zd characters",
+		errx(EXIT_FAILURE, "Wedge name too long; max %zd characters",
 		    sizeof(dkw.dkw_wname) - 1);
 
-	if (strlcpy(dkw.dkw_ptype, argv[3], sizeof(dkw.dkw_ptype)) >=
+	if (strlcpy(dkw.dkw_ptype, argv[4], sizeof(dkw.dkw_ptype)) >=
 	    sizeof(dkw.dkw_ptype))
-		errx(1, "Wedge partition type too long; max %zd characters",
+		errx(EXIT_FAILURE, "Wedge partition type too long; max %zd characters",
 		    sizeof(dkw.dkw_ptype) - 1);
 
 	errno = 0;
-	start = strtoll(argv[1], &cp, 0);
+	start = strtoll(argv[2], &cp, 0);
 	if (*cp != '\0')
-		errx(1, "Invalid start block: %s", argv[1]);
+		errx(EXIT_FAILURE, "Invalid start block: %s", argv[2]);
 	if (errno == ERANGE && (start == LLONG_MAX ||
 				start == LLONG_MIN))
-		errx(1, "Start block out of range.");
+		errx(EXIT_FAILURE, "Start block out of range.");
 	if (start < 0)
-		errx(1, "Start block must be >= 0.");
+		errx(EXIT_FAILURE, "Start block must be >= 0.");
 
 	errno = 0;
-	size = strtoull(argv[2], &cp, 0);
+	size = strtoull(argv[3], &cp, 0);
 	if (*cp != '\0')
-		errx(1, "Invalid block count: %s", argv[2]);
+		errx(EXIT_FAILURE, "Invalid block count: %s", argv[3]);
 	if (errno == ERANGE && (size == ULLONG_MAX))
-		errx(1, "Block count out of range.");
+		errx(EXIT_FAILURE, "Block count out of range.");
 
 	dkw.dkw_offset = start;
 	dkw.dkw_size = size;
 
 	if (ioctl(fd, DIOCAWEDGE, &dkw) == -1)
-		err(1, "%s: addwedge", dvname);
+		err(EXIT_FAILURE, "%s: %s", dvname, argv[0]);
 	else
 		printf("%s created successfully.\n", dkw.dkw_devname);
 
@@ -595,16 +585,16 @@ disk_delwedge(int argc, char *argv[])
 {
 	struct dkwedge_info dkw;
 
-	if (argc != 1)
+	if (argc != 2)
 		usage();
 
-	if (strlcpy(dkw.dkw_devname, argv[0], sizeof(dkw.dkw_devname)) >=
+	if (strlcpy(dkw.dkw_devname, argv[1], sizeof(dkw.dkw_devname)) >=
 	    sizeof(dkw.dkw_devname))
-		errx(1, "Wedge dk name too long; max %zd characters",
+		errx(EXIT_FAILURE, "Wedge dk name too long; max %zd characters",
 		    sizeof(dkw.dkw_devname) - 1);
 
 	if (ioctl(fd, DIOCDWEDGE, &dkw) == -1)
-		err(1, "%s: delwedge", dvname);
+		err(EXIT_FAILURE, "%s: %s", dvname, argv[0]);
 }
 
 static void
@@ -612,11 +602,11 @@ disk_getwedgeinfo(int argc, char *argv[]
 {
 	struct dkwedge_info dkw;
 
-	if (argc != 0)
+	if (argc != 1)
 		usage();
 
 	if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == -1)
-		err(1, "%s: getwedgeinfo", dvname);
+		err(EXIT_FAILURE, "%s: getwedgeinfo", dvname);
 
 	printf("%s at %s: %s\n", dkw.dkw_devname, dkw.dkw_parent,
 	    dkw.dkw_wname);	/* XXX Unicode */
@@ -631,6 +621,26 @@ disk_listwedges(int argc, char *argv[])
 	struct dkwedge_list dkwl;
 	size_t bufsize;
 	u_int i;
+	int c;
+	bool error, quiet;
+
+	optreset = 1;
+	optind = 1;
+	quiet = error = false;
+	while ((c = getopt(argc, argv, "qe")) != -1)
+		switch (c) {
+		case 'e':
+			error = true;
+			break;
+		case 'q':
+			quiet = true;
+			break;
+		default:
+			usage();
+		}
+
+	argc -= optind;
+	argv += optind;
 
 	if (argc != 0)
 		usage();
@@ -641,14 +651,14 @@ disk_listwedges(int argc, char *argv[])
 
 	for (;;) {
 		if (ioctl(fd, DIOCLWEDGES, &dkwl) == -1)
-			err(1, "%s: listwedges", dvname);
+			err(EXIT_FAILURE, "%s: listwedges", dvname);
 		if (dkwl.dkwl_nwedges == dkwl.dkwl_ncopied)
 			break;
 		bufsize = dkwl.dkwl_nwedges * sizeof(*dkw);
 		if (dkwl.dkwl_bufsize < bufsize) {
 			dkw = realloc(dkwl.dkwl_buf, bufsize);
 			if (dkw == NULL)
-				errx(1, "%s: listwedges: unable to "
+				errx(EXIT_FAILURE, "%s: listwedges: unable to "
 				    "allocate wedge info buffer", dvname);
 			dkwl.dkwl_buf = dkw;
 			dkwl.dkwl_bufsize = bufsize;
@@ -656,7 +666,10 @@ disk_listwedges(int argc, char *argv[])
 	}
 
 	if (dkwl.dkwl_nwedges == 0) {
-		printf("%s: no wedges configured\n", dvname);
+		if (!quiet)
+			printf("%s: no wedges configured\n", dvname);
+		if (error)
+			exit(EXIT_FAILURE);
 		return;
 	}
 
@@ -677,11 +690,11 @@ disk_makewedges(int argc, char *argv[])
 {
 	int bits;
 
-	if (argc != 0)
+	if (argc != 1)
 		usage();
 
 	if (ioctl(fd, DIOCMWEDGES, &bits) == -1)
-		err(1, "%s: makewedges", dvname);
+		err(EXIT_FAILURE, "%s: %s", dvname, argv[0]);
 	else
 		printf("successfully scanned %s.\n", dvname);
 }

Reply via email to