Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 Nov 2013 21:16:11 -0500
From:      Eitan Adler <lists@eitanadler.com>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        scsi@freebsd.org
Subject:   Re: mptutil, mfitil, expand_number
Message-ID:  <CAF6rxgmp0osqW8i27ntXvQ5FSE=96auRHztqYJmiDvR1mv1sUA@mail.gmail.com>
In-Reply-To: <20131110161359.S1474@besplex.bde.org>
References:  <CAF6rxgkCkpS_iu8VXcUnqk0TG+Mrbzvt55-QJ-ebTUrqJv8UHQ@mail.gmail.com> <20131110161359.S1474@besplex.bde.org>

Next in thread | Previous in thread | Raw E-Mail | Index | Archive | Help
On Sun, Nov 10, 2013 at 1:25 AM, Bruce Evans <brde@optusnet.com.au> wrote:
> On Sat, 9 Nov 2013, Eitan Adler wrote:

Lets see if I understand everything you wanted me to do.  I am not
intending to fix any bugs in expand_number at the moment if any.

In case the patch below is mangled the following should be identical:
http://people.freebsd.org/~eadler/files/expand_number.diff

commit 55c7ba2c76c9719617f0e76cb781fad0e26eba74
Author: Eitan Adler <lists@eitanadler.com>
Date:   Sat Nov 9 22:09:17 2013 -0500

    Convert from a hand-rolled function to expand_number.

diff --git a/usr.sbin/mptutil/mpt_config.c b/usr.sbin/mptutil/mpt_config.c
index 17b9945..0d34d16 100644
--- a/usr.sbin/mptutil/mpt_config.c
+++ b/usr.sbin/mptutil/mpt_config.c
@@ -50,35 +50,6 @@ __RCSID("$FreeBSD$");
 static void dump_config(CONFIG_PAGE_RAID_VOL_0 *vol);
 #endif

-static long
-dehumanize(const char *value)
-{
-        char    *vtp;
-        long    iv;
-
-        if (value == NULL)
-                return (0);
-        iv = strtoq(value, &vtp, 0);
-        if (vtp == value || (vtp[0] != '\0' && vtp[1] != '\0')) {
-                return (0);
-        }
-        switch (vtp[0]) {
-        case 't': case 'T':
-                iv *= 1024;
-        case 'g': case 'G':
-                iv *= 1024;
-        case 'm': case 'M':
-                iv *= 1024;
-        case 'k': case 'K':
-                iv *= 1024;
-        case '\0':
-                break;
-        default:
-                return (0);
-        }
-        return (iv);
-}
-
 /*
  * Lock the volume by opening its /dev device read/write.  This will
  * only work if nothing else has it opened (including mounts).  We
@@ -615,7 +586,7 @@ create_volume(int ac, char **av)
  CONFIG_PAGE_RAID_VOL_0 *vol;
  struct config_id_state state;
  struct volume_info *info;
- long stripe_size;
+ uint64_t stripe_size;
  int ch, error, fd, i, quick, raid_type, verbose;
 #ifdef DEBUG
  int dump;
@@ -666,7 +637,11 @@ create_volume(int ac, char **av)
  quick = 1;
  break;
  case 's':
- stripe_size = dehumanize(optarg);
+ error = expand_number(optarg, &stripe_size);
+ if (error == -1) {
+ warnx("Invalid stripe size %s", optarg);
+ return (errno);
+ }
  if ((stripe_size < 512) || (!powerof2(stripe_size))) {
  warnx("Invalid stripe size %s", optarg);
  return (EINVAL);

commit fdca0b483f9184f0a6de420086a81cfa34652a5f
Author: Eitan Adler <lists@eitanadler.com>
Date:   Sat Nov 9 22:09:17 2013 -0500

    Convert from a hand-rolled function to expand_number.

    Reviewed by: sbruno

diff --git a/usr.sbin/mfiutil/mfi_config.c b/usr.sbin/mfiutil/mfi_config.c
index a919214..abecb7d 100644
--- a/usr.sbin/mfiutil/mfi_config.c
+++ b/usr.sbin/mfiutil/mfi_config.c
@@ -47,35 +47,6 @@
 static int add_spare(int ac, char **av);
 static int remove_spare(int ac, char **av);

-static long
-dehumanize(const char *value)
-{
-        char    *vtp;
-        long    iv;
-
-        if (value == NULL)
-                return (0);
-        iv = strtoq(value, &vtp, 0);
-        if (vtp == value || (vtp[0] != '\0' && vtp[1] != '\0')) {
-                return (0);
-        }
-        switch (vtp[0]) {
-        case 't': case 'T':
-                iv *= 1024;
-        case 'g': case 'G':
-                iv *= 1024;
-        case 'm': case 'M':
-                iv *= 1024;
-        case 'k': case 'K':
-                iv *= 1024;
-        case '\0':
-                break;
-        default:
-                return (0);
-        }
-        return (iv);
-}
-
 int
 mfi_config_read(int fd, struct mfi_config_data **configp)
 {
@@ -629,7 +600,11 @@ create_volume(int ac, char **av)
  break;
 #endif
  case 's':
- stripe_size = dehumanize(optarg);
+ error = expand_number(optarg, &stripe_size);
+ if (error == -1) {
+ error = errno;
+ goto error;
+ }
  if ((stripe_size < 512) || (!powerof2(stripe_size)))
  stripe_size = 64 * 1024;
  break;

commit 20ad9d0a2bd9aea4aaf7c5ae9253978ae0aed75c
Author: Eitan Adler <lists@eitanadler.com>
Date:   Sat Nov 9 22:19:41 2013 -0500

    Indicate that expand_number is case-insensitive.

diff --git a/lib/libutil/expand_number.3 b/lib/libutil/expand_number.3
index f78223b..2f5871f 100644
--- a/lib/libutil/expand_number.3
+++ b/lib/libutil/expand_number.3
@@ -51,12 +51,13 @@ argument.
 The
 .Fn expand_number
 function
+is case-insensitive and
 follows the SI power of two convention.
 .Pp
 The prefixes are:
 .Bl -column "Prefix" "Description" "1000000000000000000" -offset indent
 .It Sy "Prefix" Ta Sy "Description" Ta Sy "Multiplier"
-.It Li k Ta No kilo Ta 1024
+.It Li K Ta No kilo Ta 1024
 .It Li M Ta No mega Ta 1048576
 .It Li G Ta No giga Ta 1073741824
 .It Li T Ta No tera Ta 1099511627776



-- 
Eitan Adler



Want to link to this message? Use this URL: <http://docs.FreeBSD.org/cgi/mid.cgi?CAF6rxgmp0osqW8i27ntXvQ5FSE=96auRHztqYJmiDvR1mv1sUA>