dns_master.c

来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 721 行 · 第 1/2 页

C
721
字号
	}	if (tcp != TCP_ONLY)	query_services(name, junk["HOSTADDRESS"], junk["PORTUDP"], tcp);}void zap_mud_info(string name, mapping junk){	map_delete(muds, name);	map_delete(mud_svc, name);}void support_q_callback(mapping info){	string cmd;	string mud;		if (!ACCESS_CHECK(previous_object()))	return;		if (!info || !info["CMD"] || !info["NAME"] || !strlen(info["CMD"])	||   !strlen(info["NAME"]))	return;		mud = htonn( info["NAME"] );		if (undefinedp(muds[mud]))	return;		if (undefinedp(mud_svc[mud])) mud_svc[mud] = ([]);		if(!info["SUPPORTED"] && !info["NOTSUPPORTED"])	return;		if (info["CMD"] == "tcp")	{		cmd = info["PARAM"];				if (mud_svc[mud][cmd] & (SVC_UDP | SVC_NO_UDP))		mud_svc[mud][cmd] |= SVC_KNOWN;				if (info["SUPPORTED"])		{			mud_svc[mud][cmd] |= SVC_TCP;			mud_svc[mud][cmd] &= ~SVC_NO_TCP;		}		else		{			mud_svc[mud][cmd] |= SVC_NO_TCP;			mud_svc[mud][cmd] &= ~SVC_TCP;						if(!(mud_svc[mud][cmd] & SVC_KNOWN))			SUPPORT_Q->send_support_q(muds[mud]["HOSTADDRESS"],			muds[mud]["PORTUDP"], info["PARAM"]);		}	}	else	{		cmd = info["CMD"];				if (mud_svc[mud][cmd] & (SVC_TCP | SVC_NO_TCP))		mud_svc[mud][cmd] |= SVC_KNOWN;				if (info["SUPPORTED"])		{			mud_svc[mud][cmd] |= SVC_UDP;			mud_svc[mud][cmd] &= ~SVC_NO_UDP;		}		else		{			mud_svc[mud][cmd] |= SVC_NO_UDP;			mud_svc[mud][cmd] &= ~SVC_UDP;						if(!(mud_svc[mud][cmd] & SVC_KNOWN))			SUPPORT_Q->send_support_q(muds[mud]["HOSTADDRESS"],			muds[mud]["PORTUDP"], "tcp", info["CMD"]);		}	}	return;}private voidquery_services(string mud, string address, string port, string tcp){#ifdef PREF_MAIL        if (!(mud_svc[mud]["mail"] & SVC_KNOWN))        {#if PREF_MAIL & SVC_TCP                if (tcp == TCP_SOME && !(mud_svc[mud]["mail"] & (SVC_TCP | SVC_NO_TCP)))        SUPPORT_Q->send_support_q(address, port, "tcp", "mail");#elif PREF_MAIL & SVC_UDP                if (!(mud_svc[mud]["mail"] & (SVC_UDP | SVC_NO_UDP)))        SUPPORT_Q->send_support_q(address, port, "mail");#endif}#endif#ifdef PREF_FINGER  if (!(mud_svc[mud]["finger"] & SVC_KNOWN))    {#if PREF_FINGER & SVC_TCP      if (tcp == TCP_SOME && !(mud_svc[mud]["finger"] & (SVC_TCP | SVC_NO_TCP)))   SUPPORT_Q->send_support_q(address, port, "tcp", "finger");#endif    }#endif#ifdef PREF_TELL  if (!(mud_svc[mud]["tell"] & SVC_KNOWN))    {#if PREF_TELL & SVC_TCP      if (tcp == TCP_SOME && !(mud_svc[mud]["tell"] & (SVC_TCP | SVC_NO_TCP)))   SUPPORT_Q->send_support_q(address, port, "tcp", "tell");#endif    }#endifreturn;}int query_service_method(string mud, string service){	mud = htonn(mud);		if (undefinedp(muds[mud]))	return SVC_UNKNOWN;		if (undefinedp(mud_svc[mud]))	return SVC_TCP | SVC_NO_UDP | SVC_KNOWN;		if (undefinedp(mud_svc[mud][service]))	{		if(member_array(service, STD_SERVICE) != -1)		query_services(mud, muds[mud]["HOSTADDRESS"], muds[mud]["PORTUDP"],		muds[mud]["TCP"]);		return SVC_UNKNOWN;	}	return mud_svc[mud][service];}mapping query_svc_entry(string mud){	return mud_svc[mud];}string get_host_name(string name){	name = htonn(name);		if (name == mud_nname())	return this_host["HOSTADDRESS"];		if (undefinedp(muds[name]))	return 0;		return muds[name]["HOSTADDRESS"];}mapping query_mud_info(string name){	mapping m;	string str;		name = htonn(name);		if(name == mud_nname())	return this_host + ([ "TIME" : ctime(time()) ]) +	(["USERS" : ""+sizeof(users()) ]);	return muds[name];}int dns_mudp(string name){	name = htonn( name );	return undefinedp(mud_svc[name]) ? (name == mud_nname() ? 1 : 0) : 1;}mapping query_muds(){	return muds + ([ mud_nname():this_host+	([ "TIME":ctime(time()) ])+	(["USERS" :""+ sizeof(users()) ]) ]);}mapping query_svc(){	return mud_svc;}varargs int idx_request(function f){	if (file_name(previous_object())[0..strlen(AUX_PATH) - 1] != AUX_PATH)	return 0;		seq_ctr++;	seq_entries[seq_ctr] = ({ geteuid(previous_object()), f, time() });	return seq_ctr;}void idx_callback(int idx, mixed param){	mixed *entry;		if (!ACCESS_CHECK(previous_object()))	return;		if (undefinedp(seq_entries[idx]))	return;		entry = seq_entries[idx];	map_delete(seq_entries, idx);		seteuid(entry[0]);	(*entry[1]) (param);		restore_euid();}void sequence_clean_up(){	int i, now;	int *indexes;		if(find_call_out("sequence_clean_up") != -1)	return;		indexes = keys(seq_entries);	now = time();	i = sizeof(indexes);	while (i--)		if( now - seq_entries[indexes[i]][2] > SERVICE_TIMEOUT )	{		seteuid(seq_entries[indexes[i]][0]);		(*seq_entries[indexes[i]][1]) (0);		restore_euid();		map_delete( seq_entries, indexes[i] );	}	call_out("sequence_clean_up", SEQ_CLEAN_INTERVAL);}#ifdef DEBUGmixed *query_bootsrv(){	return bootsrv;}void dump_sequencer(){	printf("counter: %d\n\n%O\n", seq_ctr, seq_entries);}void dump_svc(){	printf("%O\n", mud_svc);}void dump_mud_keys(){	printf("%O\n", keys(muds));}void dump_svc_keys(){	printf("%O\n", keys(mud_svc));}void set_monitor(object ob){	string euid;		monitor = ob;}object query_monitor(){	return monitor;}#endifprivate void restore_euid(){	seteuid(ROOT_UID);}void aux_log(string file, string entry){	if(!ACCESS_CHECK(previous_object()))	return;		restore_euid();	log_file(file, sprintf("%s: %s\n", ctime(time()), entry));}void aux_warning(string warning){	if(!ACCESS_CHECK(previous_object()))	return;		log("dns_warning: "+warning);}private void log(string entry){	string temp;	log_file(MY_LOG_FILE, sprintf("%s: %s\n", ctime(time()), entry));}void resolve_callback(string address, string my_ip, int key){	this_host["HOSTADDRESS"] = my_ip;}void create(){	mapping static_db;	int i, j;	string *list;	string *strs;	string ip, port, *listkey;	restore_euid();		set("channel_id", "网路精灵(Internet)");		list=values(LISTNODES);	listkey=keys(LISTNODES);		j=sizeof(list);	muds_ip=({});	muds_port=({});	muds_name=({});		if(j>0)	for(i=0;i<j;i++)	{		if(sscanf(list[i], "%s %s", ip, port)==2)		{			muds_ip+=({ip});			muds_port+=({port});			muds_name+=({htonn(listkey[i])});		}	}	my_port = SRVC_PORT_UDP(mud_port());	muds = allocate_mapping(MUDS_ALLOC);	mud_svc = allocate_mapping(MUDS_ALLOC);	seq_ctr = 0;	seq_entries = ([]);	bootsrv = MUDLIST_DNS;	bootsrv_retry = 0;	MUDLIST_A->clear_db_flag();		this_host = ([	"MUDNAME"     : MUD_NAME,	"NAME"        : Mud_name(),	"ALIAS"       : Mud_name(),	"MUDLIB"      : MUDLIB_NAME,	"VERSION"     : MUDLIB_VERSION,	"HOST"        : query_host_name(),	"HOSTADDRESS" : 0, 	"PORT"        : "" + mud_port(),	"PORTUDP"     : "" + my_port,	"TIME"        : ctime(time()),	"TCP"         : TCP_SERVICE_LEVEL,	"USERS"      : ""+sizeof(users()),	]);	resolve(query_host_name(), "resolve_callback");		if (startup_udp()) init_database();}void remove(){	send_shutdown();}int check_mud(string ip, string port, string name){	int i=sizeof(muds_ip);	name=htonn(name);		while(i--)	if(ip==muds_ip[i] &&  (name=="" || name==muds_name[i]))	return 1;	return 0;}

⌨️ 快捷键说明

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