On Thu, 2015-03-05 at 19:17 +0100, Bernhard Reutner-Fischer wrote: > On March 5, 2015 2:28:28 PM GMT+01:00, Ari Sundholm <[email protected]> wrote: > >From: Ari Sundholm <[email protected]> > > > >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?
I rechecked and got the same result. It is entirely possible that I am using bloat-o-meter wrong, so here is what I did: 1. git checkout <last commit before the truncate patch> 2. make 3. mv busybox busybox-beforetruncate 4. git checkout <commit with the truncate patch> 5. make oldconfig, say Y to truncate 6. make 7. scripts/bloat-o-meter busybox-beforetruncate busybox 8. get the results above: +69 bytes. Now that I think of it, I probably should use the unstripped executables? The results look different and seem to make more sense when I compare those. If this is indeed the case, I guess I'll roll a v5 with the correct values. > Why is that C impl better than a shell script around dd? In terms of size or in general? The applet's small in terms of code and the usage strings are compressed, but now that I think of it, 69 bytes just sounds too little. If you meant the latter, it is a matter of taste, I guess. I actually used such a dd wrapper script for quite a while until I wrote this applet. Best regards, Ari Sundholm [email protected] > 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 <[email protected]> > >--- > >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 <[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_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; > >+} > > _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
