|
|
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.