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: }

Defined functions

dofetch defined in line 76; used 2 times
main defined in line 27; never used

Defined variables

formats defined in line 6; used 1 times
  • in line 84

Defined macros

HISTORY defined in line 3; used 3 times
NEWSDIR defined in line 4; used 1 times
  • in line 71
Last modified: 1986-05-20
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1055
Valid CSS Valid XHTML 1.0 Strict