|
|
1.1 ! root 1: From [email protected] Sun Oct 28 16:56:42 1984 ! 2: Relay-Version: version B 2.10.2 10/19/84; site seismo.UUCP ! 3: Posting-Version: version B 2.10.2 9/5/84; site unmvax.UUCP ! 4: Path: seismo!cmcl2!lanl!unm-cvax!unmvax!lee ! 5: From: [email protected] ! 6: Newsgroups: net.sources ! 7: Subject: Program to un-shar netmaps without using a shell.. ! 8: Message-ID: <[email protected]> ! 9: Date: 28 Oct 84 21:56:42 GMT ! 10: Date-Received: 29 Oct 84 11:14:42 GMT ! 11: Distribution: net ! 12: Organization: Univ. of New Mexico, Albuquerque ! 13: Lines: 336 ! 14: ! 15: #ifndef lint ! 16: char *Rcsid = "$Header: getmaps.c,v 1.4 84/10/13 18:19:13 lee Exp $"; ! 17: #endif ! 18: ! 19: /* ! 20: * getmaps ! 21: * ! 22: * Get the net maps from USENET as published by Karen and Mark Horton, in ! 23: * "shar" format. Because of paranoia the sh is not used but instead a DFA ! 24: * recognizing the appropriate commands. ! 25: * ! 26: * lee Ward 10/13/84 ! 27: */ ! 28: ! 29: #include <stdio.h> ! 30: #include <ctype.h> ! 31: #include <sys/types.h> ! 32: #include <sys/stat.h> ! 33: #include <sys/dir.h> ! 34: ! 35: char *mapgrp = "/usr/spool/news/net/news/map"; ! 36: char *mapdir = "/usr/lee/netmap/maps"; ! 37: char *seqfil = "/usr/lee/netmap/.seq"; ! 38: char *logfil = "/usr/lee/netmap/log"; ! 39: ! 40: char *usestr = "[-l logfil] [-g group] [-s seqfile] [-a archiv-dir]"; ! 41: ! 42: FILE *logsd = NULL; ! 43: ! 44: void domaps(), myabort(), log(), mkmaps(), getwrd(), logtime(); ! 45: ! 46: main(argc, argv) ! 47: int argc; ! 48: char *argv[]; ! 49: { ! 50: int x; ! 51: FILE *seqsd; ! 52: char seqbuf[BUFSIZ]; ! 53: ! 54: for (x = 1; x < argc; x++) { ! 55: if (*argv[x]++ != '-') { ! 56: fprintf(stderr, "Bad usage\n"); ! 57: fprintf(stderr, "Usage: %s %s\n", argv[0], usestr); ! 58: exit(-1); ! 59: } ! 60: switch (*argv[x]) { ! 61: ! 62: case 'l': ! 63: logfil = argv[++x]; ! 64: break; ! 65: case 'g': ! 66: mapgrp = argv[++x]; ! 67: break; ! 68: case 's': ! 69: seqfil = argv[++x]; ! 70: break; ! 71: case 'a': ! 72: mapdir = argv[++x]; ! 73: break; ! 74: default: ! 75: fprintf(stderr, "Bad switch\n"); ! 76: fprintf(stderr, "Usage: %s %s\n", argv[0], usestr); ! 77: exit(-1); ! 78: } ! 79: } ! 80: ! 81: logsd = fopen(logfil, "a"); ! 82: ! 83: logtime("Start"); ! 84: ! 85: if (chdir(mapdir) != 0) ! 86: myabort("Could not change directory to %s", mapdir); ! 87: ! 88: seqbuf[0] = NULL; ! 89: if ((seqsd = fopen(seqfil, "r")) != NULL) { ! 90: if ((x = fread(seqbuf, sizeof(char), sizeof(seqbuf), ! 91: seqsd)) != 0) ! 92: seqbuf[x - 1] = NULL; ! 93: (void )fclose(seqsd); ! 94: } ! 95: if ((seqsd = fopen(seqfil, "a")) == NULL) ! 96: myabort("Could not open seq file for writing"); ! 97: (void )fseek(seqsd, 0L, 0); ! 98: ! 99: domaps(mapgrp, seqbuf, seqsd); ! 100: (void )fclose(seqsd); ! 101: ! 102: logtime("End"); ! 103: } ! 104: ! 105: void ! 106: domaps(grp, seqbuf, seqsd) ! 107: char *grp, *seqbuf; ! 108: FILE *seqsd; ! 109: { ! 110: char nbuf[BUFSIZ], *nptr, *tptr; ! 111: struct direct **filst; ! 112: int nfils, x; ! 113: struct stat stbuf; ! 114: extern int scandir(), alphasort(); ! 115: extern char *strcpy(), *strncat(); ! 116: ! 117: if ((nfils = scandir(grp, &filst, (int (*)())NULL, alphasort)) == -1) ! 118: myabort("scandir failed"); ! 119: ! 120: (void )strcpy(nbuf, grp); ! 121: nptr = nbuf + strlen(nbuf); ! 122: *nptr++ = '/'; ! 123: *nptr = NULL; ! 124: nbuf[BUFSIZ] = NULL; ! 125: ! 126: for (x = 0; x < nfils; x++) { ! 127: if (strcmp(".", filst[x]->d_name) == 0 || ! 128: strcmp("..", filst[x]->d_name) == 0) ! 129: continue; ! 130: tptr = filst[x]->d_name; ! 131: while(*tptr && isdigit(*tptr)) ! 132: tptr++; ! 133: if (*tptr != NULL) ! 134: continue; ! 135: *nptr = NULL; ! 136: (void )strncat(nptr, filst[x]->d_name, ! 137: BUFSIZ - (nptr - nbuf) - 1); ! 138: if (stat(nbuf, &stbuf) != 0) { ! 139: log("Could not stat %s", nbuf); ! 140: continue; ! 141: } ! 142: if ((stbuf.st_mode & S_IFMT) == S_IFDIR) ! 143: continue; ! 144: if (strcmp(seqbuf, filst[x]->d_name) >= 0) ! 145: continue; ! 146: ! 147: mkmaps(nbuf); ! 148: (void )fseek(seqsd, 0L, 0); ! 149: (void )fwrite(filst[x]->d_name, sizeof(char), ! 150: strlen(filst[x]->d_name), seqsd); ! 151: (void )fputc('\n', seqsd); ! 152: (void )fflush(seqsd); ! 153: } ! 154: } ! 155: ! 156: void ! 157: mkmaps(file) ! 158: char *file; ! 159: { ! 160: char buf[BUFSIZ], tofil[BUFSIZ], delim[BUFSIZ]; ! 161: int state, sizdel; ! 162: FILE *isd, *osd; ! 163: extern FILE *fopen(); ! 164: ! 165: #define SEARCH 1 ! 166: #define INAMAP 2 ! 167: #define SKIPPING 3 ! 168: ! 169: if ((isd = fopen(file, "r")) == NULL) { ! 170: log("Could not open %s. Skipping...", file); ! 171: return; ! 172: } ! 173: log("Unarchive %s", file); ! 174: ! 175: state = SEARCH; ! 176: while (fgets(buf, sizeof(buf) - 1, isd) != NULL) { ! 177: buf[sizeof(buf)] = NULL; ! 178: if (state == SEARCH) { ! 179: if (gotcat(buf, tofil, BUFSIZ, delim, BUFSIZ)) { ! 180: state = INAMAP; ! 181: sizdel = strlen(delim); ! 182: if ((osd = fopen(tofil, "w")) == NULL) { ! 183: log("Could not open %s", tofil); ! 184: state = SKIPPING; ! 185: } ! 186: } ! 187: continue; ! 188: } ! 189: if (strncmp(buf, delim, sizdel) == 0) { ! 190: state = SEARCH; ! 191: if (osd != NULL) ! 192: (void )fclose(osd); ! 193: continue; ! 194: } ! 195: if (state == SKIPPING) ! 196: continue; ! 197: fputs(buf, osd); ! 198: } ! 199: if (state != SEARCH) ! 200: log("Read/sync error on %s", file); ! 201: (void )fclose(isd); ! 202: ! 203: #undef SEARCH ! 204: #undef INAMAP ! 205: #undef SKIPPING ! 206: } ! 207: ! 208: /* ! 209: * gotcat ! 210: * ! 211: * Use a DFA to recognize ! 212: * cat << DELIM > OUT ! 213: * or ! 214: * cat > OUT << DELIM ! 215: * ! 216: */ ! 217: ! 218: /* Transition table for the DFA */ ! 219: int ttbl[9][4] = { ! 220: 1,-1,-1,-1, ! 221: -1,6,2,-1, ! 222: -1,-1,-1,3, ! 223: -1,4,-1,-1, ! 224: -1,-1,-1,5, ! 225: -1,-1,-1,-1, ! 226: -1,-1,-1,7, ! 227: -1,-1,8,-1, ! 228: -1,-1,-1,5, ! 229: }; ! 230: ! 231: gotcat(buf, tofil, tofilln, delim, delimln) ! 232: char *buf, ! 233: *tofil, ! 234: *delim; ! 235: int tofilln, ! 236: delimln; ! 237: { ! 238: int state; ! 239: char *ptr; ! 240: ! 241: state = 0; /* Start state */ ! 242: while (state != -1 && state != 5) { ! 243: /* Eat up white */ ! 244: while (*buf != '\n' && (*buf == ' ' || *buf == '\t')) ! 245: buf++; ! 246: if (*buf == '>') { ! 247: buf++; ! 248: state = ttbl[state][1]; ! 249: continue; ! 250: } ! 251: if (*buf == '<' && *(buf + 1) == '<') { ! 252: buf += 2; ! 253: state = ttbl[state][2]; ! 254: continue; ! 255: } ! 256: if (*buf == 'c' && *(buf + 1) == 'a' && *(buf + 2) == 't') { ! 257: buf += 3; ! 258: state = ttbl[state][0]; ! 259: continue; ! 260: } ! 261: ptr = buf; ! 262: while (*buf != '\n' && *buf != ' ' && *buf != '\t') ! 263: buf++; ! 264: if (state == 2 || state == 8) ! 265: getwrd(ptr, buf, delim, delimln); ! 266: else if (state == 6 || state == 4) ! 267: getwrd(ptr, buf, tofil, tofilln); ! 268: state = ttbl[state][3]; ! 269: } ! 270: ! 271: if (state == 5) ! 272: return(1); ! 273: return(0); ! 274: } ! 275: ! 276: void ! 277: getwrd(fc, lc, buf, maxlen) ! 278: char *fc, ! 279: *lc, ! 280: *buf; ! 281: int maxlen; ! 282: { ! 283: char *ptr, *t1ptr, *t2ptr; ! 284: ! 285: maxlen--; ! 286: maxlen = lc - fc > maxlen ? maxlen : lc - fc; ! 287: ptr = buf; ! 288: t1ptr = fc; ! 289: while (maxlen-- != 0) ! 290: *ptr++ = *t1ptr++; ! 291: *ptr = NULL; ! 292: ! 293: /* Strip quotes */ ! 294: ptr = buf; ! 295: while (*ptr != NULL) { ! 296: if (*ptr == '\\' && (*(ptr + 1) == '\'' || *(ptr + 1) == '"')) ! 297: ptr += 2; ! 298: else if (*ptr == '\'' || *ptr == '"') { ! 299: t1ptr = ptr; ! 300: t2ptr = ptr + 1; ! 301: while ((*t1ptr++ = *t2ptr++) != NULL) ! 302: ; ! 303: } else ! 304: ptr++; ! 305: } ! 306: } ! 307: /*VARARGS1*/ ! 308: void ! 309: myabort(s, a, b, c, d, e, f, g, h, i, j, k, l) ! 310: char *s; ! 311: { ! 312: ! 313: if (logsd != NULL) { ! 314: fputs("ABORT - ", logsd); ! 315: fprintf(logsd, s, a, b, c, d, e, f, g, h, i, j, k, l); ! 316: (void )fputc('\n', logsd); ! 317: logtime("End"); ! 318: } ! 319: exit(-1); ! 320: } ! 321: ! 322: /*VARARGS1*/ ! 323: void ! 324: log(s, a, b, c, d, e, f, g, h, i, j, k, l) ! 325: char *s; ! 326: { ! 327: ! 328: if (logsd == NULL) ! 329: return; ! 330: fprintf(logsd, s, a, b, c, d, e, f, g, h, i, j, k, l); ! 331: (void )fputc('\n', logsd); ! 332: (void )fflush(logsd); ! 333: } ! 334: ! 335: void ! 336: logtime(s) ! 337: char *s; ! 338: { ! 339: time_t clock; ! 340: extern char *ctime(); ! 341: ! 342: if (logsd == NULL) ! 343: return; ! 344: (void )time(&clock); ! 345: fprintf(logsd, "%s %s", s, ctime(&clock)); ! 346: (void )fflush(logsd); ! 347: } ! 348: -- ! 349: --Lee (Ward) ! 350: {ucbvax,convex,gatech,pur-ee}!unmvax!lee ! 351: ! 352:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.