[PATCH 2/2 v4] truncate: new applet

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Thu Mar 5 18:17:14 UTC 2015


On March 5, 2015 2:28:28 PM GMT+01:00, Ari Sundholm <ari at tuxera.com> wrote:
>From: Ari Sundholm <ari at tuxera.com>
>
>bloat-o-meter:
>
>function                                             old     new  
>delta
>.rodata                                           154411  154480    
>+69
>------------------------------------------------------------------------------
>(add/remove: 0/0 grow/shrink: 1/0 up/down: 69/0)               Total:
>69 bytes

Wrong baseline?

Why is that C impl better than a shell script around dd?

Thanks,
>
>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().
>
>Signed-off-by: Ari Sundholm <ari at tuxera.com>
>---
>coreutils/truncate.c | 73
>++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 73 insertions(+)
> create mode 100644 coreutils/truncate.c
>
>diff --git a/coreutils/truncate.c b/coreutils/truncate.c
>new file mode 100644
>index 0000000..5d7c4f9
>--- /dev/null
>+++ b/coreutils/truncate.c
>@@ -0,0 +1,73 @@
>+/*
>+ * 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_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_and_die("no files specified!");
>+
>+	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;
>+}




More information about the busybox mailing list