|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)uudecode.c 5.3 (Berkeley) 4/10/85";
3: #endif
4:
5: /*
6: * uudecode [input]
7: *
8: * create the specified file, decoding as you go.
9: * used with uuencode.
10: */
11: #include <stdio.h>
12: #include <pwd.h>
13: #include <sys/types.h>
14: #include <sys/stat.h>
15:
16: /* single character decode */
17: #define DEC(c) (((c) - ' ') & 077)
18:
19: main(argc, argv)
20: char **argv;
21: {
22: FILE *in, *out;
23: int mode;
24: char dest[128];
25: char buf[80];
26:
27: /* optional input arg */
28: if (argc > 1) {
29: if ((in = fopen(argv[1], "r")) == NULL) {
30: perror(argv[1]);
31: exit(1);
32: }
33: argv++; argc--;
34: } else
35: in = stdin;
36:
37: if (argc != 1) {
38: printf("Usage: uudecode [infile]\n");
39: exit(2);
40: }
41:
42: /* search for header line */
43: for (;;) {
44: if (fgets(buf, sizeof buf, in) == NULL) {
45: fprintf(stderr, "No begin line\n");
46: exit(3);
47: }
48: if (strncmp(buf, "begin ", 6) == 0)
49: break;
50: }
51: sscanf(buf, "begin %o %s", &mode, dest);
52:
53: /* handle ~user/file format */
54: if (dest[0] == '~') {
55: char *sl;
56: struct passwd *getpwnam();
57: char *index();
58: struct passwd *user;
59: char dnbuf[100];
60:
61: sl = index(dest, '/');
62: if (sl == NULL) {
63: fprintf(stderr, "Illegal ~user\n");
64: exit(3);
65: }
66: *sl++ = 0;
67: user = getpwnam(dest+1);
68: if (user == NULL) {
69: fprintf(stderr, "No such user as %s\n", dest);
70: exit(4);
71: }
72: strcpy(dnbuf, user->pw_dir);
73: strcat(dnbuf, "/");
74: strcat(dnbuf, sl);
75: strcpy(dest, dnbuf);
76: }
77:
78: /* create output file */
79: out = fopen(dest, "w");
80: if (out == NULL) {
81: perror(dest);
82: exit(4);
83: }
84: chmod(dest, mode);
85:
86: decode(in, out);
87:
88: if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) {
89: fprintf(stderr, "No end line\n");
90: exit(5);
91: }
92: exit(0);
93: }
94:
95: /*
96: * copy from in to out, decoding as you go along.
97: */
98: decode(in, out)
99: FILE *in;
100: FILE *out;
101: {
102: char buf[80];
103: char *bp;
104: int n;
105:
106: for (;;) {
107: /* for each input line */
108: if (fgets(buf, sizeof buf, in) == NULL) {
109: printf("Short file\n");
110: exit(10);
111: }
112: n = DEC(buf[0]);
113: if (n <= 0)
114: break;
115:
116: bp = &buf[1];
117: while (n > 0) {
118: outdec(bp, out, n);
119: bp += 4;
120: n -= 3;
121: }
122: }
123: }
124:
125: /*
126: * output a group of 3 bytes (4 input characters).
127: * the input chars are pointed to by p, they are to
128: * be output to file f. n is used to tell us not to
129: * output all of them at the end of the file.
130: */
131: outdec(p, f, n)
132: char *p;
133: FILE *f;
134: {
135: int c1, c2, c3;
136:
137: c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
138: c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
139: c3 = DEC(p[2]) << 6 | DEC(p[3]);
140: if (n >= 1)
141: putc(c1, f);
142: if (n >= 2)
143: putc(c2, f);
144: if (n >= 3)
145: putc(c3, f);
146: }
147:
148:
149: /* fr: like read but stdio */
150: int
151: fr(fd, buf, cnt)
152: FILE *fd;
153: char *buf;
154: int cnt;
155: {
156: int c, i;
157:
158: for (i=0; i<cnt; i++) {
159: c = getc(fd);
160: if (c == EOF)
161: return(i);
162: buf[i] = c;
163: }
164: return (cnt);
165: }
166:
167: /*
168: * Return the ptr in sp at which the character c appears;
169: * NULL if not found
170: */
171:
172: #define NULL 0
173:
174: char *
175: index(sp, c)
176: register char *sp, c;
177: {
178: do {
179: if (*sp == c)
180: return(sp);
181: } while (*sp++);
182: return(NULL);
183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.