diff options
Diffstat (limited to 'usr.bin/uudecode')
-rw-r--r-- | usr.bin/uudecode/uudecode.c | 47 |
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); } |