diff --git a/coreutils/uudecode.c b/coreutils/uudecode.c index 06211b8ef..207fb0b8d 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. diff --git a/coreutils/uuencode.c b/coreutils/uuencode.c index 490f8d1bd..fe9e8c664 100644 --- a/coreutils/uuencode.c +++ b/coreutils/uuencode.c @@ -11,7 +11,7 @@ #include "libbb.h" enum { - SRC_BUF_SIZE = 45, /* This *MUST* be a multiple of 3 */ + SRC_BUF_SIZE = 15*3, /* This *MUST* be a multiple of 3 */ DST_BUF_SIZE = 4 * ((SRC_BUF_SIZE + 2) / 3), }; @@ -33,7 +33,7 @@ int uuencode_main(int argc UNUSED_PARAM, char **argv) } argv += optind; if (argv[1]) { - src_fd = xopen(*argv, O_RDONLY); + src_fd = xopen(argv[0], O_RDONLY); fstat(src_fd, &stat_buf); mode = stat_buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); argv++;