#include <config.h>

#if HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdio.h>
#if HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
#include <sys/types.h>
#if HAVE_WINSOCK_H
#include <winsock.h>
#else
#include <netinet/in.h>
#include <netdb.h>
#endif

#include "asn1.h"
#include "mib.h"
#include "snmp_api.h"
#include "read_config.h"
#include "snmp_debug.h"

struct traphandle {
   char *exec;
   oid trap[MAX_OID_LEN];
   size_t traplen;
   struct traphandle *next;
};

struct traphandle *traphandlers=0;
struct traphandle *defaulthandler=0;

/* handles parsing .conf lines of: */
/*   traphandle OID EXEC           */

char *
snmptrapd_get_traphandler(oid *name, size_t namelen)
{
  struct traphandle **ttmp;
  DEBUGMSGTL(("snmptrapd:traphandler", "looking for trap handler for "));
  DEBUGMSGOID(("snmptrapd:traphandler", name, namelen));
  DEBUGMSG(("snmptrapd:traphandler", "...\n"));
  for(ttmp = &traphandlers;
      *ttmp != NULL && snmp_oid_compare((*ttmp)->trap, (*ttmp)->traplen, name, namelen);
      ttmp = &((*ttmp)->next));
  if (*ttmp == NULL) {
    if (defaulthandler) {
      DEBUGMSGTL(("snmptrapd:traphandler", "  None found, Using the default handler.\n"));
      return defaulthandler->exec;
    }
    DEBUGMSGTL(("snmptrapd:traphandler", "  Didn't find one.\n"));
    return NULL;
  }
  DEBUGMSGTL(("snmptrapd:traphandler", "  Found it!\n"));
  return (*ttmp)->exec;
}

void
snmptrapd_traphandle(const char *token, char *line)
{
  struct traphandle **ttmp;
  char buf[STRINGMAX];
  char *cptr;
  int doingdefault=0;

  /* find the current one, if it exists */
  if (strncmp(line,"default",7) == 0) {
    ttmp = &defaulthandler;
    doingdefault = 1;
  } else {
    for(ttmp = &traphandlers; *ttmp != NULL; ttmp = &((*ttmp)->next));
  }

  if (*ttmp == NULL) {
    /* it doesn't, so allocate a new one. */
    *ttmp = (struct traphandle *) malloc(sizeof(struct traphandle));
    memset(*ttmp, 0, sizeof(struct traphandle));
  } else {
    if ((*ttmp)->exec)
      free((*ttmp)->exec);
  }
  cptr = copy_word(line, buf);
  if (!doingdefault) {
    (*ttmp)->traplen = MAX_OID_LEN;
    if (!read_objid(buf,(*ttmp)->trap, &((*ttmp)->traplen))) {
      char buf1[STRINGMAX];
      sprintf(buf1, "Bad trap OID in traphandle directive: %s", buf);
      config_perror(buf1);
      return;
    }
  }

  (*ttmp)->exec = strdup(cptr);
  DEBUGMSGTL(("read_config:traphandler", "registered handler for: "));
  if (doingdefault) {
    DEBUGMSG(("read_config:traphandler", "default"));
  } else {
    DEBUGMSGOID(("read_config:traphandler", (*ttmp)->trap, (*ttmp)->traplen));
  }
  DEBUGMSG(("read_config:traphandler", "\n"));
}

