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

📄 request.c

📁 非常好的dns解析软件
💻 C
📖 第 1 页 / 共 3 页
字号:
		isc_netaddr_fromsockaddr(&netaddr, destaddr);		if (dns_acl_match(&netaddr, NULL, blackhole,				  NULL, &match, NULL) == ISC_R_SUCCESS &&		    match > 0)			drop = ISC_TRUE;	}	if (drop) {		isc_netaddr_format(&netaddr, netaddrstr, sizeof(netaddrstr));		req_log(ISC_LOG_DEBUG(10), "blackholed address %s", netaddrstr);	}	return (drop);}static isc_result_tcreate_tcp_dispatch(dns_requestmgr_t *requestmgr, isc_sockaddr_t *srcaddr,		    isc_sockaddr_t *destaddr, dns_dispatch_t **dispatchp){	isc_result_t result;	isc_socket_t *socket = NULL;	isc_sockaddr_t src;	unsigned int attrs;	isc_sockaddr_t bind_any;	result = isc_socket_create(requestmgr->socketmgr,				   isc_sockaddr_pf(destaddr),				   isc_sockettype_tcp, &socket);	if (result != ISC_R_SUCCESS)		return (result);#ifndef BROKEN_TCP_BIND_BEFORE_CONNECT	if (srcaddr == NULL) {		isc_sockaddr_anyofpf(&bind_any,				     isc_sockaddr_pf(destaddr));		result = isc_socket_bind(socket, &bind_any);	} else {		src = *srcaddr;		isc_sockaddr_setport(&src, 0);		result = isc_socket_bind(socket, &src);	}	if (result != ISC_R_SUCCESS)		goto cleanup;#endif	attrs = 0;	attrs |= DNS_DISPATCHATTR_TCP;	attrs |= DNS_DISPATCHATTR_PRIVATE;	if (isc_sockaddr_pf(destaddr) == AF_INET)		attrs |= DNS_DISPATCHATTR_IPV4;	else		attrs |= DNS_DISPATCHATTR_IPV6;	attrs |= DNS_DISPATCHATTR_MAKEQUERY;	result = dns_dispatch_createtcp(requestmgr->dispatchmgr,					socket, requestmgr->taskmgr,					4096, 2, 1, 1, 3, attrs,					dispatchp);cleanup:	isc_socket_detach(&socket);	return (result);}static isc_result_tfind_udp_dispatch(dns_requestmgr_t *requestmgr, isc_sockaddr_t *srcaddr,		  isc_sockaddr_t *destaddr, dns_dispatch_t **dispatchp){	dns_dispatch_t *disp = NULL;	unsigned int attrs, attrmask;	if (srcaddr == NULL) {		switch (isc_sockaddr_pf(destaddr)) {		case PF_INET:			disp = requestmgr->dispatchv4;			break;		case PF_INET6:			disp = requestmgr->dispatchv6;			break;		default:			return (ISC_R_NOTIMPLEMENTED);		}		if (disp == NULL)			return (ISC_R_FAMILYNOSUPPORT);		dns_dispatch_attach(disp, dispatchp);		return (ISC_R_SUCCESS);	}	attrs = 0;	attrs |= DNS_DISPATCHATTR_UDP;	switch (isc_sockaddr_pf(srcaddr)) {	case PF_INET:		attrs |= DNS_DISPATCHATTR_IPV4;		break;	case PF_INET6:		attrs |= DNS_DISPATCHATTR_IPV6;		break;	default:		return (ISC_R_NOTIMPLEMENTED);	}	attrmask = 0;	attrmask |= DNS_DISPATCHATTR_UDP;	attrmask |= DNS_DISPATCHATTR_TCP;	attrmask |= DNS_DISPATCHATTR_IPV4;	attrmask |= DNS_DISPATCHATTR_IPV6;	return (dns_dispatch_getudp(requestmgr->dispatchmgr,				    requestmgr->socketmgr,				    requestmgr->taskmgr,				    srcaddr, 4096,				    1000, 32768, 16411, 16433,				    attrs, attrmask,				    dispatchp));}static isc_result_tget_dispatch(isc_boolean_t tcp, dns_requestmgr_t *requestmgr,	     isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,	     dns_dispatch_t **dispatchp){	isc_result_t result;	if (tcp)		result = create_tcp_dispatch(requestmgr, srcaddr,					     destaddr, dispatchp);	else		result = find_udp_dispatch(requestmgr, srcaddr,					   destaddr, dispatchp);	return (result);}static isc_result_tset_timer(isc_timer_t *timer, unsigned int timeout, unsigned int udpresend) {	isc_time_t expires;	isc_interval_t interval;	isc_result_t result;	isc_timertype_t timertype;	isc_interval_set(&interval, timeout, 0);	result = isc_time_nowplusinterval(&expires, &interval);	isc_interval_set(&interval, udpresend, 0);	timertype = udpresend != 0 ? isc_timertype_limited : isc_timertype_once;	if (result == ISC_R_SUCCESS)		result = isc_timer_reset(timer, timertype, &expires,					 &interval, ISC_FALSE);	return (result);}isc_result_tdns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,		      isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,		      unsigned int options, unsigned int timeout,		      isc_task_t *task, isc_taskaction_t action, void *arg,		      dns_request_t **requestp){	return(dns_request_createraw3(requestmgr, msgbuf, srcaddr, destaddr,				      options, timeout, 0, 0, task, action,				      arg, requestp));}isc_result_tdns_request_createraw2(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,		       isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,		       unsigned int options, unsigned int timeout,		       unsigned int udptimeout, isc_task_t *task,		       isc_taskaction_t action, void *arg,		       dns_request_t **requestp){	unsigned int udpretries = 0;	if (udptimeout != 0)		udpretries = timeout / udptimeout;	return (dns_request_createraw3(requestmgr, msgbuf, srcaddr, destaddr,				       options, timeout, udptimeout,				       udpretries, task, action, arg,				       requestp));}isc_result_tdns_request_createraw3(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,		       isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,		       unsigned int options, unsigned int timeout,		       unsigned int udptimeout, unsigned int udpretries,		       isc_task_t *task, isc_taskaction_t action, void *arg,		       dns_request_t **requestp){	dns_request_t *request = NULL;	isc_task_t *tclone = NULL;	isc_socket_t *socket = NULL;	isc_result_t result;	isc_mem_t *mctx;	dns_messageid_t	id;	isc_boolean_t tcp = ISC_FALSE;	isc_region_t r;	REQUIRE(VALID_REQUESTMGR(requestmgr));	REQUIRE(msgbuf != NULL);	REQUIRE(destaddr != NULL);	REQUIRE(task != NULL);	REQUIRE(action != NULL);	REQUIRE(requestp != NULL && *requestp == NULL);	REQUIRE(timeout > 0);	if (srcaddr != NULL) 		REQUIRE(isc_sockaddr_pf(srcaddr) == isc_sockaddr_pf(destaddr));	mctx = requestmgr->mctx;	req_log(ISC_LOG_DEBUG(3), "dns_request_createraw");	if (isblackholed(requestmgr->dispatchmgr, destaddr))		return (DNS_R_BLACKHOLED);	request = NULL;	result = new_request(mctx, &request);	if (result != ISC_R_SUCCESS)		return (result);	if (udptimeout == 0 && udpretries != 0) {		udptimeout = timeout / (udpretries + 1);		if (udptimeout == 0)			udptimeout = 1;	}	request->udpcount = udpretries;	/*	 * Create timer now.  We will set it below once.	 */	result = isc_timer_create(requestmgr->timermgr, isc_timertype_inactive,				  NULL, NULL, task, req_timeout, request,				  &request->timer);	if (result != ISC_R_SUCCESS)		goto cleanup;	request->event = (dns_requestevent_t *)		isc_event_allocate(mctx, task, DNS_EVENT_REQUESTDONE,				   action, arg, sizeof(dns_requestevent_t));	if (request->event == NULL) {		result = ISC_R_NOMEMORY;		goto cleanup;	}	isc_task_attach(task, &tclone);	request->event->ev_sender = task;	request->event->request = request;	request->event->result = ISC_R_FAILURE;	isc_buffer_usedregion(msgbuf, &r);	if (r.length < DNS_MESSAGE_HEADERLEN || r.length > 65535) {		result = DNS_R_FORMERR;		goto cleanup;	}			if ((options & DNS_REQUESTOPT_TCP) != 0 || r.length > 512)		tcp = ISC_TRUE;	result = get_dispatch(tcp, requestmgr, srcaddr, destaddr,			      &request->dispatch);	if (result != ISC_R_SUCCESS)		goto cleanup;	socket = dns_dispatch_getsocket(request->dispatch);	INSIST(socket != NULL);	result = dns_dispatch_addresponse(request->dispatch, destaddr, task,					  req_response, request, &id,					  &request->dispentry);	if (result != ISC_R_SUCCESS)		goto cleanup;	result = isc_buffer_allocate(mctx, &request->query,				     r.length + (tcp ? 2 : 0));	if (result != ISC_R_SUCCESS)		goto cleanup;	if (tcp)		isc_buffer_putuint16(request->query, (isc_uint16_t)r.length);	result = isc_buffer_copyregion(request->query, &r);	if (result != ISC_R_SUCCESS)		goto cleanup;	/* Add message ID. */	isc_buffer_usedregion(request->query, &r);	if (tcp)		isc_region_consume(&r, 2);	r.base[0] = (id>>8) & 0xff;	r.base[1] = id & 0xff;	LOCK(&requestmgr->lock);	if (requestmgr->exiting) {		UNLOCK(&requestmgr->lock);		result = ISC_R_SHUTTINGDOWN;		goto cleanup;	}	requestmgr_attach(requestmgr, &request->requestmgr);	request->hash = mgr_gethash(requestmgr);	ISC_LIST_APPEND(requestmgr->requests, request, link);	UNLOCK(&requestmgr->lock);	result = set_timer(request->timer, timeout, tcp ? 0 : udptimeout);	if (result != ISC_R_SUCCESS)		goto unlink;	request->destaddr = *destaddr;	if (tcp) {		result = isc_socket_connect(socket, destaddr, task,					    req_connected, request);		if (result != ISC_R_SUCCESS)			goto unlink;		request->flags |= DNS_REQUEST_F_CONNECTING|DNS_REQUEST_F_TCP;	} else {		result = req_send(request, task, destaddr);		if (result != ISC_R_SUCCESS)			goto unlink;	}	req_log(ISC_LOG_DEBUG(3), "dns_request_createraw: request %p",		request);	*requestp = request;	return (ISC_R_SUCCESS); unlink:	LOCK(&requestmgr->lock);	ISC_LIST_UNLINK(requestmgr->requests, request, link);	UNLOCK(&requestmgr->lock); cleanup:	if (tclone != NULL)		isc_task_detach(&tclone);	req_destroy(request);	req_log(ISC_LOG_DEBUG(3), "dns_request_createraw: failed %s",		dns_result_totext(result));	return (result);}isc_result_tdns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,		   isc_sockaddr_t *address, unsigned int options,		   dns_tsigkey_t *key,		   unsigned int timeout, isc_task_t *task,		   isc_taskaction_t action, void *arg,		   dns_request_t **requestp){	return (dns_request_createvia3(requestmgr, message, NULL, address,				       options, key, timeout, 0, 0, task,				       action, arg, requestp));}isc_result_tdns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,		      isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,		      unsigned int options, dns_tsigkey_t *key,		      unsigned int timeout, isc_task_t *task,		      isc_taskaction_t action, void *arg,		      dns_request_t **requestp){	return(dns_request_createvia3(requestmgr, message, srcaddr, destaddr,				      options, key, timeout, 0, 0, task,				      action, arg, requestp));}isc_result_tdns_request_createvia2(dns_requestmgr_t *requestmgr, dns_message_t *message,		       isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,		       unsigned int options, dns_tsigkey_t *key,		       unsigned int timeout, unsigned int udptimeout,		       isc_task_t *task, isc_taskaction_t action, void *arg,		       dns_request_t **requestp){	unsigned int udpretries = 0;	if (udptimeout != 0)		udpretries = timeout / udptimeout;	return (dns_request_createvia3(requestmgr, message, srcaddr, destaddr,				       options, key, timeout, udptimeout,				       udpretries, task, action, arg,				       requestp));}					isc_result_tdns_request_createvia3(dns_requestmgr_t *requestmgr, dns_message_t *message,		       isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,		       unsigned int options, dns_tsigkey_t *key,		       unsigned int timeout, unsigned int udptimeout,		       unsigned int udpretries, isc_task_t *task,		       isc_taskaction_t action, void *arg,		       dns_request_t **requestp){	dns_request_t *request = NULL;	isc_task_t *tclone = NULL;	isc_socket_t *socket = NULL;	isc_result_t result;	isc_mem_t *mctx;	dns_messageid_t	id;	isc_boolean_t tcp;	isc_boolean_t setkey = ISC_TRUE;	REQUIRE(VALID_REQUESTMGR(requestmgr));	REQUIRE(message != NULL);	REQUIRE(destaddr != NULL);	REQUIRE(task != NULL);	REQUIRE(action != NULL);	REQUIRE(requestp != NULL && *requestp == NULL);	REQUIRE(timeout > 0);	if (srcaddr != NULL) 		REQUIRE(isc_sockaddr_pf(srcaddr) == isc_sockaddr_pf(destaddr));	mctx = requestmgr->mctx;	req_log(ISC_LOG_DEBUG(3), "dns_request_createvia");	if (isblackholed(requestmgr->dispatchmgr, destaddr))		return (DNS_R_BLACKHOLED);	request = NULL;	result = new_request(mctx, &request);	if (result != ISC_R_SUCCESS)		return (result);	if (udptimeout == 0 && udpretries != 0) {		udptimeout = timeout / (udpretries + 1);		if (udptimeout == 0)			udptimeout = 1;	}	request->udpcount = udpretries;	/*	 * Create timer now.  We will set it below once.	 */	result = isc_timer_create(requestmgr->timermgr, isc_timertype_inactive,				  NULL, NULL, task, req_timeout, request,				  &request->timer);	if (result != ISC_R_SUCCESS)		goto cleanup;	request->event = (dns_requestevent_t *)		isc_event_allocate(mctx, task, DNS_EVENT_REQUESTDONE,				   action, arg, sizeof(dns_requestevent_t));	if (request->event == NULL) {		result = ISC_R_NOMEMORY;		goto cleanup;	}	isc_task_attach(task, &tclone);	request->event->ev_sender = task;	request->event->request = request;	request->event->result = ISC_R_FAILURE;	if (key != NULL)		dns_tsigkey_attach(key, &request->tsigkey); use_tcp:	tcp = ISC_TF((options & DNS_REQUESTOPT_TCP) != 0);	result = get_dispatch(tcp, requestmgr, srcaddr, destaddr,			      &request->dispatch);	if (result != ISC_R_SUCCESS)		goto cleanup;	socket = dns_dispatch_getsocket(request->dispatch);	INSIST(socket != NULL);	result = dns_dispatch_addresponse(request->dispatch, destaddr, task,					  req_response, request, &id,					  &request->dispentry);	if (result != ISC_R_SUCCESS)		goto cleanup;	message->id = id;	if (setkey) {		result = dns_message_settsigkey(message, request->tsigkey);		if (result != ISC_R_SUCCESS)			goto cleanup;	}	result = req_render(message, &request->query, options, mctx);	if (result == DNS_R_USETCP &&	    (options & DNS_REQUESTOPT_TCP) == 0) {		/*		 * Try again using TCP.		 */		dns_message_renderreset(message);		dns_dispatch_removeresponse(&request->dispentry, NULL);		dns_dispatch_detach(&request->dispatch);		socket = NULL;		options |= DNS_REQUESTOPT_TCP;		setkey = ISC_FALSE;		goto use_tcp;	}	if (result != ISC_R_SUCCESS)		goto cleanup;	result = dns_message_getquerytsig(message, mctx, &request->tsig);	if (result != ISC_R_SUCCESS)		goto cleanup;	LOCK(&requestmgr->lock);	if (requestmgr->exiting) {		UNLOCK(&requestmgr->lock);		result = ISC_R_SHUTTINGDOWN;

⌨️ 快捷键说明

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