亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? domain.c

?? TCP_IPprotocol.rar
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 *	DOMAIN.C -- domain name system stub resolver
 */

#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <sys/stat.h>
#include "global.h"
#include "mbuf.h"
#include "proc.h"
#include "ip.h"
#include "netuser.h"
#include "session.h"
#include "socket.h"
#include "cmdparse.h"
#include "commands.h"
#include "files.h"
#include "main.h"
#include "domain.h"

#undef	DEBUG				/* for certain trace messages */
#undef	DEBUG_PAIN			/* for painful debugging */

static struct rr *Dcache = NULL;	/* Cache of resource records */
static int Dcache_size = 20;		/* size limit */
static time_t Dcache_time = 0L; 	/* timestamp */

static int Dfile_clean = FALSE; 	/* discard expired records (flag) */
static int Dfile_reading = 0;		/* read interlock (count) */
static int Dfile_writing = 0;		/* write interlock (count) */

struct proc *Dfile_updater = NULL;
static int32 Dfile_wait_absolute = 0L;	/* timeout Clock time */
static int Dfile_wait_relative = 300;	/* timeout file activity (seconds) */

static struct dserver *Dservers = NULL; /* List of potential servers */
static int Dserver_retries = 2;		/* Attempts to reach servers */

static char *Dsuffix = NULL;	/* Default suffix for names without periods */
static int Dtrace = FALSE;
static char *Dtypes[] = {
	"",
	"A",
	"NS",
	"MD",
	"MF",
	"CNAME",
	"SOA",
	"MB",
	"MG",
	"MR",
	"NULL",
	"WKS",
	"PTR",
	"HINFO",
	"MINFO",
	"MX",
	"TXT"
};
static int Ndtypes = 17;
static char delim[] = " \t\r\n";

static int docache(int argc,char *argv[],void *p);
static int dosuffix(int argc,char *argv[],void *p);

static int docacheclean(int argc,char *argv[],void *p);
static int docachelist(int argc,char *argv[],void *p);
static int docachesize(int argc,char *argv[],void *p);
static int docachewait(int argc,char *argv[],void *p);

static void dlist_add(struct dserver *dp);
static void dlist_drop(struct dserver *dp);
static int dodnsadd(int argc,char *argv[],void *p);
static int dodnsdrop(int argc,char *argv[],void *p);
static int dodnslist(int argc,char *argv[],void *p);
static int dodnsquery(int argc,char *argv[],void *p);
static int dodnsretry(int argc,char *argv[],void *p);
static int dodnstrace(int argc,char *argv[],void *p);

static char * dtype(int value);
static int check_ttl(struct rr *rrlp);
static int compare_rr(struct rr *search_rrp,struct rr *target_rrp);
static int compare_rr_list(struct rr *rrlp,struct rr *target_rrp);
static struct rr *copy_rr(struct rr *rrp);
static struct rr *copy_rr_list(struct rr *rrlp);
static struct rr *make_rr(int source,
	char *dname,uint16 class,uint16 type,int32 ttl,uint16 rdl,void *data);

static void dcache_add(struct rr *rrlp);
static void dcache_drop(struct rr *rrp);
static struct rr *dcache_search(struct rr *rrlp);
static void dcache_update(struct rr *rrlp);

static struct rr *get_rr(FILE *fp, struct rr *lastrrp);
static void put_rr(FILE *fp,struct rr *rrp);
static struct rr *dfile_search(struct rr *rrlp);
static void dfile_update(int s,void *unused,void *p);

static void dumpdomain(struct dhdr *dhp,int32 rtt);
static int dns_makequery(uint16 op,struct rr *rrp,
	uint8 *buffer,uint16 buflen);
static int dns_query(struct rr *rrlp);

static int isaddr(char *s);
static char *checksuffix(char *dname);
static struct rr *resolver(struct rr *rrlp);


/**
 **	Domain Resolver Commands
 **/

static struct cmds Dcmds[] = {
	"addserver",	dodnsadd,	0, 2, "add <hostid>",
	"dropserver",	dodnsdrop,	0, 2, "drop <hostid>",
	"list",		dodnslist,	0, 0, NULL,
	"query",	dodnsquery,   512, 2, "query <hostid>",
	"retry",	dodnsretry,	0, 0, NULL,
	"suffix",	dosuffix,	0, 0, NULL,
	"trace",	dodnstrace,	0, 0, NULL,
	"cache",	docache,	0, 0, NULL,
	NULL,
};

