[PATCH 2/2 v7] truncate: new applet

Ari Sundholm ari at tuxera.com
Thu Mar 19 13:30:46 UTC 2015


Denys, is this patch acceptable? It has 7 iterations of review behind it
and I find it generally useful. It won't bloat busybox much and is of
course optional even if mainlined.

On Fri, 2015-03-06 at 18:43 +0200, Ari Sundholm wrote:
> From: Ari Sundholm <ari at tuxera.com>
> 
> bloat-o-meter:
> 
> function                                             old     new   delta
> truncate_main                                          -     178    +178
> .rodata                                           154411  154462     +51
> packed_usage                                       30197   30214     +17
> applet_names                                        2483    2492      +9
> applet_main                                         2888    2896      +8
> applet_nameofs                                       722     724      +2
> ------------------------------------------------------------------------------
> (add/remove: 2/0 grow/shrink: 5/0 up/down: 265/0)             Total: 265 bytes
> 
> v2: Make dd and truncate share a common suffix struct.
> v3: Split suffix struct move into separate commit, make applet NOFORK, adjust
>     error message.
> v4: Use bb_error_msg_and_die() instead of bb_error_msg() + xfunc_die().
> v5: Add correct bloat-o-meter data.
> v6: Use opt_complementary to check the presence of filenames, juggle the flags
>     to xopen() and shorten an error message.
> v7: Do not die on first file on which ftruncate() fails.
> 
> Signed-off-by: Ari Sundholm <ari at tuxera.com>
> ---
>  coreutils/truncate.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 72 insertions(+)
>  create mode 100644 coreutils/truncate.c
> 
> diff --git a/coreutils/truncate.c b/coreutils/truncate.c
> new file mode 100644
> index 0000000..d5b9b6a
> --- /dev/null
> +++ b/coreutils/truncate.c
> @@ -0,0 +1,72 @@
> +/*
> + * Mini truncate implementation for busybox
> + *
> + * Copyright (C) 2015 by Ari Sundholm <ari at tuxera.com>
> + *
> + * 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_NOFORK(truncate, truncate, BB_DIR_USR_BIN, BB_SUID_DROP, truncate))
> +
> +//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
> +
> +/* This is a NOFORK applet. Be very careful! */
> +
> +int truncate_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> +int truncate_main(int argc UNUSED_PARAM, char **argv) {
> +	unsigned opts;
> +	int flags = O_RDWR;
> +	int ret = EXIT_SUCCESS;
> +	char *size_str;
> +	off_t size;
> +
> +	enum {
> +		OPT_NOCREATE  = (1 << 0),
> +		OPT_SIZE = (1 << 1),
> +	};
> +
> +	opt_complementary = "s:-1";
> +	opts = getopt32(argv, "cs:", &size_str);
> +
> +	if (!(opts & OPT_NOCREATE))
> +		flags |= O_CREAT;
> +
> +	size = XATOU_SFX(size_str, cwbkMG_suffixes);
> +
> +	argv += optind;
> +	while (*argv) {
> +		int fd = xopen(*argv, flags);
> +		if (ftruncate(fd, size) == -1) {
> +			bb_perror_msg("%s: ftruncate", *argv);
> +			ret = EXIT_FAILURE;
> +		}
> +		xclose(fd);
> +		++argv;
> +	}
> +
> +	return ret;
> +}




More information about the busybox mailing list