⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getinfo.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}		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 + -