Add uuencode(1)
This commit is contained in:
parent
04a32251e4
commit
aab53ef197
1
Makefile
1
Makefile
|
@ -85,6 +85,7 @@ SRC = \
|
||||||
tr.c \
|
tr.c \
|
||||||
true.c \
|
true.c \
|
||||||
tty.c \
|
tty.c \
|
||||||
|
uuencode.c \
|
||||||
uname.c \
|
uname.c \
|
||||||
uniq.c \
|
uniq.c \
|
||||||
unlink.c \
|
unlink.c \
|
||||||
|
|
16
uuencode.1
Normal file
16
uuencode.1
Normal file
|
@ -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.
|
77
uuencode.c
Normal file
77
uuencode.c
Normal file
|
@ -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\n", argv0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
ARGBEGIN {
|
||||||
|
case 'm':
|
||||||
|
eprintf("-m not implemented\n");
|
||||||
|
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\n", 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] = '\0';
|
||||||
|
if (n < 2)
|
||||||
|
p[1] = '\0';
|
||||||
|
}
|
||||||
|
ch = ' ' + ((p[0] >> 2) & 0x3f);
|
||||||
|
fputc(ch == ' ' ? '`' : ch, stdout);
|
||||||
|
ch = ' ' + (((p[0] << 4) | ((p[1] >> 4) & 0xf)) & 0x3f);
|
||||||
|
fputc(ch == ' ' ? '`' : ch, stdout);
|
||||||
|
ch = ' ' + (((p[1] << 2) | ((p[2] >> 6) & 0x3)) & 0x3f);
|
||||||
|
fputc(ch == ' ' ? '`' : ch, stdout);
|
||||||
|
ch = ' ' + (p[2] & 0x3f);
|
||||||
|
fputc(ch == ' ' ? '`' : ch, stdout);
|
||||||
|
}
|
||||||
|
fputc('\n', stdout);
|
||||||
|
}
|
||||||
|
if (ferror(fp))
|
||||||
|
eprintf("'%s' read error:", s);
|
||||||
|
fprintf(stdout, "%c\nend\n", '`');
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user