#include <udp.h>#include <udp_mail.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | DEBUG(x) |
Funktionen | |
| private int | match_mud_name (string mudname, string match_str) |
| static void | save_spool_item () |
| void | deliver_mail (string recipient, string mud, string from, string subj, string mail_body, int status_flag, string spool_name) |
| static void | start_retry_callout () |
| static void | remove_from_spool (string spool_file) |
| static void | retry_send () |
| static void | failed_to_deliver (mapping data) |
| static void | get_pending_deliveries () |
| void | create () |
| int | query_valid_mail_host (string hostname) |
| void | udp_reply (mapping data) |
Variablen | |
| mapping | spool_item |
| static string * | spool |
| #define DEBUG | ( | x | ) |
Definiert in Zeile 22 der Datei udp_mail.c.
| void create | ( | ) |
Definiert in Zeile 189 der Datei udp_mail.c.
Benutzt get_pending_deliveries().
00190 { 00191 seteuid(getuid(this_object())); 00192 get_pending_deliveries(); 00193 }

| void deliver_mail | ( | string | recipient, | |
| string | mud, | |||
| string | from, | |||
| string | subj, | |||
| string | mail_body, | |||
| int | status_flag, | |||
| string | spool_name | |||
| ) |
Definiert in Zeile 209 der Datei udp_mail.c.
00211 { 00212 mapping data; 00213 00214 // Geloggt wird, wenn ein aufrufendes Objekt nicht sicher ist. 00215 if (object_name(previous_object())[0..7]!="/secure/") 00216 write_file("/secure/ARCH/DELIVER_MAIL", 00217 sprintf("%s : Aufruf von /secure/udp_mail->deliver_mail()\n" 00218 " Sender: %O Empfaenger: %O@%O\n PO: %O TI: %O TP:%O\n\n", 00219 ctime(time()),from, recipient, mud, 00220 previous_object(), this_interactive(), this_player())); 00221 00222 data=([ 00223 REQUEST: "mail", 00224 RECIPIENT: recipient, 00225 SENDER: this_object(), 00226 UDPM_STATUS: status_flag, 00227 UDPM_WRITER: lower_case(from), 00228 UDPM_SUBJECT: subj, 00229 UDPM_SPOOL_NAME: spool_name, 00230 DATA: mail_body 00231 ]); 00232 00233 INETD->_send_udp(mud,data,1); 00234 }
| static void failed_to_deliver | ( | mapping | data | ) | [static] |
Definiert in Zeile 131 der Datei udp_mail.c.
Benutzt DATA, find_player(), LOCAL_MAILER, LOCAL_NAME, msg(), NAME, RECIPIENT, save_spool_item(), spool_item, start_retry_callout(), SYSTEM, TIME_OUT, UDPM_SUBJECT, UDPM_WRITER, UDPMS_BODY, UDPMS_DEST, UDPMS_FROM, UDPMS_SUBJECT, UDPMS_TIME und UDPMS_TO.
00132 { 00133 string msg; 00134 object obj; 00135 00136 if(!data[SYSTEM] || data[SYSTEM] != TIME_OUT) 00137 { 00138 msg="Reason: Error in connection to remote site \""+data[NAME]+"\"\n\n"+ 00139 "INCLUDED MESSAGE FOLLOWS :-\n\n"+ 00140 "To: "+data[RECIPIENT]+"\n"+ 00141 "Subject: "+data[UDPM_SUBJECT]+"\n"+data[DATA]; 00142 00143 LOCAL_MAILER->deliver_mail( 00144 data[UDPM_WRITER], /* TO */ 00145 "Mailer@"+LOCAL_NAME, /* FROM */ 00146 "Bounced Mail", /* SUBJECT */ 00147 msg /* MAIL BODY */ 00148 ); 00149 return; 00150 } 00151 00152 /* OK transmission timed out.. place in mail spool */ 00153 00154 if((obj=find_player(data[UDPM_WRITER]))) 00155 { 00156 tell_object(obj,"Mail delivery to "+data[RECIPIENT]+"@"+data[NAME]+ 00157 " Timed Out. Placing mail in spool.\n"); 00158 } 00159 00160 spool_item=([ 00161 UDPMS_TIME: time(), 00162 UDPMS_TO: data[RECIPIENT], 00163 UDPMS_DEST: data[NAME], 00164 UDPMS_FROM: data[UDPM_WRITER], 00165 UDPMS_SUBJECT: data[UDPM_SUBJECT], 00166 UDPMS_BODY: data[DATA] 00167 ]); 00168 00169 save_spool_item(); 00170 00171 start_retry_callout(); 00172 }

| static void get_pending_deliveries | ( | ) | [static] |
Definiert in Zeile 174 der Datei udp_mail.c.
Benutzt i, spool, start_retry_callout() und UDPM_SPOOL_DIR.
Wird benutzt von create().
00175 { 00176 string *entries; 00177 int i; 00178 00179 entries=get_dir(UDPM_SPOOL_DIR+"*.o"); 00180 if(!entries || !sizeof(entries)) return; 00181 00182 spool=allocate(sizeof(entries)); 00183 for(i=0;i<sizeof(entries);++i) 00184 spool[i]=entries[i][0..<3]; 00185 00186 start_retry_callout(); 00187 }


| private int match_mud_name | ( | string | mudname, | |
| string | match_str | |||
| ) |
Definiert in Zeile 28 der Datei udp_mail.c.
| int query_valid_mail_host | ( | string | hostname | ) |
Definiert in Zeile 199 der Datei udp_mail.c.
Benutzt INETD.
00200 { 00201 string *match; 00202 00203 match=filter(m_indices((mapping)INETD->query("hosts")), 00204 #'match_mud_name,lower_case(hostname)); 00205 00206 return (sizeof(match)==1); 00207 }
| static void remove_from_spool | ( | string | spool_file | ) | [static] |
Definiert in Zeile 60 der Datei udp_mail.c.
Benutzt INETD_LOG_FILE, log_file, member_array(), spool und UDPM_SPOOL_DIR.
Wird benutzt von retry_send().
00061 { 00062 int idx; 00063 00064 if(spool && (idx=member_array(spool_file,spool))!=-1) 00065 { 00066 spool -= ({ spool_file }); 00067 if(!sizeof(spool)) 00068 spool=-0; 00069 } 00070 00071 if(file_size("/"+UDPM_SPOOL_DIR+spool_file+".o")>0) 00072 if(!rm("/"+UDPM_SPOOL_DIR+spool_file+".o")) 00073 log_file(INETD_LOG_FILE,"UPD_MAIL: Can't delete spool file "+ 00074 "/"+UDPM_SPOOL_DIR+spool_file+".o"); 00075 }


| static void retry_send | ( | ) | [static] |
Definiert in Zeile 77 der Datei udp_mail.c.
Benutzt deliver_mail(), i, INETD_LOG_FILE, LOCAL_MAILER, LOCAL_NAME, log_file, msg(), remove_from_spool(), restore_object(), spool, spool_item, start_retry_callout(), UDPM_SEND_FAIL, UDPM_SPOOL_DIR, UDPM_STATUS_IN_SPOOL, UDPMS_BODY, UDPMS_DEST, UDPMS_FROM, UDPMS_SUBJECT, UDPMS_TIME und UDPMS_TO.
00078 { 00079 int i; 00080 string msg; 00081 00082 if(!spool || !sizeof(spool)) return; 00083 00084 for(i=0;i<sizeof(spool);++i) 00085 { 00086 if(!restore_object(UDPM_SPOOL_DIR+spool[i])) 00087 { 00088 log_file(INETD_LOG_FILE,"UDP_MAIL: Falied to restore spool file "+ 00089 UDPM_SPOOL_DIR+spool[i]); 00090 continue; 00091 } 00092 00093 if(time() - spool_item[UDPMS_TIME] > UDPM_SEND_FAIL*60) 00094 { 00095 msg="Reason: Unable to connect to site \""+spool_item[UDPMS_DEST]+ 00096 "\"\n\nINCLUDED MESSAGE FOLLOWS :-\n\n"+ 00097 "To: "+spool_item[UDPMS_TO]+"\n"+ 00098 "Subject: "+spool_item[UDPMS_SUBJECT]+"\n"+ 00099 spool_item[UDPMS_BODY]; 00100 00101 LOCAL_MAILER->deliver_mail( 00102 spool_item[UDPMS_FROM], /* TO */ 00103 "Mailer@"+LOCAL_NAME, /* FROM */ 00104 "Bounced Mail", /* SUBJECT */ 00105 msg /* MAIL BODY */ 00106 ); 00107 remove_from_spool(spool[i]); 00108 return; 00109 } 00110 00111 deliver_mail( 00112 spool_item[UDPMS_TO], 00113 spool_item[UDPMS_DEST], 00114 spool_item[UDPMS_FROM], 00115 spool_item[UDPMS_SUBJECT], 00116 spool_item[UDPMS_BODY], 00117 UDPM_STATUS_IN_SPOOL, 00118 spool[i]); 00119 } 00120 00121 start_retry_callout(); 00122 }

| static void save_spool_item | ( | ) | [static] |
Definiert in Zeile 32 der Datei udp_mail.c.
Benutzt count, member_array(), name, save_object(), spool, spool_item, UDPM_SPOOL_DIR und UDPMS_DEST.
Wird benutzt von failed_to_deliver().
00033 { 00034 string name; 00035 int count; 00036 00037 if(!spool_item || !mappingp(spool_item) || spool_item==([])) 00038 return; 00039 00040 do { 00041 ++count; 00042 name=spool_item[UDPMS_DEST]+"-"+to_string(count); 00043 } while(spool && member_array(name,spool)!=-1); 00044 00045 save_object(UDPM_SPOOL_DIR+name); 00046 00047 if(!spool || !sizeof(spool)) 00048 spool = ({ name }); 00049 else 00050 spool += ({ name }); 00051 }


| static void start_retry_callout | ( | ) | [static] |
Definiert in Zeile 124 der Datei udp_mail.c.
Benutzt call_out() und UDPM_RETRY_SEND.
Wird benutzt von failed_to_deliver(), get_pending_deliveries() und retry_send().
00125 { 00126 if(find_call_out("retry_send")!= -1 ) return; 00127 00128 call_out("retry_send",UDPM_RETRY_SEND*60); 00129 }


| void udp_reply | ( | mapping | data | ) |
Definiert in Zeile 236 der Datei udp_mail.c.
00237 { 00238 object sender; 00239 00240 DEBUG(sprintf("MAILER RECEIVED %O\n",data)); 00241 if (!member(data,UDPM_STATUS)) 00242 { 00243 DEBUG("BOUNCING\n"); 00244 LOCAL_MAILER->deliver_mail( 00245 data[UDPM_WRITER], /* TO */ 00246 "INETD@"+data[NAME], /* FROM */ 00247 "Bounced Mail(No mail support yet?)", /* SUBJECT */ 00248 data[DATA] /* MAIL BODY */ 00249 ); 00250 if(data[UDPM_SPOOL_NAME]) 00251 remove_from_spool(data[UDPM_SPOOL_NAME]); 00252 } else 00253 switch(data[UDPM_STATUS]) 00254 { 00255 case UDPM_STATUS_TIME_OUT: 00256 failed_to_deliver(data); 00257 break; 00258 00259 case UDPM_STATUS_DELIVERED_OK: 00260 if((sender=find_player(data[UDPM_WRITER]))) 00261 { 00262 tell_object(sender,"Mailer@"+data[NAME]+": "+ 00263 "Mail to "+capitalize(data[DATA])+" delivered ok.\n"); 00264 } 00265 if(data[UDPM_SPOOL_NAME]) 00266 remove_from_spool(data[UDPM_SPOOL_NAME]); 00267 00268 break; 00269 00270 case UDPM_STATUS_UNKNOWN_PLAYER: 00271 LOCAL_MAILER->deliver_mail( 00272 data[UDPM_WRITER], /* TO */ 00273 "Mailer@"+data[NAME], /* FROM */ 00274 "Bounced Mail", /* SUBJECT */ 00275 data[DATA] /* MAIL BODY */ 00276 ); 00277 if(data[UDPM_SPOOL_NAME]) 00278 remove_from_spool(data[UDPM_SPOOL_NAME]); 00279 break; 00280 00281 case UDPM_STATUS_IN_SPOOL: 00282 /* Do nothing */ 00283 break; 00284 } 00285 }
string* spool [static] |
Definiert in Zeile 26 der Datei udp_mail.c.
Wird benutzt von get_pending_deliveries(), remove_from_spool(), retry_send() und save_spool_item().
| mapping spool_item |
Definiert in Zeile 24 der Datei udp_mail.c.
Wird benutzt von failed_to_deliver(), retry_send() und save_spool_item().
1.6.3