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