From owner-svn-src-user@FreeBSD.ORG Sat Aug 14 15:21:06 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 70A1510656A3; Sat, 14 Aug 2010 15:21:06 +0000 (UTC) (envelope-from des@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 462768FC1A; Sat, 14 Aug 2010 15:21:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o7EFL64M031208; Sat, 14 Aug 2010 15:21:06 GMT (envelope-from des@svn.freebsd.org) Received: (from des@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o7EFL6Xi031206; Sat, 14 Aug 2010 15:21:06 GMT (envelope-from des@svn.freebsd.org) Message-Id: <201008141521.o7EFL6Xi031206@svn.freebsd.org> From: Dag-Erling Smorgrav Date: Sat, 14 Aug 2010 15:21:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211305 - user/des/phybs X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 14 Aug 2010 15:21:06 -0000 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 #include #include +#include #include #include #include @@ -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);