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