Weitgehender Neubau auf intermud-2.5.
Benutzt moderne LDMud-3.5-Sprachmittel wie structs.
diff --git a/secure/inetd/man.c b/secure/inetd/man.c
new file mode 100644
index 0000000..c7218e0
--- /dev/null
+++ b/secure/inetd/man.c
@@ -0,0 +1,114 @@
+#pragma strict_types, save_types, rtt_checks, pedantic
+#pragma no_clone, no_shadow, no_inherit
+
+inherit __DIR__"i_service";
+
+#include <intermud.h>
+#include <regexp.h>
+#include <living/comm.h>
+#include <defines.h>
+#include <daemon/mand.h>
+
+#define INETD_MANPAGE_FOUND "[ManD@%s] Folgende Seite wurde gefunden: %s\n"
+//                              mud                                 file
+#define INETD_NO_MANPAGE    "[ManD@%s] Keine Hilfeseite gefunden fuer '%s'.\n"
+//                              mud                                 page
+#define INETD_MANPAGES      "[ManD@%s] Die folgenden Seiten passen:\n" \
+                             "%'-'78.78s\n%s%'-'78.78s\n"
+//                                mud  "" pagelist ""
+#define INETD_MAN_REQUESTED "%s@%s: Abfrage abgeschickt.\n"
+//                             page  mud#ifndef LOCAL_NAME
+
+#define LOCAL_NAME "MorgenGrauen"
+
+// 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)
+      {
+          ob->ReceiveMsg(regreplace(response[DATA],"[:^print:]|\n","",1),
+                         MT_NOTIFICATION, "hilfe", 0, ME);
+    }
+  }
+  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, "hilfe", "remote man: ", ME);
+    }
+  }
+}
+
+// we received an intermud manpage request
+protected void recv_request(mapping data)
+{
+  string manpage = data[DATA];
+  string *tmp = explode(manpage,"/");
+  if (sizeof(tmp)>1)
+  {
+    if (file_size(MAND_DOCDIR+manpage)>=0)
+      tmp=({tmp[<1], manpage});
+    else
+      tmp=({});
+  }
+  else
+    tmp=(string *)call_other(MAND,"locate",data[DATA],0);
+  // Gilden ausfiltern
+  mapping pages = ([]);
+  int index=sizeof(tmp);
+  while(index--)
+  {
+    if (tmp[1][0..1]!="g.") pages[tmp[index]]=tmp[index-1];
+    index--;
+  }
+  string ret;
+  switch(sizeof(pages))
+  {
+    case 0:
+      ret=sprintf(INETD_NO_MANPAGE,LOCAL_NAME,manpage);
+      break;
+    case 1:
+      tmp=m_indices(pages)[0];
+      ret=sprintf(INETD_MANPAGE_FOUND,LOCAL_NAME,pages[tmp]);
+      index=0;
+      while(manpage=read_file(MAND_DOCDIR+tmp,index))
+      {
+        ret+=manpage;
+        index+=MAX_READ_FILE_LEN;
+      }
+      break;
+    default:
+      ret=sprintf(INETD_MANPAGES,LOCAL_NAME,"",
+                  break_string(implode(m_values(pages)," "),78),"");
+      break;
+  }
+  INETD->send(data[NAME],
+              ([REQUEST: REPLY, RECIPIENT: data[SENDER], ID: data[ID],
+                DATA: ret
+                ]),
+              0);
+}
+
+// Old interface. Request remote man page via intermud
+public string send_request(string mudname, string pagename)
+{
+  if (request(mudname, pagename))
+      return sprintf(INETD_MAN_REQUESTED,pagename,mudname);
+
+  return "Fehler beim Anfordern.\n";
+}
+
+