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