2015-03-04 15:11 GMT+01:00 Ari Sundholm <[email protected]>:
> From: Ari Sundholm <[email protected]>
>
> bloat-o-meter:
>
> function                                             old     new   delta
> .rodata                                           154411  154491     +80
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 1/0 up/down: 80/0)               Total: 80 bytes
>
> v2: Make dd and truncate share a common suffix struct.
>
> Signed-off-by: Ari Sundholm <[email protected]>
> ---
>  coreutils/dd.c       | 31 +++++-----------------
>  coreutils/truncate.c | 73 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/libbb.h      |  1 +
>  libbb/xatonum.c      | 19 ++++++++++++++
>  4 files changed, 99 insertions(+), 25 deletions(-)
>  create mode 100644 coreutils/truncate.c
>
> diff --git a/coreutils/dd.c b/coreutils/dd.c
> index 3024970..53a843c 100644
> --- a/coreutils/dd.c
> +++ b/coreutils/dd.c
> @@ -99,25 +99,6 @@ enum {
>         ofd = STDOUT_FILENO,
>  };
>
> -static const struct suffix_mult dd_suffixes[] = {
> -       { "c", 1 },
> -       { "w", 2 },
> -       { "b", 512 },
> -       { "kB", 1000 },
> -       { "kD", 1000 },
> -       { "k", 1024 },
> -       { "K", 1024 },  /* compat with coreutils dd (it also accepts KB and 
> KD, TODO?) */
> -       { "MB", 1000000 },
> -       { "MD", 1000000 },
> -       { "M", 1024*1024 },
> -       { "GB", 1000000000 },
> -       { "GD", 1000000000 },
> -       { "G", 1024*1024*1024 },
> -       /* "D" suffix for decimal is not in coreutils manpage, looks like 
> it's deprecated */
> -       /* coreutils also understands TPEZY suffixes for tera- and so on, 
> with B suffix for decimal */
> -       { "", 0 }
> -};
> -
>  struct globals {
>         off_t out_full, out_part, in_full, in_part;
>  #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE
> @@ -326,11 +307,11 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
>  #if ENABLE_FEATURE_DD_IBS_OBS
>                 if (what == OP_ibs) {
>                         /* Must fit into positive ssize_t */
> -                       ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, 
> dd_suffixes);
> +                       ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, 
> cwbkMG_suffixes);
>                         /*continue;*/
>                 }
>                 if (what == OP_obs) {
> -                       obs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, 
> dd_suffixes);
> +                       obs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, 
> cwbkMG_suffixes);
>                         /*continue;*/
>                 }
>                 if (what == OP_conv) {
> @@ -356,22 +337,22 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
>                 }
>  #endif
>                 if (what == OP_bs) {
> -                       ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, 
> dd_suffixes);
> +                       ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, 
> cwbkMG_suffixes);
>                         obs = ibs;
>                         /*continue;*/
>                 }
>                 /* These can be large: */
>                 if (what == OP_count) {
>                         G.flags |= FLAG_COUNT;
> -                       count = XATOU_SFX(val, dd_suffixes);
> +                       count = XATOU_SFX(val, cwbkMG_suffixes);
>                         /*continue;*/
>                 }
>                 if (what == OP_seek) {
> -                       seek = XATOU_SFX(val, dd_suffixes);
> +                       seek = XATOU_SFX(val, cwbkMG_suffixes);
>                         /*continue;*/
>                 }
>                 if (what == OP_skip) {
> -                       skip = XATOU_SFX(val, dd_suffixes);
> +                       skip = XATOU_SFX(val, cwbkMG_suffixes);
>                         /*continue;*/
>                 }
>                 if (what == OP_if) {
> diff --git a/coreutils/truncate.c b/coreutils/truncate.c
> new file mode 100644
> index 0000000..36b2f2c
> --- /dev/null
> +++ b/coreutils/truncate.c
> @@ -0,0 +1,73 @@
> +/*
> + * Mini truncate implementation for busybox
> + *
> + * Copyright (C) 2015 by Ari Sundholm <[email protected]>
> + *
> + * Licensed under GPLv2 or later, see file LICENSE in this source tree.
> + */
> +
> +//config:config TRUNCATE
> +//config:      bool "truncate"
> +//config:      default y
> +//config:      help
> +//config:        truncate truncates files to a given size. If a file does
> +//config:        not exist, it is created unless told otherwise.
> +
> +//kbuild:lib-$(CONFIG_TRUNCATE) += truncate.o
> +//applet:IF_TRUNCATE(APPLET(truncate, BB_DIR_USR_BIN, BB_SUID_DROP))

This looks like a good candidate for a NOFORK applet.

> +
> +//usage:#define truncate_trivial_usage
> +//usage:       "[-c] -s SIZE FILE..."
> +//usage:#define truncate_full_usage "\n\n"
> +//usage:       "Truncate FILEs to the given size.\n"
> +//usage:       "\n     -c      Do not create any files."
> +//usage:       "\n     -s SIZE Truncate to SIZE."
> +//usage:
> +//usage:#define truncate_example_usage
> +//usage:       "$ truncate -s 1G foo"
> +
> +#include "libbb.h"
> +#if ENABLE_LFS
> +# define XATOU_SFX xatoull_sfx
> +#else
> +# define XATOU_SFX xatoul_sfx
> +#endif
> +
> +int truncate_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> +int truncate_main(int argc UNUSED_PARAM, char **argv) {
> +       unsigned opts;
> +       int flags = O_CREAT|O_RDWR;
> +       int fd;
> +       char *size_str;
> +       off_t size;
> +
> +       enum {
> +               OPT_NOCREATE  = (1 << 0),
> +               OPT_SIZE = (1 << 1),
> +       };
> +
> +       opt_complementary = "s";
> +       opts = getopt32(argv, "cs:", &size_str);
> +
> +       argv += optind;
> +       if (!*argv) {
> +               bb_error_msg("truncate: no files specified!\n");
> +               return 1;

bb_perror_msg_and_die()?

> +       }
> +
> +       if (opts & OPT_NOCREATE)
> +               flags = O_RDWR;
> +
> +       size = XATOU_SFX(size_str, cwbkMG_suffixes);
> +
> +       while (*argv) {
> +               fd = xopen(*argv, flags);
> +               if (ftruncate(fd, size) == -1)
> +                       bb_perror_msg_and_die("ftruncate failed");
> +               xclose(fd);
> +               ++argv;
> +       }
> +
> +       return 0;
> +}
> diff --git a/include/libbb.h b/include/libbb.h
> index be792d6..e4fcf7c 100644
> --- a/include/libbb.h
> +++ b/include/libbb.h
> @@ -861,6 +861,7 @@ struct suffix_mult {
>  };
>  extern const struct suffix_mult bkm_suffixes[];
>  #define km_suffixes (bkm_suffixes + 1)
> +extern const struct suffix_mult cwbkMG_suffixes[];
>
>  #include "xatonum.h"
>  /* Specialized: */
> diff --git a/libbb/xatonum.c b/libbb/xatonum.c
> index 6f4e023..19b54fb 100644
> --- a/libbb/xatonum.c
> +++ b/libbb/xatonum.c
> @@ -75,3 +75,22 @@ const struct suffix_mult bkm_suffixes[] = {
>         { "m", 1024*1024 },
>         { "", 0 }
>  };
> +
> +const struct suffix_mult cwbkMG_suffixes[] = {
> +       { "c", 1 },
> +       { "w", 2 },
> +       { "b", 512 },
> +       { "kB", 1000 },
> +       { "kD", 1000 },
> +       { "k", 1024 },
> +       { "K", 1024 },  /* compat with coreutils dd (it also accepts KB and 
> KD, TODO?) */
> +       { "MB", 1000000 },
> +       { "MD", 1000000 },
> +       { "M", 1024*1024 },
> +       { "GB", 1000000000 },
> +       { "GD", 1000000000 },
> +       { "G", 1024*1024*1024 },
> +       /* "D" suffix for decimal is not in coreutils manpage, looks like 
> it's deprecated */
> +       /* coreutils also understands TPEZY suffixes for tera- and so on, 
> with B suffix for decimal */
> +       { "", 0 }
> +};
> --

Maybe replace bkm_suffixes by cwbkMG_suffixes globally?

I would also suggest splitting this patch in two parts: one moving the
suffixes array out of dd, and the second one implementing truncate.

Best regards,
Bartosz Golaszewski
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to