📄 host.c
字号:
printf("Aliased to \"%s\"\n", cp); _res.options |= RES_DEFNAMES; return (getdomaininfo(cp, (char *)NULL)); }#ifdef MAXDS for (nDomain = 0; _res.defdname_list[nDomain][0] != 0; nDomain++) { for (domain = _res.dnsrch_list[nDomain]; *domain; domain++) { if (verbose) printf("Trying domain \"%s\"\n", *domain); hp = getdomaininfo(name, *domain); if (hp) return (hp); } }#else for (domain = _res.dnsrch; *domain; domain++) { if (verbose) printf("Trying domain \"%s\"\n", *domain); hp = getdomaininfo(name, *domain); if (hp) return (hp); }#endif if (h_errno != HOST_NOT_FOUND || (_res.options & RES_DNSRCH) == 0) return (0); if (verbose) printf("Trying null domain\n"); return (getdomaininfo(name, (char *)NULL));}getdomaininfo(name, domain) char *name, *domain;{ int val1, val2; if (gettype) return getinfo(name, domain, gettype); else { val1 = getinfo(name, domain, T_A); if (cname || verbose) return val1; val2 = getinfo(name, domain, T_MX); return val1 || val2; }}getinfo(name, domain, type) char *name, *domain;{ HEADER *hp; char *eom, *bp, *cp; querybuf buf, answer; int n, n1, i, j, nmx, ancount, nscount, arcount, qdcount, buflen; u_short pref, class; char host[2*MAXDNAME+2]; if (domain == NULL) (void)sprintf(host, "%.*s", MAXDNAME, name); else (void)sprintf(host, "%.*s.%.*s", MAXDNAME, name, MAXDNAME, domain); n = res_mkquery(QUERY, host, getclass, type, (char *)NULL, 0, NULL, (char *)&buf, sizeof(buf)); if (n < 0) { if (_res.options & RES_DEBUG) printf("res_mkquery failed\n"); h_errno = NO_RECOVERY; return(0); } n = res_send((char *)&buf, n, (char *)&answer, sizeof(answer)); if (n < 0) { if (_res.options & RES_DEBUG) printf("res_send failed\n"); h_errno = TRY_AGAIN; return (0); } eom = (char *)&answer + n; return(printinfo(&answer, eom, T_ANY, 0)); }printinfo(answer, eom, filter, isls) querybuf *answer; u_char *eom; int filter; int isls;{ HEADER *hp; u_char *bp, *cp; int n, n1, i, j, nmx, ancount, nscount, arcount, qdcount, buflen; u_short pref, class; /* * find first satisfactory answer */ hp = (HEADER *) answer; ancount = ntohs(hp->ancount); qdcount = ntohs(hp->qdcount); nscount = ntohs(hp->nscount); arcount = ntohs(hp->arcount); if (_res.options & RES_DEBUG || (verbose && isls == 0)) printf("rcode = %d (%s), ancount=%d\n", hp->rcode, DecodeError(hp->rcode), ancount); if (hp->rcode != NOERROR || (ancount+nscount+arcount) == 0) { switch (hp->rcode) { case NXDOMAIN: h_errno = HOST_NOT_FOUND; return(0); case SERVFAIL: h_errno = TRY_AGAIN; return(0);#ifdef OLDJEEVES /* * Jeeves (TOPS-20 server) still does not * support MX records. For the time being, * we must accept FORMERRs as the same as * NOERROR. */ case FORMERR:#endif /*OLDJEEVES*/ case NOERROR:/* TpB - set a return error for this case. NO_DATA */ h_errno = NO_DATA; return(0); /* was 1,but now indicates exception */#ifndef OLDJEEVES case FORMERR:#endif /*OLDJEEVES*/ case NOTIMP: case REFUSED: h_errno = NO_RECOVERY; return(0); } return (0); } bp = hostbuf; nmx = 0; buflen = sizeof(hostbuf); cp = (u_char *)answer + sizeof(HEADER); if (qdcount) { cp += dn_skipname(cp, eom) + QFIXEDSZ; while (--qdcount > 0) cp += dn_skipname(cp, eom) + QFIXEDSZ; } if (ancount) { if (!hp->aa) if (verbose && isls == 0) printf("The following answer is not authoritative:\n"); while (--ancount >= 0 && cp && cp < eom) { cp = (u_char *)pr_rr(cp, answer, stdout, filter);/* * When we ask for address and there is a CNAME, it seems to return * both the CNAME and the address. Since we trace down the CNAME * chain ourselves, we don't really want to print the address at * this point. */ if (cname && ! verbose) return (1); } } if (! verbose) return (1); if (nscount) { printf("For authoritative answers, see:\n"); while (--nscount >= 0 && cp && cp < eom) { cp = (u_char *)pr_rr(cp, answer, stdout, filter); } } if (arcount) { printf("Additional information:\n"); while (--arcount >= 0 && cp && cp < eom) { cp = (u_char *)pr_rr(cp, answer, stdout, filter); } } return(1); }static u_char cnamebuf[MAXDNAME];/* * Print resource record fields in human readable form. */char *pr_rr(cp, msg, file, filter) u_char *cp, *msg; FILE *file; int filter;{ int type, class, dlen, n, c, proto, ttl; struct in_addr inaddr; u_char *cp1; struct protoent *protop; struct servent *servp; char punc; int doprint; char name[MAXDNAME]; if ((cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name))) == NULL) return (NULL); /* compression error */ type = _getshort(cp); cp += sizeof(u_short); class = _getshort(cp); cp += sizeof(u_short); ttl = _getlong(cp); cp += sizeof(u_int32_t); if (filter == type || filter == T_ANY || (filter == T_A && (type == T_PTR || type == T_NS))) doprint = 1; else doprint = 0; if (doprint) if (verbose) fprintf(file,"%s\t%d%s\t%s", name, ttl, pr_class(class), pr_type(type)); else fprintf(file,"%s%s %s",name, pr_class(class), pr_type(type)); if (verbose) punc = '\t'; else punc = ' '; dlen = _getshort(cp); cp += sizeof(u_short); cp1 = cp; /* * Print type specific data, if appropriate */ switch (type) { case T_A: switch (class) { case C_IN: bcopy(cp, (char *)&inaddr, sizeof(inaddr)); if (dlen == 4) { if (doprint) fprintf(file,"%c%s", punc, inet_ntoa(inaddr)); cp += dlen; } else if (dlen == 7) { if (doprint) { fprintf(file,"%c%s", punc, inet_ntoa(inaddr)); fprintf(file,", protocol = %d", cp[4]); fprintf(file,", port = %d", (cp[5] << 8) + cp[6]); } cp += dlen; } break; } break; case T_CNAME: if (dn_expand(msg, msg + 512, cp, cnamebuf, sizeof(cnamebuf)) >= 0) cname = cnamebuf; case T_MB:#ifdef OLDRR case T_MD: case T_MF:#endif /* OLDRR */ case T_MG: case T_MR: case T_NS: case T_PTR: cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file,"%c%s",punc, name); break; case T_HINFO: if (n = *cp++) { if (doprint) fprintf(file,"%c%.*s", punc, n, cp); cp += n; } if (n = *cp++) { if (doprint) fprintf(file,"%c%.*s", punc, n, cp); cp += n; } break; case T_SOA: cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file,"\t%s", name); cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file," %s", name); if (doprint) fprintf(file,"(\n\t\t\t%ld\t;serial (version)", _getlong(cp)); cp += sizeof(u_int32_t); if (doprint) fprintf(file,"\n\t\t\t%ld\t;refresh period", _getlong(cp)); cp += sizeof(u_int32_t); if (doprint) fprintf(file,"\n\t\t\t%ld\t;retry refresh this often", _getlong(cp)); cp += sizeof(u_int32_t); if (doprint) fprintf(file,"\n\t\t\t%ld\t;expiration period", _getlong(cp)); cp += sizeof(u_int32_t); if (doprint) fprintf(file,"\n\t\t\t%ld\t;minimum TTL\n\t\t\t)", _getlong(cp)); cp += sizeof(u_int32_t); break; case T_MX: case T_AFSDB: if (doprint) if (verbose) fprintf(file,"\t%ld ",_getshort(cp)); else fprintf(file," "); cp += sizeof(u_short); cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file, "%s", name); break; case T_MINFO: case T_RP: cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file, "%c%s", punc, name); cp = (u_char *)pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file, " %s", name); break; case T_TXT: if (doprint) fprintf(file,"%c%.*s", punc, dlen, cp); cp += dlen; break; case T_UINFO: if (doprint) fprintf(file,"%c%s", punc, cp); cp += dlen; break; case T_UID: case T_GID: if (dlen == 4) { if (doprint) fprintf(file,"%c%ld", punc, _getlong(cp)); cp += sizeof(int); } break; case T_WKS: if (dlen < sizeof(u_int32_t) + 1) break; bcopy(cp, (char *)&inaddr, sizeof(inaddr)); cp += sizeof(u_int32_t); proto = *cp++; protop = getprotobynumber(proto); if (doprint) if (protop) fprintf(file,"%c%s %s", punc, inet_ntoa(inaddr), protop->p_name); else fprintf(file,"%c%s %d", punc, inet_ntoa(inaddr), proto); n = 0; while (cp < cp1 + dlen) { c = *cp++; do { if (c & 0200) { servp = NULL; if (protop) servp = getservbyport (htons(n), protop->p_name); if (doprint) if (servp) fprintf(file, " %s", servp->s_name); else fprintf(file, " %d", n); } c <<= 1; } while (++n & 07); } break; default: if (doprint) fprintf(file,"%c???", punc); cp += dlen; } if (cp != cp1 + dlen) fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen); if (doprint) fprintf(file,"\n"); return (char *)cp;}static char nbuf[20];/* * Return a string for the type */char *pr_type(type) int type;{ switch (type) { case T_A: return(verbose? "A" : "has address"); case T_NS: /* authoritative server */ return("NS");#ifdef OLDRR case T_MD: /* mail destination */ return("MD"); case T_MF: /* mail forwarder */ return("MF");#endif /* OLDRR */ case T_CNAME: /* connonical name */ return(verbose? "CNAME" : "is a nickname for"); case T_SOA: /* start of authority zone */ return("SOA"); case T_MB: /* mailbox domain name */ return("MB"); case T_MG: /* mail group member */ return("MG"); case T_MX: /* mail routing info */ return(verbose? "MX" : "mail is handled by"); /* Roy start */ case T_TXT: /* TXT - descriptive info */ return(verbose? "TXT" : "descriptive text"); /* Roy end */ case T_AFSDB: /* AFS/DCE info */ return(verbose? "AFSDB" : "DCE or AFS service from"); case T_MR: /* mail rename name */ return("MR"); case T_NULL: /* null resource record */ return("NULL"); case T_WKS: /* well known service */ return("WKS"); case T_PTR: /* domain name pointer */ return("PTR"); case T_HINFO: /* host information */ return("HINFO"); case T_MINFO: /* mailbox information */ return("MINFO"); case T_AXFR: /* zone transfer */ return("AXFR"); case T_MAILB: /* mail box */ return("MAILB"); case T_MAILA: /* mail address */ return("MAILA"); case T_ANY: /* matches any type */ return("ANY"); case T_UINFO: return("UINFO"); case T_UID: return("UID"); case T_GID: return("GID"); default: sprintf(nbuf, "%d", type); return nbuf; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -