| 91 | #ifdef WITH_NHNS |
| 92 | /* |
| 93 | ** Query the DNS to find a moderator in the NHNS domain. |
| 94 | */ |
| 95 | Query_NHNS(const char *group, char *address) |
| 96 | { |
| 97 | int n, qdcount, ancount; |
| 98 | char answer[PACKETSZ]; |
| 99 | HEADER *hp; |
| 100 | char *rgroup, *oldp, *p, *cp, *end; |
| 101 | |
| 102 | p = oldp = COPY(group); |
| 103 | rgroup = NEW(char, strlen(group) + 1); |
| 104 | *rgroup = '\0'; |
| 105 | while (1) { |
| 106 | p = strrchr(group, '.'); |
| 107 | if (p == NULL) { |
| 108 | strcat(rgroup, group); |
| 109 | break; |
| 110 | } |
| 111 | strcat(rgroup, p + 1); |
| 112 | strcat(rgroup, "."); |
| 113 | *p = '\0'; |
| 114 | } |
| 115 | DISPOSE(oldp); |
| 116 | |
| 117 | n = res_querydomain(rgroup, "usenet.nhns.net", |
| 118 | C_IN, T_RP, answer, sizeof(answer)); |
| 119 | DISPOSE(rgroup); |
| 120 | if (n < 0) { |
| 121 | printf("res_query err (%d)\n", n); |
| 122 | return -1; |
| 123 | } |
| 124 | if (n > sizeof(answer)) |
| 125 | n = sizeof(answer); |
| 126 | |
| 127 | hp = (HEADER *)answer; |
| 128 | cp = answer + HFIXEDSZ; |
| 129 | end = answer + n; |
| 130 | |
| 131 | for (qdcount = ntohs(hp->qdcount); qdcount-- > 0; cp += n + QFIXEDSZ) |
| 132 | if ((n = dn_skipname(cp, end)) < 0) |
| 133 | return -1; |
| 134 | |
| 135 | /* this code may be broken. Only the first record found is returned. */ |
| 136 | for (ancount = ntohs(hp->ancount); ancount-- > 0 && cp < end; ) { |
| 137 | if ((n = dn_expand(answer, end, cp, address, SMBUF)) < 0) |
| 138 | return -1; |
| 139 | cp += n + RRFIXEDSZ; |
| 140 | if ((n = dn_expand(answer, end, cp, address, SMBUF)) < 0) |
| 141 | return -1; |
| 142 | break; |
| 143 | } |
| 144 | |
| 145 | for (p = address; *p != '\0'; p++) { |
| 146 | if (*p == '.') { |
| 147 | *p = '@'; |
| 148 | break; |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | return 0; |
| 153 | } |
| 154 | #endif |
| 155 | |