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

📄 main.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    int  putToFile;{    char	host[NAME_LEN];    char	file[NAME_LEN];    int		result;    /*     *  Invalidate the current host information to prevent Finger      *  from using bogus info.     */    curHostValid = FALSE;    /*     *	 Parse the command string into the host and     *	 optional output file name.     *     */    sscanf(string, " %s", host);	/* removes white space */    if (!putToFile) {	filePtr = stdout;    } else {	filePtr = OpenFile(string, file);	if (filePtr == NULL) {	    fprintf(stderr, "*** Can't open %s for writing\n", file);	    return(ERROR);	}	fprintf(filePtr,"> %s\n", string);    }    PrintHostInfo(filePtr, "Server:", defaultPtr);    /*     *  Check to see if we have the address of the server or the     *	address of a server who knows about this domain.     *     *  For now, just use the first address in the list.     */    if (defaultPtr->addrList == NULL) {	result = GetHostInfo(		    (struct in_addr *) defaultPtr->servers[0]->addrList[0], 			  queryClass, queryType, host, &curHostInfo, 0);    } else {	result = GetHostInfo((struct in_addr *) defaultPtr->addrList[0], 			  queryClass, queryType, host, &curHostInfo, 0);    }    switch(result) {	case SUCCESS:	    /*	     *  If the query was for an address, then the curHostInfo	     *  variable can be used by Finger.	     *  There's no need to print anything for other query types	     *  because the info has already been printed.	     */	    if (queryType == T_A) {		curHostValid = TRUE;		PrintHostInfo(filePtr, "Name:", &curHostInfo);	    }	    break;	/*	 * No Authoritative answer was available but we got names	 * of servers who know about the host.	 */	case NONAUTH:	    PrintHostInfo(filePtr, "Name:", &curHostInfo);	    break;	case NO_INFO:	    fprintf(stderr, "*** No %s information is available for %s\n", 			DecodeType(queryType), host);	    break;	case TIME_OUT:	    fprintf(stderr, "*** Request to %s timed-out\n", defaultServer);	    break;	default:	    fprintf(stderr, "*** %s can't find %s: %s\n", defaultServer, host,		    DecodeError(result));    }    if (putToFile) {	fclose(filePtr);	filePtr = NULL;    }    return(result);}/* ******************************************************************************* * *  LookupHostWithServer -- * *	Asks the name server specified in the second argument for  *	information about the host or domain specified in the first *	argument. The information is printed if the lookup was successful. * *	Address info about the requested name server is obtained *	from the default name server. This routine will return an *	error if the default server doesn't have info about the  *	requested server. Thus an error return status might not *	mean the requested name server doesn't have info about the *	requested host. * *	Comments from LookupHost apply here, too. * *  Results: *	SUCCESS		- the lookup was successful. *	ERROR		- the output file could not be opened. *	Misc. Errors	- an error message is printed if the lookup failed. * ******************************************************************************* */intLookupHostWithServer(string, putToFile)    char *string;    int  putToFile;{    char 	file[NAME_LEN];    char 	host[NAME_LEN];    char 	server[NAME_LEN];    int 	result;    static HostInfo serverInfo;    curHostValid = FALSE;    sscanf(string, " %s %s", host, server);    if (!putToFile) {	filePtr = stdout;    } else {	filePtr = OpenFile(string, file);	if (filePtr == NULL) {	    fprintf(stderr, "*** Can't open %s for writing\n", file);	    return(ERROR);	}	fprintf(filePtr,"> %s\n", string);    }        if (defaultPtr->addrList == NULL) {	result = GetHostInfo(			(struct in_addr *) defaultPtr->servers[0]->addrList[0], 				C_IN, T_A, server, &serverInfo, 1);    } else {	result = GetHostInfo((struct in_addr *) defaultPtr->addrList[0], 				C_IN, T_A, server, &serverInfo, 1);    }    if (result != SUCCESS) {	fprintf(stderr,"*** Can't find address for server %s: %s\n", server,		 DecodeError(result));    } else {	PrintHostInfo(filePtr, "Server:", &serverInfo);	if (serverInfo.addrList == NULL) {	    result = GetHostInfo(			(struct in_addr *) serverInfo.servers[0]->addrList[0], 			      queryClass, queryType, host, &curHostInfo, 0);	} else {	    result = GetHostInfo((struct in_addr *) serverInfo.addrList[0], 			      queryClass, queryType, host, &curHostInfo, 0);	}	switch(result) {	    case SUCCESS:		if (queryType == T_A) {		    curHostValid = TRUE;		    PrintHostInfo(filePtr, "Name:", &curHostInfo);		}		break;	    case NONAUTH:		PrintHostInfo(filePtr, "Name:", &curHostInfo);		break;	    case NO_INFO:		fprintf(stderr, "*** No %s information is available for %s\n", 			DecodeType(queryType), host);		break;	    case TIME_OUT:		fprintf(stderr, "*** Request to %s timed-out\n", server);		break;	    default:		fprintf(stderr, "*** %s can't find %s: %s\n", server, host,			DecodeError(result));	}    }    if (putToFile) {	fclose(filePtr);	filePtr = NULL;    }    return(result);}/* ******************************************************************************* * *  SetOption --  * *	This routine is used to change the state information *	that affect the lookups. The command format is *	   set keyword[=value] *	Most keywords can be abbreviated. Parsing is very simplistic-- *	A value must not be separated from its keyword by white space. * *	Valid keywords:		Meaning: *	[no]aaonly	  	authoritative query only or not (hidden). *	all			lists current values of options. *	ALL			lists current values of options, including *				  hidden options. *	[no]d2			turn on/off extra debugging mode (hidden). *	[no]debug 		turn on/off debugging mode. *	[no]defname	  	use/don't use default domain name. *	[no]search		use/don't use domain search list. *	domain=NAME		set default domain name to NAME. *	[no]ignore		ignore/don't ignore trunc. errors (hidden). *	[no]primary 		use/don't use primary server (hidden). *	query=value		set default query type to value, *				value is one of the query types in RFC883 *				without the leading T_.	(e.g. A, HINFO) *	[no]recurse		use/don't use recursive lookup. *	retry=#			set number of retries to #. *	root=NAME		change root server to NAME. *	time=#			set timeout length to #. *	[no]vc			use/don't use virtual circuit. * *  Results: *	SUCCESS		the command was parsed correctly. *	ERROR		the command was not parsed correctly. * ******************************************************************************* */intSetOption(string)    char *string;{    char 	option[NAME_LEN];    char 	type[NAME_LEN];    char 	*ptr;    int 	i;    i = sscanf(string, " set %s", option);    if (i != 1) {	fprintf(stderr, "*** Invalid option: %s\n",  option);	return(ERROR);    } else {	if (strncmp(option, "all", 3) == 0) {	    ShowOptions(FALSE);	} else if (strncmp(option, "ALL", 3) == 0) {	    ShowOptions(TRUE);	} else if (strncmp(option, "aa", 2) == 0) {	/* aaonly */	    _res.options |= RES_AAONLY;	} else if (strncmp(option, "noaa", 4) == 0) {	    _res.options &= ~RES_AAONLY;	} else if (strncmp(option, "deb", 3) == 0) {	/* debug */	    _res.options |= RES_DEBUG;	} else if (strncmp(option, "nodeb", 5) == 0) {	    _res.options &= ~(RES_DEBUG | RES_DEBUG2);	} else if (strncmp(option, "d2", 2) == 0) {	/* d2 (more debug) */	    _res.options |= (RES_DEBUG | RES_DEBUG2);	} else if (strncmp(option, "nod2", 4) == 0) {	    _res.options &= ~RES_DEBUG2;	} else if (strncmp(option, "def", 3) == 0) {	/* defname */	    _res.options |= RES_DEFNAMES;	} else if (strncmp(option, "nodef", 5) == 0) {	    _res.options &= ~RES_DEFNAMES;	} else if (strncmp(option, "sea", 3) == 0) {	/* search list */	    _res.options |= RES_DNSRCH;	} else if (strncmp(option, "nosea", 5) == 0) {	    _res.options &= ~RES_DNSRCH;	} else if (strncmp(option, "do", 2) == 0) {	/* domain */	    ptr = index(option, '=');	    if (ptr != NULL) {		sscanf(++ptr, "%s", _res.defdname);		res_re_init();	    }	} else if (strncmp(option, "i", 1) == 0) {	/* ignore */	    _res.options |= RES_IGNTC;	} else if (strncmp(option, "noi", 3) == 0) {	    _res.options &= ~RES_IGNTC;	} else if (strncmp(option, "p", 1) == 0) {	/* primary */	    _res.options |= RES_PRIMARY;	} else if (strncmp(option, "nop", 3) == 0) {	    _res.options &= ~RES_PRIMARY;	} else if (strncmp(option, "q", 1) == 0 ||	/* querytype */	  strncmp(option, "ty", 2) == 0) {	    ptr = index(option, '=');	    if (ptr != NULL) {		sscanf(++ptr, "%s", type);		queryType = StringToType(type, queryType);	    }	} else if (strncmp(option, "cl", 2) == 0) {	/* query class */	    ptr = index(option, '=');	    if (ptr != NULL) {		sscanf(++ptr, "%s", type);		queryClass = StringToClass(type, queryClass);	    }	} else if (strncmp(option, "rec", 3) == 0) {	/* recurse */	    _res.options |= RES_RECURSE;	} else if (strncmp(option, "norec", 5) == 0) {	    _res.options &= ~RES_RECURSE;	} else if (strncmp(option, "ret", 3) == 0) {	/* retry */	    ptr = index(option, '=');	    if (ptr != NULL) {		sscanf(++ptr, "%d", &_res.retry);	    }	} else if (strncmp(option, "ro", 2) == 0) {	/* root */	    ptr = index(option, '=');	    if (ptr != NULL) {		sscanf(++ptr, "%s", rootServerName);	    }	} else if (strncmp(option, "t", 1) == 0) {	/* timeout */	    ptr = index(option, '=');	    if (ptr != NULL) {		sscanf(++ptr, "%d", &_res.retrans);	    }	} else if (strncmp(option, "v", 1) == 0) {	/* vc */	    _res.options |= RES_USEVC;	} else if (strncmp(option, "nov", 3) == 0) {	    _res.options &= ~RES_USEVC;	} else {	    fprintf(stderr, "*** Invalid option: %s\n",  option);	    return(ERROR);	}    }    return(SUCCESS);}/* * Fake a reinitialization when the domain is changed. */res_re_init(){    register char *cp, **pp;    int n;    /* find components of local domain that might be searched */    pp = _res.dnsrch;    *pp++ = _res.defdname;    for (cp = _res.defdname, n = 0; *cp; cp++)	if (*cp == '.')	    n++;    cp = _res.defdname;    for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDNSRCH; n--) {	cp = index(cp, '.');	*pp++ = ++cp;    }    *pp = 0;    _res.options |= RES_INIT;}/* ******************************************************************************* * *  ShowOptions -- * *	Prints out the state information used by the resolver *	library and other options set by the user. * ******************************************************************************* */voidShowOptions(special)    int special;{    int i;    register char **cp;    PrintHostInfo(stdout, "Default Server:", defaultPtr);    if (curHostValid) {	PrintHostInfo(stdout, "Host:", &curHostInfo);    }    printf("Set options:\n");    printf("  %sdebug  \t", (_res.options & RES_DEBUG) ? "" : "no");    printf("  %sdefname\t", (_res.options & RES_DEFNAMES) ? "" : "no");    printf("  %ssearch\t", (_res.options & RES_DNSRCH) ? "" : "no");    printf("  %srecurse\t", (_res.options & RES_RECURSE) ? "" : "no");    printf("  %svc\n", (_res.options & RES_USEVC) ? "" : "no");    if (special) {	printf("  %saa\t\t", (_res.options & RES_AAONLY) ? "" : "no");	printf("  %sd2\t\t", (_res.options & RES_DEBUG2) ? "" : "no");	printf("  %signoretc\t", (_res.options & RES_IGNTC) ? "" : "no");	printf("  %sprimary\n", (_res.options & RES_PRIMARY) ? "" : "no");    }    printf("  querytype=%s\t", p_type(queryType));    printf("  class=%s\t", p_class(queryClass));    printf("  timeout=%d\t", _res.retrans);    printf("  retry=%d\n", _res.retry);    printf("  domain=%s\n", _res.defdname);    printf("  search list: ");    for (cp = _res.dnsrch; *cp; cp++)	printf("%s ", *cp);    printf("\n  root=%s\n", rootServerName);    if (special) {	printf("\n");	printf("State info:\n");	printf("  current packet id:       %d\n", _res.id);	printf("  number of name servers:  %d\n", _res.nscount);	printf("  name server addresses:   %s\n",				    inet_ntoa(_res.nsaddr_list[0].sin_addr));	for (i = 1; i < _res.nscount; i++) {	    printf("                           %s\n", 		    inet_ntoa(_res.nsaddr_list[i].sin_addr));	}    }}/* ******************************************************************************* * *  PrintHelp -- * *	Prints out the help file.*	(Code taken from Mail.) * ******************************************************************************* */voidPrintHelp(){	register int c;	register FILE *helpFilePtr;	if ((helpFilePtr = fopen(HELPFILE, "r")) == NULL) {	    perror(HELPFILE);	    return;	} 	while ((c = getc(helpFilePtr)) != EOF) {	    putchar((char) c);	}	fclose(helpFilePtr);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -