Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/secure/udp_mail.c b/secure/udp_mail.c
new file mode 100644
index 0000000..3203fb9
--- /dev/null
+++ b/secure/udp_mail.c
@@ -0,0 +1,285 @@
+/*
+ * VERSION 1.0
+ * UDP MAIL system (Author: Alvin@Sushi)
+ * Requires INETD V0.60 or higher (INETD Author: Nostradamus@Zebedee)
+ */
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma combine_strings
+//#pragma pedantic
+//#pragma range_check
+#pragma warn_deprecated
+
+#include <udp.h>
+#include <udp_mail.h>
+
+#ifdef DEBUG
+#undef DEBUG
+#endif
+#define DEBUG(x)
+
+mapping spool_item;
+
+static string *spool;
+
+private int match_mud_name(string mudname, string match_str) {
+ return mudname[0..sizeof(match_str)-1] == match_str;
+}
+
+static void save_spool_item()
+{
+ string name;
+ int count;
+
+ if(!spool_item || !mappingp(spool_item) || spool_item==([]))
+ return;
+
+ do {
+ ++count;
+ name=spool_item[UDPMS_DEST]+"-"+to_string(count);
+ } while(spool && member(spool, name)!=-1);
+
+ save_object(UDPM_SPOOL_DIR+name);
+
+ if(!spool || !sizeof(spool))
+ spool = ({ name });
+ else
+ spool += ({ name });
+}
+
+/* forward declaration */
+void deliver_mail(string recipient,string mud,string from,
+ string subj,string mail_body,int status_flag,string spool_name);
+
+/* forward declaration */
+static void start_retry_callout();
+
+static void remove_from_spool(string spool_file)
+{
+ int idx;
+
+ if(spool && (idx=member(spool,spool_file))!=-1)
+ {
+ spool -= ({ spool_file });
+ if(!sizeof(spool))
+ spool=0;
+ }
+
+ if(file_size("/"+UDPM_SPOOL_DIR+spool_file+".o")>0)
+ if(!rm("/"+UDPM_SPOOL_DIR+spool_file+".o"))
+ log_file(INETD_LOG_FILE,"UPD_MAIL: Can't delete spool file "+
+ "/"+UDPM_SPOOL_DIR+spool_file+".o");
+}
+
+static void retry_send()
+{
+ int i;
+ string msg;
+
+ if(!spool || !sizeof(spool)) return;
+
+ for(i=0;i<sizeof(spool);++i)
+ {
+ if(!restore_object(UDPM_SPOOL_DIR+spool[i]))
+ {
+ log_file(INETD_LOG_FILE,"UDP_MAIL: Falied to restore spool file "+
+ UDPM_SPOOL_DIR+spool[i]);
+ continue;
+ }
+
+ if(time() - spool_item[UDPMS_TIME] > UDPM_SEND_FAIL*60)
+ {
+ msg="Reason: Unable to connect to site \""+spool_item[UDPMS_DEST]+
+ "\"\n\nINCLUDED MESSAGE FOLLOWS :-\n\n"+
+ "To: "+spool_item[UDPMS_TO]+"\n"+
+ "Subject: "+spool_item[UDPMS_SUBJECT]+"\n"+
+ spool_item[UDPMS_BODY];
+
+ LOCAL_MAILER->deliver_mail(
+ spool_item[UDPMS_FROM], /* TO */
+ "Mailer@"+LOCAL_NAME, /* FROM */
+ "Bounced Mail", /* SUBJECT */
+ msg /* MAIL BODY */
+ );
+ remove_from_spool(spool[i]);
+ return;
+ }
+
+ deliver_mail(
+ spool_item[UDPMS_TO],
+ spool_item[UDPMS_DEST],
+ spool_item[UDPMS_FROM],
+ spool_item[UDPMS_SUBJECT],
+ spool_item[UDPMS_BODY],
+ UDPM_STATUS_IN_SPOOL,
+ spool[i]);
+ }
+
+ start_retry_callout();
+}
+
+static void start_retry_callout()
+{
+ if(find_call_out("retry_send")!= -1 ) return;
+
+ call_out("retry_send",UDPM_RETRY_SEND*60);
+}
+
+static void failed_to_deliver(mapping data)
+{
+ string msg;
+ object obj;
+
+ if(!data[SYSTEM] || data[SYSTEM] != TIME_OUT)
+ {
+ msg="Reason: Error in connection to remote site \""+data[NAME]+"\"\n\n"+
+ "INCLUDED MESSAGE FOLLOWS :-\n\n"+
+ "To: "+data[RECIPIENT]+"\n"+
+ "Subject: "+data[UDPM_SUBJECT]+"\n"+data[DATA];
+
+ LOCAL_MAILER->deliver_mail(
+ data[UDPM_WRITER], /* TO */
+ "Mailer@"+LOCAL_NAME, /* FROM */
+ "Bounced Mail", /* SUBJECT */
+ msg /* MAIL BODY */
+ );
+ return;
+ }
+
+ /* OK transmission timed out.. place in mail spool */
+
+ if((obj=find_player(data[UDPM_WRITER])))
+ {
+ tell_object(obj,"Mail delivery to "+data[RECIPIENT]+"@"+data[NAME]+
+ " Timed Out. Placing mail in spool.\n");
+ }
+
+ spool_item=([
+ UDPMS_TIME: time(),
+ UDPMS_TO: data[RECIPIENT],
+ UDPMS_DEST: data[NAME],
+ UDPMS_FROM: data[UDPM_WRITER],
+ UDPMS_SUBJECT: data[UDPM_SUBJECT],
+ UDPMS_BODY: data[DATA]
+ ]);
+
+ save_spool_item();
+
+ start_retry_callout();
+}
+
+static void get_pending_deliveries()
+{
+ string *entries;
+ int i;
+
+ entries=get_dir(UDPM_SPOOL_DIR+"*.o");
+ if(!entries || !sizeof(entries)) return;
+
+ spool=allocate(sizeof(entries));
+ for(i=0;i<sizeof(entries);++i)
+ spool[i]=entries[i][0..<3];
+
+ start_retry_callout();
+}
+
+void create()
+{
+ seteuid(getuid(this_object()));
+ get_pending_deliveries();
+}
+
+/*
+ * Public routines
+ */
+
+int query_valid_mail_host(string hostname)
+{
+ string *match;
+
+ match=filter(m_indices((mapping)INETD->query("hosts")),
+ #'match_mud_name,lower_case(hostname));
+
+ return (sizeof(match)==1);
+}
+
+void deliver_mail(string recipient,string mud,string from,
+ string subj,string mail_body,int status_flag,string spool_name)
+{
+ mapping data;
+
+ // Geloggt wird, wenn ein aufrufendes Objekt nicht sicher ist.
+ if (object_name(previous_object())[0..7]!="/secure/")
+ write_file("/secure/ARCH/DELIVER_MAIL",
+ sprintf("%s : Aufruf von /secure/udp_mail->deliver_mail()\n"
+ " Sender: %O Empfaenger: %O@%O\n PO: %O TI: %O TP:%O\n\n",
+ ctime(time()),from, recipient, mud,
+ previous_object(), this_interactive(), this_player()));
+
+ data=([
+ REQUEST: "mail",
+ RECIPIENT: recipient,
+ SENDER: this_object(),
+ UDPM_STATUS: status_flag,
+ UDPM_WRITER: lower_case(from),
+ UDPM_SUBJECT: subj,
+ UDPM_SPOOL_NAME: spool_name,
+ DATA: mail_body
+ ]);
+
+ INETD->_send_udp(mud,data,1);
+}
+
+void udp_reply(mapping data)
+{
+ object sender;
+
+ DEBUG(sprintf("MAILER RECEIVED %O\n",data));
+ if (!member(data,UDPM_STATUS))
+ {
+ DEBUG("BOUNCING\n");
+ LOCAL_MAILER->deliver_mail(
+ data[UDPM_WRITER], /* TO */
+ "INETD@"+data[NAME], /* FROM */
+ "Bounced Mail(No mail support yet?)", /* SUBJECT */
+ data[DATA] /* MAIL BODY */
+ );
+ if(data[UDPM_SPOOL_NAME])
+ remove_from_spool(data[UDPM_SPOOL_NAME]);
+ } else
+ switch(data[UDPM_STATUS])
+ {
+ case UDPM_STATUS_TIME_OUT:
+ failed_to_deliver(data);
+ break;
+
+ case UDPM_STATUS_DELIVERED_OK:
+ if((sender=find_player(data[UDPM_WRITER])))
+ {
+ tell_object(sender,"Mailer@"+data[NAME]+": "+
+ "Mail to "+capitalize(data[DATA])+" delivered ok.\n");
+ }
+ if(data[UDPM_SPOOL_NAME])
+ remove_from_spool(data[UDPM_SPOOL_NAME]);
+
+ break;
+
+ case UDPM_STATUS_UNKNOWN_PLAYER:
+ LOCAL_MAILER->deliver_mail(
+ data[UDPM_WRITER], /* TO */
+ "Mailer@"+data[NAME], /* FROM */
+ "Bounced Mail", /* SUBJECT */
+ data[DATA] /* MAIL BODY */
+ );
+ if(data[UDPM_SPOOL_NAME])
+ remove_from_spool(data[UDPM_SPOOL_NAME]);
+ break;
+
+ case UDPM_STATUS_IN_SPOOL:
+ /* Do nothing */
+ break;
+ }
+}