/*
 * This file is part of some an snmp query application.
 * This file contains parameter setting/displaying commands.
 *
 * 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
 * 15 April 1990
 *
 *    $Source: /afs/net.mit.edu/tools/src/simon/RCS/parameter.c,v $
 *    $Author: tom $
 *    $Locker:  $
 *    $Log:	parameter.c,v $
 * Revision 1.4  91/02/21  13:55:26  tom
 * ..
 * 
 * Revision 1.3  90/07/25  10:30:38  tom
 * added symbolic display type which uses symbolic representation of variable
 * if available
 * 
 * Revision 1.2  90/07/20  23:27:54  tom
 * *** empty log message ***
 * 
 * Revision 1.1  90/07/20  21:17:39  tom
 * Initial revision
 * 
 *
 */

#ifndef lint
static char *rcsid = "$Header: /afs/net.mit.edu/tools/src/simon/RCS/parameter.c,v 1.4 91/02/21 13:55:26 tom Exp $";
#endif
		
#include <simon.h>
#include <mit-copyright.h>
	
STUFF stuff;


void
cmd_change_timeout(argc, argv)
     int argc; 
     char **argv;
{

  bzero(cmdbuf, sizeof(cmdbuf));
  pname = argv[0];
  while(*++argv != (char *) NULL)
    {
      if(**argv != '-')
	{
	  if(*cmdbuf == '\0')
	    {
	      strcpy(cmdbuf, *argv);
	      continue;
	    }
	  else
	    fprintf(stderr, "You can only specify one timeout.\n");
	}
      else
	if(strcmp(*argv, "-help") != 0)
	  fprintf(stderr, "Unknown option \"%s\"\n", *argv);

      printf("usage: %s [<timeout in seconds>]\n", pname);
      return;
    }

  if(*cmdbuf == '\0')
    {
      get_prompted_input("new timeout: ", cmdbuf, sizeof(cmdbuf));
      if(*cmdbuf == '\0')
	{
	  printf("OK, nothing changed.\n");
	  return;
	}
    }

  if(!isnumber(cmdbuf) != SUCCESS)
    {
      fprintf(stderr, "%s is not a valid timeout.\n", cmdbuf);
      return;
    }

  stuff.timeout = atoi(cmdbuf);
  printf("New timeout set to %d.\n", stuff.timeout);
  return;
}




  
void
cmd_change_retry(argc, argv)
     int argc; 
     char **argv;
{
  bzero(cmdbuf, sizeof(cmdbuf));
  pname = argv[0];
  while(*++argv != (char *) NULL)
    {
      if(**argv != '-')
	{
	  if(*cmdbuf == '\0')
	    {
	      strcpy(cmdbuf, *argv);
	      continue;
	    }
	  else
	    fprintf(stderr, "You can only specify one value for max retry.\n");
	}
      else
	if(strcmp(*argv, "-help") != 0)
	  fprintf(stderr, "Unknown option \"%s\"\n", *argv);

      printf("usage: %s [<number of retries>]\n", pname);
      return;
    }

  if(*cmdbuf == '\0')
    {
      get_prompted_input("new max retry limit: ", cmdbuf, sizeof(cmdbuf));
      if(*cmdbuf == '\0')
	{
	  printf("OK, nothing changed.\n");
	  return;
	}
    }

  if(!isnumber(cmdbuf) != SUCCESS)
    {
      fprintf(stderr, "%s is not a valid number.\n", cmdbuf);
      return;
    }

  stuff.retry = atoi(cmdbuf);
  printf("Max retries is now %d.\n", stuff.retry);
  return;
}





  
void
cmd_change_interval(argc, argv)
     int argc; 
     char **argv;
{
  int interval = 0;

  bzero(cmdbuf, sizeof(cmdbuf));
  pname = argv[0];
  while(*++argv != (char *) NULL)
    {
      if(**argv != '-')
	{
	  if(*cmdbuf == '\0')
	    {
	      strcpy(cmdbuf, *argv);
	      continue;
	    }
	  else
	    fprintf(stderr, "You can only specify one value for interval.\n");
	}
      else
	if(strcmp(*argv, "-help") != 0)
	  fprintf(stderr, "Unknown option \"%s\"\n", *argv);

      printf("usage: %s [<interval>]\n", pname);
      return;
    }

  if(*cmdbuf == '\0')
    {
      get_prompted_input("new interval: ", cmdbuf, sizeof(cmdbuf));
      if(*cmdbuf == '\0')
	{
	  printf("OK, nothing changed.\n");
	  return;
	}
    }

  if(!isnumber(cmdbuf))
    {
      fprintf(stderr, "%s is not a valid number.\n", cmdbuf);
      return;
    }

  interval = atoi(cmdbuf);
  printf("Interval is now %d.\n", interval);
  return;
}



  
void
cmd_change_prefix(argc, argv)
     int argc; 
     char **argv;
{
  strng vname;
  getreq msg;

  bzero(cmdbuf, sizeof(cmdbuf));
  pname = argv[0];
  while(*++argv != (char *) NULL)
    {
      if(**argv != '-')
	{
	  if(*cmdbuf == '\0')
	    {
	      strcpy(cmdbuf, *argv);
	      continue;
	    }
	  else
	    fprintf(stderr, "You can only specify one value for a prefix.\n");
	}
      else
	if(strcmp(*argv, "-help") != 0)
	  fprintf(stderr, "Unknown option \"%s\"\n", *argv);

      printf("usage: %s [<prefix>]\n", pname);
      return;
    }

  if(*cmdbuf == '\0')
    {
      get_prompted_input("new prefix: ", cmdbuf, sizeof(cmdbuf));
      if(*cmdbuf == '\0')
	{
	  printf("OK, nothing changed.\n");
	  return;
	}
    }

  vname.len = strlen(cmdbuf);
  vname.str = &cmdbuf[0];

  if(symtonum(&vname, &(msg.varlist.elem[0].name)) < 0)
    {
      fprintf(stderr, "Prefix \"%s\" is not defined.\n", cmdbuf);
      return;
    }

  if(stuff.prefix)
    free(stuff.prefix);
  if((stuff.prefix = (char *) malloc(strlen(cmdbuf) * sizeof(char))) == 
     (char *) NULL)
    {
      fprintf(stderr, "Not enough memory for prefix name.\n");
      return;
    }
  
  strcpy(stuff.prefix, cmdbuf);  
  printf("New prefix set to: %s.\n", stuff.prefix);
  return;
}