static struct cmds Dcachecmds[] = {
	"clean",	docacheclean,	0, 0, NULL,
	"list",		docachelist,  512, 0, NULL,
	"size",		docachesize,	0, 0, NULL,
	"wait",		docachewait,	0, 0, NULL,
	NULL,
};

int
dodomain(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return subcmd(Dcmds,argc,argv,p);
}

static int
docache(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return subcmd(Dcachecmds,argc,argv,p);
}

static int
dosuffix(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	if(argc < 2){
		if(Dsuffix != NULL)
			printf("%s\n",Dsuffix);
		return 0;
	}
	free(Dsuffix);
	Dsuffix = strdup(argv[1]);
	return 0;
}

static int
docacheclean(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setbool( &Dfile_clean, "discard expired records", argc,argv );
}

static int
docachelist(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct rr *rrp;
	struct session *sp;
	int row = 25;

	if((sp = newsession(Cmdline,DCLIST,1)) == NULL){
		return -1;
	}

	(void)dcache_search(NULL); /* update ttl */

	/* Put tty into raw mode so single-char responses will work */
	sp->ttystate.echo = sp->ttystate.edit = 0;

	for(rrp=Dcache;rrp!=NULL;rrp=rrp->next)
	{
		put_rr(stdout,rrp);
		if(--row == 0){
			row = keywait("--More--",0);
			switch(row){
			case -1:
			case 'q':
			case 'Q':
				rrp = NULL;
				break;
			case '\n':
			case '\r':
				row = 1;
				break;
			case ' ':
			default:
				row = 25;
			};
		}
	}
	fflush(stdout);
	keywait(NULL,1);
	freesession(sp);
	return 0;
}

static int
docachesize(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	int newsize;
	int oldsize;
	int result;

	newsize = oldsize = Dcache_size;
	result = setint( &newsize, "memory cache size", argc,argv );

	if(newsize > 0){
		Dcache_size = newsize;
		if(newsize < oldsize){
			(void)dcache_search(NULL); /* update size */
		}
	}
	return result;
}

static int
docachewait(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setint( &Dfile_wait_relative, "time before file update (seconds)", argc,argv );
}

static void
dlist_add(dp)
register struct dserver *dp;
{
	dp->prev = NULL;
	dp->next = Dservers;
	if(Dservers != NULL)
		Dservers->prev = dp;
	Dservers = dp;
}

static void
dlist_drop(dp)
register struct dserver *dp;
{
	if(dp->prev != NULL)
		dp->prev->next = dp->next;
	else
		Dservers = dp->next;
	if(dp->next != NULL)
		dp->next->prev = dp->prev;
}

static int
dodnsadd(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	int32 address;

	if((address = resolve(argv[1])) == 0L){
		printf("Resolver %s unknown\n",argv[1]);
		return 1;
	}
	return add_nameserver(address);
}
int
add_nameserver(address)
int32 address;
{
	struct dserver *dp;

	dp = (struct dserver *)callocw(1,sizeof(struct dserver));
	dp->address = address;
	dp->srtt = INITRTT;
	dp->mdev = 0;
	dp->timeout = 2 * dp->mdev + dp->srtt + 3;
	dlist_add(dp);
	return 0;
}

static int
dodnsdrop(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct dserver *dp;
	int32 addr;

	addr = resolve(argv[1]);
	for(dp = Dservers;dp != NULL;dp = dp->next)
		if(addr == dp->address)
			break;

	if(dp == NULL){
		printf("Not found\n");
		return 1;
	}

	dlist_drop(dp);
	free(dp);
	return 0;
}

static int
dodnslist(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	register struct dserver *dp;

	printf("Server address          srtt    mdev   timeout   queries responses\n");
	for(dp = Dservers;dp != NULL;dp = dp->next){
		printf("%-20s%8lu%8lu%10lu%10lu%10lu\n",
		 inet_ntoa(dp->address),
		 dp->srtt,dp->mdev,dp->timeout,
		 dp->queries,dp->responses);
	}
	return 0;
}

