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

📄 dig.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 3 页
字号:
		} else			fprintf(stderr, ";; Warning, ignoring "				"invalid class %s\n",				value);		return (value_from_next);	case 'f':		batchname = value;		return (value_from_next);	case 'k':		strncpy(keyfile, value, sizeof(keyfile));		keyfile[sizeof(keyfile)-1]=0;		return (value_from_next);	case 'p':		port = (in_port_t) parse_uint(value, "port number", MAXPORT);		return (value_from_next);	case 't':		*open_type_class = ISC_FALSE;		if (strncasecmp(value, "ixfr=", 5) == 0) {			rdtype = dns_rdatatype_ixfr;			result = ISC_R_SUCCESS;		} else {			tr.base = value;			tr.length = strlen(value);			result = dns_rdatatype_fromtext(&rdtype,						(isc_textregion_t *)&tr);			if (result == ISC_R_SUCCESS &&			    rdtype == dns_rdatatype_ixfr)			{				result = DNS_R_UNKNOWN;			}		}		if (result == ISC_R_SUCCESS) {			if ((*lookup)->rdtypeset) {				fprintf(stderr, ";; Warning, "						"extra type option\n");			}			if (rdtype == dns_rdatatype_ixfr) {				(*lookup)->rdtype = dns_rdatatype_ixfr;				(*lookup)->rdtypeset = ISC_TRUE;				(*lookup)->ixfr_serial =					parse_uint(&value[5], "serial number",					  	MAXSERIAL);				(*lookup)->section_question = plusquest;				(*lookup)->comments = pluscomm;			} else {				(*lookup)->rdtype = rdtype;				(*lookup)->rdtypeset = ISC_TRUE;				if (rdtype == dns_rdatatype_axfr) {					(*lookup)->section_question = plusquest;					(*lookup)->comments = pluscomm;				}				(*lookup)->ixfr_serial = ISC_FALSE;			}		} else			fprintf(stderr, ";; Warning, ignoring "				 "invalid type %s\n",				 value);		return (value_from_next);	case 'y':		ptr = next_token(&value,":");		if (ptr == NULL) {			usage();		}		strncpy(keynametext, ptr, sizeof(keynametext));		keynametext[sizeof(keynametext)-1]=0;		ptr = next_token(&value, "");		if (ptr == NULL)			usage();		strncpy(keysecret, ptr, sizeof(keysecret));		keysecret[sizeof(keysecret)-1]=0;		return (value_from_next);	case 'x':		*lookup = clone_lookup(default_lookup, ISC_TRUE);		if (get_reverse(textname, value, ip6_int, ISC_TRUE)		    == ISC_R_SUCCESS)		{			strncpy((*lookup)->textname, textname,				sizeof((*lookup)->textname));			debug("looking up %s", (*lookup)->textname);			(*lookup)->trace_root = ISC_TF((*lookup)->trace  ||						(*lookup)->ns_search_only);			(*lookup)->ip6_int = ip6_int;			if (!(*lookup)->rdtypeset)				(*lookup)->rdtype = dns_rdatatype_ptr;			if (!(*lookup)->rdclassset)				(*lookup)->rdclass = dns_rdataclass_in;			(*lookup)->new_search = ISC_TRUE;			if (*lookup && *firstarg)			{				printgreeting(argc, argv, *lookup);				*firstarg = ISC_FALSE;			}			ISC_LIST_APPEND(lookup_list, *lookup, link);		} else {			fprintf(stderr, "Invalid IP address %s\n", value);			exit(1);		}		return (value_from_next);	invalid_option:	default:		fprintf(stderr, "Invalid option: -%s\n", option);		usage();	}	return (ISC_FALSE);}/* * Because we may be trying to do memory allocation recording, we're going * to need to parse the arguments for the -m *before* we start the main * argument parsing routine. * I'd prefer not to have to do this, but I am not quite sure how else to * fix the problem.  Argument parsing in dig involves memory allocation * by its nature, so it can't be done in the main argument parser. */static voidpreparse_args(int argc, char **argv) {	int rc;	char **rv;	rc = argc;	rv = argv;	for (rc--, rv++; rc > 0; rc--, rv++) {		if (strcmp(rv[0], "-m") == 0) {			memdebugging = ISC_TRUE;			isc_mem_debugging = ISC_MEM_DEBUGTRACE |				ISC_MEM_DEBUGRECORD;			return;		}	}}static voidparse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,	   int argc, char **argv) {	isc_result_t result;	isc_textregion_t tr;	isc_boolean_t firstarg = ISC_TRUE;	dig_server_t *srv = NULL;	dig_lookup_t *lookup = NULL;	dns_rdatatype_t rdtype;	dns_rdataclass_t rdclass;	isc_boolean_t open_type_class = ISC_TRUE;	char batchline[MXNAME];	int bargc;	char *bargv[64];	int rc;	char **rv;#ifndef NOPOSIX	char *homedir;	char rcfile[256];#endif	char *input;	/*	 * The semantics for parsing the args is a bit complex; if	 * we don't have a host yet, make the arg apply globally,	 * otherwise make it apply to the latest host.  This is	 * a bit different than the previous versions, but should	 * form a consistent user interface.	 *	 * First, create a "default lookup" which won't actually be used	 * anywhere, except for cloning into new lookups	 */	debug("parse_args()");	if (!is_batchfile) {		debug("making new lookup");		default_lookup = make_empty_lookup();#ifndef NOPOSIX		/*		 * Treat .digrc as a special batchfile		 */		homedir = getenv("HOME");		if (homedir != NULL)			snprintf(rcfile, sizeof(rcfile), "%s/.digrc", homedir);		else			strcpy(rcfile, ".digrc");		batchfp = fopen(rcfile, "r");		if (batchfp != NULL) {			while (fgets(batchline, sizeof(batchline),				     batchfp) != 0) {				debug("config line %s", batchline);				bargc = 1;				input = batchline;				bargv[bargc] = next_token(&input, " \t\r\n");				while ((bargv[bargc] != NULL) &&				       (bargc < 62)) {					bargc++;					bargv[bargc] = next_token(&input, " \t\r\n");				}				bargv[0] = argv[0];				argv0 = argv[0];				reorder_args(bargc, (char **)bargv);				parse_args(ISC_TRUE, ISC_TRUE, bargc,					   (char **)bargv);			}			fclose(batchfp);		}#endif	}	lookup = default_lookup;	rc = argc;	rv = argv;	for (rc--, rv++; rc > 0; rc--, rv++) {		debug("main parsing %s", rv[0]);		if (strncmp(rv[0], "%", 1) == 0)			break;		if (strncmp(rv[0], "@", 1) == 0) {			srv = make_server(&rv[0][1]);			ISC_LIST_APPEND(lookup->my_server_list,					srv, link);		} else if (rv[0][0] == '+') {			plus_option(&rv[0][1], is_batchfile,				    lookup);		} else if (rv[0][0] == '-') {			if (rc <= 1) {				if (dash_option(&rv[0][1], NULL,						&lookup, &open_type_class,						&firstarg, argc, argv)) {					rc--;					rv++;				}			} else {				if (dash_option(&rv[0][1], rv[1],						&lookup, &open_type_class,						&firstarg, argc, argv)) {					rc--;					rv++;				}			}		} else {			/*			 * Anything which isn't an option			 */			if (open_type_class) {				if (strncmp(rv[0], "ixfr=", 5) == 0) {					rdtype = dns_rdatatype_ixfr;					result = ISC_R_SUCCESS;				} else {					tr.base = rv[0];					tr.length = strlen(rv[0]);					result = dns_rdatatype_fromtext(&rdtype,						     	(isc_textregion_t *)&tr);					if (result == ISC_R_SUCCESS &&					    rdtype == dns_rdatatype_ixfr)					{						result = DNS_R_UNKNOWN;						fprintf(stderr, ";; Warning, "							"ixfr requires a "							"serial number\n");						continue;					}				}				if (result == ISC_R_SUCCESS)				{					if (lookup->rdtypeset) {						fprintf(stderr, ";; Warning, "							"extra type option\n");					}					if (rdtype == dns_rdatatype_ixfr) {						lookup->rdtype = dns_rdatatype_ixfr;						lookup->rdtypeset = ISC_TRUE;						lookup->ixfr_serial =							parse_uint(&rv[0][5],							  	"serial number",							  	MAXSERIAL);						lookup->section_question = plusquest;						lookup->comments = pluscomm;					} else {						lookup->rdtype = rdtype;						lookup->rdtypeset = ISC_TRUE;						if (rdtype == dns_rdatatype_axfr) {							lookup->section_question =								plusquest;							lookup->comments = pluscomm;						}						lookup->ixfr_serial = ISC_FALSE;					}					continue;				}				result = dns_rdataclass_fromtext(&rdclass,						     (isc_textregion_t *)&tr);				if (result == ISC_R_SUCCESS) {					if (lookup->rdclassset) {						fprintf(stderr, ";; Warning, "							"extra class option\n");					}					lookup->rdclass = rdclass;					lookup->rdclassset = ISC_TRUE;					continue;				}			}			if (!config_only) {				lookup = clone_lookup(default_lookup,						      ISC_TRUE);				if (firstarg) {					printgreeting(argc, argv, lookup);					firstarg = ISC_FALSE;				}				strncpy(lookup->textname, rv[0], 					sizeof(lookup->textname));				lookup->textname[sizeof(lookup->textname)-1]=0;				lookup->trace_root = ISC_TF(lookup->trace  ||						     lookup->ns_search_only);				lookup->new_search = ISC_TRUE;				ISC_LIST_APPEND(lookup_list, lookup, link);				debug("looking up %s", lookup->textname);			}			/* XXX Error message */		}	}	/*	 * If we have a batchfile, seed the lookup list with the	 * first entry, then trust the callback in dighost_shutdown	 * to get the rest	 */	if ((batchname != NULL) && !(is_batchfile)) {		if (strcmp(batchname, "-") == 0)			batchfp = stdin;		else			batchfp = fopen(batchname, "r");		if (batchfp == NULL) {			perror(batchname);			if (exitcode < 8)				exitcode = 8;			fatal("Couldn't open specified batch file");		}		/* XXX Remove code dup from shutdown code */	next_line:		if (fgets(batchline, sizeof(batchline), batchfp) != 0) {			bargc = 1;			debug("batch line %s", batchline);			if (batchline[0] == '\r' || batchline[0] == '\n'			    || batchline[0] == '#' || batchline[0] == ';')				goto next_line;			input = batchline;			bargv[bargc] = next_token(&input, " \t\r\n");			while ((bargv[bargc] != NULL) && (bargc < 14)) {				bargc++;				bargv[bargc] = next_token(&input, " \t\r\n");			}			bargv[0] = argv[0];			argv0 = argv[0];			reorder_args(bargc, (char **)bargv);			parse_args(ISC_TRUE, ISC_FALSE, bargc, (char **)bargv);		}	}	/*	 * If no lookup specified, search for root	 */	if ((lookup_list.head == NULL) && !config_only) {		lookup = clone_lookup(default_lookup, ISC_TRUE);		lookup->trace_root = ISC_TF(lookup->trace ||					    lookup->ns_search_only);		lookup->new_search = ISC_TRUE;		strcpy(lookup->textname, ".");		lookup->rdtype = dns_rdatatype_ns;		lookup->rdtypeset = ISC_TRUE;		if (firstarg) {			printgreeting(argc, argv, lookup);			firstarg = ISC_FALSE;		}		ISC_LIST_APPEND(lookup_list, lookup, link);	}}/* * Callback from dighost.c to allow program-specific shutdown code.  Here, * Here, we're possibly reading from a batch file, then shutting down for * real if there's nothing in the batch file to read. */voiddighost_shutdown(void) {	char batchline[MXNAME];	int bargc;	char *bargv[16];	char *input;	if (batchname == NULL) {		isc_app_shutdown();		return;	}	if (feof(batchfp)) {		batchname = NULL;		isc_app_shutdown();		if (batchfp != stdin)			fclose(batchfp);		return;	}	if (fgets(batchline, sizeof(batchline), batchfp) != 0) {		debug("batch line %s", batchline);		bargc = 1;		input = batchline;		bargv[bargc] = next_token(&input, " \t\r\n");		while ((bargv[bargc] != NULL) && (bargc < 14)) {			bargc++;			bargv[bargc] = next_token(&input, " \t\r\n");		}		bargv[0] = argv0;		reorder_args(bargc, (char **)bargv);		parse_args(ISC_TRUE, ISC_FALSE, bargc, (char **)bargv);		start_lookup();	} else {		batchname = NULL;		if (batchfp != stdin)			fclose(batchfp);		isc_app_shutdown();		return;	}}intmain(int argc, char **argv) {	isc_result_t result;	dig_server_t *s, *s2;	ISC_LIST_INIT(lookup_list);	ISC_LIST_INIT(server_list);	ISC_LIST_INIT(search_list);	debug("main()");	preparse_args(argc, argv);	progname = argv[0];	result = isc_app_start();	check_result(result, "isc_app_start");	setup_libs();	parse_args(ISC_FALSE, ISC_FALSE, argc, argv);	setup_system();	if (domainopt[0] != '\0') {		set_search_domain(domainopt);		usesearch = ISC_TRUE;	}	result = isc_app_onrun(mctx, global_task, onrun_callback, NULL);	check_result(result, "isc_app_onrun");	isc_app_run();	s = ISC_LIST_HEAD(default_lookup->my_server_list);	while (s != NULL) {		debug("freeing server %p belonging to %p",		      s, default_lookup);		s2 = s;		s = ISC_LIST_NEXT(s, link);		ISC_LIST_DEQUEUE(default_lookup->my_server_list, s2, link);		isc_mem_free(mctx, s2);	}	isc_mem_free(mctx, default_lookup);	if (batchname != NULL) {		if (batchfp != stdin)			fclose(batchfp);		batchname = NULL;	}	cancel_all();	destroy_libs();	isc_app_finish();	return (exitcode);}

⌨️ 快捷键说明

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