command.c revision 9440
16059Samurai/*
26059Samurai *		PPP User command processing module
36059Samurai *
46059Samurai *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
56059Samurai *
66059Samurai *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
76059Samurai *
86059Samurai * Redistribution and use in source and binary forms are permitted
96059Samurai * provided that the above copyright notice and this paragraph are
106059Samurai * duplicated in all such forms and that any documentation,
116059Samurai * advertising materials, and other materials related to such
126059Samurai * distribution and use acknowledge that the software was developed
136059Samurai * by the Internet Initiative Japan, Inc.  The name of the
146059Samurai * IIJ may not be used to endorse or promote products derived
156059Samurai * from this software without specific prior written permission.
166059Samurai * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
176059Samurai * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
186059Samurai * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
198857Srgrimes *
209440Samurai * $Id: command.c,v 1.6 1995/06/16 07:07:56 phk Exp $
218857Srgrimes *
226059Samurai */
236059Samurai#include <ctype.h>
246735Samurai#include <termios.h>
256059Samurai#include "fsm.h"
266059Samurai#include "phase.h"
276059Samurai#include "lcp.h"
286059Samurai#include "ipcp.h"
296059Samurai#include "modem.h"
306059Samurai#include "command.h"
316059Samurai#include "hdlc.h"
326059Samurai#include "vars.h"
336735Samurai#include "auth.h"
346059Samurai#include <netdb.h>
356059Samurai#include <sys/socket.h>
366059Samurai#include <arpa/inet.h>
376059Samurai#include <net/route.h>
386059Samurai#include "os.h"
396059Samurai
406059Samuraiextern int  MakeArgs();
416059Samuraiextern void Cleanup(), TtyTermMode(), PacketMode();
426059Samuraiextern int  EnableCommand(), DisableCommand(), DisplayCommand();
436059Samuraiextern int  AcceptCommand(), DenyCommand();
446735Samuraiextern int  LocalAuthCommand();
456059Samuraiextern int  LoadCommand(), SaveCommand();
466059Samuraiextern int  ChangeParity(char *);
476059Samuraiextern int  SelectSystem();
486059Samuraiextern int  ShowRoute();
496735Samuraiextern struct pppvars pppVars;
506059Samurai
516059Samuraistruct in_addr ifnetmask;
526059Samurai
536059Samuraistatic int ShowCommand(), TerminalCommand(), QuitCommand();
546059Samuraistatic int CloseCommand(), DialCommand(), DownCommand();
556059Samuraistatic int SetCommand(), AddCommand(), DeleteCommand();
566059Samurai
576059Samuraistatic int
586059SamuraiHelpCommand(list, argc, argv, plist)
596059Samuraistruct cmdtab *list;
606059Samuraiint argc;
616059Samuraichar **argv;
626059Samuraistruct cmdtab *plist;
636059Samurai{
646059Samurai  struct cmdtab *cmd;
656059Samurai  int n;
666059Samurai  char c;
676059Samurai
686059Samurai  if (argc > 0) {
696059Samurai    for (cmd = plist; cmd->name; cmd++) {
706764Samurai      if (strcmp(cmd->name, *argv) == 0 && (cmd->lauth & VarLocalAuth)) {
716059Samurai        printf("%s %s\n", cmd->name, cmd->syntax);
726059Samurai        return(1);
736059Samurai      }
746059Samurai    }
756059Samurai    return(1);
766059Samurai  }
776059Samurai  n = 0;
786059Samurai  for (cmd = plist; cmd->func; cmd++) {
796764Samurai    if (cmd->name && (cmd->lauth & VarLocalAuth)) {
806764Samurai      c = (n & 1)? '\n' : '\t';
816059Samurai      printf("  %-8s: %-20s%c", cmd->name, cmd->helpmes, c);
826059Samurai      n++;
836059Samurai    }
846059Samurai  }
856059Samurai  if (n & 1)
866059Samurai    printf("\n");
876059Samurai  return(1);
886059Samurai}
896059Samurai
906059Samuraiint
916059SamuraiIsInteractive()
926059Samurai{
936059Samurai  char *mes = NULL;
946059Samurai
956059Samurai  if (mode & MODE_AUTO)
966059Samurai    mes = "Working as auto mode.";
976059Samurai  else if (mode & MODE_DIRECT)
986059Samurai    mes = "Working as direct mode.";
996059Samurai  else if (mode & MODE_DEDICATED)
1006059Samurai    mes = "Workring as dedicated mode.";
1016059Samurai  if (mes) {
1026059Samurai    printf("%s\n", mes);
1036059Samurai    return(0);
1046059Samurai  }
1056059Samurai  return(1);
1066059Samurai}
1076059Samurai
1086059Samuraistatic int
1096059SamuraiDialCommand(cmdlist, argc, argv)
1106059Samuraistruct cmdtab *cmdlist;
1116059Samuraiint argc;
1126059Samuraichar **argv;
1136059Samurai{
1146059Samurai  if (LcpFsm.state > ST_CLOSED) {
1156059Samurai    printf("LCP state is [%s]\n", StateNames[LcpFsm.state]);
1166059Samurai    return(1);
1176059Samurai  }
1186059Samurai  if (!IsInteractive())
1196059Samurai    return(1);
1206735Samurai  if (argc > 0) {
1216735Samurai    if (SelectSystem(*argv, CONFFILE) < 0) {
1226735Samurai      printf("%s: not found.\n", *argv);
1236735Samurai      return(1);
1246735Samurai    }
1256735Samurai  }
1266059Samurai  modem = OpenModem(mode);
1276059Samurai  if (modem < 0) {
1286059Samurai    printf("failed to open modem.\n");
1296059Samurai    modem = 0;
1306059Samurai    return(1);
1316059Samurai  }
1326059Samurai  if (DialModem()) {
1336059Samurai    sleep(1);
1346059Samurai    ModemTimeout();
1356059Samurai    PacketMode();
1366059Samurai  }
1376059Samurai  return(1);
1386059Samurai}
1396059Samurai
1406059Samuraistatic char StrOption[] = "option ..";
1416059Samuraistatic char StrRemote[] = "[remote]";
1426059Samuraichar StrNull[] = "";
1436059Samurai
1446059Samuraistruct cmdtab Commands[] = {
1456735Samurai  { "accept",  NULL,    AcceptCommand,	LOCAL_AUTH,
1466735Samurai  	"accept option request",	StrOption},
1476735Samurai  { "add",     NULL,	AddCommand,	LOCAL_AUTH,
1486735Samurai	"add route",			"dest mask gateway"},
1496735Samurai  { "close",   NULL,    CloseCommand,	LOCAL_AUTH,
1506735Samurai	"Close connection",		StrNull},
1516735Samurai  { "delete",  NULL,    DeleteCommand,	LOCAL_AUTH,
1526735Samurai  	"delete route",			"dest gateway"},
1536735Samurai  { "deny",    NULL,    DenyCommand,	LOCAL_AUTH,
1546735Samurai  	"Deny option request",		StrOption},
1556735Samurai  { "dial",    "call",  DialCommand,	LOCAL_AUTH,
1566735Samurai  	"Dial and login",		StrRemote},
1576735Samurai  { "disable", NULL,    DisableCommand,	LOCAL_AUTH,
1586735Samurai  	"Disable option",		StrOption},
1596735Samurai  { "display", NULL,    DisplayCommand,	LOCAL_AUTH,
1606735Samurai  	"Display option configs",	StrNull},
1616735Samurai  { "enable",  NULL,    EnableCommand,	LOCAL_AUTH,
1626735Samurai  	"Enable option",		StrOption},
1636764Samurai  { "passwd",  NULL,	LocalAuthCommand,LOCAL_NO_AUTH,
1649240Sphk  	"Password for manipulation", StrOption},
1656735Samurai  { "load",    NULL,    LoadCommand,	LOCAL_AUTH,
1666735Samurai  	"Load settings",		StrRemote},
1676735Samurai  { "save",    NULL,    SaveCommand,	LOCAL_AUTH,
1686735Samurai  	"Save settings", StrNull},
1696735Samurai  { "set",     "setup", SetCommand,	LOCAL_AUTH,
1706735Samurai  	"Set parameters",  "var value"},
1716735Samurai  { "show",    NULL,    ShowCommand,	LOCAL_AUTH,
1726735Samurai  	"Show status and statictics", "var"},
1736735Samurai  { "term",    NULL,    TerminalCommand,LOCAL_AUTH,
1746735Samurai  	"Enter to terminal mode", StrNull},
1756764Samurai  { "quit",    "bye",   QuitCommand,	LOCAL_AUTH | LOCAL_NO_AUTH,
1766735Samurai  	"Quit PPP program", StrNull},
1776735Samurai  { "help",    "?",     HelpCommand,	LOCAL_AUTH | LOCAL_NO_AUTH,
1786059Samurai	"Display this message", "[command]", (void *)Commands },
1796735Samurai  { NULL,      "down",  DownCommand,	LOCAL_AUTH,
1806735Samurai  	"Generate down event",		StrNull},
1816059Samurai  { NULL,      NULL,    NULL },
1826059Samurai};
1836059Samurai
1846059Samuraiextern int ReportCcpStatus();
1856059Samuraiextern int ReportLcpStatus();
1866059Samuraiextern int ReportIpcpStatus();
1876059Samuraiextern int ReportProtStatus();
1886059Samuraiextern int ReportCompress();
1896059Samuraiextern int ShowModemStatus();
1906059Samuraiextern int ReportHdlcStatus();
1916059Samuraiextern int ShowMemMap();
1926059Samurai
1936059Samuraistatic char *LogLevelName[] = {
1946059Samurai  LM_PHASE, LM_CHAT, LM_LQM,   LM_LCP,
1956059Samurai  LM_TCPIP, LM_HDLC, LM_ASYNC,
1966059Samurai};
1976059Samurai
1986059Samuraistatic int ShowDebugLevel()
1996059Samurai{
2006059Samurai  int i;
2016059Samurai
2026059Samurai  printf("%02x: ", loglevel);
2036059Samurai  for (i = LOG_PHASE; i < MAXLOGLEVEL; i++) {
2046059Samurai    if (loglevel & (1 << i))
2056059Samurai      printf("%s ", LogLevelName[i]);
2066059Samurai  }
2076059Samurai  printf("\n");
2086059Samurai  return(1);
2096059Samurai}
2106059Samurai
2116059Samuraistatic int ShowEscape()
2126059Samurai{
2136059Samurai  int code, bit;
2146059Samurai
2156059Samurai  if (EscMap[32]) {
2166059Samurai    for (code = 0; code < 32; code++) {
2176059Samurai      if (EscMap[code]) {
2186059Samurai        for (bit = 0; bit < 8; bit++) {
2196059Samurai          if (EscMap[code] & (1<<bit)) {
2206059Samurai            printf(" 0x%02x", (code << 3) + bit);
2216059Samurai          }
2226059Samurai        }
2236059Samurai      }
2246059Samurai    }
2256059Samurai    printf("\n");
2266059Samurai  }
2276059Samurai  return(1);
2286059Samurai}
2296059Samurai
2306059Samuraistatic int ShowTimeout()
2316059Samurai{
2326735Samurai  printf(" Idle Timer: %d secs   LQR Timer: %d secs   Retry Timer: %d secs\n",
2336735Samurai    VarIdleTimeout, VarLqrTimeout, VarRetryTimeout);
2346059Samurai  return(1);
2356059Samurai}
2366059Samurai
2376059Samuraistatic int ShowAuthKey()
2386059Samurai{
2396059Samurai  printf("AuthName = %s\n", VarAuthName);
2406059Samurai  printf("AuthKey  = %s\n", VarAuthKey);
2416059Samurai  return(1);
2426059Samurai}
2436059Samurai
2446059Samuraistatic int ShowVersion()
2456059Samurai{
2466059Samurai  extern char *VarVersion[];
2476059Samurai
2486059Samurai  printf("%s\n", VarVersion);
2496059Samurai  return(1);
2506059Samurai}
2516059Samurai
2526059Samuraistatic int ShowLogList()
2536059Samurai{
2546059Samurai  ListLog();
2556059Samurai  return(1);
2566059Samurai}
2576059Samurai
2586735Samuraiextern int ShowIfilter(), ShowOfilter(), ShowDfilter(), ShowAfilter();
2596059Samurai
2606059Samuraistruct cmdtab ShowCommands[] = {
2616735Samurai  { "afilter",  NULL,     ShowAfilter,		LOCAL_AUTH,
2626735Samurai	"Show keep Alive filters", StrOption},
2636735Samurai  { "auth",     NULL,     ShowAuthKey,		LOCAL_AUTH,
2646735Samurai	"Show auth name/key", StrNull},
2656735Samurai  { "ccp",      NULL,     ReportCcpStatus,	LOCAL_AUTH,
2666735Samurai	"Show CCP status", StrNull},
2676735Samurai  { "compress", NULL,     ReportCompress,	LOCAL_AUTH,
2686735Samurai	"Show compression statictics", StrNull},
2696735Samurai  { "debug",	NULL,	  ShowDebugLevel,	LOCAL_AUTH,
2706735Samurai	"Show current debug level", StrNull},
2716735Samurai  { "dfilter",  NULL,     ShowDfilter,		LOCAL_AUTH,
2726735Samurai	"Show Demand filters", StrOption},
2736735Samurai  { "escape",   NULL,     ShowEscape,		LOCAL_AUTH,
2746735Samurai	"Show escape characters", StrNull},
2756735Samurai  { "hdlc",	NULL,	  ReportHdlcStatus,	LOCAL_AUTH,
2766735Samurai	"Show HDLC error summary", StrNull},
2776735Samurai  { "ifilter",  NULL,     ShowIfilter,		LOCAL_AUTH,
2786735Samurai	"Show Input filters", StrOption},
2796735Samurai  { "ipcp",     NULL,     ReportIpcpStatus,	LOCAL_AUTH,
2806735Samurai	"Show IPCP status", StrNull},
2816735Samurai  { "lcp",      NULL,     ReportLcpStatus,	LOCAL_AUTH,
2826735Samurai	"Show LCP status", StrNull},
2836735Samurai  { "log",      NULL,     ShowLogList,		LOCAL_AUTH,
2846735Samurai	"Show log records", StrNull},
2856735Samurai  { "mem",      NULL,     ShowMemMap,		LOCAL_AUTH,
2866735Samurai	"Show memory map", StrNull},
2876735Samurai  { "modem",    NULL,     ShowModemStatus,	LOCAL_AUTH,
2886735Samurai	"Show modem setups", StrNull},
2896735Samurai  { "ofilter",  NULL,     ShowOfilter,		LOCAL_AUTH,
2906735Samurai	"Show Output filters", StrOption},
2916735Samurai  { "proto",    NULL,     ReportProtStatus,	LOCAL_AUTH,
2926735Samurai	"Show protocol summary", StrNull},
2936735Samurai  { "route",    NULL,     ShowRoute,		LOCAL_AUTH,
2946735Samurai	"Show routing table", StrNull},
2956735Samurai  { "timeout",  NULL,	  ShowTimeout,		LOCAL_AUTH,
2966735Samurai	"Show Idle timeout value", StrNull},
2976735Samurai  { "version",  NULL,	  ShowVersion,		LOCAL_NO_AUTH | LOCAL_AUTH,
2986735Samurai	"Show version string", StrNull},
2996735Samurai  { "help",     "?",      HelpCommand,		LOCAL_NO_AUTH | LOCAL_AUTH,
3006735Samurai	"Display this message", StrNull, (void *)ShowCommands},
3016059Samurai  { NULL,       NULL,     NULL },
3026059Samurai};
3036059Samurai
3046059Samuraistruct cmdtab *
3056059SamuraiFindCommand(cmds, str, pmatch)
3066059Samuraistruct cmdtab *cmds;
3076059Samuraichar *str;
3086059Samuraiint *pmatch;
3096059Samurai{
3106059Samurai  int nmatch = 0;
3116059Samurai  int len = strlen(str);
3126059Samurai  struct cmdtab *found = NULL;
3136059Samurai
3146059Samurai  while (cmds->func) {
3156059Samurai    if (cmds->name && strncmp(str, cmds->name, len) == 0) {
3166059Samurai      nmatch++;
3176059Samurai      found = cmds;
3186059Samurai    } else if (cmds->alias && strncmp(str, cmds->alias, len) == 0) {
3196059Samurai      nmatch++;
3206059Samurai      found = cmds;
3216059Samurai    }
3226059Samurai    cmds++;
3236059Samurai  }
3246059Samurai  *pmatch = nmatch;
3256059Samurai  return(found);
3266059Samurai}
3276059Samurai
3286059Samuraiint
3296059SamuraiFindExec(cmdlist, argc, argv)
3306059Samuraistruct cmdtab *cmdlist;
3316059Samuraiint argc;
3326059Samuraichar **argv;
3336059Samurai{
3346059Samurai  struct cmdtab *cmd;
3356059Samurai  int val = 1;
3366059Samurai  int nmatch;
3376059Samurai
3386059Samurai  cmd = FindCommand(cmdlist, *argv, &nmatch);
3396059Samurai  if (nmatch > 1)
3406735Samurai    printf("Ambiguous.\n");
3416735Samurai  else if (cmd && ( cmd->lauth & VarLocalAuth ) )
3426059Samurai    val = (cmd->func)(cmd, --argc, ++argv, cmd->args);
3436059Samurai  else
3446059Samurai    printf("what?\n");
3456059Samurai  return(val);
3466059Samurai}
3476059Samurai
3486059Samuraivoid
3496059SamuraiPrompt(flag)
3506059Samuraiint flag;
3516059Samurai{
3526735Samurai  char *pconnect, *pauth;
3536735Samurai
3546059Samurai  if (!(mode & MODE_INTER))
3556059Samurai    return;
3566735Samurai
3576059Samurai  if (flag) printf("\n");
3586735Samurai
3596735Samurai  if ( VarLocalAuth == LOCAL_AUTH )
3606735Samurai    pauth = " ON ";
3616735Samurai  else
3626735Samurai    pauth = " on ";
3636059Samurai  if (IpcpFsm.state == ST_OPENED && phase == PHASE_NETWORK)
3646735Samurai    pconnect = "PPP";
3656059Samurai  else
3666735Samurai    pconnect = "ppp";
3676735Samurai  printf("%s%s%s> ", pconnect, pauth, VarShortHost);
3686059Samurai  fflush(stdout);
3696059Samurai}
3706059Samurai
3716059Samuraivoid
3726059SamuraiDecodeCommand(buff, nb, prompt)
3736059Samuraichar *buff;
3746059Samuraiint nb;
3756059Samuraiint prompt;
3766059Samurai{
3776059Samurai  char *vector[20];
3786059Samurai  char **argv;
3796059Samurai  int argc, val;
3806059Samurai  char *cp;
3816059Samurai
3826059Samurai  val = 1;
3836059Samurai  if (nb > 0) {
3846059Samurai    cp = buff + strcspn(buff, "\r\n");
3856059Samurai    if (cp)
3866059Samurai      *cp = '\0';
3876059Samurai    {
3886059Samurai      argc = MakeArgs(buff, &vector);
3896059Samurai      argv = vector;
3906059Samurai
3916059Samurai      if (argc > 0)
3926059Samurai        val = FindExec(Commands, argc, argv);
3936059Samurai    }
3946059Samurai  }
3956059Samurai  if (val && prompt)
3966059Samurai    Prompt(0);
3976059Samurai}
3986059Samurai
3996059Samuraistatic int
4006059SamuraiShowCommand(list, argc, argv)
4016059Samuraistruct cmdtab *list;
4026059Samuraiint argc;
4036059Samuraichar **argv;
4046059Samurai{
4056059Samurai  int val = 1;
4066059Samurai
4076059Samurai  if (argc > 0)
4086059Samurai    val = FindExec(ShowCommands, argc, argv);
4096059Samurai  else
4106059Samurai    printf("Use ``show ?'' to get a list.\n");
4116059Samurai  return(val);
4126059Samurai}
4136059Samurai
4146059Samuraistatic int
4156059SamuraiTerminalCommand()
4166059Samurai{
4176059Samurai  if (LcpFsm.state > ST_CLOSED) {
4186059Samurai    printf("LCP state is [%s]\n", StateNames[LcpFsm.state]);
4196059Samurai    return(1);
4206059Samurai  }
4216059Samurai  if (!IsInteractive())
4226059Samurai    return(1);
4236059Samurai  modem = OpenModem(mode);
4246059Samurai  if (modem < 0) {
4256059Samurai    printf("failed to open modem.\n");
4266059Samurai    modem = 0;
4276059Samurai    return(1);
4286059Samurai  }
4296059Samurai  printf("Enter to terminal mode.\n");
4306059Samurai  printf("Type `~?' for help.\n");
4316059Samurai  TtyTermMode();
4326059Samurai  return(0);
4336059Samurai}
4346059Samurai
4356059Samuraistatic int
4366059SamuraiQuitCommand(list, argc, argv)
4376059Samuraistruct cmdtab *list;
4386059Samuraiint argc;
4396059Samuraichar **argv;
4406059Samurai{
4416059Samurai  if (mode & (MODE_DIRECT|MODE_DEDICATED|MODE_AUTO)) {
4426764Samurai    if (argc > 0 && (VarLocalAuth & LOCAL_AUTH)) {
4436059Samurai      Cleanup(EX_NORMAL);
4446059Samurai    } else {
4456735Samurai      VarLocalAuth = LOCAL_NO_AUTH;
4466059Samurai      close(netfd);
4476059Samurai      close(1);
4487886Samurai      dup2(2, 1);     /* Have to have something here or the modem will be 1 */
4496059Samurai      netfd = -1;
4506059Samurai      mode &= ~MODE_INTER;
4516059Samurai    }
4526059Samurai  } else
4536059Samurai    Cleanup(EX_NORMAL);
4546059Samurai  return(1);
4556059Samurai}
4566059Samurai
4576059Samuraistatic int
4586059SamuraiCloseCommand()
4596059Samurai{
4606059Samurai  LcpClose();
4616059Samurai  return(1);
4626059Samurai}
4636059Samurai
4646059Samuraistatic int
4656059SamuraiDownCommand()
4666059Samurai{
4676059Samurai  LcpDown();
4686059Samurai  return(1);
4696059Samurai}
4706059Samurai
4716059Samuraistatic int SetModemSpeed(list, argc, argv)
4726059Samuraistruct cmdtab *list;
4736059Samuraiint argc;
4746059Samuraichar **argv;
4756059Samurai{
4766059Samurai  int speed;
4776059Samurai
4786059Samurai  if (argc > 0) {
4796735Samurai    if (strcmp(*argv, "sync") == 0) {
4806735Samurai      VarSpeed = 0;
4816735Samurai      return(1);
4826735Samurai    }
4836059Samurai    speed = atoi(*argv);
4846735Samurai    if (IntToSpeed(speed) != B0) {
4856735Samurai      VarSpeed = speed;
4866735Samurai      return(1);
4876059Samurai    }
4886059Samurai    printf("invalid speed.\n");
4896059Samurai  }
4906059Samurai  return(1);
4916059Samurai}
4926059Samurai
4936059Samuraistatic int SetModemParity(list, argc, argv)
4946059Samuraistruct cmdtab *list;
4956059Samuraiint argc;
4966059Samuraichar **argv;
4976059Samurai{
4986059Samurai  int parity;
4996059Samurai
5006059Samurai  if (argc > 0) {
5016059Samurai    parity = ChangeParity(*argv);
5026059Samurai    if (parity < 0)
5036059Samurai      printf("Invalid parity.\n");
5046059Samurai    else
5056059Samurai      VarParity = parity;
5066059Samurai  }
5076059Samurai  return(1);
5086059Samurai}
5096059Samurai
5106059Samuraistatic int
5116059SamuraiSetDebugLevel(list, argc, argv)
5126059Samuraistruct cmdtab *list;
5136059Samuraiint argc;
5146059Samuraichar **argv;
5156059Samurai{
5166059Samurai  int level, w;
5176059Samurai
5186059Samurai  for (level = 0; argc-- > 0; argv++) {
5196059Samurai    if (isdigit(**argv)) {
5206059Samurai      w = atoi(*argv);
5216059Samurai      if (w < 0 || w >= MAXLOGLEVEL) {
5226059Samurai	printf("invalid log level.\n");
5236059Samurai	break;
5246059Samurai      } else
5256059Samurai	level |= (1 << w);
5266059Samurai    } else {
5276059Samurai      for (w = 0; w < MAXLOGLEVEL; w++) {
5286059Samurai	if (strcasecmp(*argv, LogLevelName[w]) == 0) {
5296059Samurai	  level |= (1 << w);
5306059Samurai	  continue;
5316059Samurai	}
5326059Samurai      }
5336059Samurai    }
5346059Samurai  }
5356059Samurai  loglevel = level;
5366059Samurai  return(1);
5376059Samurai}
5386059Samurai
5396059Samuraistatic int
5406059SamuraiSetEscape(list, argc, argv)
5416059Samuraistruct cmdtab *list;
5426059Samuraiint argc;
5436059Samuraichar **argv;
5446059Samurai{
5456059Samurai  int code;
5466059Samurai
5476059Samurai  for (code = 0; code < 33; code++)
5486059Samurai    EscMap[code] = 0;
5496059Samurai  while (argc-- > 0) {
5506059Samurai    sscanf(*argv++, "%x", &code);
5516059Samurai    code &= 0xff;
5526059Samurai    EscMap[code >> 3] |= (1 << (code&7));
5536059Samurai    EscMap[32] = 1;
5546059Samurai  }
5556059Samurai  return(1);
5566059Samurai}
5576059Samurai
5586059Samuraistatic int
5596059SamuraiSetInitialMRU(list, argc, argv)
5606059Samuraistruct cmdtab *list;
5616059Samuraiint argc;
5626059Samuraichar **argv;
5636059Samurai{
5646059Samurai  int mru;
5656059Samurai
5666059Samurai  if (argc > 0) {
5676059Samurai    mru = atoi(*argv);
5686059Samurai    if (mru < 100)
5696059Samurai      printf("given value is too small.\n");
5706059Samurai    else if (mru > MAX_MRU)
5716059Samurai      printf("given value is too big.\n");
5726059Samurai    else
5736059Samurai      VarMRU = mru;
5746059Samurai  }
5756059Samurai  return(1);
5766059Samurai}
5776059Samurai
5786059Samuraistatic int
5796059SamuraiSetIdleTimeout(list, argc, argv)
5806059Samuraistruct cmdtab *list;
5816059Samuraiint argc;
5826059Samuraichar **argv;
5836059Samurai{
5846059Samurai  if (argc-- > 0) {
5856059Samurai    VarIdleTimeout = atoi(*argv++);
5866735Samurai    if (argc-- > 0) {
5876735Samurai      VarLqrTimeout = atoi(*argv++);
5886735Samurai      if (VarLqrTimeout < 1)
5896735Samurai	VarLqrTimeout = 30;
5906735Samurai      if (argc > 0) {
5916735Samurai	VarRetryTimeout = atoi(*argv);
5926735Samurai	if (VarRetryTimeout < 1 || VarRetryTimeout > 10)
5936735Samurai	  VarRetryTimeout = 3;
5946735Samurai      }
5956735Samurai    }
5966059Samurai  }
5976059Samurai  return(1);
5986059Samurai}
5996059Samurai
6006059Samuraistruct in_addr
6016059SamuraiGetIpAddr(cp)
6026059Samuraichar *cp;
6036059Samurai{
6046059Samurai  struct hostent *hp;
6056059Samurai  struct in_addr ipaddr;
6066059Samurai
6076059Samurai  hp = gethostbyname(cp);
6086059Samurai  if (hp && hp->h_addrtype == AF_INET)
6096059Samurai    bcopy(hp->h_addr, &ipaddr, hp->h_length);
6106059Samurai  else if (inet_aton(cp, &ipaddr) == 0)
6116059Samurai    ipaddr.s_addr = 0;
6126059Samurai  return(ipaddr);
6136059Samurai}
6146059Samurai
6156059Samuraistatic int
6166059SamuraiSetInterfaceAddr(list, argc, argv)
6176059Samuraistruct cmdtab *list;
6186059Samuraiint argc;
6196059Samuraichar **argv;
6206059Samurai{
6216059Samurai  int width;
6226059Samurai
6236059Samurai  DefMyAddress.ipaddr.s_addr = DefHisAddress.ipaddr.s_addr = 0L;
6246059Samurai  if (argc > 0) {
6256059Samurai    ParseAddr(argc, argv++,
6266059Samurai      &DefMyAddress.ipaddr, &DefMyAddress.mask, &DefMyAddress.width);
6276059Samurai    if (--argc > 0) {
6286059Samurai      ParseAddr(argc, argv++,
6296059Samurai	&DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width);
6306059Samurai      if (--argc > 0) {
6316059Samurai        ifnetmask = GetIpAddr(*argv);
6329440Samurai    	if (--argc > 0) {
6339440Samurai      		ParseAddr(argc, argv++,
6349440Samurai		        &DefTriggerAddress.ipaddr,
6359440Samurai			&DefTriggerAddress.mask,
6369440Samurai			&DefTriggerAddress.width);
6379440Samurai	}
6386059Samurai      }
6396059Samurai    }
6406059Samurai  }
6416059Samurai  /*
6426059Samurai   * For backwards compatibility, 0.0.0.0 means any address.
6436059Samurai   */
6446059Samurai  if (DefMyAddress.ipaddr.s_addr == 0) {
6456059Samurai    DefMyAddress.mask.s_addr = 0;
6466059Samurai    DefMyAddress.width = 0;
6476059Samurai  }
6486059Samurai  if (DefHisAddress.ipaddr.s_addr == 0) {
6496059Samurai    DefHisAddress.mask.s_addr = 0;
6506059Samurai    DefHisAddress.width = 0;
6516059Samurai  }
6526059Samurai
6536735Samurai  if ((mode & MODE_AUTO) ||
6546059Samurai	((mode & MODE_DEDICATED) && dstsystem)) {
6556059Samurai    OsSetIpaddress(DefMyAddress.ipaddr, DefHisAddress.ipaddr, ifnetmask);
6566059Samurai  }
6576059Samurai  return(1);
6586059Samurai}
6596059Samurai
6606059Samurai
6616059Samurai#define	VAR_AUTHKEY	0
6626059Samurai#define	VAR_DIAL	1
6636059Samurai#define	VAR_LOGIN	2
6646059Samurai#define	VAR_AUTHNAME	3
6656059Samurai#define	VAR_DEVICE	4
6666059Samurai#define	VAR_ACCMAP	5
6676059Samurai#define	VAR_PHONE	6
6686059Samurai
6696059Samuraistatic int
6706059SamuraiSetVariable(list, argc, argv, param)
6716059Samuraistruct cmdtab *list;
6726059Samuraiint argc;
6736059Samuraichar **argv;
6746059Samuraiint param;
6756059Samurai{
6766059Samurai  u_long map;
6776059Samurai
6786059Samurai  if (argc > 0) {
6796059Samurai    switch (param) {
6806059Samurai    case VAR_AUTHKEY:
6816059Samurai      strncpy(VarAuthKey, *argv, sizeof(VarAuthKey)-1);
6826059Samurai      break;
6836059Samurai    case VAR_AUTHNAME:
6846059Samurai      strncpy(VarAuthName, *argv, sizeof(VarAuthName)-1);
6856059Samurai      break;
6866059Samurai    case VAR_DIAL:
6876059Samurai      strncpy(VarDialScript, *argv, sizeof(VarDialScript)-1);
6886059Samurai      break;
6896059Samurai    case VAR_LOGIN:
6906059Samurai      strncpy(VarLoginScript, *argv, sizeof(VarDialScript)-1);
6916059Samurai      break;
6926059Samurai    case VAR_DEVICE:
6936059Samurai      strncpy(VarDevice, *argv, sizeof(VarDevice)-1);
6946059Samurai      break;
6956059Samurai    case VAR_ACCMAP:
6966059Samurai      sscanf(*argv, "%x", &map);
6976059Samurai      VarAccmap = map;
6986059Samurai      break;
6996059Samurai    case VAR_PHONE:
7006059Samurai      strncpy(VarPhone, *argv, sizeof(VarPhone)-1);
7016059Samurai      break;
7026059Samurai    }
7036059Samurai  }
7046059Samurai  return(1);
7056059Samurai}
7066059Samurai
7076059Samuraistatic int SetOpenMode(list, argc, argv)
7086059Samuraistruct cmdtab *list;
7096059Samuraiint argc;
7106059Samuraichar **argv;
7116059Samurai{
7126059Samurai  if (argc > 0) {
7136059Samurai    if (strcmp(*argv, "active") == 0)
7146059Samurai      VarOpenMode = OPEN_ACTIVE;
7156059Samurai    else if (strcmp(*argv, "passive") == 0)
7166059Samurai      VarOpenMode = OPEN_PASSIVE;
7176059Samurai    else
7186059Samurai      printf("Invalid mode.\n");
7196059Samurai  }
7206059Samurai  return(1);
7216059Samurai}
7226059Samurai
7236059Samuraistatic char StrChatStr[] = "chat-script";
7246059Samuraistatic char StrValue[] = "value";
7256059Samurai
7266735Samuraiextern int SetIfilter(), SetOfilter(), SetDfilter(), SetAfilter();
7276059Samurai
7286059Samuraistruct cmdtab SetCommands[] = {
7296735Samurai  { "accmap",   NULL,	  SetVariable,		LOCAL_AUTH,
7306735Samurai	"Set accmap value", "hex-value", (void *)VAR_ACCMAP},
7316735Samurai  { "afilter",  NULL,     SetAfilter, 		LOCAL_AUTH,
7326735Samurai	"Set keep Alive filter", "..."},
7336735Samurai  { "authkey",  "key",     SetVariable,		LOCAL_AUTH,
7346735Samurai	"Set authentication key", "key", (void *)VAR_AUTHKEY},
7356735Samurai  { "authname", NULL,     SetVariable,		LOCAL_AUTH,
7366735Samurai	"Set authentication name", "name", (void *)VAR_AUTHNAME},
7376735Samurai  { "debug",    NULL,	  SetDebugLevel,	LOCAL_AUTH,
7386735Samurai	"Set debug level", StrValue},
7396735Samurai  { "device",     "line", SetVariable, 		LOCAL_AUTH,
7406735Samurai	"Set modem device name", "device-name",	(void *)VAR_DEVICE},
7416735Samurai  { "dfilter",  NULL,     SetDfilter,		 LOCAL_AUTH,
7426735Samurai	"Set demand filter", "..."},
7436735Samurai  { "dial",     NULL,     SetVariable, 		LOCAL_AUTH,
7446735Samurai	"Set dialing script", StrChatStr, (void *)VAR_DIAL},
7456735Samurai  { "escape",   NULL,	  SetEscape, 		LOCAL_AUTH,
7466735Samurai	"Set escape characters", "hex-digit ..."},
7476735Samurai  { "ifaddr",   NULL,   SetInterfaceAddr,	LOCAL_AUTH,
7486735Samurai	"Set destination address", "src-addr dst-addr netmask"},
7496735Samurai  { "ifilter",  NULL,     SetIfilter, 		LOCAL_AUTH,
7506735Samurai	"Set input filter", "..."},
7516735Samurai  { "login",    NULL,     SetVariable,		LOCAL_AUTH,
7526735Samurai	"Set login script", StrChatStr,	(void *)VAR_LOGIN },
7536735Samurai  { "mru",      "mtu",    SetInitialMRU,	LOCAL_AUTH,
7546735Samurai	"Set Initial MRU value", StrValue },
7556735Samurai  { "ofilter",  NULL,	  SetOfilter,		LOCAL_AUTH,
7566735Samurai	"Set output filter", "..." },
7576735Samurai  { "openmode", NULL,	  SetOpenMode,		LOCAL_AUTH,
7586735Samurai	"Set open mode", "[active|passive]"},
7596735Samurai  { "parity",   NULL,     SetModemParity,	LOCAL_AUTH,
7606735Samurai	"Set modem parity", "[odd|even|none]"},
7616735Samurai  { "phone",    NULL,     SetVariable,		LOCAL_AUTH,
7626735Samurai	"Set telephone number", "phone-number",	(void *)VAR_PHONE },
7636735Samurai  { "speed",    NULL,     SetModemSpeed,	LOCAL_AUTH,
7646735Samurai	"Set modem speed", "speed"},
7656735Samurai  { "timeout",  NULL,     SetIdleTimeout,	LOCAL_AUTH,
7666735Samurai	"Set Idle timeout", StrValue},
7676735Samurai  { "help",     "?",      HelpCommand,		LOCAL_AUTH | LOCAL_NO_AUTH,
7686735Samurai	"Display this message", StrNull, (void *)SetCommands},
7696059Samurai  { NULL,       NULL,     NULL },
7706059Samurai};
7716059Samurai
7726059Samuraistatic int
7736059SamuraiSetCommand(list, argc, argv)
7746059Samuraistruct cmdtab *list;
7756059Samuraiint argc;
7766059Samuraichar **argv;
7776059Samurai{
7786059Samurai  int val = 1;
7796059Samurai
7806059Samurai  if (argc > 0)
7816059Samurai    val = FindExec(SetCommands, argc, argv);
7826059Samurai  else
7836059Samurai    printf("Use ``set ?'' to get a list.\n");
7846059Samurai  return(val);
7856059Samurai}
7866059Samurai
7876059Samurai
7886059Samuraistatic int
7896059SamuraiAddCommand(list, argc, argv)
7906059Samuraistruct cmdtab *list;
7916059Samuraiint argc;
7926059Samuraichar **argv;
7936059Samurai{
7946059Samurai  struct in_addr dest, gateway, netmask;
7956059Samurai
7966059Samurai  if (argc == 3) {
7976059Samurai    dest = GetIpAddr(argv[0]);
7986059Samurai    netmask = GetIpAddr(argv[1]);
7996059Samurai    if (strcmp(argv[2], "HISADDR") == 0)
8006059Samurai      gateway = IpcpInfo.his_ipaddr;
8016059Samurai    else
8026059Samurai      gateway = GetIpAddr(argv[2]);
8036059Samurai    OsSetRoute(RTM_ADD, dest, gateway, netmask);
8046059Samurai  } else {
8056059Samurai    printf("Usage: %s %s\n", list->name, list->syntax);
8066059Samurai  }
8076059Samurai  return(1);
8086059Samurai}
8096059Samurai
8106059Samuraistatic int
8116059SamuraiDeleteCommand(list, argc, argv)
8126059Samuraistruct cmdtab *list;
8136059Samuraiint argc;
8146059Samuraichar **argv;
8156059Samurai{
8166059Samurai  struct in_addr dest, gateway, netmask;
8176059Samurai
8186059Samurai  if (argc >= 2) {
8196059Samurai    dest = GetIpAddr(argv[0]);
8206059Samurai    if (strcmp(argv[1], "HISADDR") == 0)
8216059Samurai      gateway = IpcpInfo.his_ipaddr;
8226059Samurai    else
8236059Samurai      gateway = GetIpAddr(argv[1]);
8246059Samurai    netmask.s_addr = 0;
8256059Samurai    if (argc == 3) {
8266059Samurai      if (inet_aton(argv[1], &netmask) == 0) {
8276059Samurai	printf("bad netmask value.\n");
8286059Samurai	return(1);
8296059Samurai      }
8306059Samurai    }
8316059Samurai    OsSetRoute(RTM_DELETE, dest, gateway, netmask);
8326059Samurai  } else if (argc == 1 && strcmp(argv[0], "ALL") == 0) {
8336059Samurai    DeleteIfRoutes(0);
8346059Samurai  } else {
8356059Samurai    printf("Usage: %s %s\n", list->name, list->syntax);
8366059Samurai  }
8376059Samurai  return(1);
8386059Samurai}
8396059Samurai
840