* Bugs: the spec doesn't mention anything about "`\n`\n" prior to the
* "end" line
*/
+//config:config UUDECODE
+//config: bool "uudecode (5.9 kb)"
+//config: default y
+//config: help
+//config: uudecode is used to decode a uuencoded file.
+
+//applet:IF_UUDECODE(APPLET(uudecode, BB_DIR_USR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_UUDECODE) += uudecode.o
//usage:#define uudecode_trivial_usage
//usage: "[-o OUTFILE] [INFILE]"
//usage:#define uudecode_full_usage "\n\n"
//usage: "Uudecode a file\n"
-//usage: "Finds outfile name in uuencoded source unless -o is given"
+//usage: "Finds OUTFILE in uuencoded source unless -o is given"
//usage:
//usage:#define uudecode_example_usage
//usage: "$ uudecode -o busybox busybox.uu\n"
{
char *line;
- while ((line = xmalloc_fgetline(src_stream)) != NULL) {
+ for (;;) {
int encoded_len, str_len;
char *line_ptr, *dst;
+ size_t line_len;
+
+ line_len = 64 * 1024;
+ line = xmalloc_fgets_str_len(src_stream, "\n", &line_len);
+ if (!line)
+ break;
+ /* Handle both Unix and MSDOS text.
+ * Note: space should not be trimmed, some encoders use it instead of "`"
+ * for padding of last incomplete 4-char block.
+ */
+ str_len = line_len;
+ while (--str_len >= 0
+ && (line[str_len] == '\n' || line[str_len] == '\r')
+ ) {
+ line[str_len] = '\0';
+ }
if (strcmp(line, "end") == 0) {
return; /* the only non-error exit */
encoded_len = line[0] * 4 / 3;
/* Check that line is not too short. (we tolerate
- * overly _long_ line to accomodate possible extra '`').
+ * overly _long_ line to accommodate possible extra "`").
* Empty line case is also caught here. */
if (str_len <= encoded_len) {
break; /* go to bb_error_msg_and_die("short file"); */
char *outname = NULL;
char *line;
- opt_complementary = "?1"; /* 1 argument max */
- getopt32(argv, "o:", &outname);
+ getopt32(argv, "^" "o:" "\0" "?1"/* 1 arg max*/, &outname);
argv += optind;
if (!argv[0])
FILE *dst_stream;
int mode;
- if (strncmp(line, "begin-base64 ", 13) == 0) {
+ if (is_prefixed_with(line, "begin-base64 ")) {
line_ptr = line + 13;
decode_fn_ptr = read_base64;
- } else if (strncmp(line, "begin ", 6) == 0) {
+ } else if (is_prefixed_with(line, "begin ")) {
line_ptr = line + 6;
decode_fn_ptr = read_stduu;
} else {
mode = bb_strtou(line_ptr, NULL, 8);
if (outname == NULL) {
outname = strchr(line_ptr, ' ');
- if ((outname == NULL) || (*outname == '\0')) {
+ if (!outname)
break;
- }
outname++;
+ trim(outname); /* remove trailing space (and '\r' for DOS text) */
+ if (!outname[0])
+ break;
}
dst_stream = stdout;
if (NOT_LONE_DASH(outname)) {
//kbuild:lib-$(CONFIG_BASE64) += uudecode.o
//config:config BASE64
-//config: bool "base64"
+//config: bool "base64 (5 kb)"
//config: default y
//config: help
-//config: Base64 encode and decode
+//config: Base64 encode and decode
//usage:#define base64_trivial_usage
//usage: "[-d] [FILE]"
FILE *src_stream;
unsigned opts;
- opt_complementary = "?1"; /* 1 argument max */
- opts = getopt32(argv, "d");
+ opts = getopt32(argv, "^" "d" "\0" "?1"/* 1 arg max*/);
argv += optind;
if (!argv[0])