X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fuuencode.c;h=e19f996764667f9bf5470e67377577bf187c4ead;hb=8d680b51148b9cbe7dd3afd37022f3390dd999ef;hp=e107a01e71214b58798d0632976c138539401112;hpb=be84cd4ef66f8956eb4c7ff0542fd1ba823a70e7;p=oweals%2Fbusybox.git diff --git a/coreutils/uuencode.c b/coreutils/uuencode.c index e107a01e7..e19f99676 100644 --- a/coreutils/uuencode.c +++ b/coreutils/uuencode.c @@ -1,245 +1,61 @@ -/* uuencode.c -- uuencode utility. - * Copyright (C) 1994, 1995 Free Software Foundation, Inc. +/* vi: set sw=4 ts=4: */ +/* + * Copyright (C) 2000 by Glenn McGrath * - * This product is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. + * based on the function base64_encode from http.c in wget v1.6 + * Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc. * - * This product is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this product; see the file COPYING. If not, write to - * the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -/* Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ -/* Reworked to GNU style by Ian Lance Taylor, ian@airs.com, August 93. */ -/* Hacked to work with BusyBox by Alfred M. Szmidt */ - -#include "internal.h" - -#include -#include -#include -#include - -#define RW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) - -static void encode __P ((void)); +#include "libbb.h" -/* Pointer to the translation table we currently use. */ -const char *trans_ptr; - -/* The two currently defined translation tables. The first is the - standard uuencoding, the second is base64 encoding. */ -const char uu_std[64] = { - '`', '!', '"', '#', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', ':', ';', '<', '=', '>', '?', - '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '[', '\\', ']', '^', '_' -}; - -const char uu_base64[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', - '4', '5', '6', '7', '8', '9', '+', '/' +enum { + SRC_BUF_SIZE = 45, /* This *MUST* be a multiple of 3 */ + DST_BUF_SIZE = 4 * ((SRC_BUF_SIZE + 2) / 3), }; -/* ENC is the basic 1 character encoding function to make a char printing. */ -#define ENC(Char) (trans_ptr[(Char) & 077]) - -/* Copy from IN to OUT, encoding as you go along. */ -static void encode() -{ - register int ch, n; - char *p = NULL; - char buf[80]; - - while (1) { - n = 0; - do { - register int m = fread (buf, 1, 45 - n, stdin); - if (m == 0) - break; - n += m; - } - while (n < 45); - - if (n == 0) - break; - - if (trans_ptr == uu_std) - if (putchar (ENC (n)) == EOF) - break; - for (p = buf; n > 2; n -= 3, p += 3) { - ch = *p >> 2; - ch = ENC (ch); - if (putchar (ch) == EOF) - break; - ch = ((*p << 4) & 060) | ((p[1] >> 4) & 017); - ch = ENC (ch); - if (putchar (ch) == EOF) - break; - ch = ((p[1] << 2) & 074) | ((p[2] >> 6) & 03); - ch = ENC (ch); - if (putchar (ch) == EOF) - break; - ch = p[2] & 077; - ch = ENC (ch); - if (putchar (ch) == EOF) - break; - } - - if (n != 0) - break; - - if (putchar ('\n') == EOF) - break; - } - - while (n != 0) { - char c1 = *p; - char c2 = n == 1 ? 0 : p[1]; - - ch = c1 >> 2; - ch = ENC (ch); - if (putchar (ch) == EOF) - break; - - ch = ((c1 << 4) & 060) | ((c2 >> 4) & 017); - ch = ENC (ch); - if (putchar (ch) == EOF) - break; - - if (n == 1) - ch = trans_ptr == uu_std ? ENC ('\0') : '='; - else { - ch = (c2 << 2) & 074; - ch = ENC (ch); - } - if (putchar (ch) == EOF) - break; - ch = trans_ptr == uu_std ? ENC ('\0') : '='; - if (putchar (ch) == EOF) - break; - putchar ('\n'); - break; - } - - if (ferror (stdin)) - errorMsg("Read error\n"); - - if (trans_ptr == uu_std) { - putchar (ENC ('\0')); - putchar ('\n'); - } -} - -static const char uuencode_usage[] = - "uuencode [OPTION] [INFILE] REMOTEFILE\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nUuencode a file.\n\n" - "Options:\n" - "\t-m\tuse base64 encoding as of RFC1521\n" -#endif -; - -int uuencode_main (int argc, - char **argv) +int uuencode_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int uuencode_main(int argc, char **argv) { - int opt; - struct stat sb; - int mode; - - trans_ptr = uu_std; /* Standard encoding is old uu format */ - - /* Parse any options */ - while ((opt = getopt (argc, argv, "m")) != EOF) { - switch (opt) { - case 'm': - trans_ptr = uu_base64; - break; - - case 0: - break; - - default: - usage(uuencode_usage); - } - } - - switch (argc - optind) { - case 2: - /* Optional first argument is input file. */ - if (!freopen (argv[optind], "r", stdin) || fstat (fileno (stdin), &sb)) { - errorMsg("%s: %s\n", argv[optind], strerror(errno)); - exit FALSE; - } - mode = sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); - optind++; - break; - - case 1: - mode = RW & ~umask (RW); - break; - - case 0: - default: - usage(uuencode_usage); - } - - printf("begin%s %o %s\n", trans_ptr == uu_std ? "" : "-base64", - mode, argv[optind]); - encode(); - printf(trans_ptr == uu_std ? "end\n" : "====\n"); - if (ferror (stdout)) { - errorMsg("Write error\n"); - exit FALSE; - } - return( TRUE); + 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); }