/*
 * This is the main file.
 *
 * Copyright 1990 by the Massachusetts Institute of Technology.
 *
 * For copying and distribution information, please see the file
 * <mit-copyright.h>.
 *
 * Tom Coppeto
 * MIT Network Services
 * 8 August 1990
 *
 *    $Source: /afs/net.mit.edu/tools/src/xport/RCS/main.c,v $
 *    $Author: tom $
 *    $Locker: tom $
 *    $Log:	main.c,v $
 * Revision 1.3  90/08/19  16:18:57  tom
 * *** empty log message ***
 * 
 * Revision 1.2  90/08/15  14:08:16  tom
 * use setenv to reste app dir
 * 
 * Revision 1.1  90/08/15  01:13:07  tom
 * Initial revision
 * 
 */

#ifndef lint
static char *rcsid = "$Header: /afs/net.mit.edu/tools/src/xport/RCS/main.c,v 1.3 90/08/19 16:18:57 tom Exp Locker: tom $";
#endif

#include "xport.h"
#include <mit-copyright.h>

char communityB[100];

#ifndef XAPPLRESDIR
#define XAPPLRESDIR "/usr/lib/X11/app-defaults/"
#endif


main(argc, argv)
     int  argc;
     char **argv;
{
  struct hostent *hp = (struct hostent *) NULL;
  unsigned long laddr = 0;
  char **prog;
  int len;

  setenv("XAPPLRESDIR", XAPPLRESDIR, 1);

  prog = argv;
  while(*++argv)
    {      
      if((strlen(*argv) > 1) && !strncmp(*argv, "-help", strlen(*argv)))
	usage(*prog);

      if((strlen(*argv) > 1) && !strncmp(*argv, "-community", strlen(*argv)))
	{
	  if(*++argv == (char *) NULL)
	    usage(*prog);
	  len = strlen(*argv);
	  strncpy(communityB, *argv, len);
	  community = communityB;
	  bzero(*argv, len);
	  if(len > 1)
	    **argv = 'x';
	  continue;
	}

      if((*argv[0] >= '0') && (*argv[0] <= '9'))
	if((laddr = inet_addr(*argv)) > 0)
	  hp = gethostbyaddr((char *) &laddr, 4, AF_INET);
      
      if((hp == (struct hostent *) NULL) && (laddr == 0))
	if(!(hp = gethostbyname(*argv)))
	  {
	    fprintf(stderr, "Cannot resolve name \"%s\".\n", *argv);
	    exit(1);
	  }
    }
  
  if(!hp  && !laddr)
    usage(*prog);

  if(laddr > 0)
    addr.s_addr = laddr;
  else
    bcopy(hp->h_addr, &(addr.s_addr), hp->h_length);

  if(get_config() != SUCCESS)
    {
      fprintf(stderr, "unable to get configuration...\n");
      exit(1);
    }

  draw_screen(argc, prog);
}
 




usage(prog)
     char *prog;
{
  fprintf(stderr, "usage: %s [-c <community name>] [agent]\n", prog);
  exit(1);
}



int
get_config()
{
  objident *obj[SNMPMAXVARS];
  caddr_t  *dat;
  int      i = 0;
  int      j = 0;
  int      k = 0;
  int      n;
  int      o;

  nboards = 0;
  bzero(board, sizeof(struct _board) * MAX_BOARDS);

  o = 0;
  obj[o++] = &vSysDescr;
  obj[o++] = &vDeviceOccSlots;
  obj[o++] = (objident *) NULL;

  if(!(dat = make_lots_o_snmp_queries(obj)))
        return(ERROR);

  o = 0;
  sysdesc = strcpy(malloc(strlen(dat[o]) + 1), dat[o]);
  ++o;
  bcopy(dat[o++], &nboards, sizeof(nboards));

  i = -1;
  for(n = 1; n <= nboards; n*=2)
    {
      ++k;
      if(!(nboards & n))
	continue;
      ++i;
      vBoardName.cmp[vBoardName.ncmp-1]               = k;
      vBoardTotalPorts.cmp[vBoardTotalPorts.ncmp-1]   = k;

      o = 0;
      obj[o++] = &vBoardName;
      obj[o++] = &vBoardTotalPorts;
      obj[o++] = (objident *) NULL;
      
      if(!(dat = make_lots_o_snmp_queries(obj)))
        return(ERROR);

      o = 0;
      board[i].name = strcpy(malloc(strlen(dat[o]) + 1), (char *) dat[o]);
      o++;
      bcopy(dat[o++], &(board[i].nports), sizeof(board[i].nports));
      for(j = 0; j < board[i].nports; j++)
	{
	  board[i].port[j].boardnum = k;
	  board[i].port[j].portnum  = j + 1;
	}
    }

  update_status();
  return(SUCCESS);
}



