Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/dnslookup.c b/p/daemon/dnslookup.c
new file mode 100644
index 0000000..a952324
--- /dev/null
+++ b/p/daemon/dnslookup.c
@@ -0,0 +1,101 @@
+// MorgenGrauen MUDlib
+//
+// dnslookup.c - kleines DNS-Lookup-Objekt mit Cache.
+//               Braucht externen DNS-Resolver, der per UDP ansprechbar ist.
+//
+// Autor: Zesstra
+
+/* Im Mudlibmaster in receive_udp() braucht es noch etwas a la:
+  if( message[0..9]=="DNSLOOKUP\n" ) {
+    "/p/daemon/dnslookup"->update( message );
+    return;
+  }
+
+  ext. Objekt erwartet ganz simpel <hostname>\n als Eingabe und sendet zurueck:
+  DNSLOOKUP\n<hostname>\n<ip-adresse>|UNKNOWN\n
+  (Das | steht fuer oder.)
+*/
+
+#pragma strong_types,rtt_checks
+
+// externer server, der den DNS-Resolve macht.
+#define IPLOOKUP_HOST "127.0.0.1"
+#define IPLOOKUP_PORT 8712
+
+mapping cache = ([]);
+
+mapping _query_cache() {return cache;}
+
+protected void create()
+{
+  seteuid(getuid());
+  set_next_reset(3600);
+}
+
+// ja... total simpel... nicht mehr aufwand als noetig.
+void reset()
+{
+  cache = ([]);
+  set_next_reset(10800);
+}
+
+// eigentliche Anfrage an den externen Resolver senden.
+protected void make_request(string hostname)
+{
+  send_udp( IPLOOKUP_HOST, IPLOOKUP_PORT, hostname+"\n" );
+  if (sizeof(cache) > 1000)
+    reset();
+  cache[hostname]=0; // cached request, but unknown result (yet)
+}
+
+// Hostnamen asynchron aufloesen.
+public string resolve( string hostname )
+{
+  if (member(cache, hostname))
+    return cache[hostname];
+  make_request( hostname );
+  return 0;  // leider...
+}
+
+// Pruefung, ob von <ip> Verbindungen zu unserer IP nach <localport>
+// weitergeleitet werden.
+public int check_tor(string ip, int localport)
+{
+  string *arr=explode(ip,".");
+  if (!sizeof(arr)==4)
+    return 0;
+  string req =
+    sprintf("%s.%s.%s.%s.%d.60.24.79.87.ip-port.exitlist.torproject.org",
+            arr[3],arr[2],arr[1],arr[0],localport);
+  
+  return resolve(req) == "127.0.0.2";
+}
+
+// Pruefung, ob <ip> auf einigen Blacklists steht.
+public int check_dnsbl(string ip)
+{
+  string *arr=explode(ip,".");
+  if (!sizeof(arr)==4)
+    return 0;
+  string req =
+    sprintf("%s.%s.%s.%s.dnsbl.dronebl.org",
+            arr[3],arr[2],arr[1],arr[0]);
+  
+  return resolve(req) != 0;
+}
+
+/* wird vom master aufgerufen, wenn eine antwort vom externen
+ * iplookup dienst eintrudelt.
+ */
+public void update( string udp_reply )
+{
+  if( previous_object()!=master() ) return;
+  string *reply = explode(udp_reply,"\n");
+  if( sizeof(reply)<3 ) return;
+
+  if (reply[2] == "UNKNOWN")
+    cache[reply[1]] = 0;
+  else
+    cache[reply[1]] = reply[2];
+}
+