|
|
BSD 4.3
/* down!honey 4/84 */
#define HISTORY "/usr/new/lib/news/history"
#define NEWSDIR "/usr/spool/news"
char *formats[] = { /* add as appropriate */
"<%s.uucp>",
"<%s>",
"<%s.arpa>",
"<%s.oz>",
0
};
#include <stdio.h>
#include <sysexits.h>
#include <ctype.h>
typedef struct {
char *dptr;
int dsize;
} datum;
long lseek();
char *index();
datum fetch(), dofetch();
main(argc, argv)
char **argv;
{
int fd;
char buf[BUFSIZ], *ptr1, *ptr2;
datum content;
long offset;
if ((fd = open(HISTORY, 0)) < 0) {
perror(HISTORY);
exit(EX_UNAVAILABLE);
}
if (dbminit(HISTORY) < 0) {
fprintf(stderr, "dbm error\n");
exit(EX_UNAVAILABLE);
}
for (--argc, argv++; argc; --argc, argv++) {
content = dofetch(*argv);
if (content.dptr == 0) {
printf("%s: No such key\n", *argv);
continue;
}
/* ensure alignment */
bcopy(content.dptr, (char *)&offset, sizeof offset);
if (lseek(fd, offset, 0) < 0)
continue;
if (read(fd, buf, sizeof buf) <= 0)
continue;
if ((ptr2 = index(buf, '\n')) == 0)
continue;
*ptr2 = '\0';
if ((ptr1 = index(buf, '\t')) == 0)
continue;
ptr1++;
if ((ptr1 = index(ptr1, '\t')) == 0)
continue;
ptr1++;
for (ptr2 = ptr1; ptr2 = index(ptr2, '.'); *ptr2 = '/')
;
if ((ptr2 = index(ptr1, ' ')) != NULL)
*ptr2 = '\0';
if (*ptr1 == '\0')
printf("expired\n");
else
printf("%s/%s\n", NEWSDIR, ptr1);
}
exit(EX_OK);
}
datum
dofetch(str)
char *str;
{
datum key, content;
char buf[BUFSIZ], **fmt;
register char *rcp;
for (fmt = formats; *fmt; fmt++) {
sprintf(buf, *fmt, str);
rcp = buf - 1;
while (*++rcp)
if (isupper(*rcp))
*rcp = tolower(*rcp);
key.dptr = buf;
key.dsize = strlen(buf) + 1;
content = fetch(key);
if (content.dptr)
break;
}
return(content);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.