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>
This commit is contained in:
Denys Vlasenko 2010-08-31 14:09:22 +02:00
parent 8d3e225a2d
commit ee06264a29
2 changed files with 76 additions and 6 deletions

View File

@ -10,9 +10,9 @@
* Bugs: the spec doesn't mention anything about "`\n`\n" prior to the * Bugs: the spec doesn't mention anything about "`\n`\n" prior to the
* "end" line * "end" line
*/ */
#include "libbb.h" #include "libbb.h"
#if ENABLE_UUDECODE
static void read_stduu(FILE *src_stream, FILE *dst_stream) static void read_stduu(FILE *src_stream, FILE *dst_stream)
{ {
char *line; char *line;
@ -73,13 +73,14 @@ static void read_stduu(FILE *src_stream, FILE *dst_stream)
} }
bb_error_msg_and_die("short file"); bb_error_msg_and_die("short file");
} }
#endif
static void read_base64(FILE *src_stream, FILE *dst_stream) static void read_base64(FILE *src_stream, FILE *dst_stream)
{ {
int term_count = 1; int term_count = 1;
while (1) { while (1) {
char translated[4]; unsigned char translated[4];
int count = 0; int count = 0;
while (count < 4) { while (count < 4) {
@ -93,6 +94,12 @@ static void read_base64(FILE *src_stream, FILE *dst_stream)
do { do {
ch = fgetc(src_stream); ch = fgetc(src_stream);
if (ch == EOF) { if (ch == EOF) {
if (ENABLE_BASE64
&& (!ENABLE_UUDECODE || applet_name[0] == 'b')
&& count == 0
) {
return;
}
bb_error_msg_and_die("short file"); bb_error_msg_and_die("short file");
} }
table_ptr = strchr(bb_uuenc_tbl_base64, ch); 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, char **argv) MAIN_EXTERNALLY_VISIBLE;
int uudecode_main(int argc UNUSED_PARAM, char **argv) 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); getopt32(argv, "o:", &outname);
argv += optind; argv += optind;
if (!*argv) if (!argv[0])
*--argv = (char*)"-"; *--argv = (char*)"-";
src_stream = xfopen_stdin(*argv); src_stream = xfopen_stdin(argv[0]);
/* Search for the start of the encoding */ /* Search for the start of the encoding */
while ((line = xmalloc_fgetline(src_stream)) != NULL) { 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"); 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. /* Test script.
Put this into an empty dir with busybox binary, an run. Put this into an empty dir with busybox binary, an run.

View File

@ -11,7 +11,7 @@
#include "libbb.h" #include "libbb.h"
enum { 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), DST_BUF_SIZE = 4 * ((SRC_BUF_SIZE + 2) / 3),
}; };
@ -33,7 +33,7 @@ int uuencode_main(int argc UNUSED_PARAM, char **argv)
} }
argv += optind; argv += optind;
if (argv[1]) { if (argv[1]) {
src_fd = xopen(*argv, O_RDONLY); src_fd = xopen(argv[0], O_RDONLY);
fstat(src_fd, &stat_buf); fstat(src_fd, &stat_buf);
mode = stat_buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); mode = stat_buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
argv++; argv++;