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 + -
显示快捷键?