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

📄 lookup.c

📁 This a good VPN source
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* okay, so look this new thing up */			success = lwres_getrrsetbyname_init(cname_buf, dns_rdataclass_in,					    dl->wantedtype, 0 /*flags*/,					    gs->lwctx, &dl->las);	if(success != ERRSET_SUCCESS) {		return;	}	lwres_getrrsetbyname_xmit(gs->lwctx, &dl->las);	dl->step = dkl_second;}static void process_step_first(dnskey_glob *gs,			       dnskey_lookup *dl,			       struct rrsetinfo *ans,			       int success,			       int attempt)  /* attempt = 0 first time, 1 after cname */{	char simplebuf[132], typebuf[16];	char txtbuf[1024];	unsigned int i;	switch(success) {	case ERRSET_NODATA:		if(attempt == 0) {			lwresd_has_spoken = 1;			setup_follow_possible_cname(gs, dl);			dl->step = dkl_cname;			return;		} 		/* FALLTHROUGH */	case ERRSET_NONAME:		lwresd_has_spoken = 1;		snprintf(simplebuf, sizeof(simplebuf),			 "RR of type %s for %s was not found",			 dl->wantedtype_name,			 dl->fqdn);		output_transaction_line(gs, dl->tracking_id, 0, "RETRY", 					simplebuf);		dl->step = dkl_done;		goto done;			case ERRSET_NOMEMORY:		snprintf(simplebuf, sizeof(simplebuf),			 "ran out of memory while looking up RR of type %s for %s",			 dl->wantedtype_name, dl->fqdn);		output_transaction_line(gs, dl->tracking_id, 0, "FATAL", simplebuf);		dl->step = dkl_done;		goto done;	case ERRSET_FAIL:		snprintf(simplebuf, sizeof(simplebuf),			 "unspecified failure while looking up RR of type %s for %s%s",			 dl->wantedtype_name, dl->fqdn,			 lwresd_has_spoken ? "" : " (is lwresd running?)");		output_transaction_line(gs, dl->tracking_id, 0, "FATAL", simplebuf);		dl->step = dkl_done;		goto done;			case ERRSET_INVAL:		snprintf(simplebuf, sizeof(simplebuf),			 "invalid input while looking up RR of type %s for %s",			 dl->wantedtype_name, dl->fqdn);		output_transaction_line(gs, dl->tracking_id, 0, "RETRY", simplebuf);		dl->step = dkl_done;		goto done;	default:		snprintf(simplebuf, sizeof(simplebuf), " unknown error %d", success);		output_transaction_line(gs, dl->tracking_id, 0, "RETRY", simplebuf);		dl->step = dkl_done;	done:		return;			case 0:		/* everything okay */		lwresd_has_spoken = 1;		dl->step = dkl_done;		break;	}	/* output the rest of the data */	if(ans->rri_flags & RRSET_VALIDATED) {		output_transaction_line(gs, dl->tracking_id, 0, "DNSSEC", "OKAY");		snprintf(typebuf, sizeof(typebuf), "AD-%s", dl->wantedtype_name);		if(dl->wantedtype_name) free(dl->wantedtype_name);		dl->wantedtype_name=xstrdup(typebuf);	} else {		output_transaction_line(gs, dl->tracking_id, 0, "DNSSEC", "not present");	}	output_transaction_line(gs, dl->tracking_id, 0, "NAME", ans->rri_name);	for(i=0; i<ans->rri_nrdatas; i++) {		struct rdatainfo *ri = &ans->rri_rdatas[i];		isc_region_t  region;		dns_rdata_t    rd;		isc_buffer_clear(gs->iscbuf);		memset(&region, 0, sizeof(region));		memset(&rd,     0, sizeof(rd));				region.base   =  ri->rdi_data;		region.length =  ri->rdi_length;		if(dl->wantedtype == dns_rdatatype_txt) {			/* special treatment for TXT records */			unsigned int len, rdatalen, totlen;			unsigned char *txtp, *rdata;			txtp     = txtbuf;			totlen   = 0;			rdatalen = ri->rdi_length;			rdata    = ri->rdi_data;			while(rdatalen > 0) {				len= (unsigned)rdata[0];				memcpy(txtp, rdata+1, len);				totlen   += len;				txtp     += len;				rdata    += len+1;				rdatalen -= len+1;			}			*txtp = '\0';			output_transaction_line_limited(gs, dl->tracking_id, 0,							dl->wantedtype_name,							totlen, txtbuf);		} else {			dns_rdata_fromregion(&rd, dns_rdataclass_in,					     dl->wantedtype, &region);						if(dns_rdata_totext(&rd, NULL, gs->iscbuf) != ISC_R_SUCCESS) {			}						output_transaction_line_limited(gs, dl->tracking_id, 0,							dl->wantedtype_name,					(int)isc_buffer_usedlength(gs->iscbuf),					(char *)isc_buffer_base(gs->iscbuf));		}	}			for(i=0; i<ans->rri_nsigs; i++) {		struct rdatainfo *ri = &ans->rri_sigs[i];		isc_region_t  region;		dns_rdata_t    rd;		isc_buffer_clear(gs->iscbuf);		memset(&region, 0, sizeof(region));		memset(&rd,     0, sizeof(rd));				region.base   =  ri->rdi_data;		region.length =  ri->rdi_length;		dns_rdata_fromregion(&rd, dns_rdataclass_in,				     dns_rdatatype_sig, &region);		if(dns_rdata_totext(&rd, NULL, gs->iscbuf) != ISC_R_SUCCESS) {			output_transaction_line(gs, dl->tracking_id, 0, "FATAL", "isc totext error");			return;		}				output_transaction_line_limited(gs, dl->tracking_id, 0, "SIG",					(int)isc_buffer_usedlength(gs->iscbuf),					(char *)isc_buffer_base(gs->iscbuf));	}}	static void lookup_step(dnskey_glob *gs,			dnskey_lookup *dl,			struct rrsetinfo *ans,			int success){	/* char simplebuf[80]; */	int  nextstate;	nextstate = dkl_done;	if(dl == NULL)	{		return;	}	switch(dl->step)	{	case dkl_start:		/* first request done, why are still in this state? */		break;	case dkl_first:		/* okay, got the reply from the first step! */		process_step_first(gs, dl, ans, success, 0);		nextstate = dl->step;		break;			case dkl_cname:		/*		 * we asked for a cname, and we have some result to deal		 * with here.		 */		process_step_cname(gs, dl, ans, success);		nextstate = dl->step;		break;	case dkl_second:		/*		 * we had asked for something, for a cname, and we followed		 * it, and we'll see what we got back.		 */		process_step_first(gs, dl, ans, success, 1);		nextstate = dl->step;		break;	case dkl_done:		/* this should not happen, really, just book keeping, so,		 * just free up the structure, and return.		 */		nextstate = dl->step;		return;	}	/* we have been through, made a state transition, if we are	 * done, then do that.	 */	if(nextstate == dkl_done)	{		output_transaction_line(gs, dl->tracking_id, 0, "DONE", NULL);		free_dl(gs, dl);		dl=NULL;	}	return;}void dns_rexmit(dnskey_glob *gs, dnskey_lookup *dl, int force){	time_t now;	int ret;	time(&now);	if(!force) {		if(dl->resend_time==0 || dl->resend_time > now)		{			return;		}	}	dl->retry_count--;	if(dl->retry_count > 0) {		dl->resend_time = now + LWDNSQ_RETRANSMIT_INTERVAL;		output_transaction_line(gs, dl->tracking_id, 0, "TIMEOUT", "");		ret = lwres_getrrsetbyname_xmit(gs->lwctx, &dl->las);		if(ret != ERRSET_SUCCESS) {			output_transaction_line(gs, dl->tracking_id, 0, "FATAL write failed", "");		}				} else {		output_transaction_line(gs, dl->tracking_id, 0, "FATAL", "too many retries");		free_dl(gs, dl);	}}void process_dns_reply(dnskey_glob *gs){  dnskey_lookup *dl;  struct lwres_async_state *plas;  struct rrsetinfo *res;  int success;  plas = NULL;  success = lwres_getrrsetbyname_read(&plas, gs->lwctx, &res);  /* cast answer back to dnskey_lookup structure */  dl = (dnskey_lookup *)plas;  if(dl == NULL) {	  return;  }  if(dl!= NULL && success == LWRES_R_RETRY) {	  /* XXX we got something from some other weird place!	   * transmit again, in the hope of getting the right answer	   */	  dns_rexmit(gs, dl, 1);	  return;  }  /* perform next step for this one */  lookup_step(gs, dl, res, success);}	/* * $Log: lookup.c,v $ * Revision 1.8  2004/12/02 06:16:19  mcr * 	fixed long standing bug with async resolver when there was * 	more than one outstanding request. * * Revision 1.7  2003/12/24 19:47:30  mcr * 	added "FATAL" prefix for the failure to write. * * Revision 1.6  2003/12/02 04:34:09  mcr * 	if lwresd does not start early enough, then the request is * 	lost and never retransmitted. This version can now deal with * 	named being slow to start, or taking along time to verify * 	DNSSEC signatures. * 	This also fixes the non-concurrent stuff. * * Revision 1.5  2003/12/01 21:45:17  mcr * 	the lwctx structure needs to be properly initialized. * 	the lwdnsq program needs to have the --serial option finished, * 	and a retransmitter installed. * * Revision 1.4  2003/09/19 02:56:11  mcr * 	fixes to make lwdnsq compile with strictest compile flags. * * Revision 1.3  2003/09/18 02:17:39  mcr * 	if we have tried a CNAME lookup, then take a NODATA * 	reply as a no-name. * * Revision 1.2  2003/09/10 17:55:14  mcr * 	the CNAME message had the s removed, which changes test * 	results gratuitously. * * Revision 1.1  2003/09/03 01:13:24  mcr * 	first attempt at async capable lwdnsq. * * * Local variables: * c-file-style: "linux" * c-basic-offset: 2 * End: * */

⌨️ 快捷键说明

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