/*
 * Whois (RFC 3912) plugin. 
 *
 * $Id$
 */

#define IN_PLUGIN
#include "../../echoping.h"
#ifdef HAVE_CONFIG_H
#include "../../config.h"
#include "config.h"
#endif

#define MAX_REQUEST 256

struct addrinfo whois_server;
char *hostname;
const char *request = NULL;
int dump = FALSE;
int n;
int sockfd;
FILE *files = NULL;
poptContext whois_poptcon;

void
whois_usage (const char *msg)
{
  if (msg)
    {
      printf ("Error: %s\n", msg);
    }
  poptPrintUsage (whois_poptcon, stdout, 0);
  fprintf (stderr, "  request\n");
  exit (1);
}

char *
init (const int argc, const char **argv, echoping_options global_options)
{
  int value;
  char *msg = malloc (256);
  char *rest;
  /* popt variables */
  struct poptOption options[] = {
    {"dump", 'd', POPT_ARG_NONE, &dump, 'd',
     "Dumps the reply from the whois server",
     ""},
    POPT_AUTOHELP POPT_TABLEEND
  };
  if (global_options.udp)
    err_quit ("UDP is incompatible with this whois plugin");
  /* Will probably be catched before because /etc/services have no entry for UDP port 43 */
  whois_poptcon = poptGetContext (NULL, argc,
				  argv, options, POPT_CONTEXT_POSIXMEHARDER);
  while ((value = poptGetNextOpt (whois_poptcon)) > 0)
    {
      switch ((char) value)
	{
	case 'd':
	  break;
	default:
	  sprintf (msg, "Wrong option %d (%c)", value, (char) value);
	  whois_usage (msg);
	}
    }
  if (value < -1)
    {
      sprintf (msg, "%s: %s",
	       poptBadOption (whois_poptcon, POPT_BADOPTION_NOALIAS),
	       poptStrerror (value));
      whois_usage (msg);
    }
  request = (char *) poptGetArg (whois_poptcon);
  if (request == NULL)
    whois_usage ("Mandatory request missing");
  rest = (char *) poptGetArg (whois_poptcon);
  if (rest != NULL && strcmp (rest, ""))
    whois_usage ("Extraneous arguments ignored");
  return "nicname";
}

void
start (struct addrinfo *res)
{
  whois_server = *res;
}

int
execute ()
{
  int nr = 0;
  char recvline[MAX_LINE + 1];
  char complete_request[MAX_REQUEST];
  if ((sockfd =
       socket (whois_server.ai_family, whois_server.ai_socktype,
	       whois_server.ai_protocol)) < 0)
    err_sys ("Can't open socket");
  if (connect (sockfd, whois_server.ai_addr, whois_server.ai_addrlen) < 0)
    err_sys ("Can't connect to server");
  if ((files = fdopen (sockfd, "r")) == NULL)
    err_sys ("Cannot fdopen");
  sprintf (complete_request, "%s\r\n", request);
  n = strlen (complete_request);
  if (writen (sockfd, complete_request, n) != n)
    err_sys ("writen error on socket");
  /* Read from the server */
  while ((nr = readline (files, recvline, MAX_LINE, 0)) > 0)
    if (dump)
      printf ("%s", recvline);
  if (dump)
    printf ("\n");
  close (sockfd);
  return 1;
}

void
terminate ()
{
}
