sefun query_ip_number an driver sefun angeglichen

Die sefun verhaelt sich nun wie die vom driver gelieferte
sefun und interactive_info(...,II_IP_NUMBER), d.h.
es wird garantiert ein string als Ergebnis geliefert und
es ist ein Fehler, wenn das Objekt nicht existiert oder
nicht interatkiv ist.
Ausserdem Kommentare ergaenzt.

Change-Id: I8131e667a9702b505e6817136c087ebb626bca3d
diff --git a/secure/simul_efun/query_ip_name.c b/secure/simul_efun/query_ip_name.c
index 222fd26..4ad213e 100644
--- a/secure/simul_efun/query_ip_name.c
+++ b/secure/simul_efun/query_ip_name.c
@@ -1,12 +1,16 @@
 /* This sefun is to provide a replacement for the efuns query_ip_name() and
  * query_ip_number().
  * Feel free to add it to your mudlibs, if you have much code relying on that.
+ *
+ * The code of the helper functions originates from the driver sources, they
+ * are kept as-is intentionally.
  */
 
 #if ! __EFUN_DEFINED__(query_ip_name)
 
 #include <interactive_info.h>
 
+// (actually not used in MG)
 private varargs string _query_ip_name(object player)
 {
     object ob = player;
@@ -15,7 +19,7 @@
     return efun::interactive_info(ob, II_IP_NAME);
 }
 
-private varargs string _query_ip_number(object player)
+private varargs string int_query_ip_number(object player)
 {
     object ob = player;
     ob ||= efun::this_player();
@@ -23,22 +27,35 @@
     return efun::interactive_info(ob, II_IP_NUMBER);
 }
 
-// * Herkunfts-Ermittlung
-string query_ip_number(object ob)
+// First tries to get the "real" IP (instead of the proxy's one), which was
+// saved in the object by the login object. If that is unsuccessful, it falls
+// back to the driver information of the IP the interactive object is
+// connected to.
+public string query_ip_number(object ob)
 {
-  ob= ob || this_player();
-  if (!objectp(ob) || !interactive(ob)) return 0;
-  if(ob->query_realip() && ob->query_realip()!="")
+  ob = ob || this_player();
+  if(objectp(ob) && interactive(ob))
   {
-    return ob->query_realip();
+    string realip = ob->query_realip();
+    if (sizeof(ob->query_realip()))
+    {
+      return realip;
+    }
   }
-  return _query_ip_number(ob);
+  return int_query_ip_number(ob);
 }
 
+/* Liefert zu einer gegebenen ipnum den Hostnamen.
+ * @param ipnum eine numerische ip-adresse oder ein interactive
+ * @return den Hostnamen der zu der angegebenen ip-adresse gehoert.
+ * wenn der hostname nicht bekannt ist, wird die ipadresse zurueckgegeben.
+ */
 public string query_ip_name(string|object ob)
 {
+  // First get the IP number (as string) for the object or  a 0.
   if ( !ob || objectp(ob) )
       ob=query_ip_number(ob);
+  // then get its host name from the lookup & cache daemon.
   return "/p/daemon/iplookup"->host(ob);
 }