📄 info_hes.c
字号:
hs_readresp(s, answer, anslen)int s;char *answer;int anslen;{ register int len, n; char *cp; cp = answer; len = sizeof(short); while (len != 0 && (n = hs_res_vcread(s, (char *)cp, (int)len, &hs_timeout)) > 0) { cp += n; len -= n; } if (n <= 0) return(-1); cp = answer; if ((len = _getshort(cp)) > anslen) {#ifdef DEBUG dlog("hs_readresp: response too long: %d", len);#endif return(-1); } while (len != 0 && (n = hs_res_vcread(s, (char *)cp, (int)len, &hs_timeout)) > 0) { cp += n; len -= n; } if (n <= 0) return(-1); return(hs_parse(answer, answer+PACKETSZ));}hs_res_vcread(sock, buf, buflen, timeout)int sock, buflen;char *buf;struct timeval *timeout;{ register int n; if ((n = hs_res_selwait(sock, timeout)) > 0) return(read(sock, buf, buflen)); else return(n);}hs_res_selwait(sock, timeout)int sock;struct timeval *timeout;{ fd_set dsmask; register int n; /* * Wait for reply */ FD_ZERO(&dsmask); FD_SET(sock, &dsmask); n = select(sock+1, &dsmask, (fd_set *)NULL, (fd_set *)NULL, timeout); return(n);}/* Returns: 0: Success -1: Error -2: Permanent failure*/hs_parse(msg, eom)char *msg, *eom;{ register char *cp; register HEADER *hp; register int n, len; int qdcount, ancount; char key[PACKETSZ]; char *key_cpy, *value, *hs_make_value(); short type; hp = (HEADER *)msg; if (hp->rcode != NOERROR || hp->opcode != QUERY) { char dq[20];#ifdef DEBUG dlog("Bad response (%d) from nameserver %s", hp->rcode, inet_dquad(dq, hs_server_addr(servernum)->s_addr));#endif DEBUG return(-1); } cp = msg + sizeof(HEADER); ancount = ntohs(hp->ancount); qdcount = ntohs(hp->qdcount); while (qdcount-- > 0) cp += dn_skipname(cp, eom) + QFIXEDSZ; if (soacnt == 0 && ancount == 0) { /* XXX We should look for NS records to find SOA */#ifdef DEBUG dlog("No SOA found");#endif return(-2); } while (ancount-- > 0 && cp < eom) { if ((n = dn_expand(msg, eom, cp, key, PACKETSZ)) < 0) break; cp += n; if ((type = _getshort(cp)) == T_SOA) { soacnt++; } cp += 2*sizeof(u_short) + sizeof(u_long); len = _getshort(cp); cp += sizeof(u_short); /* Check to see if key is in our domain */ if (type == T_TXT && hs_strip_our_domain(key)) { value = hs_make_value(cp, len); if (value == NULL) return(-1); key_cpy = strdup(key);#ifdef DEBUG dlog("hs_parse: Parsed key: %s, value: %s", key, value);#endif mapc_add_kv(hs_map, key_cpy, value); } cp += len; errno = 0; } return(0);}/* Check to see if the domain name in the supplied argument matches hs_domain. Strip hs_domain from supplied argument if so. */hs_strip_our_domain(name)char *name;{ char *end_pos; short targ_len, cur_len; targ_len = strlen(hs_domain); cur_len = strlen(name); if (cur_len <= targ_len) return(0); end_pos = &name[cur_len - targ_len]; if (strcmp(end_pos, hs_domain) != 0) return(0); if (*--end_pos != '.') return(0); *end_pos = '\0'; return(1);}#define MAXDATA 8*1024char *hs_make_value(cp, len)char *cp;int len;{ char *value, *cpcpy, *valuep; int cnt, nextcnt, totalcnt, lencpy;#ifdef DEBUG char *dbgname; dbgname = &cp[1];#endif DEBUG lencpy = len; cpcpy = cp; totalcnt = 0; cnt = *cpcpy++; while (cnt) { totalcnt += cnt; lencpy -= cnt+1; if (lencpy == 0) break; nextcnt = cpcpy[cnt]; cpcpy = &cpcpy[cnt+1]; cnt = nextcnt; } if (totalcnt < 1 || totalcnt > MAXDATA || totalcnt > len) {#ifdef DEBUG dlog("TXT RR not of expected length (%d %d): %s", totalcnt, len, dbgname);#endif DEBUG return(NULL); } /* Allocate null terminated string */ value = (char *) xmalloc(totalcnt+1); value[totalcnt] = '\0'; cnt = *cp++; valuep = value; while (cnt) { bcopy(cp, valuep, cnt); len -= cnt+1; if (len == 0) break; valuep = &valuep[cnt]; nextcnt = cp[cnt]; cp = &cp[cnt+1]; cnt = nextcnt; } return(value);}hs_make_ns_query(domain, ansbuf)char *domain;char *ansbuf;{ int status, len; char buf[PACKETSZ]; if ((len = res_mkquery(QUERY, domain, C_HS, T_NS, (char *)NULL, 0, NULL, buf, PACKETSZ)) == -1) {#ifdef DEBUG dlog("hs_get_ns_list: res_mkquery failed");#endif errno = 0; return(-1); } if ((status = res_send(buf, len, (char *)ansbuf, PACKETSZ)) == -1) {#ifdef DEBUG dlog("hs_get_ns_list: res_send failed. status %d errno %d", status, errno);#endif errno = 0; return(-1); } return(0);}static voidadd_address(addr)struct in_addr *addr;{ char dq[20]; bcopy((char *)addr, nsaddr_list[hs_nscount++], sizeof(struct in_addr));#ifdef DEBUG dlog("Adding NS address %s", inet_dquad(dq, addr->s_addr));#endif DEBUG}hs_get_ns_list(domain)char *domain;{ register HEADER *hp; int qdcount, nscount; register char *cp; register int n, len; char key[PACKETSZ], name[PACKETSZ], msg[PACKETSZ], *eom; register long **hptr; struct hostent *ghp; int numns; char nsname[MAXHSNS][MAXDATA]; int nshaveaddr[MAXHSNS], i; short type; if (hs_make_ns_query(domain, msg) == -1) return(-1); numns = hs_nscount = 0; eom = &msg[PACKETSZ]; bzero(nsname, sizeof(nsname)); hp = (HEADER *)msg; if (hp->rcode != NOERROR || hp->opcode != QUERY) {#ifdef DEBUG dlog("Bad response (%d) from nameserver %#x", hp->rcode, hs_server_addr(servernum)->s_addr);#endif DEBUG return(-1); } cp = msg + sizeof(HEADER); qdcount = ntohs(hp->qdcount); while (qdcount-- > 0) cp += dn_skipname(cp, eom) + QFIXEDSZ; nscount = ntohs(hp->ancount) + ntohs(hp->nscount) + ntohs(hp->arcount);#ifdef DEBUG dlog("hs_get_ns_list: Processing %d response records", nscount);#endif for (;nscount; nscount--) { if ((n = dn_expand(msg, eom, cp, key, PACKETSZ)) < 0) break; cp += n; type = _getshort(cp); cp += 2*sizeof(u_short) + sizeof(u_long); len = _getshort(cp); cp += sizeof(u_short);#ifdef DEBUG dlog("hs_get_ns_list: Record type: %d", type);#endif switch (type) { case T_NS: if (numns >= MAXHSNS || strcasecmp(domain, key) != 0) break; if ((n = dn_expand(msg, eom, cp, name, PACKETSZ)) < 0) break;#ifdef DEBUG dlog("hs_get_ns_list: NS name: %s", name);#endif for (i = 0; i < numns; i++) if (strcasecmp(nsname[i], name) == 0) break; if (i == numns) {#ifdef DEBUG dlog("hs_get_ns_list: Saving name %s", name);#endif strncpy(nsname[numns], name, MAXDATA); nshaveaddr[numns] = 0; numns++; } break; case T_A: if (hs_nscount == MAX_NSADDR) break; for (i = 0; i < numns; i++) { if (strcasecmp(nsname[i], domain) == 0) { nshaveaddr[i]++; add_address((struct in_addr *) cp); break; } } break; default: break; } if (hs_nscount == MAX_NSADDR) break; cp += len; errno = 0; }#ifdef DEBUG dlog("hs_get_ns_list: Found %d NS records", numns);#endif for (i = 0; i < numns; i++) { if (nshaveaddr[i]) continue; if ((ghp = gethostbyname(nsname[i])) == 0) continue; for (hptr = (long **)ghp->h_addr_list; *hptr && hs_nscount < MAX_NSADDR; hptr++) { add_address((struct in_addr *) *hptr); } } if (hs_nscount) return(0);#ifdef DEBUG dlog("No NS records found for %s", domain); return(-1);#endif DEBUG}#endif /* HAS_HESIOD_RELOAD */#endif /* HAS_HESIOD_MAPS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -