command.c revision 6059
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.
196059Samurai *
206059Samurai * $Id:$
216059Samurai *
226059Samurai */
236059Samurai#include <ctype.h>
246059Samurai#include "fsm.h"
256059Samurai#include "phase.h"
266059Samurai#include "lcp.h"
276059Samurai#include "ipcp.h"
286059Samurai#include "modem.h"
296059Samurai#include "command.h"
306059Samurai#include "hdlc.h"
316059Samurai#include "vars.h"
326059Samurai#include <netdb.h>
336059Samurai#include <sys/socket.h>
346059Samurai#include <arpa/inet.h>
356059Samurai#include <net/route.h>
366059Samurai#include "os.h"
376059Samurai
386059Samuraiextern int  MakeArgs();
396059Samuraiextern void Cleanup(), TtyTermMode(), PacketMode();
406059Samuraiextern int  EnableCommand(), DisableCommand(), DisplayCommand();
416059Samuraiextern int  AcceptCommand(), DenyCommand();
426059Samuraiextern int  LoadCommand(), SaveCommand();
436059Samuraiextern int  ChangeParity(char *);
446059Samuraiextern int  SelectSystem();
456059Samuraiextern int  ShowRoute();
466059Samurai
476059Samuraistruct in_addr ifnetmask;
486059Samurai
496059Samuraistatic int ShowCommand(), TerminalCommand(), QuitCommand();
506059Samuraistatic int CloseCommand(), DialCommand(), DownCommand();
516059Samuraistatic int SetCommand(), AddCommand(), DeleteCommand();
526059Samurai
536059Samuraistatic int
546059SamuraiHelpCommand(list, argc, argv, plist)
556059Samuraistruct cmdtab *list;
566059Samuraiint argc;
576059Samuraichar **argv;
586059Samuraistruct cmdtab *plist;
596059Samurai{
606059Samurai  struct cmdtab *cmd;
616059Samurai  int n;
626059Samurai  char c;
636059Samurai
646059Samurai  if (argc > 0) {
656059Samurai    for (cmd = plist; cmd->name; cmd++) {
666059Samurai      if (strcmp(cmd->name, *argv) == 0) {
676059Samurai        printf("%s %s\n", cmd->name, cmd->syntax);
686059Samurai        return(1);
696059Samurai      }
706059Samurai    }
716059Samurai    return(1);
726059Samurai  }
736059Samurai  n = 0;
746059Samurai  for (cmd = plist; cmd->func; cmd++) {
756059Samurai    c = (n & 1)? '\n' : '\t';
766059Samurai    if (cmd->name) {
776059Samurai      printf("  %-8s: %-20s%c", cmd->name, cmd->helpmes, c);
786059Samurai      n++;
796059Samurai    }
806059Samurai  }
816059Samurai  if (n & 1)
826059Samurai    printf("\n");
836059Samurai  return(1);
846059Samurai}
856059Samurai
866059Samuraiint
876059SamuraiIsInteractive()
886059Samurai{
896059Samurai  char *mes = NULL;
906059Samurai
916059Samurai  if (mode & MODE_AUTO)
926059Samurai    mes = "Working as auto mode.";
936059Samurai  else if (mode & MODE_DIRECT)
946059Samurai    mes = "Working as direct mode.";
956059Samurai  else if (mode & MODE_DEDICATED)
966059Samurai    mes = "Workring as dedicated mode.";
976059Samurai  if (mes) {
986059Samurai    printf("%s\n", mes);
996059Samurai    return(0);
1006059Samurai  }
1016059Samurai  return(1);
1026059Samurai}
1036059Samurai
1046059Samuraistatic int
1056059SamuraiDialCommand(cmdlist, argc, argv)
1066059Samuraistruct cmdtab *cmdlist;
1076059Samuraiint argc;
1086059Samuraichar **argv;
1096059Samurai{
1106059Samurai  if (LcpFsm.state > ST_CLOSED) {
1116059Samurai    printf("LCP state is [%s]\n", StateNames[LcpFsm.state]);
1126059Samurai    return(1);
1136059Samurai  }
1146059Samurai  if (!IsInteractive())
1156059Samurai    return(1);
1166059Samurai  modem = OpenModem(mode);
1176059Samurai  if (modem < 0) {
1186059Samurai    printf("failed to open modem.\n");
1196059Samurai    modem = 0;
1206059Samurai    return(1);
1216059Samurai  }
1226059Samurai  if (argc > 0) {
1236059Samurai    if (SelectSystem(*argv, CONFFILE) < 0) {
1246059Samurai      printf("%s: not found.\n", *argv);
1256059Samurai      return(1);
1266059Samurai    }
1276059Samurai  }
1286059Samurai  if (DialModem()) {
1296059Samurai    sleep(1);
1306059Samurai    ModemTimeout();
1316059Samurai    PacketMode();
1326059Samurai  }
1336059Samurai  return(1);
1346059Samurai}
1356059Samurai
1366059Samuraistatic char StrOption[] = "option ..";
1376059Samuraistatic char StrRemote[] = "[remote]";
1386059Samuraichar StrNull[] = "";
1396059Samurai
1406059Samuraistruct cmdtab Commands[] = {
1416059Samurai  { "accept",  NULL,    AcceptCommand,
1426059Samurai  	"accept option request",	StrOption },
1436059Samurai  { "add",     NULL,	AddCommand,
1446059Samurai	"add route",			"dest mask gateway" },
1456059Samurai  { "close",   NULL,    CloseCommand,
1466059Samurai	"Close connection",		StrNull },
1476059Samurai  { "delete",  NULL,    DeleteCommand,
1486059Samurai  	"delete route",			"dest gateway" },
1496059Samurai  { "deny",    NULL,    DenyCommand,
1506059Samurai  	"Deny option request",		StrOption },
1516059Samurai  { "dial",    "call",  DialCommand,
1526059Samurai  	"Dial and login",		StrRemote },
1536059Samurai  { "disable", NULL,    DisableCommand,
1546059Samurai  	"Disable option",		StrOption },
1556059Samurai  { "display", NULL,    DisplayCommand,
1566059Samurai  	"Display option configs",	StrNull },
1576059Samurai  { "enable",  NULL,    EnableCommand,
1586059Samurai  	"Enable option",		StrOption },
1596059Samurai  { "load",    NULL,    LoadCommand,
1606059Samurai  	"Load settings",		StrRemote },
1616059Samurai  { "save",    NULL,    SaveCommand,
1626059Samurai  	"Save settings", StrNull },
1636059Samurai  { "set",     "setup", SetCommand,
1646059Samurai  	"Set parameters",  "var value" },
1656059Samurai  { "show",    NULL,    ShowCommand,
1666059Samurai  	"Show status and statictics", "var" },
1676059Samurai  { "term",    NULL,    TerminalCommand,
1686059Samurai  	"Enter to terminal mode", StrNull },
1696059Samurai  { "quit",    "bye",   QuitCommand,
1706059Samurai  	"Quit PPP program", StrNull },
1716059Samurai  { "help",    "?",     HelpCommand,
1726059Samurai	"Display this message", "[command]", (void *)Commands },
1736059Samurai  { NULL,      "down",  DownCommand,
1746059Samurai  	"Generate down event",		StrNull },
1756059Samurai  { NULL,      NULL,    NULL },
1766059Samurai};
1776059Samurai
1786059Samuraiextern int ReportCcpStatus();
1796059Samuraiextern int ReportLcpStatus();
1806059Samuraiextern int ReportIpcpStatus();
1816059Samuraiextern int ReportProtStatus();
1826059Samuraiextern int ReportCompress();
1836059Samuraiextern int ShowModemStatus();
1846059Samuraiextern int ReportHdlcStatus();
1856059Samuraiextern int ShowMemMap();
1866059Samurai
1876059Samuraistatic char *LogLevelName[] = {
1886059Samurai  LM_PHASE, LM_CHAT, LM_LQM,   LM_LCP,
1896059Samurai  LM_TCPIP, LM_HDLC, LM_ASYNC,
1906059Samurai};
1916059Samurai
1926059Samuraistatic int ShowDebugLevel()
1936059Samurai{
1946059Samurai  int i;
1956059Samurai
1966059Samurai  printf("%02x: ", loglevel);
1976059Samurai  for (i = LOG_PHASE; i < MAXLOGLEVEL; i++) {
1986059Samurai    if (loglevel & (1 << i))
1996059Samurai      printf("%s ", LogLevelName[i]);
2006059Samurai  }
2016059Samurai  printf("\n");
2026059Samurai  return(1);
2036059Samurai}
2046059Samurai
2056059Samuraistatic int ShowEscape()
2066059Samurai{
2076059Samurai  int code, bit;
2086059Samurai
2096059Samurai  if (EscMap[32]) {
2106059Samurai    for (code = 0; code < 32; code++) {
2116059Samurai      if (EscMap[code]) {
2126059Samurai        for (bit = 0; bit < 8; bit++) {
2136059Samurai          if (EscMap[code] & (1<<bit)) {
2146059Samurai            printf(" 0x%02x", (code << 3) + bit);
2156059Samurai          }
2166059Samurai        }
2176059Samurai      }
2186059Samurai    }
2196059Samurai    printf("\n");
2206059Samurai  }
2216059Samurai  return(1);
2226059Samurai}
2236059Samurai
2246059Samuraistatic int ShowTimeout()
2256059Samurai{
2266059Samurai  printf(" Idle Timer: %d secs   LQR Timer: %d secs\n",
2276059Samurai    VarIdleTimeout, VarLqrTimeout);
2286059Samurai  return(1);
2296059Samurai}
2306059Samurai
2316059Samuraistatic int ShowAuthKey()
2326059Samurai{
2336059Samurai  printf("AuthName = %s\n", VarAuthName);
2346059Samurai  printf("AuthKey  = %s\n", VarAuthKey);
2356059Samurai  return(1);
2366059Samurai}
2376059Samurai
2386059Samuraistatic int ShowVersion()
2396059Samurai{
2406059Samurai  extern char *VarVersion[];
2416059Samurai
2426059Samurai  printf("%s\n", VarVersion);
2436059Samurai  return(1);
2446059Samurai}
2456059Samurai
2466059Samuraistatic int ShowLogList()
2476059Samurai{
2486059Samurai  ListLog();
2496059Samurai  return(1);
2506059Samurai}
2516059Samurai
2526059Samuraiextern int ShowIfilter(), ShowOfilter(), ShowDfilter();
2536059Samurai
2546059Samuraistruct cmdtab ShowCommands[] = {
2556059Samurai  { "auth",     NULL,     ShowAuthKey,       "Show auth name/key",
2566059Samurai	StrNull, },
2576059Samurai  { "ccp",      NULL,     ReportCcpStatus,   "Show CCP status",
2586059Samurai	StrNull, },
2596059Samurai  { "compress", NULL,     ReportCompress,    "Show compression statictics",
2606059Samurai	StrNull },
2616059Samurai  { "debug",	NULL,	  ShowDebugLevel,    "Show current debug level",
2626059Samurai	StrNull },
2636059Samurai  { "dfilter",  NULL,     ShowDfilter,       "Show Demand filters",
2646059Samurai	StrOption },
2656059Samurai  { "escape",   NULL,     ShowEscape,        "Show escape characters",
2666059Samurai	StrNull },
2676059Samurai  { "hdlc",	NULL,	  ReportHdlcStatus,  "Show HDLC error summary",
2686059Samurai  	StrNull },
2696059Samurai  { "ifilter",  NULL,     ShowIfilter,       "Show Input filters",
2706059Samurai	StrOption },
2716059Samurai  { "ipcp",     NULL,     ReportIpcpStatus,  "Show IPCP status",
2726059Samurai	StrNull, },
2736059Samurai  { "lcp",      NULL,     ReportLcpStatus,   "Show LCP status",
2746059Samurai	StrNull, },
2756059Samurai  { "log",      NULL,     ShowLogList,       "Show log records",
2766059Samurai	StrNull, },
2776059Samurai  { "mem",      NULL,     ShowMemMap,        "Show memory map",
2786059Samurai	StrNull, },
2796059Samurai  { "modem",    NULL,     ShowModemStatus,   "Show modem setups",
2806059Samurai	StrNull, },
2816059Samurai  { "ofilter",  NULL,     ShowOfilter,       "Show Output filters",
2826059Samurai	StrOption },
2836059Samurai  { "proto",    NULL,     ReportProtStatus,  "Show protocol summary",
2846059Samurai	StrNull, },
2856059Samurai  { "route",    NULL,     ShowRoute,	     "Show routing table",
2866059Samurai	StrNull, },
2876059Samurai  { "timeout",  NULL,	  ShowTimeout,       "Show Idle timeout value",
2886059Samurai	StrNull, },
2896059Samurai  { "version",  NULL,	  ShowVersion,       "Show version string",
2906059Samurai	StrNull, },
2916059Samurai  { "help",     "?",      HelpCommand,       "Display this message",
2926059Samurai	StrNull, (void *)ShowCommands },
2936059Samurai  { NULL,       NULL,     NULL },
2946059Samurai};
2956059Samurai
2966059Samuraistruct cmdtab *
2976059SamuraiFindCommand(cmds, str, pmatch)
2986059Samuraistruct cmdtab *cmds;
2996059Samuraichar *str;
3006059Samuraiint *pmatch;
3016059Samurai{
3026059Samurai  int nmatch = 0;
3036059Samurai  int len = strlen(str);
3046059Samurai  struct cmdtab *found = NULL;
3056059Samurai
3066059Samurai  while (cmds->func) {
3076059Samurai    if (cmds->name && strncmp(str, cmds->name, len) == 0) {
3086059Samurai      nmatch++;
3096059Samurai      found = cmds;
3106059Samurai    } else if (cmds->alias && strncmp(str, cmds->alias, len) == 0) {
3116059Samurai      nmatch++;
3126059Samurai      found = cmds;
3136059Samurai    }
3146059Samurai    cmds++;
3156059Samurai  }
3166059Samurai  *pmatch = nmatch;
3176059Samurai  return(found);
3186059Samurai}
3196059Samurai
3206059Samuraiint
3216059SamuraiFindExec(cmdlist, argc, argv)
3226059Samuraistruct cmdtab *cmdlist;
3236059Samuraiint argc;
3246059Samuraichar **argv;
3256059Samurai{
3266059Samurai  struct cmdtab *cmd;
3276059Samurai  int val = 1;
3286059Samurai  int nmatch;
3296059Samurai
3306059Samurai  cmd = FindCommand(cmdlist, *argv, &nmatch);
3316059Samurai  if (nmatch > 1)
3326059Samurai    printf("Anbiguous.\n");
3336059Samurai  else if (cmd)
3346059Samurai    val = (cmd->func)(cmd, --argc, ++argv, cmd->args);
3356059Samurai  else
3366059Samurai    printf("what?\n");
3376059Samurai  return(val);
3386059Samurai}
3396059Samurai
3406059Samuraivoid
3416059SamuraiPrompt(flag)
3426059Samuraiint flag;
3436059Samurai{
3446059Samurai  if (!(mode & MODE_INTER))
3456059Samurai    return;
3466059Samurai  if (flag) printf("\n");
3476059Samurai  if (IpcpFsm.state == ST_OPENED && phase == PHASE_NETWORK)
3486059Samurai    printf("PPP> ");
3496059Samurai  else
3506059Samurai    printf("ppp> ");
3516059Samurai  fflush(stdout);
3526059Samurai}
3536059Samurai
3546059Samuraivoid
3556059SamuraiDecodeCommand(buff, nb, prompt)
3566059Samuraichar *buff;
3576059Samuraiint nb;
3586059Samuraiint prompt;
3596059Samurai{
3606059Samurai  char *vector[20];
3616059Samurai  char **argv;
3626059Samurai  int argc, val;
3636059Samurai  char *cp;
3646059Samurai
3656059Samurai  val = 1;
3666059Samurai  if (nb > 0) {
3676059Samurai    cp = buff + strcspn(buff, "\r\n");
3686059Samurai    if (cp)
3696059Samurai      *cp = '\0';
3706059Samurai    {
3716059Samurai      argc = MakeArgs(buff, &vector);
3726059Samurai      argv = vector;
3736059Samurai
3746059Samurai      if (argc > 0)
3756059Samurai        val = FindExec(Commands, argc, argv);
3766059Samurai    }
3776059Samurai  }
3786059Samurai  if (val && prompt)
3796059Samurai    Prompt(0);
3806059Samurai}
3816059Samurai
3826059Samuraistatic int
3836059SamuraiShowCommand(list, argc, argv)
3846059Samuraistruct cmdtab *list;
3856059Samuraiint argc;
3866059Samuraichar **argv;
3876059Samurai{
3886059Samurai  int val = 1;
3896059Samurai
3906059Samurai  if (argc > 0)
3916059Samurai    val = FindExec(ShowCommands, argc, argv);
3926059Samurai  else
3936059Samurai    printf("Use ``show ?'' to get a list.\n");
3946059Samurai  return(val);
3956059Samurai}
3966059Samurai
3976059Samuraistatic int
3986059SamuraiTerminalCommand()
3996059Samurai{
4006059Samurai  if (LcpFsm.state > ST_CLOSED) {
4016059Samurai    printf("LCP state is [%s]\n", StateNames[LcpFsm.state]);
4026059Samurai    return(1);
4036059Samurai  }
4046059Samurai  if (!IsInteractive())
4056059Samurai    return(1);
4066059Samurai  modem = OpenModem(mode);
4076059Samurai  if (modem < 0) {
4086059Samurai    printf("failed to open modem.\n");
4096059Samurai    modem = 0;
4106059Samurai    return(1);
4116059Samurai  }
4126059Samurai  printf("Enter to terminal mode.\n");
4136059Samurai  printf("Type `~?' for help.\n");
4146059Samurai  TtyTermMode();
4156059Samurai  return(0);
4166059Samurai}
4176059Samurai
4186059Samuraistatic int
4196059SamuraiQuitCommand(list, argc, argv)
4206059Samuraistruct cmdtab *list;
4216059Samuraiint argc;
4226059Samuraichar **argv;
4236059Samurai{
4246059Samurai  if (mode & (MODE_DIRECT|MODE_DEDICATED|MODE_AUTO)) {
4256059Samurai    if (argc > 0) {
4266059Samurai      Cleanup(EX_NORMAL);
4276059Samurai    } else {
4286059Samurai      close(netfd);
4296059Samurai      close(1);
4306059Samurai      netfd = -1;
4316059Samurai      mode &= ~MODE_INTER;
4326059Samurai    }
4336059Samurai  } else
4346059Samurai    Cleanup(EX_NORMAL);
4356059Samurai  return(1);
4366059Samurai}
4376059Samurai
4386059Samuraistatic int
4396059SamuraiCloseCommand()
4406059Samurai{
4416059Samurai  LcpClose();
4426059Samurai  return(1);
4436059Samurai}
4446059Samurai
4456059Samuraistatic int
4466059SamuraiDownCommand()
4476059Samurai{
4486059Samurai  LcpDown();
4496059Samurai  return(1);
4506059Samurai}
4516059Samurai
4526059Samuraistatic int validspeed[] = {
4536059Samurai  1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 0
4546059Samurai};
4556059Samurai
4566059Samuraistatic int SetModemSpeed(list, argc, argv)
4576059Samuraistruct cmdtab *list;
4586059Samuraiint argc;
4596059Samuraichar **argv;
4606059Samurai{
4616059Samurai  int speed;
4626059Samurai  int *sp;
4636059Samurai
4646059Samurai  if (argc > 0) {
4656059Samurai    speed = atoi(*argv);
4666059Samurai    for (sp = validspeed; *sp; sp++) {
4676059Samurai      if (*sp == speed) {
4686059Samurai	VarSpeed = speed;
4696059Samurai	return(1);
4706059Samurai      }
4716059Samurai    }
4726059Samurai    printf("invalid speed.\n");
4736059Samurai  }
4746059Samurai  return(1);
4756059Samurai}
4766059Samurai
4776059Samuraistatic int SetModemParity(list, argc, argv)
4786059Samuraistruct cmdtab *list;
4796059Samuraiint argc;
4806059Samuraichar **argv;
4816059Samurai{
4826059Samurai  int parity;
4836059Samurai
4846059Samurai  if (argc > 0) {
4856059Samurai    parity = ChangeParity(*argv);
4866059Samurai    if (parity < 0)
4876059Samurai      printf("Invalid parity.\n");
4886059Samurai    else
4896059Samurai      VarParity = parity;
4906059Samurai  }
4916059Samurai  return(1);
4926059Samurai}
4936059Samurai
4946059Samuraistatic int
4956059SamuraiSetDebugLevel(list, argc, argv)
4966059Samuraistruct cmdtab *list;
4976059Samuraiint argc;
4986059Samuraichar **argv;
4996059Samurai{
5006059Samurai  int level, w;
5016059Samurai
5026059Samurai  for (level = 0; argc-- > 0; argv++) {
5036059Samurai    if (isdigit(**argv)) {
5046059Samurai      w = atoi(*argv);
5056059Samurai      if (w < 0 || w >= MAXLOGLEVEL) {
5066059Samurai	printf("invalid log level.\n");
5076059Samurai	break;
5086059Samurai      } else
5096059Samurai	level |= (1 << w);
5106059Samurai    } else {
5116059Samurai      for (w = 0; w < MAXLOGLEVEL; w++) {
5126059Samurai	if (strcasecmp(*argv, LogLevelName[w]) == 0) {
5136059Samurai	  level |= (1 << w);
5146059Samurai	  continue;
5156059Samurai	}
5166059Samurai      }
5176059Samurai    }
5186059Samurai  }
5196059Samurai  loglevel = level;
5206059Samurai  return(1);
5216059Samurai}
5226059Samurai
5236059Samuraistatic int
5246059SamuraiSetEscape(list, argc, argv)
5256059Samuraistruct cmdtab *list;
5266059Samuraiint argc;
5276059Samuraichar **argv;
5286059Samurai{
5296059Samurai  int code;
5306059Samurai
5316059Samurai  for (code = 0; code < 33; code++)
5326059Samurai    EscMap[code] = 0;
5336059Samurai  while (argc-- > 0) {
5346059Samurai    sscanf(*argv++, "%x", &code);
5356059Samurai    code &= 0xff;
5366059Samurai    EscMap[code >> 3] |= (1 << (code&7));
5376059Samurai    EscMap[32] = 1;
5386059Samurai  }
5396059Samurai  return(1);
5406059Samurai}
5416059Samurai
5426059Samuraistatic int
5436059SamuraiSetInitialMRU(list, argc, argv)
5446059Samuraistruct cmdtab *list;
5456059Samuraiint argc;
5466059Samuraichar **argv;
5476059Samurai{
5486059Samurai  int mru;
5496059Samurai
5506059Samurai  if (argc > 0) {
5516059Samurai    mru = atoi(*argv);
5526059Samurai    if (mru < 100)
5536059Samurai      printf("given value is too small.\n");
5546059Samurai    else if (mru > MAX_MRU)
5556059Samurai      printf("given value is too big.\n");
5566059Samurai    else
5576059Samurai      VarMRU = mru;
5586059Samurai  }
5596059Samurai  return(1);
5606059Samurai}
5616059Samurai
5626059Samuraistatic int
5636059SamuraiSetIdleTimeout(list, argc, argv)
5646059Samuraistruct cmdtab *list;
5656059Samuraiint argc;
5666059Samuraichar **argv;
5676059Samurai{
5686059Samurai  if (argc-- > 0) {
5696059Samurai    VarIdleTimeout = atoi(*argv++);
5706059Samurai    if (argc > 0)
5716059Samurai      VarLqrTimeout = atoi(*argv);
5726059Samurai  }
5736059Samurai  return(1);
5746059Samurai}
5756059Samurai
5766059Samuraistruct in_addr
5776059SamuraiGetIpAddr(cp)
5786059Samuraichar *cp;
5796059Samurai{
5806059Samurai  struct hostent *hp;
5816059Samurai  struct in_addr ipaddr;
5826059Samurai
5836059Samurai  hp = gethostbyname(cp);
5846059Samurai  if (hp && hp->h_addrtype == AF_INET)
5856059Samurai    bcopy(hp->h_addr, &ipaddr, hp->h_length);
5866059Samurai  else if (inet_aton(cp, &ipaddr) == 0)
5876059Samurai    ipaddr.s_addr = 0;
5886059Samurai  return(ipaddr);
5896059Samurai}
5906059Samurai
5916059Samuraistatic int
5926059SamuraiSetInterfaceAddr(list, argc, argv)
5936059Samuraistruct cmdtab *list;
5946059Samuraiint argc;
5956059Samuraichar **argv;
5966059Samurai{
5976059Samurai  int width;
5986059Samurai
5996059Samurai  DefMyAddress.ipaddr.s_addr = DefHisAddress.ipaddr.s_addr = 0L;
6006059Samurai  if (argc > 0) {
6016059Samurai    ParseAddr(argc, argv++,
6026059Samurai      &DefMyAddress.ipaddr, &DefMyAddress.mask, &DefMyAddress.width);
6036059Samurai    if (--argc > 0) {
6046059Samurai      ParseAddr(argc, argv++,
6056059Samurai	&DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width);
6066059Samurai      if (--argc > 0) {
6076059Samurai        ifnetmask = GetIpAddr(*argv);
6086059Samurai      }
6096059Samurai    }
6106059Samurai  }
6116059Samurai  /*
6126059Samurai   * For backwards compatibility, 0.0.0.0 means any address.
6136059Samurai   */
6146059Samurai  if (DefMyAddress.ipaddr.s_addr == 0) {
6156059Samurai    DefMyAddress.mask.s_addr = 0;
6166059Samurai    DefMyAddress.width = 0;
6176059Samurai  }
6186059Samurai  if (DefHisAddress.ipaddr.s_addr == 0) {
6196059Samurai    DefHisAddress.mask.s_addr = 0;
6206059Samurai    DefHisAddress.width = 0;
6216059Samurai  }
6226059Samurai
6236059Samurai  if ((mode & MODE_AUTO) |
6246059Samurai	((mode & MODE_DEDICATED) && dstsystem)) {
6256059Samurai    OsSetIpaddress(DefMyAddress.ipaddr, DefHisAddress.ipaddr, ifnetmask);
6266059Samurai  }
6276059Samurai  return(1);
6286059Samurai}
6296059Samurai
6306059Samurai
6316059Samurai#define	VAR_AUTHKEY	0
6326059Samurai#define	VAR_DIAL	1
6336059Samurai#define	VAR_LOGIN	2
6346059Samurai#define	VAR_AUTHNAME	3
6356059Samurai#define	VAR_DEVICE	4
6366059Samurai#define	VAR_ACCMAP	5
6376059Samurai#define	VAR_PHONE	6
6386059Samurai
6396059Samuraistatic int
6406059SamuraiSetVariable(list, argc, argv, param)
6416059Samuraistruct cmdtab *list;
6426059Samuraiint argc;
6436059Samuraichar **argv;
6446059Samuraiint param;
6456059Samurai{
6466059Samurai  u_long map;
6476059Samurai
6486059Samurai  if (argc > 0) {
6496059Samurai    switch (param) {
6506059Samurai    case VAR_AUTHKEY:
6516059Samurai      strncpy(VarAuthKey, *argv, sizeof(VarAuthKey)-1);
6526059Samurai      break;
6536059Samurai    case VAR_AUTHNAME:
6546059Samurai      strncpy(VarAuthName, *argv, sizeof(VarAuthName)-1);
6556059Samurai      break;
6566059Samurai    case VAR_DIAL:
6576059Samurai      strncpy(VarDialScript, *argv, sizeof(VarDialScript)-1);
6586059Samurai      break;
6596059Samurai    case VAR_LOGIN:
6606059Samurai      strncpy(VarLoginScript, *argv, sizeof(VarDialScript)-1);
6616059Samurai      break;
6626059Samurai    case VAR_DEVICE:
6636059Samurai      strncpy(VarDevice, *argv, sizeof(VarDevice)-1);
6646059Samurai      break;
6656059Samurai    case VAR_ACCMAP:
6666059Samurai      sscanf(*argv, "%x", &map);
6676059Samurai      VarAccmap = map;
6686059Samurai      break;
6696059Samurai    case VAR_PHONE:
6706059Samurai      strncpy(VarPhone, *argv, sizeof(VarPhone)-1);
6716059Samurai      break;
6726059Samurai    }
6736059Samurai  }
6746059Samurai  return(1);
6756059Samurai}
6766059Samurai
6776059Samuraistatic int SetOpenMode(list, argc, argv)
6786059Samuraistruct cmdtab *list;
6796059Samuraiint argc;
6806059Samuraichar **argv;
6816059Samurai{
6826059Samurai  if (argc > 0) {
6836059Samurai    if (strcmp(*argv, "active") == 0)
6846059Samurai      VarOpenMode = OPEN_ACTIVE;
6856059Samurai    else if (strcmp(*argv, "passive") == 0)
6866059Samurai      VarOpenMode = OPEN_PASSIVE;
6876059Samurai    else
6886059Samurai      printf("Invalid mode.\n");
6896059Samurai  }
6906059Samurai  return(1);
6916059Samurai}
6926059Samurai
6936059Samuraistatic char StrChatStr[] = "chat-script";
6946059Samuraistatic char StrValue[] = "value";
6956059Samurai
6966059Samuraiextern int SetIfilter(), SetOfilter(), SetDfilter();
6976059Samurai
6986059Samuraistruct cmdtab SetCommands[] = {
6996059Samurai  { "accmap",   NULL,	  SetVariable,	  "Set accmap value",
7006059Samurai	"hex-value",	(void *)VAR_ACCMAP },
7016059Samurai  { "authkey",  "key",     SetVariable,	  "Set authentication key",
7026059Samurai	"key",		(void *)VAR_AUTHKEY },
7036059Samurai  { "authname", NULL,     SetVariable,    "Set authentication name",
7046059Samurai	"name",		(void *)VAR_AUTHNAME },
7056059Samurai  { "debug",    NULL,	  SetDebugLevel,  "Set debug level",
7066059Samurai	StrValue },
7076059Samurai  { "device",     "line", SetVariable, "Set modem device name",
7086059Samurai	"device-name",	(void *)VAR_DEVICE },
7096059Samurai  { "dfilter",  NULL,     SetDfilter,  "Set demand filter",
7106059Samurai        "..." },
7116059Samurai  { "dial",     NULL,     SetVariable, 	 "Set dialing script",
7126059Samurai	StrChatStr,	(void *)VAR_DIAL },
7136059Samurai  { "escape",   NULL,	  SetEscape,       "Set escape characters",
7146059Samurai        "hex-digit ..."},
7156059Samurai  { "ifaddr",   NULL,   SetInterfaceAddr,  "Set destination address",
7166059Samurai	"src-addr dst-addr netmask" },
7176059Samurai  { "ifilter",  NULL,     SetIfilter,  "Set input filter",
7186059Samurai        "..." },
7196059Samurai  { "login",    NULL,     SetVariable,	"Set login script",
7206059Samurai	 StrChatStr,	(void *)VAR_LOGIN },
7216059Samurai  { "mru",      "mtu",    SetInitialMRU,  "Set Initial MRU value",
7226059Samurai	StrValue },
7236059Samurai  { "ofilter",  NULL,	  SetOfilter,	  "Set output filter",
7246059Samurai        "..." },
7256059Samurai  { "openmode", NULL,	  SetOpenMode,	  "Set open mode",
7266059Samurai	"[active|passive]" },
7276059Samurai  { "parity",   NULL,     SetModemParity, "Set modem parity",
7286059Samurai	"[odd|even|none]" },
7296059Samurai  { "phone",    NULL,     SetVariable,	  "Set telephone number",
7306059Samurai        "phone-number",	(void *)VAR_PHONE },
7316059Samurai  { "speed",    NULL,     SetModemSpeed,  "Set modem speed",
7326059Samurai	"speed" },
7336059Samurai  { "timeout",  NULL,     SetIdleTimeout, "Set Idle timeout",
7346059Samurai	StrValue },
7356059Samurai  { "help",     "?",      HelpCommand,    "Display this message",
7366059Samurai	StrNull, (void *)SetCommands },
7376059Samurai  { NULL,       NULL,     NULL },
7386059Samurai};
7396059Samurai
7406059Samuraistatic int
7416059SamuraiSetCommand(list, argc, argv)
7426059Samuraistruct cmdtab *list;
7436059Samuraiint argc;
7446059Samuraichar **argv;
7456059Samurai{
7466059Samurai  int val = 1;
7476059Samurai
7486059Samurai  if (argc > 0)
7496059Samurai    val = FindExec(SetCommands, argc, argv);
7506059Samurai  else
7516059Samurai    printf("Use ``set ?'' to get a list.\n");
7526059Samurai  return(val);
7536059Samurai}
7546059Samurai
7556059Samurai
7566059Samuraistatic int
7576059SamuraiAddCommand(list, argc, argv)
7586059Samuraistruct cmdtab *list;
7596059Samuraiint argc;
7606059Samuraichar **argv;
7616059Samurai{
7626059Samurai  struct in_addr dest, gateway, netmask;
7636059Samurai
7646059Samurai  if (argc == 3) {
7656059Samurai    dest = GetIpAddr(argv[0]);
7666059Samurai    netmask = GetIpAddr(argv[1]);
7676059Samurai    if (strcmp(argv[2], "HISADDR") == 0)
7686059Samurai      gateway = IpcpInfo.his_ipaddr;
7696059Samurai    else
7706059Samurai      gateway = GetIpAddr(argv[2]);
7716059Samurai    OsSetRoute(RTM_ADD, dest, gateway, netmask);
7726059Samurai  } else {
7736059Samurai    printf("Usage: %s %s\n", list->name, list->syntax);
7746059Samurai  }
7756059Samurai  return(1);
7766059Samurai}
7776059Samurai
7786059Samuraistatic int
7796059SamuraiDeleteCommand(list, argc, argv)
7806059Samuraistruct cmdtab *list;
7816059Samuraiint argc;
7826059Samuraichar **argv;
7836059Samurai{
7846059Samurai  struct in_addr dest, gateway, netmask;
7856059Samurai
7866059Samurai  if (argc >= 2) {
7876059Samurai    dest = GetIpAddr(argv[0]);
7886059Samurai    if (strcmp(argv[1], "HISADDR") == 0)
7896059Samurai      gateway = IpcpInfo.his_ipaddr;
7906059Samurai    else
7916059Samurai      gateway = GetIpAddr(argv[1]);
7926059Samurai    netmask.s_addr = 0;
7936059Samurai    if (argc == 3) {
7946059Samurai      if (inet_aton(argv[1], &netmask) == 0) {
7956059Samurai	printf("bad netmask value.\n");
7966059Samurai	return(1);
7976059Samurai      }
7986059Samurai    }
7996059Samurai    OsSetRoute(RTM_DELETE, dest, gateway, netmask);
8006059Samurai  } else if (argc == 1 && strcmp(argv[0], "ALL") == 0) {
8016059Samurai    DeleteIfRoutes(0);
8026059Samurai  } else {
8036059Samurai    printf("Usage: %s %s\n", list->name, list->syntax);
8046059Samurai  }
8056059Samurai  return(1);
8066059Samurai}
8076059Samurai
808