#include <udp.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | ZDEBUG(x) |
| #define | COMMANDS ({ "channel", "finger", "tell", "who", "mail", "www", "htmlwho", "locate" }) |
| #define | UDP_MASTER __MASTER_OBJECT__ |
| #define | SET_EUID seteuid(getuid()) |
| #define | MAX_PACKET_LEN 1024 |
| #define | USE_OLD_DELIMITER |
| #define | USE_OLD_DATA_FORMAT |
| #define | UNKNOWN 0 |
| #define | UP time() |
| #define | DOWN (-time()) |
| #define | NEW_DELIMITER "\n" |
| #define | DELIMITER "|" |
| #define | OLD_DELIMITER "|" |
| #define | HOSTFILE_DEL ":" |
| #define | HOSTFILE_DEL2 "," |
| #define | RETRY "_RETRY" |
| #define | DEBUG(msg) |
Funktionen | |
| ctime (time()) | |
| void | create () |
| status | check_system_field (mapping data, string field) |
| mapping | add_system_field (mapping data, string field) |
| private mapping | read_host_list (string file) |
| void | set_host_list () |
| int | dump_hosts_list () |
| void | startup (string *muds) |
| void | remove_incoming (string id) |
| mixed | decode (string arg) |
| mixed | decode_packet (string packet, string delimiter) |
| string | valid_request (mapping data) |
| void | _receive_udp (string sender, string packet) |
| int | do_match (string mudname, string match_str) |
| string * | expand_mud_name (string name) |
| string | encode (mixed arg) |
| string | encode_packet (mapping data) |
| string * | explode_packet (string packet, int len) |
| varargs string | _send_udp (string mudname, mapping data, int expect_reply) |
| void | reply_time_out (string id) |
| void | remove_received_id (string id) |
| varargs mixed | query (string what, mixed extra1, mixed extra2) |
| #define COMMANDS ({ "channel", "finger", "tell", "who", "mail", "www", "htmlwho", "locate" }) |
Definiert in Zeile 30 der Datei inetd.c.
Wird benutzt von query() und read_host_list().
| #define DEBUG | ( | msg | ) |
| #define DELIMITER "|" |
Wird benutzt von _send_udp() und encode_packet().
| #define DOWN (-time()) |
Wird benutzt von reply_time_out().
| #define HOSTFILE_DEL ":" |
Wird benutzt von read_host_list().
| #define HOSTFILE_DEL2 "," |
Wird benutzt von read_host_list().
| #define MAX_PACKET_LEN 1024 |
Definiert in Zeile 55 der Datei inetd.c.
Wird benutzt von _send_udp().
| #define NEW_DELIMITER "\n" |
| #define OLD_DELIMITER "|" |
| #define RETRY "_RETRY" |
Wird benutzt von reply_time_out().
| #define UNKNOWN 0 |
Wird benutzt von read_host_list().
| #define UP time() |
| #define ZDEBUG | ( | x | ) |
if (find_player("zesstra"))\ tell_object(find_player("zesstra"),"Inetd: "+x+"\n")
Definiert in Zeile 17 der Datei inetd.c.
Wird benutzt von _call_DoDecay(), InternalModifySkillAttribute() und UpdateSACache().
| void _receive_udp | ( | string | sender, | |
| string | packet | |||
| ) |
Definiert in Zeile 434 der Datei inetd.c.
Wird benutzt von _receive_udp().
00434 { 00435 mapping data; 00436 string req, err, id; 00437 00438 #ifdef UDP_MASTER 00439 if (!previous_object() || 00440 object_name(previous_object()) != UDP_MASTER) { 00441 log_file(INETD_LOG_FILE, DATE + ": Illegal call of _receive_udp() by " + 00442 object_name(previous_object()) + "\n\n"); 00443 return; 00444 } 00445 #endif 00446 00447 //ZDEBUG(sprintf("%O -> %.500O\n",sender, packet)); 00448 if ( 00449 #ifdef DELIMITER_COMPAT 00450 #ifdef USE_EXTRACT 00451 (!(data = decode_packet(packet, NEW_DELIMITER)) 00452 #else 00453 (!(data = decode_packet(packet, NEW_DELIMITER)) 00454 #endif 00455 || (data[HOST] = sender) && (err = valid_request(data))) && 00456 (!(data = decode_packet(packet, OLD_DELIMITER)) || 00457 (data[HOST] = sender) && (err = valid_request(data))) 00458 #else 00459 #ifdef USE_EXTRACT 00460 !(data = decode_packet(packet, DELIMITER)) 00461 #else 00462 !(data = decode_packet(packet, DELIMITER)) 00463 #endif 00464 #endif 00465 ) { 00466 if (!data) 00467 #ifdef RECEIVE_UDP_COMPAT 00468 RECEIVE_UDP_COMPAT(sender, packet); 00469 #else 00470 log_file(INETD_LOG_FILE, DATE + ": Received invalid packet.\nSender: " + 00471 sender + "\nPacket:\n" + packet + "\n\n"); 00472 #endif 00473 return; 00474 } 00475 #ifdef DELIMITER_COMPAT 00476 if (!mappingp(data)) 00477 return; 00478 if (err) 00479 #else 00480 if (!mappingp(data)) 00481 return; 00482 data[HOST] = sender; 00483 if (err = valid_request(data)) 00484 #endif 00485 { 00486 log_file(INETD_LOG_FILE, err + "Sender: " + sender + "\nPacket:\n" + 00487 packet + "\n\n"); 00488 return; 00489 } 00490 hosts[lower_case(data[NAME])][HOST_STATUS] = UP; 00491 if ((req = data[REQUEST]) == REPLY) { 00492 mapping pending; 00493 00494 /* If we can't find the reply in the pending list then bin it. */ 00495 if (!(pending = pending_data[lower_case(data[NAME]) + ":" + data[ID]])) 00496 return; 00497 /* Set data[REQUEST] correctly, but still send to (req = REPLY) */ 00498 data[REQUEST] = pending[REQUEST]; 00499 #ifdef INETD_DIAGNOSTICS 00500 data[PACKET_LOSS] = pending[PACKET_LOSS]; 00501 data[RESPONSE_TIME] = time() - pending[RESPONSE_TIME] + 1; 00502 #endif 00503 #if 0 00504 /* channel replies may not include a recipient, and shouldn't have one set */ 00505 /* Restore the RECIPIENT in replies if none given and it is known. */ 00506 if (!data[RECIPIENT] && pending[SENDER]) 00507 data[RECIPIENT] = pending[SENDER]; 00508 #endif 00509 pending_data = 00510 m_delete(pending_data, lower_case(data[NAME]) + ":" + data[ID]); 00511 } 00512 else if (data[ID]) { 00513 id = lower_case(data[NAME]) + ":" + data[ID]; 00514 if (member(received_ids, id) == -1) 00515 { 00516 received_ids += ({ id }); 00517 call_out("remove_received_id", 00518 REPLY_TIME_OUT + REPLY_TIME_OUT * (RETRIES + 1), id); 00519 } 00520 else 00521 add_system_field(data, REPEAT); 00522 } 00523 if (err = catch( 00524 call_other(UDP_CMD_DIR + req, "udp_" + req, deep_copy(data));publish)) 00525 { 00526 _send_udp(data[NAME], ([ 00527 REQUEST: REPLY, 00528 RECIPIENT: data[SENDER], 00529 ID: data[ID], 00530 DATA: capitalize(req)+ " request failed @" + LOCAL_NAME + ".\n" 00531 ]) ); 00532 log_file(INETD_LOG_FILE, DATE + ": " + data[REQUEST] + " from " + 00533 data[NAME] + " failed.\n" + err + packet + "\n\n"); 00534 } 00535 }

| varargs string _send_udp | ( | string | mudname, | |
| mapping | data, | |||
| int | expect_reply | |||
| ) |
Definiert in Zeile 648 der Datei inetd.c.
Benutzt break_string(), call_out(), DATE, DELIMITER, encode_packet(), expand_mud_name(), explode_packet(), HOST_IP, HOST_NAME, HOST_UDP_PORT, i, INETD_DIAGNOSTICS, INETD_LOG_FILE, LOCAL_NAME, log_file, m_delete(), MAX_PACKET_LEN, PACKET, REPLY, REPLY_TIME_OUT, REQUEST und RESPONSE_TIME.
Wird benutzt von reply_time_out() und startup().
00648 { 00649 mixed host_data; 00650 string *packet_arr; 00651 string packet; 00652 int i; 00653 00654 mudname = lower_case(mudname); 00655 if (!(host_data = hosts[mudname])) { 00656 string *names; 00657 00658 if (sizeof(names = expand_mud_name(mudname)) == 1) 00659 host_data = hosts[mudname = names[0]]; 00660 else 00661 #ifdef SEND_UDP_COMPAT 00662 return (string)SEND_UDP_COMPAT(mudname, data, expect_reply); 00663 #else 00664 if (!sizeof(names)) 00665 return "Unbekannter Mudname: " + capitalize(mudname) + "\n"; 00666 else 00667 return break_string("Mudname ("+capitalize(mudname)+ 00668 ") nicht eindeutig, es passen: "+implode(map(names,#'capitalize),", ")+ 00669 ".\n",78); 00670 #endif 00671 } 00672 00673 if (data[REQUEST] != PING && 00674 data[REQUEST] != QUERY && 00675 data[REQUEST] != REPLY && 00676 member(host_data[HOST_COMMANDS], "*") == -1 && 00677 member(host_data[HOST_COMMANDS], data[REQUEST]) == -1) 00678 return capitalize(data[REQUEST]) + ": Command unavailable @" + 00679 host_data[HOST_NAME] + "\n"; 00680 00681 data[NAME] = LOCAL_NAME; 00682 data[UDP_PORT] = LOCAL_UDP_PORT; 00683 00684 if (expect_reply) { 00685 /* Don't use zero. */ 00686 data[ID] = ++packet_id; 00687 /* Don't need deep_copy() as we are changing the mapping size. */ 00688 pending_data[mudname + ":" + packet_id] = 00689 #ifdef INETD_DIAGNOSTICS 00690 data + ([ NAME: host_data[HOST_NAME], RESPONSE_TIME: time() ]); 00691 #else 00692 data + ([ NAME: host_data[HOST_NAME] ]); 00693 #endif 00694 } 00695 if (!(packet = encode_packet(data))) { 00696 if (expect_reply) 00697 pending_data = m_delete(pending_data, mudname + ":" + packet_id); 00698 log_file(INETD_LOG_FILE, DATE + ": Illegal packet sent by " + 00699 object_name(previous_object()) + "\n\n"); 00700 return "inetd: Illegal packet.\n"; 00701 } 00702 if (expect_reply) 00703 call_out("reply_time_out", REPLY_TIME_OUT, mudname + ":" + packet_id); 00704 00705 if (strlen(packet) <= MAX_PACKET_LEN) 00706 packet_arr = ({ packet }); 00707 else { 00708 string header; 00709 int max; 00710 00711 /* Be careful with the ID. data[ID] could have been set up by RETRY */ 00712 header = 00713 PACKET + ":" + lower_case(LOCAL_NAME) + ":" + 00714 ((expect_reply || data[REQUEST] != REPLY)&& data[ID] ? 00715 data[ID] : ++packet_id) + ":"; 00716 00717 /* Allow 8 extra chars: 3 digits + "/" + 3 digits + DELIMITER */ 00718 packet_arr = explode_packet(packet, 00719 MAX_PACKET_LEN - (strlen(header) + 8)); 00720 00721 for(i = max = sizeof(packet_arr); i--; ) 00722 packet_arr[i] = 00723 header + (i+1) + "/" + max + DELIMITER + packet_arr[i]; 00724 } 00725 00726 for(i = sizeof(packet_arr); i--; ) { 00727 00728 if (!send_udp( 00729 host_data[HOST_IP], host_data[HOST_UDP_PORT], packet_arr[i])) 00730 return "inetd: Error in sending packet.\n"; 00731 } 00732 return 0; 00733 }


| mapping add_system_field | ( | mapping | data, | |
| string | field | |||
| ) |
Definiert in Zeile 128 der Datei inetd.c.
Benutzt check_system_field() und SYSTEM.
Wird benutzt von reply_time_out().
00128 { 00129 if (data[SYSTEM]) { 00130 if (!check_system_field(data, field)) 00131 data[SYSTEM] += ({ field }); 00132 } 00133 else 00134 data[SYSTEM] = ({ field }); 00135 return data; 00136 }


| status check_system_field | ( | mapping | data, | |
| string | field | |||
| ) |
| void create | ( | ) |
| ctime | ( | time() | ) |
Definiert in Zeile 68 der Datei inetd.c.
Wird benutzt von __query_variable(), _query_short(), _set_currentdir(), _set_disable_attack(), add_gluehwein(), AddFP(), alles(), check_illegal(), check_password(), check_too_many_from_same_ip(), check_too_many_logons(), CheckSecond(), DeepTransferMoney(), deliver_mail(), DeliverMail(), efun_ctime(), epilog(), FtpAccess(), gtell(), InterpretTime(), liste(), load_player_ob_2(), load_player_object(), RemoveFP(), reset(), rubriken(), scan_objects(), send_mail(), ShowEPObjects(), shutdown(), SiteBanish(), udp_www(), valid_read(), wear_best_armours(), Xcall() und Xeval().
00084 :" 00085 #define HOSTFILE_DEL2 "," 00086 #define RETRY "_RETRY" 00087 00088 private nosave mapping hosts, pending_data, incoming_packets; 00089 private nosave mapping static_host_list; 00090 private nosave string *received_ids; 00091 private nosave int packet_id; 00092 00093 void set_host_list(); 00094 varargs string _send_udp(string mudname, mapping data, int expect_reply); 00095 00096 #define DEBUG(msg) 00097 00098 void my_create() { 00099 #ifndef COMPAT_FLAG 00100 SET_EUID; 00101 #endif 00102 packet_id = 0; 00103 pending_data = ([ ]); 00104 incoming_packets = ([ ]); 00105 hosts = ([ ]); 00106 received_ids = ({ }); 00107 set_host_list(); 00108 if (!this_player()) 00109 call_out("startup", 1, 0); 00110 }

| mixed decode | ( | string | arg | ) |
Definiert in Zeile 260 der Datei inetd.c.
Wird benutzt von udp_www().
00260 { 00261 00262 if (strlen(arg) && arg[0] == '$') 00263 return arg[1..]; 00264 #ifdef RESTRICTED_CASTS 00265 if (to_string(to_int(arg)) == arg) 00266 return to_int(arg); 00267 #else 00268 if ((string)((int)arg) == arg) 00269 return (int)arg; 00270 #endif 00271 return arg; 00272 }

| mixed decode_packet | ( | string | packet, | |
| string | delimiter | |||
| ) |
Definiert in Zeile 280 der Datei inetd.c.
00280 { 00281 string *data; 00282 mapping ret; 00283 string info, tmp; 00284 mixed class; 00285 int i, id, n; 00286 00287 /* If this packet has been split, handle buffering. */ 00288 if (packet[0..strlen(PACKET)] == PACKET + ":") { 00289 if (sscanf(packet, PACKET + ":%s:%d:%d/%d" + delimiter + "%s", 00290 class, id, i, n, tmp) != 5) 00291 return 0; 00292 class = lower_case(class) + ":" + id; 00293 if (pointerp(incoming_packets[class])) { 00294 incoming_packets[class][i-1] = tmp; 00295 if (member(incoming_packets[class], 0) == -1) { 00296 ret = 00297 decode_packet(implode(incoming_packets[class], ""), delimiter); 00298 remove_incoming(class); 00299 return ret; 00300 } 00301 } else { 00302 incoming_packets[class] = allocate(n); 00303 incoming_packets[class][i-1] = tmp; 00304 /* Is it possible to already have a timeout running here ?!? */ 00305 /* If no timeout is running then start one. */ 00306 if (!pending_data[class]) { 00307 call_out("remove_incoming", 00308 REPLY_TIME_OUT + REPLY_TIME_OUT * RETRIES, class); 00309 } else { 00310 DEBUG("\nINETD: *** Buffered packet Timeout already running! ***\n"); 00311 } 00312 } 00313 return 1; 00314 } 00315 ret = ([ ]); 00316 for(i = 0, n = sizeof(data = old_explode(packet, delimiter)); i < n; i++) { 00317 /* DATA fields can be denoted by a preceeding blank field. */ 00318 if (data[i] == "") { 00319 tmp = DATA; 00320 /* Test for illegal packet length (no DATA) */ 00321 if (++i >= n) 00322 return 0; 00323 info = data[i]; 00324 } 00325 else if (sscanf(data[i], "%s:%s", tmp, info) != 2) 00326 return 0; 00327 switch((string)(class = decode(tmp))) { 00328 case DATA: 00329 #ifdef USE_EXTRACT 00330 return ret + ([ DATA: decode(implode( 00331 ({ info }) + extract(data, i+1), delimiter)) ]); 00332 #else 00333 return ret + ([ DATA: decode(implode( 00334 ({ info }) + data[i+1..], delimiter)) ]); 00335 #endif 00336 case SYSTEM: 00337 ret[class] = old_explode(info, ":"); 00338 continue; 00339 default: 00340 ret[class] = decode(info); 00341 continue; 00342 } 00343 } 00344 return ret; 00345 }
| int do_match | ( | string | mudname, | |
| string | match_str | |||
| ) |
| int dump_hosts_list | ( | ) |
Definiert in Zeile 209 der Datei inetd.c.
Benutzt HOST_FILE, HOST_STATUS, MUDNAME und strftime().
00209 { 00210 00211 write_file(HOST_FILE+".dump", sprintf( 00212 "#Hostlist dump from "MUDNAME", created %s\n", strftime()), 1); 00213 00214 foreach(string mudname, mixed tmp : hosts) { 00215 // skip muds we did not hear from for 2 days. 00216 if (tmp[HOST_STATUS] + 172800 < time()) 00217 continue; 00218 write_file(HOST_FILE+".dump", 00219 sprintf("%s:%s:%d:%s:%s\n",tmp[0],tmp[1],tmp[2],implode(tmp[3],","), 00220 implode(tmp[4],","))); 00221 } 00222 return 1; 00223 }

| string encode | ( | mixed | arg | ) |
Definiert in Zeile 566 der Datei inetd.c.
Wird benutzt von encode_packet() und udp_www().
00566 { 00567 if (objectp(arg)) 00568 return object_name(arg); 00569 if (stringp(arg) && (arg[0] == '$' || 00570 #ifdef RESTRICTED_CASTS 00571 to_string(to_int(arg)) == (string)arg)) 00572 #else 00573 (string)to_int(arg) == (string)arg)) 00574 #endif 00575 return "$" + arg; 00576 return to_string(arg); 00577 }

| string encode_packet | ( | mapping | data | ) |
Definiert in Zeile 579 der Datei inetd.c.
Benutzt DATA, DELIMITER, encode() und i.
Wird benutzt von _send_udp().
00579 { 00580 int i; 00581 mixed indices; 00582 string header, body, t1, t2; 00583 string *ret; 00584 status data_flag; 00585 00586 for(ret = ({ }), i = sizeof(indices = m_indices(data)); i--; ) { 00587 if (indices[i] == DATA) { 00588 data_flag = 1; 00589 continue; 00590 } 00591 header = encode(indices[i]); 00592 body = encode(data[indices[i]]); 00593 if (sscanf(header, "%s:%s", t1, t2) || 00594 sscanf(header + body, "%s" + DELIMITER + "%s", t1, t2) 00595 ) 00596 return 0; 00597 00598 ret += ({ header + ":" + body }); 00599 } 00600 if (data_flag) 00601 #ifdef USE_OLD_DATA_FORMAT 00602 ret += ({ DATA + ":" + encode(data[DATA]) }); 00603 #else 00604 ret += ({ "", encode(data[DATA]) }); 00605 #endif 00606 return implode(ret, DELIMITER); 00607 }


| string* expand_mud_name | ( | string | name | ) |
Definiert in Zeile 557 der Datei inetd.c.
Wird benutzt von _send_udp().
00557 { 00558 return sort_array( 00559 filter(m_indices(hosts), #'do_match, name), 00560 #'> 00561 ); 00562 }

| string* explode_packet | ( | string | packet, | |
| int | len | |||
| ) |
Definiert in Zeile 613 der Datei inetd.c.
Benutzt extract() und result().
Wird benutzt von _send_udp().
00613 { 00614 00615 int ptr, m_ptr,size; 00616 string *result; 00617 00618 // Variablen initialisieren 00619 m_ptr=ptr=0; 00620 size=strlen(packet); 00621 result=({}); 00622 00623 // Um Arrayadditionen zu vermeiden wird vorher allokiert. Die Division 00624 // durch 0 ist nicht abgefangen, da bei len=0 was im Aufruf falch ist. 00625 result=allocate((size/len+1)); 00626 00627 while (ptr<size) { 00628 result[m_ptr] = // Aktuellen Teilstring speichern 00629 #ifdef USE_EXTRACT 00630 extract(packet,ptr,ptr+len-1); 00631 #else 00632 packet[ptr..ptr+len-1]; 00633 #endif 00634 ptr+=len;// Neuen Pointer im String berechnen 00635 m_ptr++; // Neuen Pointer im Mapping berechnen. Hier nutze ich eine 00636 // Variable mehr als noetig, weil das billiger ist, als jedes 00637 // mal ptr=m_ptr*len auszurechnen. Lieber zwei Additionen als 00638 // eine Multiplikation und eine Addtion. 00639 } 00640 00641 // Wenn size/len aufgeht, ist das Result-Feld zu gross. Dann bleibt 00642 // ein Element leer, das wird hier gestrippt. Das ist billiger als 00643 // jedesmal auszurechnen, ob size/len aufgeht. 00644 return result-({0}); 00645 00646 }


| varargs mixed query | ( | string | what, | |
| mixed | extra1, | |||
| mixed | extra2 | |||
| ) |
Definiert in Zeile 778 der Datei inetd.c.
Benutzt COMMANDS, data und HOST_COMMANDS.
Wird benutzt von Request().
00778 { 00779 mixed data; 00780 00781 switch(what) { 00782 case "commands": 00783 return COMMANDS; 00784 case "hosts": 00785 return deep_copy(hosts); 00786 case "pending": 00787 return deep_copy(pending_data); 00788 case "incoming": 00789 return deep_copy(incoming_packets); 00790 case "received": 00791 return ({ }) + received_ids; 00792 /* args: "valid_request", request, mudname */ 00793 case "valid_request": 00794 if (data = hosts[extra2]) 00795 return member(data[HOST_COMMANDS], "*") != -1 || 00796 member(data[HOST_COMMANDS], extra1) != -1; 00797 return 0; 00798 } 00799 return(0); 00800 }

| private mapping read_host_list | ( | string | file | ) |
Definiert in Zeile 138 der Datei inetd.c.
Benutzt COMMANDS, data, HOST_COMMANDS, HOST_IP, HOST_NAME, HOST_STATUS, HOST_UDP_PORT, HOSTFILE_DEL, HOSTFILE_DEL2, INETD_LOG_FILE, LOCAL_COMMANDS, log_file, name, old_explode() und UNKNOWN.
Wird benutzt von set_host_list().
00138 { 00139 00140 mixed data = (read_file(file)); 00141 if (!data) { 00142 log_file(INETD_LOG_FILE, "*Error in reading host file: " 00143 + file +"\n\n"); 00144 return 0; 00145 } 00146 00147 data = old_explode(data, "\n"); 00148 mapping new_hosts = m_allocate(sizeof(data),1); 00149 00150 foreach(string line: data) { 00151 if (line == "" || line[0] == '#') 00152 continue; 00153 mixed fields = old_explode(line, HOSTFILE_DEL); 00154 if (sizeof(fields) < 5) { 00155 log_file(INETD_LOG_FILE, sprintf( 00156 "*Parse error in hosts file: %s, Line: %s\n", file, line)); 00157 continue; 00158 } 00159 00160 string name = lower_case(fields[HOST_NAME]); 00161 if (member(new_hosts, name)) 00162 continue; // mud already in list 00163 00164 string *local_cmds = old_explode(fields[LOCAL_COMMANDS],HOSTFILE_DEL2); 00165 if (member(local_cmds,"*") != -1) 00166 local_cmds = local_cmds - ({ "*" }) + COMMANDS; 00167 00168 new_hosts[name] = ({ capitalize(fields[HOST_NAME]), 00169 fields[HOST_IP], 00170 to_int(fields[HOST_UDP_PORT]), 00171 local_cmds, 00172 old_explode(fields[HOST_COMMANDS], HOSTFILE_DEL2), 00173 UNKNOWN 00174 }); 00175 /* 00176 * Get existing host status from current active host lost as long as the 00177 * IP and UDP ports are the same. 00178 */ 00179 if (hosts[name] && 00180 hosts[name][HOST_IP] == new_hosts[name][HOST_IP] && 00181 hosts[name][HOST_UDP_PORT] == new_hosts[name][HOST_UDP_PORT]) 00182 new_hosts[name][HOST_STATUS] = hosts[name][HOST_STATUS]; 00183 } 00184 return new_hosts; 00185 }


| void remove_incoming | ( | string | id | ) |
Definiert in Zeile 252 der Datei inetd.c.
Wird benutzt von reply_time_out().
00252 { 00253 incoming_packets = m_delete(incoming_packets, id); 00254 }

| void remove_received_id | ( | string | id | ) |
| void reply_time_out | ( | string | id | ) |
Definiert in Zeile 735 der Datei inetd.c.
Benutzt _send_udp(), add_system_field(), call_out(), data, DOWN, HOST_STATUS, m_delete(), ob(), PACKET_LOSS, remove_incoming(), REPLY, REPLY_TIME_OUT, RESPONSE_TIME, RETRIES, RETRY, send(), TIME_OUT und UDP_CMD_DIR.
00735 { 00736 mapping data; 00737 00738 if (data = pending_data[id]) { 00739 object ob; 00740 00741 #ifdef INETD_DIAGNOSTICS 00742 data[PACKET_LOSS]++; 00743 #endif 00744 if (data[RETRY] < RETRIES) { 00745 mapping send; 00746 00747 data[RETRY]++; 00748 /* We must use a copy so the NAME field in pending_data[id] 00749 * isn't corrupted by _send_udp(). */ 00750 send = deep_copy(data); 00751 send = m_delete(send, RETRY); 00752 #ifdef INETD_DIAGNOSTICS 00753 send = m_delete(send, PACKET_LOSS); 00754 send = m_delete(send, RESPONSE_TIME); 00755 #endif 00756 call_out("reply_time_out", REPLY_TIME_OUT, id); 00757 _send_udp(data[NAME], send); 00758 return; 00759 } 00760 data = m_delete(data, RETRY); 00761 #ifdef INETD_DIAGNOSTICS 00762 data = m_delete(data, RESPONSE_TIME); 00763 #endif 00764 catch(call_other(UDP_CMD_DIR + REPLY, "udp_" + REPLY, 00765 add_system_field(data, TIME_OUT));publish); 00766 /* It's just possible this was removed from the host list. */ 00767 if (hosts[lower_case(data[NAME])]) 00768 hosts[lower_case(data[NAME])][HOST_STATUS] = DOWN; 00769 remove_incoming(lower_case(data[NAME]) + ":" + id); 00770 } 00771 pending_data = m_delete(pending_data, id); 00772 }

| void set_host_list | ( | ) |
Definiert in Zeile 193 der Datei inetd.c.
Benutzt HOST_FILE und read_host_list().
00193 { 00194 00195 // read the static host file and the last host file dump. 00196 mapping static_hosts = read_host_list(HOST_FILE); 00197 if (!static_hosts) 00198 return; // retain the old list(s) 00199 00200 // remember the static hosts 00201 static_host_list = m_reallocate(static_hosts,0); 00202 00203 // read the last host file dump and add the static hosts. Then the static 00204 // hosts have precedence over the ones from the dump. 00205 hosts = (read_host_list(HOST_FILE".dump") || ([])) + static_hosts; 00206 00207 }

| void startup | ( | string * | muds | ) |
Definiert in Zeile 231 der Datei inetd.c.
Benutzt _send_udp(), call_out(), PING und REQUEST.
00231 { 00232 00233 if (!pointerp(muds)) 00234 muds=m_indices(hosts); 00235 if (!sizeof(muds)) 00236 return; 00237 string *part; 00238 if (sizeof(muds) > 9) 00239 part=muds[0..9]; 00240 else 00241 part=muds; 00242 foreach(string mud: part) 00243 _send_udp(mud, ([ REQUEST: PING ]), 1); 00244 muds -= part; 00245 if (sizeof(muds)) 00246 call_out(#'startup, 4, muds); 00247 }

| string valid_request | ( | mapping | data | ) |
Definiert in Zeile 352 der Datei inetd.c.
00352 { 00353 mixed host_data; 00354 string *muds; 00355 string req; 00356 int i; 00357 00358 if (!data[NAME] || !data[UDP_PORT]) 00359 return DATE + ": Illegal packet.\n"; 00360 if (host_data = hosts[lower_case(data[NAME])]) { 00361 if (data[HOST] != host_data[HOST_IP]) { 00362 if (data[NAME] == LOCAL_NAME) 00363 return DATE + ": *** FAKE MUD ***\n"; 00364 log_file(INETD_LOG_FILE, DATE + ": Host change:\n" + 00365 host_data[HOST_NAME] + ": " + host_data[HOST_IP] + " -> " + 00366 data[HOST] + "\n\n"); 00367 host_data[HOST_IP] = data[HOST]; 00368 } 00369 if (data[UDP_PORT] != host_data[HOST_UDP_PORT]) { 00370 if (data[NAME] == LOCAL_NAME) 00371 return DATE + ": *** FAKE MUD ***\n"; 00372 log_file(INETD_LOG_FILE, DATE + ": Port change:\n" + 00373 host_data[HOST_NAME] + " (" + host_data[HOST_IP] + "): " + 00374 host_data[HOST_UDP_PORT] + " -> " + data[UDP_PORT] + "\n\n"); 00375 host_data[HOST_UDP_PORT] = data[UDP_PORT]; 00376 } 00377 } else { 00378 if (lower_case(data[NAME]) == lower_case(LOCAL_NAME)) 00379 return DATE + ": *** FAKE MUD ***\n"; 00380 for(i = sizeof(muds = m_indices(hosts)); i--; ) { 00381 host_data = hosts[muds[i]]; 00382 if (data[HOST] == host_data[HOST_IP] && 00383 data[UDP_PORT] == host_data[HOST_UDP_PORT]) { 00384 log_file(INETD_LOG_FILE, DATE + ": Name change:\n" + 00385 host_data[HOST_NAME] + " (" + host_data[HOST_IP] + 00386 ") -> " + data[NAME] + "\n\n"); 00387 host_data[HOST_NAME] = data[NAME]; 00388 hosts[lower_case(data[NAME])] = host_data; 00389 hosts = m_delete(hosts, muds[i]); 00390 i = -2; 00391 break; 00392 } 00393 } 00394 if (i != -2) { 00395 host_data = hosts[lower_case(data[NAME])] = ({ 00396 data[NAME], 00397 data[HOST], 00398 data[UDP_PORT], 00399 COMMANDS, 00400 ({ "*" }), 00401 UP 00402 }); 00403 log_file(INETD_LOG_FILE, DATE + ": New mud.\n" + data[NAME] + ":" + 00404 data[HOST] + ":" + data[UDP_PORT] + "\n\n"); 00405 } 00406 } 00407 if (!(req = data[REQUEST])) 00408 return DATE + ": System message.\n"; 00409 if (req != PING && 00410 req != QUERY && 00411 req != REPLY && 00412 member(host_data[LOCAL_COMMANDS], req) == -1) 00413 { 00414 /* This should probably send a system message too. */ 00415 _send_udp(host_data[HOST_NAME], ([ 00416 REQUEST: REPLY, 00417 RECIPIENT: data[SENDER], 00418 ID: data[ID], 00419 DATA: "Invalid request @" + LOCAL_NAME + ": " + 00420 capitalize(data[REQUEST]) + "\n" 00421 ]) ); 00422 return DATE + ": Invalid request.\n"; 00423 } 00424 return 0; 00425 }
1.6.3