void
cmd_change_dspmode(argc, argv)
     int argc; 
     char **argv;
{
  int change;
  int i = 0;
  int j;

  if(argc > 0)
    {
      pname = argv[0];
      while(*++argv != (char *) NULL)
	{
	  if(**argv != '-')
	    {
	      argptr[i++] = *argv;
	      continue;
	    }
	  else
	    if(strcmp(*argv, "-help") != 0)
	      fprintf(stderr, "Unknown option \"%s\"\n", *argv);
	  
	  printf("usage: %s [<variable display modes>]\n", pname);
	  return;
	}
    }

  while (TRUE)
    {
      change = 0;

      if(i == 0)
	{
	  get_prompted_input("display mode: ", cmdbuf, sizeof(cmdbuf));	  
	  if((*cmdbuf == '\0') || string_equiv(cmdbuf, "quit", 1))
	    {
	      printf("Request cancelled.\n");
	      return;
	    }
	  argptr[i++] = cmdbuf;
	}
      
      for(j = 0; j < i; j++)
	{
	  if(*argptr[j] == '?')
	    {
	      printf(" choose one of:\n");
	      printf("\tstandard\t - specified prefixes suppressed.\n");
	      printf("\ttruncated\t - all prefixes suppressed.\n");
	      printf("\tunique\t\t - common prefixes suppressed.\n");
	      printf("\tsymbolic\t - symbolic variable is used.\n");
	      printf("\tcomma\t\t - comma large numbers.\n");
	      printf("\tlabel\t\t - print labels if available.\n");
	      printf("\tnewline\t\t - print variable on a new line.\n");
	      printf("\tnone\t\t - nothing suppressed.\n");
	      printf("\nor hit <return> to abort.\n");
	      *cmdbuf = '\0';
	      continue;
	    }

	  if(string_equiv(argptr[j], "standard", 2))
	    {
	      if(stuff.dispmode & STANDARD)
		stuff.dispmode &= ~STANDARD;
	      else
		{
		  stuff.dispmode &= ~EXCLUSIVE;
		  stuff.dispmode |= STANDARD;
		}
	      change = TRUE;
	      continue;
	    }

	  if(string_equiv(argptr[j], "unique", 1))
	    {
	      if(stuff.dispmode & UNIQUE)
		stuff.dispmode &= ~UNIQUE;
	      else
		{
		  stuff.dispmode &= ~EXCLUSIVE;
		  stuff.dispmode |= UNIQUE;
		}
	      change = TRUE;
	      continue;
	    }

	  if(string_equiv(argptr[j], "truncated", 1))
	    {
	      if(stuff.dispmode & TRUNCATED)
		stuff.dispmode &= ~TRUNCATED;
	      else
		{
		  stuff.dispmode &= ~EXCLUSIVE;
		  stuff.dispmode |= TRUNCATED;
		}
	      change = TRUE;
	      continue;
	    }
	
	  if(string_equiv(argptr[j], "symbolic", 2))
	    {
	      if(stuff.dispmode & SYMBOLIC)
		stuff.dispmode &= ~SYMBOLIC;
	      else
		stuff.dispmode |= SYMBOLIC;
	      change = TRUE;
	      continue;
	    }

	  if(string_equiv(argptr[j], "label", 1))
	    {
	      if(stuff.dispmode & LABEL)
		stuff.dispmode &= ~LABEL;
	      else
		stuff.dispmode |= LABEL;
	      change = TRUE;
	      continue;
	    }
      
	  if(string_equiv(argptr[j], "comma", 1))
	    {
	      if(stuff.dispmode & COMMA)
		stuff.dispmode &= ~COMMA;
	      else
		stuff.dispmode |= COMMA;
	      change = TRUE;
	      continue;
	    }
	
	  if(string_equiv(argptr[j], "newline", 2))
	    {
	      if(stuff.dispmode & NEWLINE)
		stuff.dispmode &= ~NEWLINE;
	      else
		stuff.dispmode |= NEWLINE;
	      change = TRUE;
	      continue;
	    }
	
	  if(string_equiv(argptr[j], "none", 2))
	    {
	      stuff.dispmode = NONE;
	      change = TRUE;
	      continue;
	    }
	  
	  printf("unknown display type.. try 'list' to list valid types.\n");
	  *cmdbuf = '\0';	  
	}      
      if((j == i) && (i > 0) && change)
	return;
      i = 0;
    }
}





