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:
parent
8d3e225a2d
commit
ee06264a29
@ -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.
|
||||||
|
@ -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++;
|
||||||
|
Loading…
Reference in New Issue
Block a user