Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/secure/misc/mssp.c b/secure/misc/mssp.c
new file mode 100644
index 0000000..4c45388
--- /dev/null
+++ b/secure/misc/mssp.c
@@ -0,0 +1,214 @@
+#include <config.h>
+#include <thing/description.h>
+#include <strings.h>
+
+// hosts who asked us in the past and timestamp of last connection which got
+// the full datatset.
+private nosave mapping peers = ([:1]);
+
+/* For a list of official and extended fields:
+   http://www.mudbytes.net/index.php?a=articles&s=MSSP_Fields
+   For a protocal description:
+   http://tintin.sourceforge.net/mssp/
+   */
+
+#define MSSP_VAR 1
+#define MSSP_VAL 2
+
+public string convert_tn(mapping ldata);
+
+protected string list_ports() {
+  int ports = query_mud_port(-1) - 1;
+  string res="23";
+  for(; ports>=0 ; --ports)
+    res += "\t" + to_string(query_mud_port(ports));
+
+  return res;
+}
+
+#define DESCRIPTION \
+    MUDNAME" is a native German LPmud. It was founded in 1992 and has "\
+    "been prospering since. The world features an original fantasy setting "\
+    "with many facets. The 13 domains form a big world with 18000 rooms to "\
+    "explore and several thousand NPCs. You can choose between 7 races and "\
+    "10 classes (guilds). Advancing is done through a combination of "\
+    "exploration points, experience points, class skills, finished "\
+    "adventures and some more. The levels are not limited, current maximum "\
+    "is about 200. After becoming a high level player it's possible to "\
+    "become a wizard and add your own imagination to the game. We are "\
+    "especially proud of attracting a number of visually impaired players "\
+    "who very much enjoy playing a text based online RPG. Thats why we have "\
+    "an option to turn ascii-graphics off. Multiplaying is a bit restricted "\
+    "and scripting is discouraged."
+
+private nosave mapping mindata = ([
+    "NAME"             : MUDNAME,
+    "UPTIME"           : to_string(__BOOT_TIME__),
+    ]);
+
+private nosave mapping data = mindata + ([
+    "PORT"             : list_ports(),
+    "CODEBASE"         : _MUDLIB_NAME_+"-"+_MUDLIB_VERSION_,
+    "HOSTNAME"         : __HOST_NAME__ + "." + __DOMAIN_NAME__,
+#if MUDHOST == __HOST_NAME__
+// diese Angaben sollen nur gesendet werden, wenn das Mud wirklich auf dem
+// MG-Rechner laeuft und kein Homemud ist.
+    "CRAWL DELAY"      : "1",
+    "DESCRIPTION"      : DESCRIPTION,
+    "CREATED"          : "1992",
+    "ICON"             : "http://mg.mud.de/newweb/img/icon.gif",
+    "IP"               : "87.79.24.60",
+    "CONTACT"          : "mud@mg.mud.de",
+    "WEBSITE"          : "http://mg.mud.de/",
+    "AREAS"            : "13",
+    "MOBILES"          : "2600",
+    "OBJECTS"          : "4000",
+    "ROOMS"            : "18000",
+    "CLASSES"          : "10",
+    "LEVELS"           : "200",
+    "RACES"            : "7",
+    "SKILLS"           : "140",
+    "MULTICLASSING"    : "0",
+    "PLAYERKILLING"    : "Restricted",
+    "NEWBIE FRIENDLY"  : "1",
+    "ROLEPLAYING"      : "Accepted",
+    "WORLD ORIGINALITY": "Mostly Original",
+    "MINIMUM AGE"      : "6",
+    "SSL"              : "4712",
+    "STATUS"           : "Live",
+    "STATUS-NOTES"     : "live and running",
+    "PORT-NOTES"       : "player ports are 23 and 4711, SSL port is 4712",
+    "QUEST-NOTES"      : "We have about 200 Quests and MiniQuests and "
+                         "they play an important role in gaining "
+                         "levels and skills.",
+    "MULTIPLAYING-NOTES"     : "for combat and quests only 2 characters may be active",
+#else
+    "STATUS"           : "Alpha",
+    "STATUS-NOTES"     : "Homemud for testing puposes",
+#endif
+    "LANGUAGE"         : "German",
+    "LOCATION"         : "Germany",
+    "FAMILY"           : "LPMud",
+    "GENRE"            : "Fantasy",
+    "SUBGENRE"         : "None",
+    "GAMEPLAY"         : "Adventure",
+    "GAMESYSTEM"       : "Custom",
+    "INTERMUD"         : "IM2-Zebedee",
+    "HELPFILES"        : "N/A",
+    "MULTIPLAYING"     : "Restricted",
+    "EQUIPMENT SYSTEM" : "Both",
+    "TRAINING SYSTEM"  : "Both",
+    "QUEST SYSTEM"     : "Integrated",
+    "ZMP"              : "0",
+    "ANSI"             : "1",
+    "GMCP"             : "1",
+    "MCCP"             : "0",
+    "MCP"              : "0",
+    "MSP"              : "0",
+    "MXP"              : "0",
+    "PUEBLO"           : "0",
+    "VT100"            : "1",
+    "XTERM 256 COLORS" : "0",
+    "PAY TO PLAY"      : "0",
+    "PAY FOR PERKS"    : "0",
+    "HIRING BUILDERS"  : "1",
+    "HIRING CODERS"    : "1",
+    "CODEBASE-NOTES"         : "download daily snapshot of our public base "
+                               "mudlib at ftp://mg.mud.de/Software/MudLib/, "
+                               "get our driver at http://www.ldmud.eu/",
+    "FAMILY-NOTES"           : "Descendant of Nightfall, base for several "
+                               "german MUDs, uses LDMud-3.5.x", 
+    "HELPFILES-NOTES"        : "each basic command, and hundreds of other docs",
+    "MOBILES-NOTES"          : "npc's can be cloned, so there can be thousands",
+    "OBJECTS-NOTES"          : "objects can be cloned, so there can be thousands",
+    "RESETS-NOTES"           : "doesn't apply, LPMud",
+    "MUDPROGS-NOTES"         : "doesn't apply, LPMud",
+    "MUDTRIGS-NOTES"         : "doesn't apply, LPMud",
+    "RACES-NOTES"            : "some additional for non player characters",
+    "SKILLS-NOTES"           : "each class/guild and race has its own set of skills",
+    "PLAYERKILLING-NOTES"    : "playerkilling is limited to specific rooms",
+/*
+    "ADULT MATERIAL"   : "0",
+    "PLAYER CITIES"    : "0",
+    "PLAYER CLANS"     : "0",
+    "PLAYER CRAFTING"  : "0",
+    "PLAYER GUILDS"    : "0",
+    "ROOMS-NOTES"            : "areas have generated rooms, could be millions",
+ */
+    ]);
+
+
+// cache fuer die telnetneg-basierte variante
+private nosave string tn_result_min = convert_tn(mindata);
+private nosave string tn_result = convert_tn(data);
+
+
+// converts into the array to be sent via telnet suboption negotiation.
+public string convert_tn(mapping ldata) {
+  string res="";
+  foreach(string key, string value: ldata) {
+    res += sprintf("%c%s%c%s", MSSP_VAR, key, MSSP_VAL, value);
+  }
+  return res;
+}
+
+
+public void print_mssp_response() {
+ string ip = query_ip_number(previous_object());
+ mapping ldata;
+ if (stringp(ip)) {
+     // Vollen Datensatz alle ("CRAWL DELAY" / 2) h, daher * 1800.
+   if (peers[ip] > (time() - (to_int(data["CRAWL DELAY"]) || 1) * 1800)) {
+       // this peers asks to often and gets only the minimal dataset
+       ldata = mindata;
+   }
+   else {
+       ldata = data;
+       peers[ip] = time(); // record timestamp
+   }
+ }
+ else
+     ldata = data;
+
+ /* data["WHO"] = implode(map(filter(users(), 
+                      function status (object o)
+                      { return !o->QueryProp(P_INVIS); } ),
+                    function string (object o)
+                    { return capitalize(o->query_real_name()); } ),
+                  "\t" );
+  */
+  ldata["PLAYERS"] = to_string(sizeof(users())-1);
+
+  string reply = "\r\nMSSP-REPLY-START\r\n";
+
+  foreach(string key, string value: ldata) {
+    reply += key + "\t" + value + "\r\n";
+  }
+
+  reply += "MSSP-REPLY-END\r\n";
+  write(reply);
+}
+
+public string get_telnegs_str() {
+  string ip = query_ip_number(previous_object());
+  string res;
+
+  if (stringp(ip)) {
+    // Vollen Datensatz alle ("CRAWL DELAY" / 2) h, daher * 1800.
+    if (peers[ip] > (time() - (to_int(data["CRAWL DELAY"]) || 1) * 1800)) {
+       // this peers asks to often and gets only the minimal dataset
+       res = tn_result_min;
+    }
+    else {
+        res = tn_result;
+        peers[ip] = time(); // record timestamp
+    }
+  }
+  else
+    res = tn_result;
+
+  res += convert_tn( (["PLAYERS": to_string(sizeof(users())-1) ]) );
+   
+  return res;
+}
+