diff --git a/Makefile.inc1 b/Makefile.inc1 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -2393,7 +2393,7 @@ # file2c is required for building usr.sbin/config: _basic_bootstrap_tools+=usr.bin/file2c # uuencode/uudecode required for share/tabset -_basic_bootstrap_tools+=usr.bin/uuencode usr.bin/uudecode +_basic_bootstrap_tools_multilink+=usr.bin/uuencode uuencode,uudecode # xargs is required by mkioctls _basic_bootstrap_tools+=usr.bin/xargs # cap_mkdb is required for share/termcap: diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -1088,8 +1088,6 @@ .. units .. - uudecode - .. uuencode .. unifdef diff --git a/targets/pseudo/tests/Makefile.depend b/targets/pseudo/tests/Makefile.depend --- a/targets/pseudo/tests/Makefile.depend +++ b/targets/pseudo/tests/Makefile.depend @@ -358,7 +358,6 @@ usr.bin/truncate/tests \ usr.bin/uniq/tests \ usr.bin/units/tests \ - usr.bin/uudecode/tests \ usr.bin/uuencode/tests \ usr.bin/xargs/tests \ usr.bin/xinstall/tests \ diff --git a/targets/pseudo/userland/Makefile.depend b/targets/pseudo/userland/Makefile.depend --- a/targets/pseudo/userland/Makefile.depend +++ b/targets/pseudo/userland/Makefile.depend @@ -365,7 +365,6 @@ usr.bin/usbhidaction \ usr.bin/usbhidctl \ usr.bin/users \ - usr.bin/uudecode \ usr.bin/uuencode \ usr.bin/vacation \ usr.bin/vgrind \ diff --git a/usr.bin/Makefile b/usr.bin/Makefile --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -169,7 +169,6 @@ unzip \ units \ unvis \ - uudecode \ uuencode \ vis \ vmstat \ diff --git a/usr.bin/uudecode/Makefile b/usr.bin/uudecode/Makefile deleted file mode 100644 --- a/usr.bin/uudecode/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)Makefile 8.1 (Berkeley) 6/6/93 -# $FreeBSD$ - -.include - -PROG= uudecode -LINKS= ${BINDIR}/uudecode ${BINDIR}/b64decode -MAN= - -HAS_TESTS= -SUBDIR.${MK_TESTS}+= tests - -.include diff --git a/usr.bin/uudecode/Makefile.depend b/usr.bin/uudecode/Makefile.depend deleted file mode 100644 --- a/usr.bin/uudecode/Makefile.depend +++ /dev/null @@ -1,18 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - gnu/lib/csu \ - include \ - include/arpa \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcompiler_rt \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/usr.bin/uudecode/tests/Makefile b/usr.bin/uudecode/tests/Makefile deleted file mode 100644 --- a/usr.bin/uudecode/tests/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -PACKAGE= tests - -TAP_TESTS_SH= legacy_test - -${PACKAGE}FILES+= regress.base64.in -${PACKAGE}FILES+= regress.out -${PACKAGE}FILES+= regress.sh -${PACKAGE}FILES+= regress.traditional.in -${PACKAGE}FILES+= regress.153276.in regress.153276.out - -.include diff --git a/usr.bin/uudecode/tests/Makefile.depend b/usr.bin/uudecode/tests/Makefile.depend deleted file mode 100644 --- a/usr.bin/uudecode/tests/Makefile.depend +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/usr.bin/uudecode/tests/legacy_test.sh b/usr.bin/uudecode/tests/legacy_test.sh deleted file mode 100644 --- a/usr.bin/uudecode/tests/legacy_test.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -SRCDIR="$(dirname "${0}")"; export SRCDIR - -m4 "${SRCDIR}/../regress.m4" "${SRCDIR}/regress.sh" | sh diff --git a/usr.bin/uudecode/tests/regress.sh b/usr.bin/uudecode/tests/regress.sh deleted file mode 100644 --- a/usr.bin/uudecode/tests/regress.sh +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -echo 1..3 - -REGRESSION_START($1) - -REGRESSION_TEST_ONE(`uudecode -p <${SRCDIR}/regress.traditional.in', `traditional') -REGRESSION_TEST_ONE(`uudecode -p <${SRCDIR}/regress.base64.in', `base64') - -# was uudecode: stdin: /dev/null: character out of range: [33-96] -REGRESSION_TEST(`153276', `uudecode -o /dev/null <${SRCDIR}/regress.153276.in 2>&1') - -REGRESSION_END() diff --git a/usr.bin/uuencode/Makefile b/usr.bin/uuencode/Makefile --- a/usr.bin/uuencode/Makefile +++ b/usr.bin/uuencode/Makefile @@ -3,12 +3,17 @@ .include -PROG= uuencode -MAN= uuencode.1 uuencode.format.5 -LINKS= ${BINDIR}/uuencode ${BINDIR}/b64encode -MLINKS= uuencode.1 uudecode.1 \ +PROG= bintrans +SRCS= bintrans.c uuencode.c uudecode.c +MAN= bintrans.1 uuencode.format.5 +LINKS+= ${BINDIR}/bintrans ${BINDIR}/uuencode +LINKS+= ${BINDIR}/bintrans ${BINDIR}/b64encode +LINKS+= ${BINDIR}/bintrans ${BINDIR}/uudecode +LINKS+= ${BINDIR}/bintrans ${BINDIR}/b64decode +MLINKS= bintrans.1 uudecode.1 \ + bintrans.1 uuencode.1 \ uuencode.format.5 uuencode.5 \ - uuencode.1 b64encode.1 \ + bintrans.1 b64encode.1 \ b64encode.1 b64decode.1 HAS_TESTS= diff --git a/usr.bin/uuencode/uuencode.1 b/usr.bin/uuencode/bintrans.1 rename from usr.bin/uuencode/uuencode.1 rename to usr.bin/uuencode/bintrans.1 --- a/usr.bin/uuencode/uuencode.1 +++ b/usr.bin/uuencode/bintrans.1 @@ -25,13 +25,14 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)uuencode.1 8.1 (Berkeley) 6/6/93 +.\" From: @(#)uuencode.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd January 27, 2002 -.Dt UUENCODE 1 +.Dd April 18, 2022 +.Dt BINTRANS 1 .Os .Sh NAME +.Nm bintrans , .Nm uuencode , .Nm uudecode , .Nm b64encode , @@ -39,6 +40,9 @@ .Nd encode/decode a binary file .Sh SYNOPSIS .Nm +.Op algorithm +.Op ... +.Nm uuencode .Op Fl m .Op Fl r .Op Fl o Ar output_file @@ -64,7 +68,7 @@ .Op Ar file .Sh DESCRIPTION The -.Nm +.Nm uuencode and .Nm uudecode utilities are used to transmit binary files over transmission mediums @@ -74,7 +78,7 @@ The .Nm b64encode utility is synonymous with -.Nm +.Nm uuencode with the .Fl m flag specified. @@ -87,7 +91,7 @@ flag specified. .Pp The -.Nm +.Nm uuencode utility reads .Ar file (or by default the standard input) and writes an encoded version @@ -119,11 +123,11 @@ utility ignores any leading and trailing lines. .Pp The following options are available for -.Nm : +.Nm uuencode : .Bl -tag -width ident .It Fl m Use the Base64 method of encoding, rather than the traditional -.Nm +.Nm uuencode algorithm. .It Fl r Produce raw output by excluding the initial and final framing lines. @@ -146,7 +150,7 @@ When used with the .Fl r flag, decode Base64 input instead of traditional -.Nm +.Nm uuencode input. Without .Fl r @@ -163,7 +167,7 @@ Decode raw (or broken) input, which is missing the initial and possibly the final framing lines. The input is assumed to be in the traditional -.Nm +.Nm uuencode encoding, but if the .Fl m flag is used, or if the utility is invoked as @@ -176,6 +180,10 @@ deletes any prefix ending with the last slash '/' for security reasons. .El +.Pp +.Nm +is a generic utility that can run +any of the aforementioned encoders and decoders. .Sh EXAMPLES The following example packages up a source tree, compresses it, uuencodes it and mails it to a user on another system. @@ -213,7 +221,7 @@ The .Nm uudecode and -.Nm +.Nm uuencode utilities appeared in .Bx 4.0 . .Sh BUGS diff --git a/usr.bin/uuencode/bintrans.c b/usr.bin/uuencode/bintrans.c new file mode 100644 --- /dev/null +++ b/usr.bin/uuencode/bintrans.c @@ -0,0 +1,88 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2022 The FreeBSD Foundation + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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. + */ + +#include +#include +#include +#include +#include +#include + +extern int main_decode(int, char *[]); +extern int main_encode(int, char *[]); + +static int search(const char *const); + +enum coders { + uuencode, uudecode, b64encode, b64decode +}; + +int +main(int argc, char *argv[]) +{ + const char *const progname = getprogname(); + int coder = search(progname); + + if (coder == -1 && argc > 1) { + argc--; + argv++; + coder = search(argv[0]); + } + switch (coder) { + case uuencode: + case b64encode: + main_encode(argc, argv); + break; + case uudecode: + case b64decode: + main_decode(argc, argv); + break; + default: + (void)fprintf(stderr, + "usage: %s ...\n" + " %s ...\n", + progname, progname); + exit(EX_USAGE); + } +} + +static int +search(const char *const progname) +{ +#define DESIGNATE(item) [item] = #item + const char *const known[] = { + DESIGNATE(uuencode), + DESIGNATE(uudecode), + DESIGNATE(b64encode), + DESIGNATE(b64decode) + }; + + for (size_t i = 0; i < nitems(known); i++) + if (strcmp(progname, known[i]) == 0) + return ((int)i); + return (-1); +} diff --git a/usr.bin/uuencode/tests/Makefile b/usr.bin/uuencode/tests/Makefile --- a/usr.bin/uuencode/tests/Makefile +++ b/usr.bin/uuencode/tests/Makefile @@ -4,9 +4,10 @@ TAP_TESTS_SH= legacy_test -${PACKAGE}FILES+= regress.base64.out -${PACKAGE}FILES+= regress.in +${PACKAGE}FILES+= regress.base64.in regress.base64.out +${PACKAGE}FILES+= regress.in regress.out ${PACKAGE}FILES+= regress.sh -${PACKAGE}FILES+= regress.traditional.out +${PACKAGE}FILES+= regress.traditional.in regress.traditional.out +${PACKAGE}FILES+= regress.153276.in regress.153276.out .include diff --git a/usr.bin/uudecode/tests/regress.153276.in b/usr.bin/uuencode/tests/regress.153276.in rename from usr.bin/uudecode/tests/regress.153276.in rename to usr.bin/uuencode/tests/regress.153276.in diff --git a/usr.bin/uudecode/tests/regress.153276.out b/usr.bin/uuencode/tests/regress.153276.out rename from usr.bin/uudecode/tests/regress.153276.out rename to usr.bin/uuencode/tests/regress.153276.out diff --git a/usr.bin/uudecode/tests/regress.base64.in b/usr.bin/uuencode/tests/regress.base64.in rename from usr.bin/uudecode/tests/regress.base64.in rename to usr.bin/uuencode/tests/regress.base64.in diff --git a/usr.bin/uudecode/tests/regress.out b/usr.bin/uuencode/tests/regress.out rename from usr.bin/uudecode/tests/regress.out rename to usr.bin/uuencode/tests/regress.out diff --git a/usr.bin/uuencode/tests/regress.sh b/usr.bin/uuencode/tests/regress.sh --- a/usr.bin/uuencode/tests/regress.sh +++ b/usr.bin/uuencode/tests/regress.sh @@ -1,10 +1,12 @@ # $FreeBSD$ -echo 1..2 +echo 1..5 REGRESSION_START($1) REGRESSION_TEST(`traditional', `uuencode regress.in <${SRCDIR}/regress.in') REGRESSION_TEST(`base64', `uuencode -m regress.in <${SRCDIR}/regress.in') +REGRESSION_TEST_ONE(`uudecode -p <${SRCDIR}/regress.traditional.in', `traditional') +REGRESSION_TEST_ONE(`uudecode -p <${SRCDIR}/regress.base64.in', `base64') REGRESSION_END() diff --git a/usr.bin/uudecode/tests/regress.traditional.in b/usr.bin/uuencode/tests/regress.traditional.in rename from usr.bin/uudecode/tests/regress.traditional.in rename to usr.bin/uuencode/tests/regress.traditional.in diff --git a/usr.bin/uudecode/uudecode.c b/usr.bin/uuencode/uudecode.c rename from usr.bin/uudecode/uudecode.c rename to usr.bin/uuencode/uudecode.c --- a/usr.bin/uudecode/uudecode.c +++ b/usr.bin/uuencode/uudecode.c @@ -68,6 +68,8 @@ #include #include +extern int main_decode(int, char *[]); + static const char *infile, *outfile; static FILE *infp, *outfp; static bool base64, cflag, iflag, oflag, pflag, rflag, sflag; @@ -79,7 +81,7 @@ static int base64_decode(void); int -main(int argc, char *argv[]) +main_decode(int argc, char *argv[]) { int rval, ch; diff --git a/usr.bin/uuencode/uuencode.c b/usr.bin/uuencode/uuencode.c --- a/usr.bin/uuencode/uuencode.c +++ b/usr.bin/uuencode/uuencode.c @@ -63,6 +63,8 @@ #include #include +extern int main_encode(int, char *[]); + static void encode(void); static void base64_encode(void); static void usage(void); @@ -73,7 +75,7 @@ static char **av; int -main(int argc, char *argv[]) +main_encode(int argc, char *argv[]) { struct stat sb; bool base64;