static int
dodnsquery(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct rr *rrp;
	struct rr *result_rrlp;
	char *sname;
	struct session *sp;
	int row = 25;

	if((sp = newsession(Cmdline,DQUERY,1)) == NULL){
		return -1;
	}

	if ( isaddr( argv[1] ) ) {
		result_rrlp = inverse_a( aton( argv[1] ) );
	} else {
		sname = checksuffix( argv[1] );
		rrp = make_rr(RR_QUERY,sname,CLASS_IN,TYPE_ANY,0,0,NULL);
		FREE(sname);

		dns_query(rrp);
		result_rrlp = dcache_search(rrp);
		free_rr(rrp);
	}

	/* Put tty into raw mode so single-char responses will work */
	sp->ttystate.echo = sp->ttystate.edit = 0;

	for( rrp=result_rrlp; rrp!=NULL; rrp=rrp->next)
	{
		put_rr(stdout,rrp);
		if(--row == 0){
			row = keywait("--More--",0);
			switch(row){
			case -1:
			case 'q':
			case 'Q':
				rrp = NULL;
				break;
			case '\n':
			case '\r':
				row = 1;
				break;
			case ' ':
			default:
				row = 25;
			};
		}
	}
	fflush(stdout);
	free_rr(result_rrlp);
	keywait(NULL,1);
	freesession(sp);
	return 0;
}

static int
dodnsretry(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setint( &Dserver_retries, "server retries", argc,argv );
}

static int
dodnstrace(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setbool(&Dtrace,"server trace",argc,argv);
}


/**
 **	Domain Resource Record Utilities
 **/

static char *
dtype(value)
int value;
{
	static char buf[10];

	if (value < Ndtypes)
		return Dtypes[value];

	sprintf( buf, "{%d}", value);
	return buf;
}

/* check list of resource records for any expired ones.
 * returns number of expired records.
 */
static int
check_ttl(rrlp)
register struct rr *rrlp;
{
	int count = 0;

	while(rrlp != NULL){
		if(rrlp->ttl == 0L)
			count++;
		rrlp = rrlp->next;
	}
	return count;
}

/* Compare two resource records.
 * returns 0 if match, nonzero otherwise.
 */
static int
compare_rr(search_rrp,target_rrp)
register struct rr *search_rrp,*target_rrp;
{
	int i;

	if(search_rrp == NULL || target_rrp == NULL)
		return -32765;

	if(search_rrp->class != target_rrp->class)
		return -32763;

	if(search_rrp->type != TYPE_ANY
	&& search_rrp->type != target_rrp->type
	&& (search_rrp->source != RR_QUERY
	 || (target_rrp->type != TYPE_CNAME
	  && target_rrp->type != TYPE_PTR)))
		return -32761;

	if(search_rrp->source != RR_INQUERY){
		if((i = strlen(search_rrp->name)) != strlen(target_rrp->name))
			return -32759;
		if((i = strnicmp(search_rrp->name,target_rrp->name,i)) != 0)
			return i;

		/* match negative records so that they are replaced */
		if(target_rrp->rdlength == 0)
			return 0;
	}

	/* if a query has gotten this far, match it */
	if(search_rrp->source == RR_QUERY)
		return 0;

	/* ensure negative records don't replace older records */
	if(search_rrp->rdlength == 0)
		return -32757;

	/* match expired records so that they are replaced */
	if(search_rrp->source != RR_INQUERY){
		if(target_rrp->ttl == 0L)
			return 0;
	}

	/* Note: rdlengths are not compared because they vary depending
	 * on the representation (ASCII or encoded) this record was
	 * generated from.
	 */

	switch(search_rrp->type){
	case TYPE_A:
		i = search_rrp->rdata.addr != target_rrp->rdata.addr;
		break;
	case TYPE_CNAME:
	case TYPE_MB:
	case TYPE_MG:
	case TYPE_MR:
	case TYPE_NS:
	case TYPE_PTR:
	case TYPE_TXT:
		i = stricmp(search_rrp->rdata.data,target_rrp->rdata.data);
		break;
	case TYPE_HINFO:
		i = strcmp(search_rrp->rdata.hinfo.cpu,target_rrp->rdata.hinfo.cpu) ||
			strcmp(search_rrp->rdata.hinfo.os,target_rrp->rdata.hinfo.os);
		break;
	case TYPE_MX:
		i = stricmp(search_rrp->rdata.mx.exch,target_rrp->rdata.mx.exch);
		break;
	case TYPE_SOA:
		i = search_rrp->rdata.soa.serial != target_rrp->rdata.soa.serial;
		break;
	default:
		i = -32755;	/* unsupported */
	}
	return i;
}

