base64: new applet
authorDenys Vlasenko <dvlasenk@redhat.com>
Tue, 31 Aug 2010 12:09:22 +0000 (14:09 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Tue, 31 Aug 2010 12:09:22 +0000 (14:09 +0200)
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>
coreutils/uudecode.c
coreutils/uuencode.c

index 06211b8..207fb0b 100644 (file)
@@ -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.
index 490f8d1..fe9e8c6 100644 (file)
@@ -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++;