|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)uudecode.c 5.5 (Berkeley) 7/6/88";
20: #endif /* not lint */
21:
22: /*
23: * uudecode [input]
24: *
25: * create the specified file, decoding as you go.
26: * used with uuencode.
27: */
28: #include <stdio.h>
29: #include <pwd.h>
30: #include <sys/types.h>
31: #include <sys/stat.h>
32:
33: /* single character decode */
34: #define DEC(c) (((c) - ' ') & 077)
35:
36: main(argc, argv)
37: char **argv;
38: {
39: FILE *in, *out;
40: int mode;
41: char dest[128];
42: char buf[80];
43:
44: /* optional input arg */
45: if (argc > 1) {
46: if ((in = fopen(argv[1], "r")) == NULL) {
47: perror(argv[1]);
48: exit(1);
49: }
50: argv++; argc--;
51: } else
52: in = stdin;
53:
54: if (argc != 1) {
55: printf("Usage: uudecode [infile]\n");
56: exit(2);
57: }
58:
59: /* search for header line */
60: for (;;) {
61: if (fgets(buf, sizeof buf, in) == NULL) {
62: fprintf(stderr, "No begin line\n");
63: exit(3);
64: }
65: if (strncmp(buf, "begin ", 6) == 0)
66: break;
67: }
68: (void)sscanf(buf, "begin %o %s", &mode, dest);
69:
70: /* handle ~user/file format */
71: if (dest[0] == '~') {
72: char *sl;
73: struct passwd *getpwnam();
74: struct passwd *user;
75: char dnbuf[100], *index(), *strcat(), *strcpy();
76:
77: sl = index(dest, '/');
78: if (sl == NULL) {
79: fprintf(stderr, "Illegal ~user\n");
80: exit(3);
81: }
82: *sl++ = 0;
83: user = getpwnam(dest+1);
84: if (user == NULL) {
85: fprintf(stderr, "No such user as %s\n", dest);
86: exit(4);
87: }
88: strcpy(dnbuf, user->pw_dir);
89: strcat(dnbuf, "/");
90: strcat(dnbuf, sl);
91: strcpy(dest, dnbuf);
92: }
93:
94: /* create output file */
95: out = fopen(dest, "w");
96: if (out == NULL) {
97: perror(dest);
98: exit(4);
99: }
100: chmod(dest, mode);
101:
102: decode(in, out);
103:
104: if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) {
105: fprintf(stderr, "No end line\n");
106: exit(5);
107: }
108: exit(0);
109: }
110:
111: /*
112: * copy from in to out, decoding as you go along.
113: */
114: decode(in, out)
115: FILE *in;
116: FILE *out;
117: {
118: char buf[80];
119: char *bp;
120: int n;
121:
122: for (;;) {
123: /* for each input line */
124: if (fgets(buf, sizeof buf, in) == NULL) {
125: printf("Short file\n");
126: exit(10);
127: }
128: n = DEC(buf[0]);
129: if (n <= 0)
130: break;
131:
132: bp = &buf[1];
133: while (n > 0) {
134: outdec(bp, out, n);
135: bp += 4;
136: n -= 3;
137: }
138: }
139: }
140:
141: /*
142: * output a group of 3 bytes (4 input characters).
143: * the input chars are pointed to by p, they are to
144: * be output to file f. n is used to tell us not to
145: * output all of them at the end of the file.
146: */
147: outdec(p, f, n)
148: char *p;
149: FILE *f;
150: {
151: int c1, c2, c3;
152:
153: c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
154: c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
155: c3 = DEC(p[2]) << 6 | DEC(p[3]);
156: if (n >= 1)
157: putc(c1, f);
158: if (n >= 2)
159: putc(c2, f);
160: if (n >= 3)
161: putc(c3, f);
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.