summaryrefslogtreecommitdiffstats
path: root/usr.bin/uudecode
diff options
context:
space:
mode:
authorfanf <fanf@FreeBSD.org>2003-02-27 03:28:29 +0000
committerfanf <fanf@FreeBSD.org>2003-02-27 03:28:29 +0000
commitd90bc6c93294740f31d5ab014c3ad93bb94062c7 (patch)
tree9be3087e1e5d3f0d0fdb4ba214dd5544bcc04562 /usr.bin/uudecode
parentf7f8ecaac2995446758adef6635913f8126bdc4a (diff)
downloadFreeBSD-src-d90bc6c93294740f31d5ab014c3ad93bb94062c7.zip
FreeBSD-src-d90bc6c93294740f31d5ab014c3ad93bb94062c7.tar.gz
Add a relaxed mode for handling raw input which is missing the
initial and possibly the final framing lines. This is particularly handy for dealing with broken files or fragments of MIME messages.
Diffstat (limited to 'usr.bin/uudecode')
-rw-r--r--usr.bin/uudecode/uudecode.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/usr.bin/uudecode/uudecode.c b/usr.bin/uudecode/uudecode.c
index 7bf2fcc..b4697ee 100644
--- a/usr.bin/uudecode/uudecode.c
+++ b/usr.bin/uudecode/uudecode.c
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <libgen.h>
#include <pwd.h>
#include <resolv.h>
#include <stdio.h>
@@ -70,7 +71,7 @@ __FBSDID("$FreeBSD$");
static const char *infile, *outfile;
static FILE *infp, *outfp;
-static int cflag, iflag, oflag, pflag, sflag;
+static int base64, cflag, iflag, oflag, pflag, rflag, sflag;
static void usage(void);
static int decode(void);
@@ -83,18 +84,24 @@ main(int argc, char *argv[])
{
int rval, ch;
- while ((ch = getopt(argc, argv, "cio:ps")) != -1) {
+ if (strcmp(basename(argv[0]), "b64decode") == 0)
+ base64 = 1;
+
+ while ((ch = getopt(argc, argv, "cimo:prs")) != -1) {
switch(ch) {
case 'c':
- if (oflag)
+ if (oflag || rflag)
usage();
cflag = 1; /* multiple uudecode'd files */
break;
case 'i':
iflag = 1; /* ask before override files */
break;
+ case 'm':
+ base64 = 1;
+ break;
case 'o':
- if (cflag || pflag || sflag)
+ if (cflag || pflag || rflag || sflag)
usage();
oflag = 1; /* output to the specified file */
sflag = 1; /* do not strip pathnames for output */
@@ -105,6 +112,11 @@ main(int argc, char *argv[])
usage();
pflag = 1; /* print output to stdout */
break;
+ case 'r':
+ if (cflag || oflag)
+ usage();
+ rflag = 1; /* decode raw data */
+ break;
case 's':
if (oflag)
usage();
@@ -142,6 +154,15 @@ decode(void)
{
int r, v;
+ if (rflag) {
+ /* relaxed alternative to decode2() */
+ outfile = "/dev/stdout";
+ outfp = stdout;
+ if (base64)
+ return (base64_decode());
+ else
+ return (uu_decode());
+ }
v = decode2();
if (v == EOF) {
warnx("%s: missing or bad \"begin\" line", infile);
@@ -158,7 +179,7 @@ decode(void)
static int
decode2(void)
{
- int base64, flags, fd, mode;
+ int flags, fd, mode;
size_t n, m;
char *p, *q;
void *handle;
@@ -292,7 +313,9 @@ uu_decode(void)
/* for each input line */
for (;;) {
if (fgets(p = buf, sizeof(buf), infp) == NULL) {
- warnx("%s: short file", infile);
+ if (rflag)
+ return (0);
+ warnx("%s: %s: short file", infile, outfile);
return (1);
}
@@ -355,7 +378,7 @@ uu_decode(void)
return (1);
}
if (fclose(outfp) != 0) {
- warnx("%s: %s", infile, outfile);
+ warn("%s: %s", infile, outfile);
return (1);
}
return (0);
@@ -370,14 +393,16 @@ base64_decode(void)
for (;;) {
if (fgets(inbuf, sizeof(inbuf), infp) == NULL) {
- warnx("%s: short file", infile);
+ if (rflag)
+ return (0);
+ warnx("%s: %s: short file", infile, outfile);
return (1);
}
if (strcmp(inbuf, "====") == 0 ||
strcmp(inbuf, "====\n") == 0 ||
strcmp(inbuf, "====\r\n") == 0) {
if (fclose(outfp) != 0) {
- warnx("%s: %s", infile, outfile);
+ warn("%s: %s", infile, outfile);
return (1);
}
return (0);
@@ -398,9 +423,9 @@ static void
usage(void)
{
(void)fprintf(stderr,
-"usage: uudecode [-cips] [file ...]\n"
+"usage: uudecode [-cimprs] [file ...]\n"
" uudecode [-i] -o output_file [file]\n"
-" b64decode [-cips] [file ...]\n"
+" b64decode [-cimprs] [file ...]\n"
" b64decode [-i] -o output_file [file]\n");
exit(1);
}
OpenPOWER on IntegriCloud