diff options
author | Denys Vlasenko | 2010-08-31 14:09:22 +0200 |
---|---|---|
committer | Denys Vlasenko | 2010-08-31 14:09:22 +0200 |
commit | ee06264a29c81a2d309c9919222d61ff92aa7b7c (patch) | |
tree | e758f420e9547748aca986356ec0c6d6d7f889d9 /coreutils/uudecode.c | |
parent | 8d3e225a2d1d980bcedb825f294b6a8041fe3f1b (diff) | |
download | busybox-ee06264a29c81a2d309c9919222d61ff92aa7b7c.zip busybox-ee06264a29c81a2d309c9919222d61ff92aa7b7c.tar.gz |
base64: new applet
function old new delta
base64_main - 217 +217
packed_usage 27181 27229 +48
read_base64 348 373 +25
applet_names 2299 2306 +7
bbconfig_config_bz2 4942 4948 +6
applet_main 1352 1356 +4
applet_nameofs 676 678 +2
applet_install_loc 169 170 +1
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 7/0 up/down: 310/0) Total: 310 bytes
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'coreutils/uudecode.c')
-rw-r--r-- | coreutils/uudecode.c | 78 |
1 files changed, 74 insertions, 4 deletions
diff --git a/coreutils/uudecode.c b/coreutils/uudecode.c index 06211b8..207fb0b 100644 --- a/coreutils/uudecode.c +++ b/coreutils/uudecode.c @@ -10,9 +10,9 @@ * Bugs: the spec doesn't mention anything about "`\n`\n" prior to the * "end" line */ - #include "libbb.h" +#if ENABLE_UUDECODE static void read_stduu(FILE *src_stream, FILE *dst_stream) { char *line; @@ -73,13 +73,14 @@ static void read_stduu(FILE *src_stream, FILE *dst_stream) } bb_error_msg_and_die("short file"); } +#endif static void read_base64(FILE *src_stream, FILE *dst_stream) { int term_count = 1; while (1) { - char translated[4]; + unsigned char translated[4]; int count = 0; while (count < 4) { @@ -93,6 +94,12 @@ static void read_base64(FILE *src_stream, FILE *dst_stream) do { ch = fgetc(src_stream); if (ch == EOF) { + if (ENABLE_BASE64 + && (!ENABLE_UUDECODE || applet_name[0] == 'b') + && count == 0 + ) { + return; + } bb_error_msg_and_die("short file"); } table_ptr = strchr(bb_uuenc_tbl_base64, ch); @@ -134,6 +141,7 @@ static void read_base64(FILE *src_stream, FILE *dst_stream) } } +#if ENABLE_UUDECODE int uudecode_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int uudecode_main(int argc UNUSED_PARAM, char **argv) { @@ -145,9 +153,9 @@ int uudecode_main(int argc UNUSED_PARAM, char **argv) getopt32(argv, "o:", &outname); argv += optind; - if (!*argv) + if (!argv[0]) *--argv = (char*)"-"; - src_stream = xfopen_stdin(*argv); + src_stream = xfopen_stdin(argv[0]); /* Search for the start of the encoding */ while ((line = xmalloc_fgetline(src_stream)) != NULL) { @@ -188,6 +196,68 @@ int uudecode_main(int argc UNUSED_PARAM, char **argv) } bb_error_msg_and_die("no 'begin' line"); } +#endif + +//applet:IF_BASE64(APPLET(base64, _BB_DIR_BIN, _BB_SUID_DROP)) + +//kbuild:lib-$(CONFIG_BASE64) += uudecode.o + +//config:config BASE64 +//config: bool "base64" +//config: default y +//config: help +//config: Base64 encode and decode + +//usage:#define base64_trivial_usage +//usage: "[-d] [FILE]" +//usage:#define base64_full_usage "\n\n" +//usage: "Base64 encode or decode FILE to standard output" +//usage: "\nOptions:" +//usage: "\n -d Decode data" +////usage: "\n -w COL Wrap lines at COL (default 76, 0 disables)" +////usage: "\n -i When decoding, ignore non-alphabet characters" + +#if ENABLE_BASE64 +int base64_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int base64_main(int argc UNUSED_PARAM, char **argv) +{ + FILE *src_stream; + unsigned opts; + + opt_complementary = "?1"; /* 1 argument max */ + opts = getopt32(argv, "d"); + argv += optind; + + if (!argv[0]) + *--argv = (char*)"-"; + src_stream = xfopen_stdin(argv[0]); + if (opts) { + read_base64(src_stream, stdout); + } else { + enum { + SRC_BUF_SIZE = 76/4*3, /* This *MUST* be a multiple of 3 */ + DST_BUF_SIZE = 4 * ((SRC_BUF_SIZE + 2) / 3), + }; + char src_buf[SRC_BUF_SIZE]; + char dst_buf[DST_BUF_SIZE + 1]; + int src_fd = fileno(src_stream); + while (1) { + size_t size = full_read(src_fd, src_buf, SRC_BUF_SIZE); + if (!size) + break; + if ((ssize_t)size < 0) + bb_perror_msg_and_die(bb_msg_read_error); + /* Encode the buffer we just read in */ + bb_uuencode(dst_buf, src_buf, size, bb_uuenc_tbl_base64); + xwrite(STDOUT_FILENO, dst_buf, 4 * ((size + 2) / 3)); + bb_putchar('\n'); + fflush(stdout); + } + } + + fflush_stdout_and_exit(EXIT_SUCCESS); +} +#endif /* Test script. Put this into an empty dir with busybox binary, an run. |