#include "xrmonwatch.h"

Agent agent;
int row = 0;
static int session = 1;
static int reqid = 1;
char *the_community = "public";
int the_timeout = 2;
extern int dataFile;


buffer_send_query()
{
  getreq msg;
  int rc;

  vPacketData.cmp[vPacketData.ncmp - 2]     = session;
  vPacketData.cmp[vPacketData.ncmp - 1]     = row;

  bzero(&msg, sizeof(msg));
  bcopy(&vPacketData, &msg.varlist.elem[0].name, sizeof(vPacketData));
  msg.reqid = getpid();
  msg.varlist.len = 1;
  msg.reqid = ++reqid;
  
  if((rc = snmpsend(NXT, reqid, &(agent.addr), "snmp", &msg,
		     the_community, strlen(the_community),
		     the_timeout)) < 0)
    {
      printf("error = %d\n", rc);
      return;
    }
}


char *
buffer_get_response(len)
     int *len;
{
  getreq  reply;
  char    *s_id = (char *) NULL;
  struct  sockaddr_in from;
  int     sid_len;
  int     rc;
  static char buf[BUFSIZ];
  char  c;

  if(dataFile)
    {
      read(dataFile, &c, sizeof(c));
      read(dataFile, len, sizeof(int));
      read(dataFile, &c, sizeof(c));
      read(dataFile, buf, *len);
      return(buf);
    }

  if((rc = snmprecv(&from, (char *) NULL, &reqid, s_id, &sid_len, &reply,
                    sizeof(getreq))) < 0)
    {
      printf("error = %d\n", rc);
      return((char *) NULL);
    }

  if(oidncmp(&vPacketData, &(reply.varlist.elem[0].name), 12) != 0)
    {
      return((char *) NULL);
    }

  if(reply.errstat)
    {
      printf("resetting row..\n");
      row = 0;
      return((char *) NULL);
    }

  if(row == reply.varlist.elem[0].name.cmp[reply.varlist.elem[0].name.ncmp-1])
    return((char *) NULL);

  row = reply.varlist.elem[0].name.cmp[reply.varlist.elem[0].name.ncmp-1];
  *len = reply.varlist.elem[0].val.value.str.len;
  return(reply.varlist.elem[0].val.value.str.str);
}