void
cmd_change_session_id(argc, argv)
     int argc; 
     char **argv;
{

  bzero(cmdbuf, sizeof(cmdbuf));
  pname = argv[0];
  while(*++argv != (char *) NULL)
    {
      if(**argv != '-')
	{
	  if(*cmdbuf == '\0')
	    {
	      strcpy(cmdbuf, *argv);
	      continue;
	    }
	  else
	    fprintf(stderr, 
		    "You can only specify one value for a community.\n");
	}
      else
	if(strcmp(*argv, "-help") != 0)
	  fprintf(stderr, "Unknown option \"%s\"\n", *argv);

      printf("usage: %s [<community name>]\n", pname);
      return;
    }

  if(*cmdbuf == '\0')
    {
      get_prompted_input("new community name: ", cmdbuf, sizeof(cmdbuf));
      if(*cmdbuf == '\0')
	{
	  printf("OK, nothing changed.\n");
	  return;
	}
    }

  if(stuff.session_id)
    free(stuff.session_id);
  if((stuff.session_id = (char *) malloc((strlen(cmdbuf)+1) * sizeof(char))) == 
     (char *) NULL)
    {
      fprintf(stderr, "Not enough memory for community name.\n");
      return;
    }
  
  strcpy(stuff.session_id, cmdbuf);  
  printf("New community is: %s.\n", stuff.session_id);
  return;
}





void
cmd_change_class(argc, argv)
     int argc; 
     char **argv;
{
  CLASS *c;
  char *n = (char *) NULL;

  pname = argv[0];
  while(*++argv != (char *) NULL)
    {
      if(**argv != '-')
	{
	  if(n == (char *) NULL)
	    {
	      n = *argv;
	      continue;
	    }
	  else
	    fprintf(stderr, 
		    "You can only specify one value for a class.\n");
	}
      else
	if(strcmp(*argv, "-help") != 0)
	  fprintf(stderr, "Unknown option \"%s\"\n", *argv);

      printf("usage: %s [<class name>]\n", pname);
      return;
    }

  if((c = prompt_for_class("class: ", n)) == (CLASS *) NULL)
    {
      printf("Request cancelled.\n");
      return;
    }

  stuff.class = c;
  printf("New class set to: %s.\n", stuff.class->name);
  return;
}






