commit - f49c1a3aa1e636cbb8f34940660a227320ffbc21
commit + 5a64be2df98dc16d97e70c3c9b029fc873e40800
blob - 2dd877fc0ca63a5f36fa0cefeedc8773d776bf6d
blob + 45d25c1c97f3c8c986f8c7cbaca6e0122395497b
--- commands.c
+++ commands.c
static int disable(void);
static int doverbose(int, char**);
static int doediting(int, char**);
+static int doconfig(int, char**);
int rtable(int, char**);
int group(int, char**);
static int nsh_setrtable(int);
static int ssh(int, char*[]);
static int telnet(int, char*[]);
void p_argv(int, char **);
-static int notvalid(void);
static int nreboot(void);
static int halt(void);
static Command *getcmd(char *);
{ "neighborgcthresh", "Maximum number of entries in neighbor cache", CMPL0 0, 0, 0, 0, ipsysctl },
{ "send-redirect", "Enables sending ICMPv6 redirects by the system", CMPL0 0, 0, 0, 0, ipsysctl },
{ "?", "Help", CMPL0 0, 0, 0, 0, sysctlhelp },
-{ 0, 0, 0, 0, 0, 0, 0, 0 }
-
-
-
+ { 0, 0, 0, 0, 0, 0, 0, 0 }
};
Menu mplstab[] = {
quithelp[] = "Close current connection",
verbosehelp[] = "Set verbose diagnostics",
editinghelp[] = "Set command line editing",
+ confighelp[] = "Set configuration mode",
whohelp[] = "Display system users",
shellhelp[] = "Invoke a subshell",
savehelp[] = "Save the current configuration",
#define ssctl sizeof(struct ctl)
Command cmdtab[] = {
- { "hostname", hostnamehelp, CMPL0 0, 0, hostname, 1, 0, 0 },
- { "interface", interfacehelp, CMPL(i) 0, 0, interface, 1, 1, 1 },
- { "rtable", rtablehelp, CMPL0 0, 0, rtable, 0, 1, 2 },
- { "group", grouphelp, CMPL0 0, 0, group, 1, 1, 0 },
- { "arp", arphelp, CMPL0 0, 0, arpset, 1, 1, 0 },
- { "ndp", ndphelp, CMPL0 0, 0, ndpset, 1, 1, 0 },
- { "nameserver", nameserverhelp, CMPL0 0, 0, nameserverset,1, 1, 0 },
- { "bridge", bridgehelp, CMPL(i) 0, 0, interface, 1, 1, 1 },
- { "show", showhelp, CMPL(ta) (char **)showlist, sizeof(Menu), showcmd, 0, 0, 0 },
- { "ip", iphelp, CMPL(ta) (char **)iptab, sizeof(Menu), ipcmd, 1, 1, 0 },
- { "ip6", ip6help, CMPL(ta) (char **)ip6tab, sizeof(Menu), ipcmd, 1, 1, 0 },
- { "mpls", mplshelp, CMPL(ta) (char **)mplstab, sizeof(Menu), ipcmd, 1, 1, 0 },
- { "ddb", ddbhelp, CMPL(ta) (char **)ddbtab, sizeof(Menu), ipcmd, 1, 1, 0 },
- { "pipex", pipexhelp, CMPL(ta) (char **)pipextab, sizeof(Menu), ipcmd, 1, 1, 0 },
- { "flush", flushhelp, CMPL(ta) (char **)flushlist, sizeof(Menu), flushcmd, 1, 0, 0 },
- { "enable", enablehelp, CMPL0 0, 0, enable, 0, 0, 0 },
- { "disable", disablehelp, CMPL0 0, 0, disable, 1, 0, 0 },
- { "route", routehelp, CMPL0 0, 0, route, 1, 1, 0 },
- { "pf", pfhelp, CMPL(t) (char **)ctl_pf, ssctl, ctlhandler, 1, 0, 1 },
- { "ospf", ospfhelp, CMPL(t) (char **)ctl_ospf, ssctl, ctlhandler, 1, 0, 1 },
- { "ospf6", ospf6help, CMPL(t) (char **)ctl_ospf6, ssctl, ctlhandler, 1, 0, 1 },
- { "eigrp", eigrphelp, CMPL(t) (char **)ctl_eigrp, ssctl, ctlhandler, 1, 0, 1 },
- { "bgp", bgphelp, CMPL(t) (char **)ctl_bgp, ssctl, ctlhandler, 1, 0, 1 },
- { "rip", riphelp, CMPL(t) (char **)ctl_rip, ssctl, ctlhandler, 1, 0, 1 },
- { "ldp", ldphelp, CMPL(t) (char **)ctl_ldp, ssctl, ctlhandler, 1, 0, 1 },
- { "relay", relayhelp, CMPL(t) (char **)ctl_relay, ssctl, ctlhandler, 1, 0, 1 },
- { "ipsec", ipsechelp, CMPL(t) (char **)ctl_ipsec, ssctl, ctlhandler, 1, 0, 1 },
- { "ike", ikehelp, CMPL(t) (char **)ctl_ike, ssctl, ctlhandler, 1, 0, 1 },
- { "dvmrp", dvmrphelp, CMPL(t) (char **)ctl_dvmrp, ssctl, ctlhandler, 1, 0, 1 },
- { "rad", radhelp, CMPL(t) (char **)ctl_rad, ssctl, ctlhandler, 1, 0, 1 },
- { "sasync", sasynchelp, CMPL(t) (char **)ctl_sasync, ssctl, ctlhandler, 1, 0, 1 },
- { "dhcp", dhcphelp, CMPL(t) (char **)ctl_dhcp, ssctl, ctlhandler, 1, 0, 1 },
- { "snmp", snmphelp, CMPL(t) (char **)ctl_snmp, ssctl, ctlhandler, 1, 0, 1 },
- { "ldap", ldaphelp, CMPL(t) (char **)ctl_ldap, ssctl, ctlhandler, 1, 0, 1 },
- { "smtp", smtphelp, CMPL(t) (char **)ctl_smtp, ssctl, ctlhandler, 1, 0, 1 },
- { "sshd", sshdhelp, CMPL(t) (char **)ctl_sshd, ssctl, ctlhandler, 1, 0, 1 },
- { "ntp", ntphelp, CMPL(t) (char **)ctl_ntp, ssctl, ctlhandler, 1, 0, 1 },
- { "nppp", nppphelp, CMPL(t) (char **)ctl_nppp, ssctl, ctlhandler, 1, 0, 1 },
- { "ifstate", ifstatehelp, CMPL(t) (char **)ctl_ifstate, ssctl, ctlhandler, 1, 0, 1 },
- { "ftp-proxy", ftpproxyhelp, CMPL(t) (char **)ctl_ftpproxy, ssctl, ctlhandler, 1, 0, 1 },
- { "tftp-proxy", tftpproxyhelp, CMPL(t) (char **)ctl_tftpproxy, ssctl, ctlhandler, 1, 0, 1 },
- { "tftp", tftphelp, CMPL(t) (char **)ctl_tftp, ssctl, ctlhandler, 1, 0, 1 },
- { "resolv", resolvhelp, CMPL(t) (char **)ctl_resolv, ssctl, ctlhandler, 1, 0, 1 },
- { "motd", motdhelp, CMPL(t) (char **)ctl_motd, ssctl, ctlhandler, 1, 0, 1 },
- { "inet", inethelp, CMPL(t) (char **)ctl_inet, ssctl, ctlhandler, 1, 0, 1 },
- { "ping", pinghelp, CMPL0 0, 0, ping, 0, 0, 0 },
- { "ping6", ping6help, CMPL0 0, 0, ping6, 0, 0, 0 },
- { "traceroute", tracerthelp, CMPL0 0, 0, traceroute, 0, 0, 0 },
- { "traceroute6", tracert6help, CMPL0 0, 0, traceroute6, 0, 0, 0 },
- { "ssh", sshhelp, CMPL0 0, 0, ssh, 0, 0, 0 },
- { "telnet", telnethelp, CMPL0 0, 0, telnet, 0, 0, 0 },
- { "reboot", nreboothelp, CMPL0 0, 0, nreboot, 1, 0, 0 },
- { "halt", halthelp, CMPL0 0, 0, halt, 1, 0, 0 },
- { "write-config", savehelp, CMPL0 0, 0, wr_startup, 1, 0, 0 },
- { "verbose", verbosehelp, CMPL0 0, 0, doverbose, 0, 1, 0 },
- { "editing", editinghelp, CMPL0 0, 0, doediting, 0, 1, 0 },
- { "who", whohelp, CMPL0 0, 0, who, 0, 0, 0 },
- { "!", shellhelp, CMPL0 0, 0, shell, 1, 0, 0 },
- { "?", helphelp, CMPL(C) 0, 0, help, 0, 0, 0 },
- { "quit", quithelp, CMPL0 0, 0, quit, 0, 0, 0 },
- { "help", 0, CMPL(C) 0, 0, help, 0, 0, 0 },
- { 0, 0, CMPL0 0, 0, 0, 0, 0, 0 }
+ { "hostname", hostnamehelp, CMPL0 0, 0, hostname, 1, 1, 0, 0 },
+ { "interface", interfacehelp, CMPL(i) 0, 0, interface, 1, 1, 1, 1 },
+ { "rtable", rtablehelp, CMPL0 0, 0, rtable, 0, 0, 1, 2 },
+ { "group", grouphelp, CMPL0 0, 0, group, 1, 1, 1, 0 },
+ { "arp", arphelp, CMPL0 0, 0, arpset, 1, 1, 1, 0 },
+ { "ndp", ndphelp, CMPL0 0, 0, ndpset, 1, 1, 1, 0 },
+ { "nameserver", nameserverhelp, CMPL0 0, 0, nameserverset, 1, 1, 1, 0 },
+ { "bridge", bridgehelp, CMPL(i) 0, 0, interface, 1, 1, 1, 1 },
+ { "show", showhelp, CMPL(ta) (char **)showlist, sizeof(Menu), showcmd, 0, 0, 0, 0 },
+ { "ip", iphelp, CMPL(ta) (char **)iptab, sizeof(Menu), ipcmd, 1, 1, 1, 0 },
+ { "ip6", ip6help, CMPL(ta) (char **)ip6tab, sizeof(Menu), ipcmd, 1, 1, 1, 0 },
+ { "mpls", mplshelp, CMPL(ta) (char **)mplstab, sizeof(Menu), ipcmd, 1, 1, 1, 0 },
+ { "ddb", ddbhelp, CMPL(ta) (char **)ddbtab, sizeof(Menu), ipcmd, 1, 1, 1, 0 },
+ { "pipex", pipexhelp, CMPL(ta) (char **)pipextab, sizeof(Menu), ipcmd, 1, 1, 1, 0 },
+ { "flush", flushhelp, CMPL(ta) (char **)flushlist, sizeof(Menu), flushcmd, 1, 0, 0, 0 },
+ { "enable", enablehelp, CMPL0 0, 0, enable, 0, 0, 0, 0 },
+ { "disable", disablehelp, CMPL0 0, 0, disable, 1, 0, 0, 0 },
+ { "route", routehelp, CMPL0 0, 0, route, 1, 1, 1, 0 },
+ { "pf", pfhelp, CMPL(t) (char **)ctl_pf, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ospf", ospfhelp, CMPL(t) (char **)ctl_ospf, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ospf6", ospf6help, CMPL(t) (char **)ctl_ospf6, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "eigrp", eigrphelp, CMPL(t) (char **)ctl_eigrp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "bgp", bgphelp, CMPL(t) (char **)ctl_bgp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "rip", riphelp, CMPL(t) (char **)ctl_rip, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ldp", ldphelp, CMPL(t) (char **)ctl_ldp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "relay", relayhelp, CMPL(t) (char **)ctl_relay, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ipsec", ipsechelp, CMPL(t) (char **)ctl_ipsec, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ike", ikehelp, CMPL(t) (char **)ctl_ike, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "dvmrp", dvmrphelp, CMPL(t) (char **)ctl_dvmrp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "rad", radhelp, CMPL(t) (char **)ctl_rad, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "sasync", sasynchelp, CMPL(t) (char **)ctl_sasync, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "dhcp", dhcphelp, CMPL(t) (char **)ctl_dhcp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "snmp", snmphelp, CMPL(t) (char **)ctl_snmp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ldap", ldaphelp, CMPL(t) (char **)ctl_ldap, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "smtp", smtphelp, CMPL(t) (char **)ctl_smtp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "sshd", sshdhelp, CMPL(t) (char **)ctl_sshd, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ntp", ntphelp, CMPL(t) (char **)ctl_ntp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "nppp", nppphelp, CMPL(t) (char **)ctl_nppp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ifstate", ifstatehelp, CMPL(t) (char **)ctl_ifstate, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ftp-proxy", ftpproxyhelp, CMPL(t) (char **)ctl_ftpproxy, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "tftp-proxy", tftpproxyhelp, CMPL(t) (char **)ctl_tftpproxy, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "tftp", tftphelp, CMPL(t) (char **)ctl_tftp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "resolv", resolvhelp, CMPL(t) (char **)ctl_resolv, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "motd", motdhelp, CMPL(t) (char **)ctl_motd, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "inet", inethelp, CMPL(t) (char **)ctl_inet, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "ping", pinghelp, CMPL0 0, 0, ping, 0, 0, 0, 0 },
+ { "ping6", ping6help, CMPL0 0, 0, ping6, 0, 0, 0, 0 },
+ { "traceroute", tracerthelp, CMPL0 0, 0, traceroute, 0, 0, 0, 0 },
+ { "traceroute6", tracert6help, CMPL0 0, 0, traceroute6, 0, 0, 0, 0 },
+ { "ssh", sshhelp, CMPL0 0, 0, ssh, 0, 0, 0, 0 },
+ { "telnet", telnethelp, CMPL0 0, 0, telnet, 0, 0, 0, 0 },
+ { "reboot", nreboothelp, CMPL0 0, 0, nreboot, 1, 0, 0, 0 },
+ { "halt", halthelp, CMPL0 0, 0, halt, 1, 0, 0, 0 },
+ { "write-config", savehelp, CMPL0 0, 0, wr_startup, 1, 0, 0, 0 },
+ { "verbose", verbosehelp, CMPL0 0, 0, doverbose, 0, 0, 1, 0 },
+ { "editing", editinghelp, CMPL0 0, 0, doediting, 0, 0, 1, 0 },
+ { "configure", confighelp, CMPL0 0, 0, doconfig, 0, 0, 1, 0 },
+ { "who", whohelp, CMPL0 0, 0, who, 0, 0, 0, 0 },
+ { "!", shellhelp, CMPL0 0, 0, shell, 1, 0, 0, 0 },
+ { "?", helphelp, CMPL(C) 0, 0, help, 0, 0, 0, 0 },
+ { "quit", quithelp, CMPL0 0, 0, quit, 0, 0, 0, 0 },
+ { "help", 0, CMPL(C) 0, 0, help, 0, 0, 0, 0 },
+ { 0, 0, CMPL0 0, 0, 0, 0, 0, 0, 0 }
};
/*
*/
static Command cmdtab2[] = {
- { "config", 0, CMPL0 0, 0, notvalid, 0, 0, 0 },
- { 0, 0, CMPL0 0, 0, 0, 0, 0, 0 }
+ { 0, 0, CMPL0 0, 0, 0, 0, 0, 0, 0 }
};
Command *
printf("%% Privilege required\n");
continue;
}
+ if (c->needconfig != 0 && config_mode != 1) {
+ printf("%% Command requires configure mode\n");
+ continue;
+ }
if (c->modh)
strlcpy(hname, c->name, HSIZE);
if ((*c->handler) (margc, margv, 0)) {
&& strlen(c->name) > z)
z = strlen(c->name);
for (c = cmdtab; c->name; c++) {
- if (c->help && ((c->needpriv && priv) ||
- !c->needpriv))
+ if (c->help &&
+ ((c->needpriv && priv) || !c->needpriv) &&
+ ((c->needconfig && config_mode) || !c->needconfig))
printf(" %-*s %s\n", z, c->name, c->help);
}
return 0;
{
priv = 0;
return 0;
-}
-
-int
-notvalid(void)
-{
- printf("%% The command you entered is not necessary with this"
- " software.\n");
-
- return(0);
}
/*
}
int
+doconfig(int argc, char **argv)
+{
+ if (argc > 1) {
+ if (NO_ARG(argv[0])) {
+ config_mode = 0;
+ } else if (isprefix(argv[1], "terminal")) {
+ config_mode = 1;
+ } else {
+ printf ("%% Invalid argument\n");
+ return 1;
+ }
+ } else {
+ config_mode = 1;
+ }
+
+ return 0;
+}
+
+int
flush_history(void)
{
if (!editing) {
snprintf(tmp, sizeof(tmp), "%d", cli_rtable);
gethostname(hbuf, sizeof(hbuf));
- pr = priv | cli_rtable;
- snprintf(prompt, sizeof(prompt), "%s%s%s%s%s%s%s/", hbuf, pr ? "(" : "",
- priv ? "p" : "", priv && cli_rtable ? "-" : "",
+ pr = priv | cli_rtable | config_mode;
+ snprintf(prompt, sizeof(prompt), "%s%s%s%s%s%s%s%s%s/", hbuf,
+ pr ? "(" : "",
+ config_mode ? "config" : "",
+ config_mode && priv ? "-" : "",
+ priv ? "p" : "",
+ (( priv && cli_rtable) || (config_mode && cli_rtable)) ? "-" : "",
cli_rtable ? "rtable " : "", cli_rtable ? tmp : "",
pr ?")" : "");
blob - fc8626fcc61c9c24599265d53954d9ef7b542bb2
blob + e74c977b346ceb6486c725a1592835190bda6ba7
--- externs.h
+++ externs.h
extern char *margv[]; /* makeargv() args */
extern int verbose; /* is verbose mode on? */
extern int editing; /* is command line editing mode on? */
+extern int config_mode; /* are we in comfig mode? */
extern int bridge; /* are we in bridge mode (or interface mode?) */
extern int priv; /* privileged mode or not? */
extern pid_t pid; /* process id of nsh */
int stlen; /* struct length (for rows in next table) */
int (*handler) (); /* routine which executes command */
int needpriv; /* Do we need privilege to execute? */
+ int needconfig; /* Do we need config mode to execute? */
int nocmd; /* Can we specify 'no ...command...'? */
int modh; /* Is it a mode handler for cmdrc()? */
} Command;
blob - accb594a68e8d85a5dc026572eee1cf858f25f4c
blob + b9d30aa3a09e4fddb97cabb286263cb72e2088f7
--- main.c
+++ main.c
int bridge = 0; /* bridge mode for interface() */
int verbose = 0; /* verbose mode */
int priv = 0, cli_rtable = 0;
-int editing = 1;
+int editing = 1, config_mode = 0;;
pid_t pid;
History *histi = NULL;