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