update_status()
{
  objident *obj[SNMPMAXVARS];
  caddr_t  *dat;
  int      i;
  int      j;
  int      n;
  int      o;
  unsigned long pkts;
  unsigned long xc;
  unsigned long rc;
  unsigned long t;

  i = -1;
  for(n = 1; n <= nboards; n*=2)
    {
      if(!(nboards & n))
	continue;
      ++i;
      for(j = 0; j < board[i].nports; j++)
	{
	  if(dsp_mode == DISPLAY_STATUS)
	    {
	      vPortAdminStatus.cmp[vPortAdminStatus.ncmp-2] = 
		board[i].port[j].boardnum;
	      vPortAdminStatus.cmp[vPortAdminStatus.ncmp-1] = 
		board[i].port[j].portnum;
	      vPortLinkStatus.cmp[vPortLinkStatus.ncmp-2] = 
		board[i].port[j].boardnum;
	      vPortLinkStatus.cmp[vPortLinkStatus.ncmp-1] = 
		board[i].port[j].portnum;
	      vPortNetworkStatus.cmp[vPortNetworkStatus.ncmp-2] = 
		board[i].port[j].boardnum;
	      vPortNetworkStatus.cmp[vPortNetworkStatus.ncmp-1] = 
		board[i].port[j].portnum;
	      
	      o = 0;
	      obj[o++] = &vPortAdminStatus;
	      obj[o++] = &vPortLinkStatus;
	      obj[o++] = &vPortNetworkStatus;
	      obj[o++] = (objident *) NULL;
	      
	      if(!(dat = make_lots_o_snmp_queries(obj)))
		return;
		
	      o = 0;
	      bcopy(dat[o++], &(board[i].port[j].astatus.status), 
		    sizeof(board[i].port[j].astatus.status));
	      bcopy(dat[o++], &(board[i].port[j].lstatus.status), 
		      sizeof(board[i].port[j].lstatus.status));
	      bcopy(dat[o++], &(board[i].port[j].nstatus.status), 
		    sizeof(board[i].port[j].nstatus.status));
	    }
	  
	  if(dsp_mode == DISPLAY_TRAFFIC)
	    {
	      pkts = board[i].port[j].pkts;
	      xc   = board[i].port[j].xmit_coll;
	      rc   = board[i].port[j].recv_coll;
	      t    = board[i].port[j].update;
	      get_port_stats(&board[i].port[j]);	    
	      
	      board[i].port[j].pkt_rate        = 
		(board[i].port[j].pkts - pkts)/
		  (board[i].port[j].update - t);
	      board[i].port[j].xmit_coll_rate  = 
		(board[i].port[j].xmit_coll - xc)/
		  (board[i].port[j].update - t);
	      board[i].port[j].recv_coll_rate  = 
		(board[i].port[j].recv_coll - rc)/
		  (board[i].port[j].update - t);
	      
	      board[i].port[j].pkt_rate       /= 10;
	      board[i].port[j].xmit_coll_rate /= 10;
	      board[i].port[j].recv_coll_rate /= 10;
	    }
	}
    }
}


