/*  -*- LPC -*-  */
/*
 * $Id: out_auth.c,v 1.3 1999/11/23 12:58:56 turrican Exp $
 */
/*
 * This will connect up to an auth demon and get it to return our
 * login name.
 * Written by Pinkfish.
 * Rewritten by Turrican on 23-4-96.
 */
#include <network.h>
inherit CLIENT;
class auth {
  object Object;
  string Function;
}
private nosave mapping found;
#define AUTH_PORT 113
protected void create() {
  client::create();
  SetSocketType(STREAM);
  SetDestructOnClose(1);
  found = ([]);
} /* create() */
void query_auth(string func) {
  string addr;
  int port, fd;
  class auth auth;
  /* Disable for now, until we find a way to stop denial-of-service
     attacks */
  call_other(previous_object(), func, 0);
  return;
  addr = socket_address(previous_object());
  if (!addr) {
    call_other(previous_object(), func, 0);
    return;
  }
  sscanf(addr, "%s %d", addr, port);
  if ((fd = eventCreateSocket(addr, AUTH_PORT)) < 0) {
    call_other(previous_object(), func, 0);
    return;
  }
  auth = new(class auth);
  auth->Object = previous_object();
  auth->Function = func;
  found[fd] = auth;
  eventWrite(fd, sprintf("%d , %d\r\n", port,
                         query_ip_port(previous_object())));
} /* query_auth() */
protected void eventRead(int fd, string mess) {
  string name;
  class auth auth;
  mess = replace_string(mess, "\r\n", "\n");
  sscanf(mess, "%*d , %*d : %*s : %*s : %s\n", name);
  if (!(auth = (class auth)found[fd])) {
    eventAbortCallback(fd);
    return;
  }
  if (objectp(auth->Object)) {
    call_other(auth->Object, auth->Function, name);
    auth->Object = 0;
  }
  eventAbortCallback(fd);
}
protected void eventSocketClose(int fd) {
  class auth auth = (class auth)found[fd];
  if (auth) {
    if (objectp(auth->Object))
      call_other(auth->Object, auth->Function, 0);
    map_delete(found, fd);
  }
} /* close_callback() */