/* 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;
    ob ||= efun::this_player();

    return efun::interactive_info(ob, II_IP_NAME);
}

private varargs string int_query_ip_number(object player)
{
    object ob = player;
    ob ||= efun::this_player();

    return efun::interactive_info(ob, II_IP_NUMBER);
}

// 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))
  {
    string realip = ob->query_realip();
    if (sizeof(realip))
    {
      return realip;
    }
  }
  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);
}

#endif

