name_server.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 164 行
C
164 行
// File : /adm/daemons/network/name_server.c// Creator : Huthar@Portals|MIRE|TMI|Genocide|OD//// This is the mudlib's name server daemon.// 93-08-09 Grendel made this the auxiliary name server.// 95-06/15 Annihilator@ES2 port this to ES2 mudlib.#include <net/config.h>#include <net/services.h>#include <net/dns.h>#include <net/macros.h> mapping muds;void error(int i,string file, string message);void load_muds();void load_services();mapping query_muds(){ if(geteuid(previous_object()) == ROOT_UID) return muds + ([]);}void create(){ muds = ([ "DEFAULT" : ([]) ]); seteuid(ROOT_UID); load_muds(); load_services();}string get_host_name(string alias){ if(!mapp(muds[alias])) return ""; return muds[alias]["address"];}int get_mudresource(string mud, string resource){ int tmp; if(mud == "DEFAULT" || !mapp(muds[mud])) return 0; if(resource == "DEFAULT") return muds[mud]["port"]; if(muds[mud][resource]) return muds[mud]["port"] + muds[mud][resource]; if(muds["DEFAULT"][resource] >= 10000) return muds["DEFAULT"][resource] - 10000; tmp = muds[mud]["port"] + muds["DEFAULT"][resource]; if(tmp == muds[mud]["port"]) return 0; return tmp;}void load_muds(){ int i; string *line; string md,ad; int pt;// This stuff is commented out, prior to dropping support for TCP style// Intermud/* line = explode(read_file(MUD_ADDRESSES),"\n"); for(i = 0; i < sizeof(line); i++) { if(line[i] == "" || line[i][0] == '#') continue; if(sscanf(line[i],"%s:%s:%d",md,ad,pt) != 3) { error(i,MUD_ADDRESSES,"Syntax Error"); continue; } if(mapp(muds[md])) { error(i,MUD_ADDRESSES,"Duplicate entry for mud: "+md); continue; } muds[md] = ([ "address" : ad, "port" : pt ]); }*/ return ;}// this is used by the dns master to get the static mudsmapping build_static_database(){ int i; string *mud_names; string pt, ad; mapping m; mud_names = keys(muds); i = sizeof(mud_names); m = allocate_mapping(i); while(i--) { ad = muds[mud_names[i]]["address"]; pt = muds[mud_names[i]]["port"]; m[mud_names[i]] = ([ "HOSTADDRESS" : ad, "PORT" : sprintf("%d",pt), "NAME" : nntoh( mud_names[i] ), "TCP" : "only", "ALIAS" : nntoh( mud_names[i] ), "PORTUDP" : sprintf("%d",SRVC_PORT_UDP(pt)) ]); } return m;}void load_services(){ int i; string *line; string md,sv,tmp; int pt; line = explode(read_file(MUD_SERVICES),"\n"); for(i = 0; i < sizeof(line); i++) { if(line[i] == "" || line[i][0] == '#') continue; if(sscanf(line[i],"%s:%s:%d",md,sv,pt) != 3) { error(i,MUD_SERVICES,"Syntax Error"); continue; } if(!mapp(muds[md])) { error(i,MUD_SERVICES,"The mud '"+md+"' is not defined."); continue; } if(sv == "address" || sv == "port") { error(i,MUD_SERVICES,"The service '"+sv+"' is a reserved name."); continue; } if(stringp(muds[md][sv])) { error(i,MUD_SERVICES,"Duplicate service '"+sv+"' defined."); continue; } if(sscanf(line[i],"%*s:%*s:%s",tmp) && tmp[0] != '-' && tmp[0] != '+') pt = ((md != "DEFAULT") ? pt - muds[md]["port"] : pt + 10000); muds[md] += ([ sv : pt ]); }}void error(int line, string file, string message) { write("ERROR: Line "+line+" of "+file+": "); write(message+"\n");}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?