--- getmodaddr.c.orig Sun Oct 15 16:18:15 2000 +++ getmodaddr.c Sun Oct 15 18:04:32 2000 @@ -11,6 +11,12 @@ #include "macros.h" #include "nntp.h" +#define WITH_NHNS +#ifdef WITH_NHNS +#include +#include +#include +#endif STATIC char GMApathname[256]; STATIC FILE *GMAfp = NULL; @@ -82,6 +88,71 @@ return NULL; } +#ifdef WITH_NHNS +/* +** Query the DNS to find a moderator in the NHNS domain. +*/ +Query_NHNS(const char *group, char *address) +{ + int n, qdcount, ancount; + char answer[PACKETSZ]; + HEADER *hp; + char *rgroup, *oldp, *p, *cp, *end; + + p = oldp = COPY(group); + rgroup = NEW(char, strlen(group) + 1); + *rgroup = '\0'; + while (1) { + p = strrchr(group, '.'); + if (p == NULL) { + strcat(rgroup, group); + break; + } + strcat(rgroup, p + 1); + strcat(rgroup, "."); + *p = '\0'; + } + DISPOSE(oldp); + + n = res_querydomain(rgroup, "usenet.nhns.net", + C_IN, T_RP, answer, sizeof(answer)); + DISPOSE(rgroup); + if (n < 0) { + printf("res_query err (%d)\n", n); + return -1; + } + if (n > sizeof(answer)) + n = sizeof(answer); + + hp = (HEADER *)answer; + cp = answer + HFIXEDSZ; + end = answer + n; + + for (qdcount = ntohs(hp->qdcount); qdcount-- > 0; cp += n + QFIXEDSZ) + if ((n = dn_skipname(cp, end)) < 0) + return -1; + + /* this code may be broken. Only the first record found is returned. */ + for (ancount = ntohs(hp->ancount); ancount-- > 0 && cp < end; ) { + if ((n = dn_expand(answer, end, cp, address, SMBUF)) < 0) + return -1; + cp += n + RRFIXEDSZ; + if ((n = dn_expand(answer, end, cp, address, SMBUF)) < 0) + return -1; + break; + } + + for (p = address; *p != '\0'; p++) { + if (*p == '.') { + *p = '@'; + break; + } + } + + return 0; +} +#endif + /* ** Read the moderators file, looking for a moderator. */ @@ -135,6 +206,17 @@ if (wildmat(name, buff)) { for (save = p; ISWHITE(*save); save++) continue; +#ifdef WITH_NHNS + printf("buff: %s p: %s save: %s\n", buff, p, save); + if (strcmp(save, "NHNS") == 0) { + if (Query_NHNS(name, address) < 0) + { + continue; + puts("FAILED"); exit(0); + } + return address; + } +#endif for (p = name; *p; p++) if (*p == '.') *p = '-';