#ifdef notdef
ether_send_query()
{
  getreq msg;
  int rc;
  int o = 0;

  vEtherStatsDropEvents.cmp[vEtherStatsDropEvents.ncmp - 1]        = session;
  vEtherStatsOctets.cmp[vEtherStatsOctets.ncmp - 1]                = session;
  vEtherStatsPkts.cmp[vEtherStatsPkts.ncmp - 1]                    = session;
  vEtherStatsBcastPkts.cmp[vEtherStatsBcastPkts.ncmp - 1]          = session;
  vEtherStatsMcastPkts.cmp[vEtherStatsMcastPkts.ncmp - 1]          = session;
  vEtherStatsAlignErrors.cmp[vEtherStatsAlignErrors.ncmp - 1]      = session;
  vEtherStatsUndersizePkts.cmp[vEtherStatsUndersizePkts.ncmp - 1]  = session;
  vEtherStatsOversizePkts.cmp[vEtherStatsOversizePkts.ncmp - 1]    = session;

  o = 0;
  bzero(&msg, sizeof(msg));
  bcopy(&vEtherStatsDropEvents, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsDropEvents));
  bcopy(&vEtherStatsOctets, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsOctets));
  bcopy(&vEtherStatsPkts, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsPkts));
  bcopy(&vEtherStatsBcastPkts, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsBcastPkts));
  bcopy(&vEtherStatsMcastPkts, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsMcastPkts));
  bcopy(&vEtherStatsAlignErrors, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsAlignErrors));
  bcopy(&vEtherStatsUndersizePkts, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsUndersizePkts));
  bcopy(&vEtherStatsOversizePkts, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsOversizePkts));

  msg.reqid = getpid();
  msg.varlist.len = 0;
  msg.reqid = 1;
  
  if((rc = snmpsend(REQ, 1, &(agent.addr), "snmp", &msg,
		     the_community, strlen(the_community),
		     the_timeout)) < 0)
    {
      printf("error = %d\n", rc);
      return;
    }

  vEtherStatsFragments.cmp[vEtherStatsFragments.ncmp - 1]         = session;
  vEtherStatsJabbers.cmp[vEtherStatsJabbers.ncmp - 1]             = session;
  vEtherStatsCollisions.cmp[vEtherStatsCollisions.ncmp - 1]       = session;
  vEtherStats64Octets.cmp[vEtherStats64Octets.ncmp - 1]           = session;
  vEtherStats127Octets.cmp[vEtherStats127Octets.ncmp - 1]         = session;
  vEtherStats255Octets.cmp[vEtherStats255Octets.ncmp - 1]         = session;
  vEtherStats511Octets.cmp[vEtherStats511Octets.ncmp - 1]         = session;
  vEtherStats1023Octets.cmp[vEtherStats1023Octets.ncmp - 1]       = session;
  vEtherStats1518Octets.cmp[vEtherStats1518Octets.ncmp - 1]       = session;

  o = 0;
  bzero(&msg, sizeof(msg));
  bcopy(&vEtherStatsFragments, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsFragments));
  bcopy(&vEtherStatsJabbers, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsJabbers));
  bcopy(&vEtherStatsCollisions &msg.varlist.elem[o++].name, 
	sizeof(vEtherStatsCollisions));
  bcopy(&vEtherStats64Octets, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStats64Octets));
  bcopy(&vEtherStats127Octets, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStats127Octets));
  bcopy(&vEtherStats255Octets, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStats255Octets));
  bcopy(&vEtherStats511Octets, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStats511Octets));
  bcopy(&vEtherStats1023Octets, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStats1023Octets));
  bcopy(&vEtherStats1518Octets, &msg.varlist.elem[o++].name, 
	sizeof(vEtherStats1518Octets));

  msg.reqid = getpid();
  msg.varlist.len = 0;
  msg.reqid = 3;
  
  if((rc = snmpsend(REQ, 3, &(agent.addr), "snmp", &msg,
		     the_community, strlen(the_community),
		     the_timeout)) < 0)
    {
      printf("error = %d\n", rc);
      return;
    }
}



buffer_get_response(stats)
     EtherStats *stats;
{
  getreq  reply;
  char    *s_id = (char *) NULL;
  struct  sockaddr_in from;
  int     sid_len;
  int     rc;

  if((rc = snmprecv(&from, (char *) NULL, &reqid, s_id, &sid_len, &reply,
                    sizeof(getreq))) < 0)
    {
      printf("error = %d\n", rc);
      return(-1);
    }

  if(reply.errstat)
    return(-1);

  if(reqid == 1)
    {
      stats->drop      = reply.varlist.elem[0].val.value.intgr;
      stats->octet     = reply.varlist.elem[1].val.value.intgr;
      stats->pkt       = reply.varlist.elem[2].val.value.intgr;
      stats->bcast     = reply.varlist.elem[3].val.value.intgr;
      stats->mcast     = reply.varlist.elem[4].val.value.intgr;
      stats->align     = reply.varlist.elem[5].val.value.intgr;
      stats->usize     = reply.varlist.elem[6].val.value.intgr;
      stats->osize     = reply.varlist.elem[7].val.value.intgr;
      stats->time1     = time(0);
    }

  if(reqid == 3)
    {
      stats->fragment  = reply.varlist.elem[0].val.value.intgr;
      stats->jabber    = reply.varlist.elem[1].val.value.intgr;
      stats->collision = reply.varlist.elem[2].val.value.intgr;
      stats->64octet   = reply.varlist.elem[3].val.value.intgr;
      stats->127octet  = reply.varlist.elem[4].val.value.intgr;
      stats->255octet  = reply.varlist.elem[5].val.value.intgr;
      stats->511octet  = reply.varlist.elem[6].val.value.intgr;
      stats->1023octet = reply.varlist.elem[7].val.value.intgr;
      stats->1518octet = reply.varlist.elem[8].val.value.intgr;
      stats->time2     = time(0);
    }

  return(0);
}
#endif
