aboutsummaryrefslogtreecommitdiff
path: root/coreutils/uuencode.c
diff options
context:
space:
mode:
Diffstat (limited to 'coreutils/uuencode.c')
-rw-r--r--coreutils/uuencode.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/coreutils/uuencode.c b/coreutils/uuencode.c
new file mode 100644
index 0000000..e19f996
--- /dev/null
+++ b/coreutils/uuencode.c
@@ -0,0 +1,61 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Copyright (C) 2000 by Glenn McGrath
+ *
+ * based on the function base64_encode from http.c in wget v1.6
+ * Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ */
+
+#include "libbb.h"
+
+enum {
+ SRC_BUF_SIZE = 45, /* This *MUST* be a multiple of 3 */
+ DST_BUF_SIZE = 4 * ((SRC_BUF_SIZE + 2) / 3),
+};
+
+int uuencode_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int uuencode_main(int argc, char **argv)
+{
+ struct stat stat_buf;
+ int src_fd = STDIN_FILENO;
+ const char *tbl;
+ mode_t mode;
+ char src_buf[SRC_BUF_SIZE];
+ char dst_buf[DST_BUF_SIZE + 1];
+
+ tbl = bb_uuenc_tbl_std;
+ mode = 0666 & ~umask(0666);
+ opt_complementary = "-1:?2"; /* must have 1 or 2 args */
+ if (getopt32(argv, "m")) {
+ tbl = bb_uuenc_tbl_base64;
+ }
+ argv += optind;
+ if (argc == optind + 2) {
+ src_fd = xopen(*argv, O_RDONLY);
+ fstat(src_fd, &stat_buf);
+ mode = stat_buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+ argv++;
+ }
+
+ printf("begin%s %o %s", tbl == bb_uuenc_tbl_std ? "" : "-base64", mode, *argv);
+ 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, tbl);
+ bb_putchar('\n');
+ if (tbl == bb_uuenc_tbl_std) {
+ bb_putchar(tbl[size]);
+ }
+ fflush(stdout);
+ xwrite(STDOUT_FILENO, dst_buf, 4 * ((size + 2) / 3));
+ }
+ printf(tbl == bb_uuenc_tbl_std ? "\n`\nend\n" : "\n====\n");
+
+ fflush_stdout_and_exit(EXIT_SUCCESS);
+}