inetd.c-Dateireferenz

#include <udp.h>
Include-Abhängigkeitsdiagramm für inetd.c:

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)

Makro-Dokumentation

#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 SET_EUID   seteuid(getuid())

Definiert in Zeile 42 der Datei inetd.c.

#define UDP_MASTER   __MASTER_OBJECT__

Definiert in Zeile 38 der Datei inetd.c.

#define UNKNOWN   0

Wird benutzt von read_host_list().

#define UP   time()
#define USE_OLD_DATA_FORMAT

Definiert in Zeile 61 der Datei inetd.c.

#define USE_OLD_DELIMITER

Definiert in Zeile 59 der Datei inetd.c.

#define ZDEBUG ( x   ) 
Wert:
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().


Dokumentation der Funktionen

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

status check_system_field ( mapping  data,
string  field 
)

Definiert in Zeile 124 der Datei inetd.c.

Benutzt SYSTEM.

Wird benutzt von add_system_field().

00124                                                       {
00125     return data[SYSTEM] && member(data[SYSTEM], field) != -1;
00126 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void create (  ) 

Definiert in Zeile 115 der Datei inetd.c.

Benutzt reset().

00115               {
00116 #else
00117 void reset(arg) {
00118     if (arg)
00119         return;
00120 #endif
00121     my_create();
00122 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 
)

Definiert in Zeile 537 der Datei inetd.c.

00537                                                {
00538     return mudname[0..strlen(match_str)-1] == match_str;
00539 }

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void remove_received_id ( string  id  ) 

Definiert in Zeile 774 der Datei inetd.c.

00774                                    {
00775     received_ids -= ({ id });
00776 }

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Erzeugt am Thu Jun 3 14:41:23 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3