|
|
1.1 ! root 1: /* down!honey 4/84 */ ! 2: ! 3: #define HISTORY "/usr/new/lib/news/history" ! 4: #define NEWSDIR "/usr/spool/news" ! 5: ! 6: char *formats[] = { /* add as appropriate */ ! 7: "<%s.uucp>", ! 8: "<%s>", ! 9: "<%s.arpa>", ! 10: "<%s.oz>", ! 11: 0 ! 12: }; ! 13: ! 14: #include <stdio.h> ! 15: #include <sysexits.h> ! 16: #include <ctype.h> ! 17: ! 18: typedef struct { ! 19: char *dptr; ! 20: int dsize; ! 21: } datum; ! 22: ! 23: long lseek(); ! 24: char *index(); ! 25: datum fetch(), dofetch(); ! 26: ! 27: main(argc, argv) ! 28: char **argv; ! 29: { ! 30: int fd; ! 31: char buf[BUFSIZ], *ptr1, *ptr2; ! 32: datum content; ! 33: long offset; ! 34: ! 35: if ((fd = open(HISTORY, 0)) < 0) { ! 36: perror(HISTORY); ! 37: exit(EX_UNAVAILABLE); ! 38: } ! 39: if (dbminit(HISTORY) < 0) { ! 40: fprintf(stderr, "dbm error\n"); ! 41: exit(EX_UNAVAILABLE); ! 42: } ! 43: for (--argc, argv++; argc; --argc, argv++) { ! 44: content = dofetch(*argv); ! 45: if (content.dptr == 0) { ! 46: printf("%s: No such key\n", *argv); ! 47: continue; ! 48: } ! 49: /* ensure alignment */ ! 50: bcopy(content.dptr, (char *)&offset, sizeof offset); ! 51: if (lseek(fd, offset, 0) < 0) ! 52: continue; ! 53: if (read(fd, buf, sizeof buf) <= 0) ! 54: continue; ! 55: if ((ptr2 = index(buf, '\n')) == 0) ! 56: continue; ! 57: *ptr2 = '\0'; ! 58: if ((ptr1 = index(buf, '\t')) == 0) ! 59: continue; ! 60: ptr1++; ! 61: if ((ptr1 = index(ptr1, '\t')) == 0) ! 62: continue; ! 63: ptr1++; ! 64: for (ptr2 = ptr1; ptr2 = index(ptr2, '.'); *ptr2 = '/') ! 65: ; ! 66: if ((ptr2 = index(ptr1, ' ')) != NULL) ! 67: *ptr2 = '\0'; ! 68: if (*ptr1 == '\0') ! 69: printf("expired\n"); ! 70: else ! 71: printf("%s/%s\n", NEWSDIR, ptr1); ! 72: } ! 73: exit(EX_OK); ! 74: } ! 75: ! 76: datum ! 77: dofetch(str) ! 78: char *str; ! 79: { ! 80: datum key, content; ! 81: char buf[BUFSIZ], **fmt; ! 82: register char *rcp; ! 83: ! 84: for (fmt = formats; *fmt; fmt++) { ! 85: sprintf(buf, *fmt, str); ! 86: rcp = buf - 1; ! 87: while (*++rcp) ! 88: if (isupper(*rcp)) ! 89: *rcp = tolower(*rcp); ! 90: key.dptr = buf; ! 91: key.dsize = strlen(buf) + 1; ! 92: content = fetch(key); ! 93: if (content.dptr) ! 94: break; ! 95: } ! 96: return(content); ! 97: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.