Freebsd:

If the number ends with a ``b'', ``k'', ``m'', ``g'',
or ``w'', the number is multiplied by 512, 1024 (1K), 1048576 (1M),
1073741824 (1G) or the number of bytes in an integer, respectively.

NetBSD:

Where sizes are specified, a decimal number of bytes is expected.  Two or
     more numbers may be separated by an ``x'' to indicate a product.  Each
     number may have one of the following optional suffixes:
           b    Block; multiply by 512
           k    Kibi; multiply by 1024 (1 KiB)
           m    Mebi; multiply by 1048576 (1 MiB)
           g    Gibi; multiply by 1073741824 (1 GiB)
           t    Tebi; multiply by 1099511627776 (1 TiB)
           w    Word; multiply by the number of bytes in an integer


On Sun, Mar 23, 2014 at 9:01 PM, Adam Thompson <[email protected]> wrote:
> GNU dd definitely has it (along with the wholly-expected proliferation of 
> other useless units).  It's definitely not called for by POSIX.  IIRC, 
> Solaris supports some units but not others.  HPUX doesn't support any units 
> at all.  Don't know what other BSDs or AIX support.
> -Adam
>
> On March 23, 2014 6:20:29 PM CDT, Theo de Raadt <[email protected]> 
> wrote:
>>Fine with me.
>>
>>dd is often used in portable scripts.  Do we need to document this
>>as an extension, or has it already arrived in other implimentations?
>>
>>> A gigabyte is like a megabyte, except it's bigger and better.
>>>
>>> This adds support for g/G suffixes. It also updates and corrects the
>>> comments in the source. Also move the goto label out of the if.
>>>
>>> Index: args.c
>>> ===================================================================
>>> RCS file: /cvs/src/bin/dd/args.c,v
>>> retrieving revision 1.22
>>> diff -u -p -r1.22 args.c
>>> --- args.c   12 Feb 2014 01:18:36 -0000      1.22
>>> +++ args.c   23 Mar 2014 22:16:58 -0000
>>> @@ -312,13 +312,12 @@ f_conv(char *arg)
>>>
>>>  /*
>>>   * Convert an expression of the following forms to a size_t
>>> - *  1) A positive decimal number.
>>> - *  2) A positive decimal number followed by a b (mult by 512).
>>> - *  3) A positive decimal number followed by a k (mult by 1024).
>>> - *  4) A positive decimal number followed by a m (mult by 1048576).
>>> - *  5) A positive decimal number followed by a w (mult by sizeof int)
>>> - *  6) Two or more positive decimal numbers (with/without k,b or w).
>>> - *     separated by x (also * for backwards compatibility),
>>specifying
>>> + *  1) A positive decimal number, optionally followed by
>>> + *          b - multiply by 512.
>>> + *          k, m or g - multply by 1024 each.
>>> + *          w - multiply by sizeof int
>>> + *  2) Two or more of the above, separated by x
>>> + *     (or * for backwards compatibility), specifying
>>>   *     the product of the indicated values.
>>>   */
>>>  static size_t
>>> @@ -341,18 +340,24 @@ get_bsz(char *val)
>>>                      goto erange;
>>>              ++expr;
>>>              break;
>>> -    case 'k':
>>> -    case 'K':
>>> +    case 'g':
>>> +    case 'G':
>>>              t = num;
>>>              num *= 1024;
>>>              if (t > num)
>>>                      goto erange;
>>> -            ++expr;
>>> -            break;
>>> +            /* fallthrough */
>>>      case 'm':
>>>      case 'M':
>>>              t = num;
>>> -            num *= 1048576;
>>> +            num *= 1024;
>>> +            if (t > num)
>>> +                    goto erange;
>>> +            /* fallthrough */
>>> +    case 'k':
>>> +    case 'K':
>>> +            t = num;
>>> +            num *= 1024;
>>>              if (t > num)
>>>                      goto erange;
>>>              ++expr;
>>> @@ -374,23 +379,24 @@ get_bsz(char *val)
>>>                      t = num;
>>>                      num *= get_bsz(expr + 1);
>>>                      if (t > num)
>>> -erange:                             errx(1, "%s: %s", oper, 
>>> strerror(ERANGE));
>>> +                            goto erange;
>>>                      break;
>>>              default:
>>>                      errx(1, "%s: illegal numeric value", oper);
>>>      }
>>>      return (num);
>>> +erange:
>>> +    errx(1, "%s: %s", oper, strerror(ERANGE));
>>>  }
>>>
>>>  /*
>>>   * Convert an expression of the following forms to an off_t
>>> - *  1) A positive decimal number.
>>> - *  2) A positive decimal number followed by a b (mult by 512).
>>> - *  3) A positive decimal number followed by a k (mult by 1024).
>>> - *  4) A positive decimal number followed by a m (mult by 1048576).
>>> - *  5) A positive decimal number followed by a w (mult by sizeof int)
>>> - *  6) Two or more positive decimal numbers (with/without k,b or w).
>>> - *     separated by x (also * for backwards compatibility),
>>specifying
>>> + *  1) A positive decimal number, optionally followed by
>>> + *          b - multiply by 512.
>>> + *          k, m or g - multply by 1024 each.
>>> + *          w - multiply by sizeof int
>>> + *  2) Two or more of the above, separated by x
>>> + *     (or * for backwards compatibility), specifying
>>>   *     the product of the indicated values.
>>>   */
>>>  static off_t
>>> @@ -413,18 +419,24 @@ get_off(char *val)
>>>                      goto erange;
>>>              ++expr;
>>>              break;
>>> -    case 'k':
>>> -    case 'K':
>>> +    case 'g':
>>> +    case 'G':
>>>              t = num;
>>>              num *= 1024;
>>>              if (t > num)
>>>                      goto erange;
>>> -            ++expr;
>>> -            break;
>>> +            /* fallthrough */
>>>      case 'm':
>>>      case 'M':
>>>              t = num;
>>> -            num *= 1048576;
>>> +            num *= 1024;
>>> +            if (t > num)
>>> +                    goto erange;
>>> +            /* fallthrough */
>>> +    case 'k':
>>> +    case 'K':
>>> +            t = num;
>>> +            num *= 1024;
>>>              if (t > num)
>>>                      goto erange;
>>>              ++expr;
>>> @@ -446,10 +458,12 @@ get_off(char *val)
>>>                      t = num;
>>>                      num *= get_off(expr + 1);
>>>                      if (t > num)
>>> -erange:                             errx(1, "%s: %s", oper, 
>>> strerror(ERANGE));
>>> +                            goto erange;
>>>                      break;
>>>              default:
>>>                      errx(1, "%s: illegal numeric value", oper);
>>>      }
>>>      return (num);
>>> +erange:
>>> +    errx(1, "%s: %s", oper, strerror(ERANGE));
>>>  }
>>> Index: dd.1
>>> ===================================================================
>>> RCS file: /cvs/src/bin/dd/dd.1,v
>>> retrieving revision 1.29
>>> diff -u -p -r1.29 dd.1
>>> --- dd.1     14 Feb 2014 17:27:58 -0000      1.29
>>> +++ dd.1     23 Mar 2014 22:18:41 -0000
>>> @@ -305,11 +305,13 @@ or
>>>  .Sq m
>>>  or
>>>  .Sq M ,
>>> +.Sq g
>>> +or
>>> +.Sq G ,
>>>  or
>>>  .Sq w ,
>>> -the number
>>> -is multiplied by 512, 1024 (1K), 1048576 (1M), or the number of
>>bytes
>>> -in an integer, respectively.
>>> +the number is multiplied by 512, 1024 (1K), 1048576 (1M), 1073741824
>>(1G),
>>> +or the number of bytes in an integer, respectively.
>>>  Two or more numbers may be separated by an
>>>  .Sq x
>>>  to indicate a product.
>>>
>
> --
> Sent from my Android device with K-9 Mail. Please excuse my brevity.



-- 
---------------------------------------------------------------------------------------------------------------------
() ascii ribbon campaign - against html e-mail
/\

Reply via email to