/*
 * unbound-fuzzme.c - parse a packet provided on stdin (for fuzzing).
 *
 */
#include "config.h"
#include "util/regional.h"
#include "util/module.h"
#include "util/config_file.h"
#include "iterator/iterator.h"
#include "iterator/iter_priv.h"
#include "iterator/iter_scrub.h"
#include "util/log.h"
#include "util/netevent.h"
#include "util/alloc.h"
#include "sldns/sbuffer.h"
#include "services/cache/rrset.h"

int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t nr) {
  log_init("/tmp/foo", 0, NULL);
  struct regional* reg;

  struct sldns_buffer *pkt = sldns_buffer_new(1);
  sldns_buffer_new_frm_data(pkt, buf, nr);

  reg = regional_create();

  struct msg_parse msg;
  struct edns_data edns;
  memset(&msg, 0, sizeof(struct msg_parse));
  memset(&edns, 0, sizeof(edns));

  struct query_info qinfo_out;
  memset(&qinfo_out, 0, sizeof(struct query_info));
  qinfo_out.qname = (unsigned char *) "\03nic\02de";
  uint8_t *peter = (unsigned char *) "\02de";   // zonename  
  struct module_env env;
  memset(&env, 0, sizeof(struct module_env));
  struct config_file cfg;
  memset(&cfg, 0, sizeof(struct config_file));

  cfg.harden_glue = 0;    // crashes now, want to remove that later
  env.cfg = &cfg;
  cfg.rrset_cache_slabs = HASH_DEFAULT_SLABS;
  cfg.rrset_cache_size = HASH_DEFAULT_MAXMEM;

  struct comm_base* base = comm_base_create(0);
  comm_base_timept(base, &env.now, &env.now_tv);

  env.alloc = malloc(sizeof(struct alloc_cache));
  alloc_init(env.alloc, NULL, 0);

  env.rrset_cache = rrset_cache_create(env.cfg, env.alloc);
  

  struct iter_env ie;
  memset(&ie, 0, sizeof(struct iter_env));

  struct iter_priv priv;
  memset(&priv, 0, sizeof(struct iter_priv));
  ie.priv = &priv;


  if (parse_packet(pkt, &msg, reg) != LDNS_RCODE_NOERROR) {    
    goto out;
  }
  if (parse_extract_edns(&msg, &edns, reg) != LDNS_RCODE_NOERROR) {
    goto out;
  }


  scrub_message(pkt, &msg, &qinfo_out, peter, reg, &env, &ie);   

out:
  rrset_cache_delete(env.rrset_cache);
  alloc_clear(env.alloc);
  free(env.alloc);
  comm_base_delete(base);
  regional_destroy(reg);
  sldns_buffer_free(pkt);
  return 0;
}
