#include <stdio.h>
#include <ctype.h>
#include "Connect.h"
#include "Parse.h"
#include "inet-udp.h"

/* #define printError() fprintf(stderr, "%s\n", Error_String(Error)) */

void printError()
{
  while (Error_Exists)
    {
      fprintf(stderr, "%s\n", Error_String(Error));
      Error_Pop();
    }
}

#define E(x) if (x) printError()

Trap mapPort(), newLicense(), newPool(), setAuthentication(),
  setAuthorization();

#define MAXPORTS 20

typedef struct _srvinfo
{
  int portsInitialized;
  Addr ports[MAXPORTS];
} srvinfo;

Keywords mainwords[] =
{
  { "port",		mapPort },
  { "license",		newLicense },
  { "pool",		newPool },
  { "authentication",	setAuthentication },
  { "authorization",	setAuthorization },
/*
  { "vendor",		setVendor },
  { "program",		setProgram },
  { "version",		setVersion },
  { "totallicenses",	setTotallicenses },
  { "licenses",		setLicenses },
*/
  { NULL,		NULL }
};

/*
 * ERRORS:
 *
 * APP_PORTTOOLARGE: FATAL
 * The port number specified is out of range.
 *
 * APP_PORTNUMEXPECTED: FATAL
 * A port number was expected, but not found.
 */
Trap mapPort(block, line)
     MasterBlock *block;
     char *line;
{
  int i;
  srvinfo *info;
  char *temp;
  Trap retval;

  if (Parse_GetCurrentData(block, "srvinfo",
			   (caddr_t *)&info, sizeof(srvinfo)))
    {
      if (Error_Severity == S_FATAL)
	return CHECK;
      else
	Error_Pop();
    }

  if (!info->portsInitialized)
    {
      for (i = 0; i < MAXPORTS; i++)
	info->ports[i] = NOADDRESS;
      info->portsInitialized++;
    }

  while (isspace(*line)) line++;

  if (isdigit(*line))
    {
      i = atoi(line);
      if (i >= MAXPORTS)
	Return(APP_PORTTOOLARGE, i);
    }
  else
    Return(APP_PORTNUMEXPECTED, NULL);

  while (isdigit(*line)) line++;
  while (isspace(*line)) line++;

  temp = (char *)malloc(strlen(line) + 1);
  if (temp == NULL)
    Return(MEMORY_ALLOC, strlen(line) + 1);

  strcpy(temp, line);
  if (temp[strlen(temp) - 1] == '\n')
    temp[strlen(temp) - 1] = '\0';

  retval = Connect_NameToAddress(temp, &(info->ports[i]));
  free(temp);
  return retval;
}

Trap newLicense(block, line)
     MasterBlock *block;
     char *line;
{
  char *foo;

  E(Parse_GetCurrentData(block, "testtype", &foo, strlen(line) + 1));
    else
      strcpy(foo, line);

  return OK;
}

Trap newPool(block, line)
     MasterBlock *block;
     char *line;
{
  return OK;
}

Trap setAuthentication(block, line)
     MasterBlock *block;
     char *line;
{
  char *foo;

  E(Parse_GetCurrentData(block, "authtype", &foo, strlen(line) + 1));
    else
      strcpy(foo, line);

  return OK;
}

Trap setAuthorization(block, line)
     MasterBlock *block;
     char *line;
{
  return OK;
}

/*
Keywords authorizeWords[] =
{
  { "users",		setUsers },
  { "platforms",	setPlatforms },
  { "hosts",		setHosts },
  { "failuremsg",	setMsg },
  { NULL,		NULL }
};
*/

main(argc, argv)
     char **argv;
{
  Packet p;
  char *message = "hello\n";
  char name[50];
  MasterBlock *block;
  char *foo;
  srvinfo *s;
  Addr a, b;

  E(Connect_Initialize());
  E(Connect_RegisterDomain(&inetudp));
  E(Parse_NewMasterBlock(&block));
  E(Parse_RegisterKeywords(block, "server", mainwords));

  E(Parse_ParseFile(block, "config"));
  if (Error_Exists)
    printError();
/*
  if (Parse_ParseFile(block, "config"))
    {
      if (Error == PARSE_BADKEYWORD)
	fprintf(stderr, "Bad keyword in line %d.\n", (int)Error_Info);
      else
	printError();
    }
*/
/*
  E(Parse_GetCurrentData(block, "testtype", &foo, 0));
  else
    fprintf(stdout, foo);

  E(Parse_GetCurrentData(block, "authtype", &foo, 0));
  else
    fprintf(stdout, foo);
*/
  E(Parse_GetCurrentData(block, "srvinfo", (caddr_t *)&s, 0));
  else
    {
      a = s->ports[0];
      b = s->ports[1];
    }

  E(Connect_OpenConnection(a, b));

  p.Source = a;
  p.Destination = b;
  p.packet = message;
  p.length = strlen(message);

  E(Connect_SendPacket(&p));
  E(Connect_Wait(&p, NOTIMEOUT));

  fprintf(stdout, "%s", p.packet);
}