void
cmd_change_cluster(argc, argv)
     int argc; 
     char **argv;
{
  CLUSTER *c;
  char *n = (char *) NULL;

  pname = argv[0];
  while(*++argv != (char *) NULL)
    {
      if(**argv != '-')
	{
	  if(n == (char *) NULL)
	    {
	      n = *argv;
	      continue;
	    }
	  else
	    fprintf(stderr, 
		    "You can only specify one value for a cluster.\n");
	}
      else
	if(strcmp(*argv, "-help") != 0)
	  fprintf(stderr, "Unknown option \"%s\"\n", *argv);

      printf("usage: %s [<cluster name>]\n", pname);
      return;
    }

  if((c = prompt_for_cluster("cluster: ", n)) == (CLUSTER *) NULL)
    {
      printf("Request canned.\n");
      return;
    }
  
  stuff.cluster = c;
  printf("New cluster is: %s.\n", stuff.cluster->name);
  return;
}





void 
cmd_print_parameters(argc, argv)
     int argc;
     char **argv;
{
  if(argc > 1)
    {
      fprintf(stderr, "This function does not take any arguments.\n");
      return;
    }
  putchar('\n');
  printf("\ttimeout:  \t%d (sec)\n",  stuff.timeout);
  printf("\tretry:    \t%d\n",        stuff.retry);
  printf("\tinterval: \t%d (sec)\n",  stuff.interval);
  printf("\tcommunity:\t\"%s\"\n",    stuff.session_id);
  printf("\tprefix:   \t\"%s\"\n",    stuff.prefix);
  printf("\tclass:    \t%s\n",        stuff.class ? stuff.class->name :"none");
  printf("\tcluster:  \t%s\n",        stuff.cluster ? stuff.cluster->name :
	 "none");
  printf("\tdisplay:  \t");
  if(stuff.dispmode & LABEL)
    printf("label & ");
  if(stuff.dispmode & SYMBOLIC)
    printf("symbolic & ");
  if(stuff.dispmode & COMMA)
    printf("comma & ");
  if(stuff.dispmode & NEWLINE)
    printf("newline & ");
  switch(stuff.dispmode & EXCLUSIVE)
    {
    case STANDARD:
      printf("standard\n\n");
      break;
    case TRUNCATED:
      printf("truncated\n\n");
      break;
    case UNIQUE:
      printf("unique\n\n");
      break;
    case NONE:
      printf("none\n\n");
      break;
    default:
      printf("dunno\n\n");
      break;
    }
  return;
}




void 
cmd_reset_parameters(argc, argv)
     int argc;
     char **argv;
{
  if(argc > 1)
    {
      fprintf(stderr, "This function does not take any arguments.\n");
      return;
    }

  stuff.timeout    = DFLT_TIMEOUT;
  stuff.retry      = DFLT_RETRY;
  stuff.interval   = DFLT_INTERVAL;
  stuff.dispmode   = DFLT_DSPMODE;
  stuff.class      = get_default_class();
  stuff.cluster    = get_default_cluster();

  if(stuff.session_id)
    free(stuff.session_id);
  if((stuff.session_id = (char *) malloc((strlen(DFLT_SESSION_ID)+1) * 
					 sizeof(char))) ==  (char *) NULL)
    {
      fprintf(stderr, "Not enough memory for session name.\n");
      return;
    }
  strcpy(stuff.session_id, DFLT_SESSION_ID);

  if(stuff.prefix)
    free(stuff.prefix);

  if((stuff.prefix = (char *) malloc((strlen(DFLT_PREFIX) + 1) * 
				     sizeof(char))) == (char *) NULL)
    {
      fprintf(stderr, "Not enough memory for prefix name.\n");
      return;
    }

  strcpy(stuff.prefix, DFLT_PREFIX);

  if(argc > 0)
    {
      printf("setting parameters...\n");
      cmd_print_parameters(0,0);
    }
  return;
}
