commit aab53ef1972ca149f5e0371539d78d17ec89e3f5 Author: sin <s...@2f30.org> Date: Fri Jan 31 15:24:38 2014 +0000
Add uuencode(1) diff --git a/Makefile b/Makefile index 8a6790e..f8469df 100644 --- a/Makefile +++ b/Makefile @@ -85,6 +85,7 @@ SRC = \ tr.c \ true.c \ tty.c \ + uuencode.c \ uname.c \ uniq.c \ unlink.c \ diff --git a/uuencode.1 b/uuencode.1 new file mode 100644 index 0000000..06ced88 --- /dev/null +++ b/uuencode.1 @@ -0,0 +1,16 @@ +.TH UUENCODE 1 sbase\-VERSION +.SH NAME +uuencode \- encode a binary file +.SH SYNOPSIS +.B uuencode +.RI [file] +.RB name +.SH DESCRIPTION +.B uuencode +reads file (or by default, the standard input) and writes an encoded +version to the standard output. The encoding uses only printing ASCII +characters and includes the mode of the file and the operand name +for use by uudecode. +.SH NOTES +This version of uuencode does not currently support the base64 +encoding algorithm. diff --git a/uuencode.c b/uuencode.c new file mode 100644 index 0000000..a400180 --- /dev/null +++ b/uuencode.c @@ -0,0 +1,77 @@ +/* See LICENSE file for copyright and license details. */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include "util.h" + +static void uuencode(FILE *, const char *, const char *); + +static void +usage(void) +{ + eprintf("usage: %s [file] name ", argv0); +} + +int +main(int argc, char *argv[]) +{ + FILE *fp; + + ARGBEGIN { + case 'm': + eprintf("-m not implemented "); + default: + usage(); + } ARGEND; + + if (argc == 0 || argc > 2) + usage(); + + if (argc == 1) { + uuencode(stdin, argv[0], "<stdin>"); + } else { + if (!(fp = fopen(argv[0], "r"))) + eprintf("fopen %s:", argv[0]); + uuencode(fp, argv[1], argv[0]); + fclose(fp); + } + return EXIT_SUCCESS; +} + +static void +uuencode(FILE *fp, const char *name, const char *s) +{ + struct stat st; + unsigned char buf[80], *p; + ssize_t n; + int ch; + + if (fstat(fileno(fp), &st) < 0) + eprintf("fstat %s:", s); + fprintf(stdout, "begin %o %s ", st.st_mode & 0777, name); + while ((n = fread(buf, 1, 45, fp))) { + ch = ' ' + (n & 0x3f); + fputc(ch == ' ' ? '`' : ch, stdout); + for (p = buf; n > 0; n -= 3, p += 3) { + if (n < 3) { + p[2] = '