Date: Sat, 14 Aug 2010 15:21:06 +0000 (UTC) From: Dag-Erling Smorgrav <des@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r211305 - user/des/phybs Message-ID: <201008141521.o7EFL6Xi031206@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: des Date: Sat Aug 14 15:21:06 2010 New Revision: 211305 URL: http://svn.freebsd.org/changeset/base/211305 Log: getopt()ify minsize and maxsize Modified: user/des/phybs/phybs.c Modified: user/des/phybs/phybs.c ============================================================================== --- user/des/phybs/phybs.c Sat Aug 14 14:34:36 2010 (r211304) +++ user/des/phybs/phybs.c Sat Aug 14 15:21:06 2010 (r211305) @@ -32,6 +32,7 @@ #include <err.h> #include <fcntl.h> #include <libutil.h> +#include <limits.h> #include <stdlib.h> #include <stdio.h> #include <string.h> @@ -106,28 +107,49 @@ static void usage(void) { - fprintf(stderr, "usage: phybs [-R | -r] [-W | -w] device [min [max]]\n"); + fprintf(stderr, "usage: phybs [-rw] [-l min] [-h max] device\n"); exit(1); } +static unsigned int +poweroftwo(char opt, const char *valstr, unsigned int min, unsigned int max) +{ + uint64_t val; + + if (expand_number(valstr, &val) != 0) { + fprintf(stderr, "-%c: invalid number\n", opt); + usage(); + } + if ((val & (val - 1)) != 0) { + fprintf(stderr, "-%c: not a power of two\n", opt); + usage(); + } + if (val < min || (max != 0 && val > max) || val > UINT_MAX) { + fprintf(stderr, "-%c: out of range\n", opt); + usage(); + } + return (val); +} + int main(int argc, char *argv[]) { - int64_t tmp; char *device; int fd, opt; - while ((opt = getopt(argc, argv, "RrWw")) != -1) + tty = isatty(STDOUT_FILENO); + + while ((opt = getopt(argc, argv, "h:l:rw")) != -1) switch (opt) { - case 'R': - opt_r = 0; + case 'h': + maxsize = poweroftwo(opt, optarg, minsize, 0); + break; + case 'l': + minsize = poweroftwo(opt, optarg, BSIZE, maxsize); break; case 'r': opt_r = 1; break; - case 'W': - opt_w = 0; - break; case 'w': opt_w = 1; break; @@ -140,23 +162,10 @@ main(int argc, char *argv[]) if (!opt_r && !opt_w) opt_r = opt_w = 1; - if (argc < 1 || argc > 3) + + if (argc != 1) usage(); device = argv[0]; - if (argc > 1) { - if (expand_number(argv[1], &tmp) != 0 || - tmp < BSIZE || (tmp & (tmp - 1)) != 0) - usage(); - minsize = tmp; - } - if (argc > 2) { - if (expand_number(argv[2], &tmp) != 0 || - tmp < minsize || (tmp & (tmp - 1)) != 0) - usage(); - maxsize = tmp; - } - - tty = isatty(STDOUT_FILENO); if ((fd = open(device, opt_w ? O_RDWR : O_RDONLY)) == -1) err(1, "open(%s)", device);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008141521.o7EFL6Xi031206>