static int
compare_rr_list(rrlp,target_rrp)
register struct rr *rrlp,*target_rrp;
{
	while(rrlp != NULL){
		if(compare_rr(rrlp,target_rrp) == 0)
			return 0;
#ifdef DEBUG_PAIN
		if(Dtrace)
			printf("%15d %s\n",
				compare_rr(rrlp,target_rrp),
				target_rrp->name);
#endif
		rrlp = rrlp->next;
	}
	return -32767;
}

/* Make a new copy of a resource record */
static struct rr *
copy_rr(rrp)
register struct rr *rrp;
{
	register struct rr *newrr;

	if(rrp == NULL)
		return NULL;

	newrr = (struct rr *)callocw(1,sizeof(struct rr));
	newrr->source =	rrp->source;
	newrr->name =	strdup(rrp->name);
	newrr->type =	rrp->type;
	newrr->class =	rrp->class;
	newrr->ttl =	rrp->ttl;
	if((newrr->rdlength = rrp->rdlength) == 0)
		return newrr;

	switch(rrp->type){
	case TYPE_A:
		newrr->rdata.addr = rrp->rdata.addr;
		break;
	case TYPE_CNAME:
	case TYPE_MB:
	case TYPE_MG:
	case TYPE_MR:
	case TYPE_NS:
	case TYPE_PTR:
	case TYPE_TXT:
		newrr->rdata.name = strdup(rrp->rdata.name);
		break;
	case TYPE_HINFO:
		newrr->rdata.hinfo.cpu = strdup(rrp->rdata.hinfo.cpu);
		newrr->rdata.hinfo.os = strdup(rrp->rdata.hinfo.os);
		break;
	case TYPE_MX:
		newrr->rdata.mx.pref = rrp->rdata.mx.pref;
		newrr->rdata.mx.exch = strdup(rrp->rdata.mx.exch);
		break;
	case TYPE_SOA:
		newrr->rdata.soa.mname = 	strdup(rrp->rdata.soa.mname);
		newrr->rdata.soa.rname = 	strdup(rrp->rdata.soa.rname);
		newrr->rdata.soa.serial = 	rrp->rdata.soa.serial;
		newrr->rdata.soa.refresh = 	rrp->rdata.soa.refresh;
		newrr->rdata.soa.retry = 	rrp->rdata.soa.retry;
		newrr->rdata.soa.expire = 	rrp->rdata.soa.expire;
		newrr->rdata.soa.minimum = 	rrp->rdata.soa.minimum;
		break;
	}
	return newrr;
}

