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;
+    }
+}