Deleted Added
full compact
uuencode.c (84715) uuencode.c (91661)
1/*-
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 28 unchanged lines hidden (view full) ---

37 The Regents of the University of California. All rights reserved.\n";
38#endif /* not lint */
39
40#ifndef lint
41#if 0
42static char sccsid[] = "@(#)uuencode.c 8.2 (Berkeley) 4/2/94";
43#endif
44static const char rcsid[] =
1/*-
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 28 unchanged lines hidden (view full) ---

37 The Regents of the University of California. All rights reserved.\n";
38#endif /* not lint */
39
40#ifndef lint
41#if 0
42static char sccsid[] = "@(#)uuencode.c 8.2 (Berkeley) 4/2/94";
43#endif
44static const char rcsid[] =
45 "$FreeBSD: head/usr.bin/uuencode/uuencode.c 84715 2001-10-09 11:05:27Z ru $";
45 "$FreeBSD: head/usr.bin/uuencode/uuencode.c 91661 2002-03-05 03:27:47Z jmallett $";
46#endif /* not lint */
47
48/*
49 * uuencode [input] output
50 *
51 * Encode a file so it can be mailed to a remote system.
52 */
46#endif /* not lint */
47
48/*
49 * uuencode [input] output
50 *
51 * Encode a file so it can be mailed to a remote system.
52 */
53#include <sys/types.h>
53#include <sys/param.h>
54#include <sys/socket.h>
54#include <sys/stat.h>
55
55#include <sys/stat.h>
56
57#include <netinet/in.h>
58
56#include <err.h>
59#include <err.h>
60#include <resolv.h>
57#include <stdio.h>
58#include <stdlib.h>
61#include <stdio.h>
62#include <stdlib.h>
63#include <string.h>
59#include <unistd.h>
60
61void encode __P((void));
64#include <unistd.h>
65
66void encode __P((void));
67void base64_encode __P((void));
62static void usage __P((void));
63
68static void usage __P((void));
69
70FILE *output = stdout;
71int mode;
72char **av;
73
64int
65main(argc, argv)
66 int argc;
67 char *argv[];
68{
69 struct stat sb;
74int
75main(argc, argv)
76 int argc;
77 char *argv[];
78{
79 struct stat sb;
70 int mode;
80 int base64;
81 char ch;
82 char *outfile;
71
83
72 while (getopt(argc, argv, "") != -1)
73 usage();
84 base64 = 0;
85 outfile = NULL;
86
87 while ((ch = getopt(argc, argv, "mo:")) != -1) {
88 switch (ch) {
89 case 'm':
90 base64 = 1;
91 break;
92 case 'o':
93 outfile = optarg;
94 break;
95 case '?':
96 default:
97 usage();
98 }
99 }
74 argv += optind;
75 argc -= optind;
76
77 switch(argc) {
78 case 2: /* optional first argument is input file */
79 if (!freopen(*argv, "r", stdin) || fstat(fileno(stdin), &sb))
80 err(1, "%s", *argv);
81#define RWX (S_IRWXU|S_IRWXG|S_IRWXO)

--- 4 unchanged lines hidden (view full) ---

86#define RW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
87 mode = RW & ~umask(RW);
88 break;
89 case 0:
90 default:
91 usage();
92 }
93
100 argv += optind;
101 argc -= optind;
102
103 switch(argc) {
104 case 2: /* optional first argument is input file */
105 if (!freopen(*argv, "r", stdin) || fstat(fileno(stdin), &sb))
106 err(1, "%s", *argv);
107#define RWX (S_IRWXU|S_IRWXG|S_IRWXO)

--- 4 unchanged lines hidden (view full) ---

112#define RW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
113 mode = RW & ~umask(RW);
114 break;
115 case 0:
116 default:
117 usage();
118 }
119
94 (void)printf("begin %o %s\n", mode, *argv);
95 encode();
96 (void)printf("end\n");
97 if (ferror(stdout))
120 av = argv;
121
122 if (outfile != NULL) {
123 output = fopen(outfile, "w+");
124 if (output == NULL)
125 err(1, "unable to open %s for output", outfile);
126 }
127 if (base64)
128 base64_encode();
129 else
130 encode();
131 if (ferror(output))
98 errx(1, "write error");
99 exit(0);
100}
101
102/* ENC is the basic 1 character encoding function to make a char printing */
103#define ENC(c) ((c) ? ((c) & 077) + ' ': '`')
104
105/*
132 errx(1, "write error");
133 exit(0);
134}
135
136/* ENC is the basic 1 character encoding function to make a char printing */
137#define ENC(c) ((c) ? ((c) & 077) + ' ': '`')
138
139/*
106 * copy from in to out, encoding as you go along.
140 * Copy from in to out, encoding in base64 as you go along.
107 */
108void
141 */
142void
143base64_encode()
144{
145#define GROUPS 8 /* Group output chunks */
146 unsigned char buf[6];
147 char buf2[16];
148 size_t n;
149 int rv, sequence;
150
151 sequence = 0;
152
153 fprintf(output, "begin-base64 %o %s\n", mode, *av);
154 while ((n = fread(buf, 1, sizeof(buf), stdin))) {
155 ++sequence;
156 rv = b64_ntop(buf, n, buf2, (sizeof(buf2) / sizeof(buf2[0])));
157 if (rv == -1)
158 errx(1, "b64_ntop: error encoding base64");
159 fprintf(output, "%s%s", buf2, (sequence % GROUPS) ? "" : "\n");
160 }
161 if (sequence % GROUPS)
162 fprintf(output, "\n");
163 fprintf(output, "====\n");
164}
165
166/*
167 * Copy from in to out, encoding as you go along.
168 */
169void
109encode()
110{
111 register int ch, n;
112 register char *p;
113 char buf[80];
114
170encode()
171{
172 register int ch, n;
173 register char *p;
174 char buf[80];
175
176 (void)fprintf(output, "begin %o %s\n", mode, *av);
115 while ((n = fread(buf, 1, 45, stdin))) {
116 ch = ENC(n);
177 while ((n = fread(buf, 1, 45, stdin))) {
178 ch = ENC(n);
117 if (putchar(ch) == EOF)
179 if (fputc(ch, output) == EOF)
118 break;
119 for (p = buf; n > 0; n -= 3, p += 3) {
120 /* Pad with nulls if not a multiple of 3. */
121 if (n < 3) {
122 p[2] = '\0';
123 if (n < 2)
124 p[1] = '\0';
125 }
126 ch = *p >> 2;
127 ch = ENC(ch);
180 break;
181 for (p = buf; n > 0; n -= 3, p += 3) {
182 /* Pad with nulls if not a multiple of 3. */
183 if (n < 3) {
184 p[2] = '\0';
185 if (n < 2)
186 p[1] = '\0';
187 }
188 ch = *p >> 2;
189 ch = ENC(ch);
128 if (putchar(ch) == EOF)
190 if (fputc(ch, output) == EOF)
129 break;
130 ch = ((*p << 4) & 060) | ((p[1] >> 4) & 017);
131 ch = ENC(ch);
191 break;
192 ch = ((*p << 4) & 060) | ((p[1] >> 4) & 017);
193 ch = ENC(ch);
132 if (putchar(ch) == EOF)
194 if (fputc(ch, output) == EOF)
133 break;
134 ch = ((p[1] << 2) & 074) | ((p[2] >> 6) & 03);
135 ch = ENC(ch);
195 break;
196 ch = ((p[1] << 2) & 074) | ((p[2] >> 6) & 03);
197 ch = ENC(ch);
136 if (putchar(ch) == EOF)
198 if (fputc(ch, output) == EOF)
137 break;
138 ch = p[2] & 077;
139 ch = ENC(ch);
199 break;
200 ch = p[2] & 077;
201 ch = ENC(ch);
140 if (putchar(ch) == EOF)
202 if (fputc(ch, output) == EOF)
141 break;
142 }
203 break;
204 }
143 if (putchar('\n') == EOF)
205 if (fputc('\n', output) == EOF)
144 break;
145 }
146 if (ferror(stdin))
147 errx(1, "read error");
206 break;
207 }
208 if (ferror(stdin))
209 errx(1, "read error");
148 ch = ENC('\0');
149 (void)putchar(ch);
150 (void)putchar('\n');
210 (void)fprintf(output, "%c\nend\n", ENC('\0'));
151}
152
153static void
154usage()
155{
211}
212
213static void
214usage()
215{
156 (void)fprintf(stderr,"usage: uuencode [infile] remotefile\n");
216 (void)fprintf(stderr,"usage: uuencode [-m] [-o outfile] [infile] remotefile\n");
157 exit(1);
158}
217 exit(1);
218}