static struct rr *
copy_rr_list(rrlp)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品丝袜久久久中文字幕| 亚洲人成小说网站色在线 | 精品美女在线播放| k8久久久一区二区三区| 日韩成人免费电影| 亚洲四区在线观看| 欧美videossexotv100| 欧美综合欧美视频| 99re8在线精品视频免费播放| 久久国产免费看| 午夜精品福利视频网站| 国产精品久久久久天堂| 久久这里只有精品首页| 国产精品18久久久久| 伊人夜夜躁av伊人久久| 国产亚洲欧美色| 精品国产91亚洲一区二区三区婷婷 | 欧美美女视频在线观看| 久久婷婷成人综合色| 欧美精品在线视频| 色婷婷综合激情| aaa欧美色吧激情视频| 国产一区二区三区久久久| 青青草国产精品97视觉盛宴 | 国产高清不卡二三区| 日韩avvvv在线播放| 香蕉久久一区二区不卡无毒影院| 国产精品污污网站在线观看| 久久精品亚洲国产奇米99| 精品国产精品网麻豆系列| 日韩一本二本av| 91麻豆精品国产91久久久久久 | 国产精品亚洲午夜一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 视频一区欧美精品| 亚洲成va人在线观看| 亚洲一区二区三区三| 亚洲午夜久久久| 亚洲午夜激情网站| 亚洲超碰精品一区二区| 日日夜夜精品视频天天综合网| 亚洲成人7777| 午夜精品久久久久久久99水蜜桃| 亚洲国产精品影院| 水野朝阳av一区二区三区| 青青草国产精品亚洲专区无| 久久国产尿小便嘘嘘尿| 精品中文av资源站在线观看| 国产精品一区二区黑丝| 成人小视频免费在线观看| 成人动漫一区二区| 色一情一乱一乱一91av| 欧美日韩一级大片网址| 欧美一区二区三区免费视频| 精品久久人人做人人爽| 久久久久久亚洲综合影院红桃| 日本一区二区成人| 亚洲免费在线看| 性欧美疯狂xxxxbbbb| 免费看欧美美女黄的网站| 激情综合五月天| 国产999精品久久久久久绿帽| 91一区二区三区在线观看| 欧美婷婷六月丁香综合色| 日韩午夜精品电影| 久久视频一区二区| **欧美大码日韩| 午夜精品在线看| 国内精品在线播放| 91麻豆免费在线观看| 欧美一区二区视频观看视频| 国产网站一区二区三区| 高清在线不卡av| 在线亚洲免费视频| 精品免费视频一区二区| 中文字幕在线观看一区| 日韩激情一区二区| 国产成人aaa| 欧美老人xxxx18| 久久九九国产精品| 亚洲综合色视频| 国产精品一区二区久激情瑜伽| 91福利视频久久久久| 日韩一级视频免费观看在线| 国产精品久久毛片av大全日韩| 亚洲国产wwwccc36天堂| 国产乱人伦偷精品视频不卡 | 亚洲国产精华液网站w| 洋洋av久久久久久久一区| 精品一区二区三区视频| 91国产丝袜在线播放| 精品国产三级a在线观看| 亚洲精品视频在线观看免费| 激情五月婷婷综合| 欧美亚男人的天堂| 国产精品嫩草99a| 蜜桃在线一区二区三区| 色偷偷久久一区二区三区| 久久综合99re88久久爱| 五月天激情综合网| 91视频在线观看| 久久久国际精品| 美女视频黄久久| 精品视频999| 成人欧美一区二区三区| 国产一区二区女| 欧美日韩在线三级| 亚洲啪啪综合av一区二区三区| 国产精品99精品久久免费| 欧美一区二区三区系列电影| 一区二区三区欧美| av午夜一区麻豆| 中文字幕第一页久久| 精品综合久久久久久8888| 6080午夜不卡| 亚洲一区在线视频| 色婷婷精品久久二区二区蜜臀av| 中文字幕av一区二区三区高 | 亚洲成av人片一区二区| 一本大道av伊人久久综合| 中文字幕不卡的av| 国产精品一区二区不卡| 精品成人一区二区| 美女在线视频一区| 在线成人免费视频| 性欧美疯狂xxxxbbbb| 欧美日韩一级片在线观看| 亚洲专区一二三| 在线观看区一区二| 亚洲女人的天堂| 91精彩视频在线观看| 中文字幕一区视频| av综合在线播放| 亚洲三级电影全部在线观看高清| www.日韩av| 亚洲欧美色一区| 色综合激情久久| 亚洲成人自拍网| 91精品欧美久久久久久动漫| 免费成人在线播放| 日韩欧美在线1卡| 麻豆91免费观看| xf在线a精品一区二区视频网站| 色狠狠综合天天综合综合| 国产精品女主播av| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | www.亚洲色图.com| 中文字幕一区二区三区不卡| 不卡的av中国片| 亚洲激情欧美激情| 欧美日韩日本视频| 久久精品国产一区二区| 久久色中文字幕| 99re这里只有精品首页| 亚洲卡通欧美制服中文| 欧美日韩精品免费| 蜜臀久久99精品久久久画质超高清 | 欧美高清www午色夜在线视频| 秋霞成人午夜伦在线观看| 久久美女艺术照精彩视频福利播放 | 精品日韩一区二区| 成人综合在线观看| 伊人色综合久久天天人手人婷| 国产在线一区观看| ●精品国产综合乱码久久久久| 91免费国产在线| 日韩成人伦理电影在线观看| 2021国产精品久久精品| 91在线云播放| 日韩高清电影一区| 国产日韩一级二级三级| 在线精品视频小说1| 蓝色福利精品导航| 国产精品视频观看| 91精品国产综合久久精品| 国产精品888| 亚洲午夜久久久久中文字幕久| 精品欧美一区二区三区精品久久| av一区二区三区黑人| 天涯成人国产亚洲精品一区av| 国产日韩综合av| 欧美日韩亚洲高清一区二区| 国产在线看一区| 亚洲国产精品久久一线不卡| 国产亚洲1区2区3区| 欧美婷婷六月丁香综合色| 制服丝袜成人动漫| 91亚洲午夜精品久久久久久| 久久精品国产成人一区二区三区| 亚洲欧洲无码一区二区三区| 日韩一区二区不卡| 日本久久一区二区三区| 国内精品第一页| 丝瓜av网站精品一区二区| 国产精品福利一区| 国产91精品露脸国语对白| 成人免费在线播放视频| 亚洲精品在线一区二区| 欧美性一二三区| av一区二区三区黑人|