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

📄 nslookup.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 2 页
字号:
static voidshow_settings(isc_boolean_t full, isc_boolean_t serv_only) {	dig_server_t *srv;	isc_sockaddr_t sockaddr;	dig_searchlist_t *listent;	srv = ISC_LIST_HEAD(server_list);	while (srv != NULL) {		char sockstr[ISC_SOCKADDR_FORMATSIZE];		get_address(srv->servername, port, &sockaddr);		isc_sockaddr_format(&sockaddr, sockstr, sizeof(sockstr));		printf("Default server: %s\nAddress: %s\n",			srv->servername, sockstr);		if (!full)			return;		srv = ISC_LIST_NEXT(srv, link);	}	if (serv_only)		return;	printf("\nSet options:\n");	printf("  %s\t\t\t%s\t\t%s\n",	       tcpmode ? "vc" : "novc",	       short_form ? "nodebug" : "debug",	       debugging ? "d2" : "nod2");	printf("  %s\t\t%s\n",	       usesearch ? "search" : "nosearch",	       recurse ? "recurse" : "norecurse");	printf("  timeout = %d\t\tretry = %d\tport = %d\n",	       timeout, tries, port);	printf("  querytype = %-8s\tclass = %s\n", deftype, defclass);	printf("  srchlist = ");	for (listent = ISC_LIST_HEAD(search_list);	     listent != NULL;	     listent = ISC_LIST_NEXT(listent, link)) {		     printf("%s", listent->origin);		     if (ISC_LIST_NEXT(listent, link) != NULL)			     printf("/");	}	printf("\n");}static isc_boolean_ttesttype(char *typetext) {	isc_result_t result;	isc_textregion_t tr;	dns_rdatatype_t rdtype;	tr.base = typetext;	tr.length = strlen(typetext);	result = dns_rdatatype_fromtext(&rdtype, &tr);	if (result == ISC_R_SUCCESS)		return (ISC_TRUE);	else {		printf("unknown query type: %s\n", typetext);		return (ISC_FALSE);	}}static isc_boolean_ttestclass(char *typetext) {	isc_result_t result;	isc_textregion_t tr;	dns_rdataclass_t rdclass;	tr.base = typetext;	tr.length = strlen(typetext);	result = dns_rdataclass_fromtext(&rdclass, &tr);	if (result == ISC_R_SUCCESS) 		return (ISC_TRUE);	else {		printf("unknown query class: %s\n", typetext);		return (ISC_FALSE);	}}static voidsafecpy(char *dest, char *src, int size) {	strncpy(dest, src, size);	dest[size-1] = 0;}	static voidsetoption(char *opt) {	if (strncasecmp(opt, "all", 4) == 0) {		show_settings(ISC_TRUE, ISC_FALSE);	} else if (strncasecmp(opt, "class=", 6) == 0) {		if (testclass(&opt[6]))			safecpy(defclass, &opt[6], sizeof(defclass));	} else if (strncasecmp(opt, "cl=", 3) == 0) {		if (testclass(&opt[3]))			safecpy(defclass, &opt[3], sizeof(defclass));	} else if (strncasecmp(opt, "type=", 5) == 0) {		if (testtype(&opt[5]))			safecpy(deftype, &opt[5], sizeof(deftype));	} else if (strncasecmp(opt, "ty=", 3) == 0) {		if (testtype(&opt[3]))			safecpy(deftype, &opt[3], sizeof(deftype));	} else if (strncasecmp(opt, "querytype=", 10) == 0) {		if (testtype(&opt[10]))			safecpy(deftype, &opt[10], sizeof(deftype));	} else if (strncasecmp(opt, "query=", 6) == 0) {		if (testtype(&opt[6]))			safecpy(deftype, &opt[6], sizeof(deftype));	} else if (strncasecmp(opt, "qu=", 3) == 0) {		if (testtype(&opt[3]))			safecpy(deftype, &opt[3], sizeof(deftype));	} else if (strncasecmp(opt, "q=", 2) == 0) {		if (testtype(&opt[2]))			safecpy(deftype, &opt[2], sizeof(deftype));	} else if (strncasecmp(opt, "domain=", 7) == 0) {		safecpy(domainopt, &opt[7], sizeof(domainopt));		set_search_domain(domainopt);		usesearch = ISC_TRUE;	} else if (strncasecmp(opt, "do=", 3) == 0) {		safecpy(domainopt, &opt[3], sizeof(domainopt));		set_search_domain(domainopt);		usesearch = ISC_TRUE;	} else if (strncasecmp(opt, "port=", 5) == 0) {		port = atoi(&opt[5]);	} else if (strncasecmp(opt, "po=", 3) == 0) {		port = atoi(&opt[3]);	} else if (strncasecmp(opt, "timeout=", 8) == 0) {		timeout = atoi(&opt[8]);	} else if (strncasecmp(opt, "t=", 2) == 0) {		timeout = atoi(&opt[2]); 	} else if (strncasecmp(opt, "rec", 3) == 0) {		recurse = ISC_TRUE;	} else if (strncasecmp(opt, "norec", 5) == 0) {		recurse = ISC_FALSE;	} else if (strncasecmp(opt, "retry=", 6) == 0) {		tries = atoi(&opt[6]);	} else if (strncasecmp(opt, "ret=", 4) == 0) {		tries = atoi(&opt[4]); 	} else if (strncasecmp(opt, "def", 3) == 0) {		usesearch = ISC_TRUE;	} else if (strncasecmp(opt, "nodef", 5) == 0) {		usesearch = ISC_FALSE; 	} else if (strncasecmp(opt, "vc", 3) == 0) {		tcpmode = ISC_TRUE;	} else if (strncasecmp(opt, "novc", 5) == 0) {		tcpmode = ISC_FALSE; 	} else if (strncasecmp(opt, "deb", 3) == 0) {		short_form = ISC_FALSE;	} else if (strncasecmp(opt, "nodeb", 5) == 0) {		short_form = ISC_TRUE; 	} else if (strncasecmp(opt, "d2", 2) == 0) {		debugging = ISC_TRUE;	} else if (strncasecmp(opt, "nod2", 4) == 0) {		debugging = ISC_FALSE;	} else if (strncasecmp(opt, "search",3) == 0) {		usesearch = ISC_TRUE;	} else if (strncasecmp(opt, "nosearch",5) == 0) {		usesearch = ISC_FALSE;	} else if (strncasecmp(opt, "sil",3) == 0) {		deprecation_msg = ISC_FALSE;	} else {		printf("*** Invalid option: %s\n", opt);		}}static voidaddlookup(char *opt) {	dig_lookup_t *lookup;	isc_result_t result;	isc_textregion_t tr;	dns_rdatatype_t rdtype;	dns_rdataclass_t rdclass;	char store[MXNAME];	debug("addlookup()");	tr.base = deftype;	tr.length = strlen(deftype);	result = dns_rdatatype_fromtext(&rdtype, &tr);	if (result != ISC_R_SUCCESS) {		printf("unknown query type: %s\n", deftype);		rdclass = dns_rdatatype_a;	}	tr.base = defclass;	tr.length = strlen(defclass);	result = dns_rdataclass_fromtext(&rdclass, &tr);	if (result != ISC_R_SUCCESS) {		printf("unknown query class: %s\n", defclass);		rdclass = dns_rdataclass_in;	}	lookup = make_empty_lookup();	if (get_reverse(store, opt, lookup->ip6_int, ISC_TRUE)	    == ISC_R_SUCCESS)	{		safecpy(lookup->textname, store, sizeof(lookup->textname));		lookup->rdtype = dns_rdatatype_ptr;		lookup->rdtypeset = ISC_TRUE;	} else {		safecpy(lookup->textname, opt, sizeof(lookup->textname));		lookup->rdtype = rdtype;		lookup->rdtypeset = ISC_TRUE;	}	lookup->rdclass = rdclass;	lookup->rdclassset = ISC_TRUE;	lookup->trace = ISC_FALSE;	lookup->trace_root = lookup->trace;	lookup->ns_search_only = ISC_FALSE;	lookup->identify = identify;	lookup->recurse = recurse;	lookup->aaonly = aaonly;	lookup->retries = tries;	lookup->udpsize = 0;	lookup->comments = comments;	lookup->tcp_mode = tcpmode;	lookup->stats = stats;	lookup->section_question = section_question;	lookup->section_answer = section_answer;	lookup->section_authority = section_authority;	lookup->section_additional = section_additional;	lookup->new_search = ISC_TRUE;	ISC_LIST_INIT(lookup->q);	ISC_LINK_INIT(lookup, link);	ISC_LIST_APPEND(lookup_list, lookup, link);	lookup->origin = NULL;	ISC_LIST_INIT(lookup->my_server_list);	debug("looking up %s", lookup->textname);}static voidflush_server_list(void) {	dig_server_t *s, *ps;	debug("flush_server_list()");	s = ISC_LIST_HEAD(server_list);	while (s != NULL) {		ps = s;		s = ISC_LIST_NEXT(s, link);		ISC_LIST_DEQUEUE(server_list, ps, link);		isc_mem_free(mctx, ps);	}}/* * This works on the global server list, instead of on a per-lookup * server list, since the change is persistent. */static voidsetsrv(char *opt) {	dig_server_t *srv;	if (opt == NULL)		return;	flush_server_list();	srv = isc_mem_allocate(mctx, sizeof(struct dig_server));	if (srv == NULL)		fatal("memory allocation failure");	safecpy(srv->servername, opt, sizeof(srv->servername));	ISC_LIST_INITANDAPPEND(server_list, srv, link);}static voidget_next_command(void) {	char *buf;	char *ptr, *arg;	char *input;	buf = isc_mem_allocate(mctx, COMMSIZE);	if (buf == NULL)		fatal("memory allocation failure");	fputs("> ", stderr);	isc_app_block();	ptr = fgets(buf, COMMSIZE, stdin);	isc_app_unblock();	if (ptr == NULL) {		in_use = ISC_FALSE;		goto cleanup;	}	input = buf;	ptr = next_token(&input, " \t\r\n");	if (ptr == NULL)		goto cleanup;	arg = next_token(&input, " \t\r\n");	if ((strcasecmp(ptr, "set") == 0) &&	    (arg != NULL))		setoption(arg);	else if ((strcasecmp(ptr, "server") == 0) ||		 (strcasecmp(ptr, "lserver") == 0)) {		setsrv(arg);		show_settings(ISC_TRUE, ISC_TRUE);	} else if (strcasecmp(ptr, "exit") == 0) {		in_use = ISC_FALSE;		goto cleanup;	} else if (strcasecmp(ptr, "help") == 0 ||		   strcasecmp(ptr, "?") == 0)	{		printf("The '%s' command is not yet implemented.\n", ptr);		goto cleanup;	} else if (strcasecmp(ptr, "finger") == 0 ||		   strcasecmp(ptr, "root") == 0 ||		   strcasecmp(ptr, "ls") == 0 ||		   strcasecmp(ptr, "view") == 0)	{		printf("The '%s' command is not implemented.\n", ptr);		goto cleanup;	} else		addlookup(ptr); cleanup:	isc_mem_free(mctx, buf);}static voidparse_args(int argc, char **argv) {	isc_boolean_t have_lookup = ISC_FALSE;	usesearch = ISC_TRUE;	for (argc--, argv++; argc > 0; argc--, argv++) {		debug("main parsing %s", argv[0]);		if (argv[0][0] == '-') {			if (argv[0][1] != 0)				setoption(&argv[0][1]);			else				have_lookup = ISC_TRUE;		} else {			if (!have_lookup) {				have_lookup = ISC_TRUE;				in_use = ISC_TRUE;				addlookup(argv[0]);			}			else				setsrv(argv[0]);		}	}}static voidflush_lookup_list(void) {	dig_lookup_t *l, *lp;	dig_query_t *q, *qp;	dig_server_t *s, *sp;	lookup_counter = 0;	l = ISC_LIST_HEAD(lookup_list);	while (l != NULL) {		q = ISC_LIST_HEAD(l->q);		while (q != NULL) {			if (q->sock != NULL) {				isc_socket_cancel(q->sock, NULL,						  ISC_SOCKCANCEL_ALL);				isc_socket_detach(&q->sock);			}			if (ISC_LINK_LINKED(&q->recvbuf, link))				ISC_LIST_DEQUEUE(q->recvlist, &q->recvbuf,						 link);			if (ISC_LINK_LINKED(&q->lengthbuf, link))				ISC_LIST_DEQUEUE(q->lengthlist, &q->lengthbuf,						 link);			isc_buffer_invalidate(&q->recvbuf);			isc_buffer_invalidate(&q->lengthbuf);			qp = q;			q = ISC_LIST_NEXT(q, link);			ISC_LIST_DEQUEUE(l->q, qp, link);			isc_mem_free(mctx, qp);		}		s = ISC_LIST_HEAD(l->my_server_list);		while (s != NULL) {			sp = s;			s = ISC_LIST_NEXT(s, link);			ISC_LIST_DEQUEUE(l->my_server_list, sp, link);			isc_mem_free(mctx, sp);		}		if (l->sendmsg != NULL)			dns_message_destroy(&l->sendmsg);		if (l->timer != NULL)			isc_timer_detach(&l->timer);		lp = l;		l = ISC_LIST_NEXT(l, link);		ISC_LIST_DEQUEUE(lookup_list, lp, link);		isc_mem_free(mctx, lp);	}}static voidgetinput(isc_task_t *task, isc_event_t *event) {	UNUSED(task);	if (global_event == NULL)		global_event = event;	while (in_use) {		get_next_command();		if (ISC_LIST_HEAD(lookup_list) != NULL) {			start_lookup();			return;		}	}	isc_app_shutdown();}intmain(int argc, char **argv) {	isc_result_t result;	ISC_LIST_INIT(lookup_list);	ISC_LIST_INIT(server_list);	ISC_LIST_INIT(search_list);	result = isc_app_start();	check_result(result, "isc_app_start");	setup_libs();	progname = argv[0];	parse_args(argc, argv);	if (deprecation_msg) {		fputs("Note:  nslookup is deprecated and may be removed from future releases.\n""Consider using the `dig' or `host' programs instead.  Run nslookup with\n""the `-sil[ent]' option to prevent this message from appearing.\n", stderr);	}	setup_system();	if (domainopt[0] != '\0')		set_search_domain(domainopt);	if (in_use)		result = isc_app_onrun(mctx, global_task, onrun_callback,				       NULL);	else		result = isc_app_onrun(mctx, global_task, getinput, NULL);	check_result(result, "isc_app_onrun");	in_use = ISC_TF(!in_use);	(void)isc_app_run();	puts("");	debug("done, and starting to shut down");	if (global_event != NULL)		isc_event_free(&global_event);	cancel_all();	destroy_libs();	isc_app_finish();	return (0);}

⌨️ 快捷键说明

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