Weitgehender Neubau auf intermud-2.5.
Benutzt moderne LDMud-3.5-Sprachmittel wie structs.
diff --git a/secure/inetd/i_service.c b/secure/inetd/i_service.c
new file mode 100644
index 0000000..b27606d
--- /dev/null
+++ b/secure/inetd/i_service.c
@@ -0,0 +1,88 @@
+#pragma strict_types, save_types, rtt_checks, pedantic
+#pragma no_clone, no_shadow, no_inherit
+
+#include <intermud.h>
+#include <regexp.h>
+#include <living/comm.h>
+#include <defines.h>
+#include <daemon/mand.h>
+
+protected nosave string currentname = "INETD-service";
+
+public string service_name()
+{
+  return "undefined";
+}
+
+public string name(int egal)
+{
+  return currentname || "INETD-"+service_name();
+}
+
+public string Name(int egal)
+{
+  return capitalize(name(egal));
+}
+
+// we received a reply to one of our requests.
+// Note: if response is 0, the peer did not respond (timeout)...
+protected void recv_reply(int id, mapping request, mapping response)
+{
+  if(response)
+  {
+    if (stringp(response[RECIPIENT]))
+    {
+      object ob = find_player(response[RECIPIENT])
+                  || find_object(response[RECIPIENT]);
+      if (ob)
+      {
+          currentname = capitalize(data[SENDER])+"@"+capitalize(data[NAME]);
+          ob->ReceiveMsg(regreplace(response[DATA],"[:^print:]|\n","",1),
+                         MT_NOTIFICATION, service_name(), 0, ME);
+          currentname = 0;
+    }
+  }
+  else
+  {
+    // no response, timeout...
+    if (request[SENDER] && stringp(request[SENDER]))
+    {
+      object ob = find_player(request[SENDER])
+                  || find_object(request[SENDER]);
+      if (ob)
+          ob->ReceiveMsg("Das Mud \'" + request[NAME] +
+                         "\' konnte nicht erreicht werden.\n",
+                         MT_NOTIFICATION, 0, service_name(), ME);
+    }
+  }
+}
+
+// we received an intermud request
+protected void recv_request(mapping data)
+{
+  // implement it!
+  raise_error("recv_request() has to be implemented!\n");
+}
+
+// send request via intermud
+public int request(string mudname, string|int data)
+{
+  return INETD->send(mudname, ([REQUEST: servicename(),
+                                DATA: data,
+                                SENDER: getuid(previous_object())]),
+                  #'recv_reply) > 0;
+}
+
+protected void create()
+{
+  INETD->register_service(service_name(), #'recv_request);
+  currentname = "INETD-"+service_name();
+}
+
+public varargs int remove(int silent)
+{
+  INETD->unregister_service(service_name());
+  destruct(this_object());
+}
+
+