📄 getinfo.c
字号:
} numServers++; server[numServers -1].name = namePtr; server[numServers -1].domain[0] = dnamePtr; server[numServers -1].numDomains = 1; server[numServers -1].numAddresses = 0; } } } if (!headerPtr->aa && (queryType != T_A) && arcount > 0) { printf("Authoritative answers can be found from:\n"); } /* * Additional resource records contain addresses of * servers. */ cp = res_skip((char *) &answer, 3, eom); while (--arcount >= 0 && cp < eom) { /* * If we don't need to save the record, just print it. */ if (queryType != T_A) { if ((cp = Print_rr(cp, (char *) &answer, eom, stdout)) == NULL) { return(ERROR); } continue; } else { if ((n = dn_expand((char *) &answer, eom, cp, bp, buflen)) < 0) break; cp += n; type = _getshort(cp); cp += sizeof(u_short); class = _getshort(cp); cp += sizeof(u_short) + sizeof(u_long); dlen = _getshort(cp); cp += sizeof(u_short); if (type != T_A) { cp += dlen; continue; } else { for (j = 0; j < numServers; j++) { if (strcmp(bp, server[j].name) == 0) { server[j].numAddresses++; if (server[j].numAddresses <= MAXADDRS) { server[j].address[server[j].numAddresses-1]=Calloc((unsigned)1,(unsigned)dlen); bcopy(cp,server[j].address[server[j].numAddresses-1],dlen); break; } } } cp += dlen; } } } /* * If we are returning name server info, transfer it to * the hostPtr. * */ if (numServers > 0) { hostPtr->servers = (ServerInfo **) Calloc((unsigned)numServers+1, sizeof(ServerInfo *)); for (i = 0; i < numServers; i++) { hostPtr->servers[i] = (ServerInfo *) Calloc((unsigned)1, sizeof(ServerInfo)); hostPtr->servers[i]->name = server[i].name; hostPtr->servers[i]->domains = (char **) Calloc((unsigned)server[i].numDomains+1,sizeof(char *)); for (j = 0; j < server[i].numDomains; j++) { hostPtr->servers[i]->domains[j] = server[i].domain[j]; } hostPtr->servers[i]->domains[j] = NULL; hostPtr->servers[i]->addrList = (char **) Calloc((unsigned)server[i].numAddresses+1,sizeof(char *)); for (j = 0; j < server[i].numAddresses; j++) { hostPtr->servers[i]->addrList[j] = server[i].address[j]; } hostPtr->servers[i]->addrList[j] = NULL; } hostPtr->servers[i] = NULL; } if (queryType != T_A) { return(SUCCESS); } else { return(NONAUTH); }}/* ******************************************************************************* * * GetHostInfo -- * * Retrieves host name, address and alias information * for a domain. * * Results: * ERROR - res_mkquery failed. * + return values from GetAnswer() * ******************************************************************************* */intGetHostInfo(nsAddrPtr, queryClass, queryType, name, hostPtr, isserver) struct in_addr *nsAddrPtr; int queryClass; int queryType; char *name; HostInfo *hostPtr; int isserver;{ int n; int result; register char *cp, **domain; querybuf buf; extern char *Calloc(), *hostalias(); /* catch explicit addresses */ if (isdigit(*name) && (queryType == T_A)) { long ina; ina = inet_addr(name); if (ina == -1) return(ERROR); hostPtr->name = Calloc((unsigned)strlen(name)+3,1); (void)sprintf(hostPtr->name,"[%s]",name); hostPtr->aliases = 0; hostPtr->servers = 0; hostPtr->addrType = AF_INET; hostPtr->addrLen = 4; hostPtr->addrList = (char **)Calloc((unsigned)2,sizeof(char *)); hostPtr->addrList[0] = Calloc(sizeof(long),sizeof(char)); bcopy((char *)&ina,hostPtr->addrList[0],sizeof(ina)); hostPtr->addrList[1] = 0; return(SUCCESS); } for (cp = name, n = 0; *cp; cp++) if (*cp == '.') n++; if ((n && *--cp == '.') || (isserver == 0 && (_res.options & RES_DEFNAMES) == 0)) { int defflag = _res.options & RES_DEFNAMES; _res.options &= ~RES_DEFNAMES; if (n && *cp == '.') *cp = 0; result = GetHostDomain(nsAddrPtr, queryClass, queryType, name, (char *)NULL, hostPtr, isserver); if (n && *cp == 0) *cp = '.'; if (defflag) _res.options |= RES_DEFNAMES; return (result); } if (n == 0 && (cp = hostalias(name))) return (GetHostDomain(nsAddrPtr, queryClass, queryType, cp, (char *)NULL, hostPtr, isserver)); for (domain = _res.dnsrch; *domain; domain++) { result = GetHostDomain(nsAddrPtr, queryClass, queryType, name, *domain, hostPtr, isserver); if ((result != NXDOMAIN && result != NO_INFO) || (_res.options & RES_DNSRCH) == 0) return (result); } if (n) return (GetHostDomain(nsAddrPtr, queryClass, queryType, name, (char *)NULL, hostPtr, isserver)); return (result);}GetHostDomain(nsAddrPtr, queryClass, queryType, name, domain, hostPtr, isserver) struct in_addr *nsAddrPtr; int queryClass; int queryType; char *name, *domain; HostInfo *hostPtr; int isserver;{ querybuf buf; char nbuf[2*MAXDNAME+2]; int n; if (domain) { (void)sprintf(nbuf, "%.*s.%.*s", MAXDNAME, name, MAXDNAME, domain); name = nbuf; } n = res_mkquery(QUERY, name, queryClass, queryType, (char *)0, 0, (char *)0, (char *) &buf, sizeof(buf)); if (n < 0) { if (_res.options & RES_DEBUG) { printf("Res_mkquery failed\n"); } return (ERROR); } n = GetAnswer(nsAddrPtr, queryType, (char *) &buf, n, 0, hostPtr, isserver); /* * GetAnswer didn't find a name, so set it to the specified one. */ if (n == NONAUTH) { if (hostPtr->name == NULL) { int len = strlen(name) + 1; hostPtr->name = Calloc((unsigned)len, sizeof(char)); bcopy(name, hostPtr->name, len); } } return(n);}/* ******************************************************************************* * * FindHostInfo -- * * Performs an inverse query to find the host name * that corresponds to the given address. * * Results: * ERROR - res_mkquery failed. * + return values from GetAnswer() * ******************************************************************************* */intFindHostInfo(nsAddrPtr, address, len, hostPtr) struct in_addr *nsAddrPtr; struct in_addr *address; int len; HostInfo *hostPtr;{ int n; querybuf buf; n = res_mkquery(IQUERY, (char *)0, C_IN, T_A, (char *)address, len, (char *)0, (char *) &buf, sizeof(buf)); if (n < 0) { if (_res.options & RES_DEBUG) { printf("Res_mkquery failed\n"); } return (ERROR); } return(GetAnswer(nsAddrPtr, T_A, (char *) &buf, n, 1, hostPtr, 1));}/* ******************************************************************************* * * FreeHostInfoPtr -- * * Deallocates all the calloc'd areas for a HostInfo * variable. * ******************************************************************************* */voidFreeHostInfoPtr(hostPtr) HostInfo *hostPtr;{ int i, j; if (hostPtr->name != NULL) { free(hostPtr->name); hostPtr->name = NULL; } if (hostPtr->aliases != NULL) { i = 0; while (hostPtr->aliases[i] != NULL) { free(hostPtr->aliases[i]); i++; } free((char *)hostPtr->aliases); hostPtr->aliases = NULL; } if (hostPtr->addrList != NULL) { i = 0; while (hostPtr->addrList[i] != NULL) { free(hostPtr->addrList[i]); i++; } free((char *)hostPtr->addrList); hostPtr->addrList = NULL; } if (hostPtr->servers != NULL) { i = 0; while (hostPtr->servers[i] != NULL) { if (hostPtr->servers[i]->name != NULL) { free(hostPtr->servers[i]->name); } if (hostPtr->servers[i]->domains != NULL) { j = 0; while (hostPtr->servers[i]->domains[j] != NULL) { free(hostPtr->servers[i]->domains[j]); j++; } free((char *)hostPtr->servers[i]->domains); } if (hostPtr->servers[i]->addrList != NULL) { j = 0; while (hostPtr->servers[i]->addrList[j] != NULL) { free(hostPtr->servers[i]->addrList[j]); j++; } free((char *)hostPtr->servers[i]->addrList); } free((char *)hostPtr->servers[i]); i++; } free((char *)hostPtr->servers); hostPtr->servers = NULL; }}/* ******************************************************************************* * * GetHostList -- * * Performs a completion query when given an incomplete * name. * * Still under development. * ******************************************************************************* */#if notdefintGetHostList(nsAddrPtr, queryType, name, defaultName, hostPtr) struct in_addr *nsAddrPtr; int queryType; char *name, *defaultName; HostInfo *hostPtr;{ int n; querybuf buf; n = res_mkquery(CQUERYM, name, C_IN, T_A, defaultName, 0, (char *)0, (char *) &buf, sizeof(buf)); if (n < 0) { if (_res.options & RES_DEBUG) printf("Res_mkquery failed\n"); return (ERROR); } return(GetAnswer(nsAddrPtr, queryType, (char *)&buf, n, 0, hostPtr, 1));}#endif notdef
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -