/**************************************************************************
*
* Copyright (c) 2013 Alcatel-Lucent
*
* Alcatel Lucent licenses this file to You under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. A copy of the License is contained the
* file LICENSE at the top level of this repository.
* You may also obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**************************************************************************
*
* cmdtbl.c:
* This is the command table used by the monitor.
*
* Original author: Ed Sutter (ed.sutter@alcatel-lucent.com)
*
*/
#include "config.h"
#include "tfs.h"
#include "tfsprivate.h"
#include "cli.h"
#include "genlib.h"
#include "xcmddcl.h"
#define ULVLCMD "ulvl"
#if INCLUDE_MEMCMDS
#define INCLUDE_PM 1
#define INCLUDE_DM 1
#define INCLUDE_FM 1
#define INCLUDE_CM 1
#define INCLUDE_SM 1
#define INCLUDE_MT 1
#endif
extern int Arp(int, char **);
extern int BbcCmd(int, char **);
extern int BinfoCmd(int, char **);
extern int BmemCmd(int, char **);
extern int Call(int, char **);
extern int Cast(int, char **);
extern int Cm(int, char **);
extern int CfCmd(int, char **);
extern int Dis(int, char **);
extern int Dm(int, char **);
extern int Dhcp(int, char **);
extern int DnsCmd(int, char **);
extern int Echo(int, char **);
extern int Edit(int, char **);
extern int Ether(int, char **);
extern int Exit(int, char **);
extern int FatfsCmd(int, char **);
extern int FbiCmd(int, char **);
extern int FlashCmd(int, char **);
extern int Fm(int, char **);
extern int Gdb(int, char **);
extern int Goto(int, char **);
extern int Gosub(int, char **);
extern int Heap(int, char **);
extern int Help(int, char **);
extern int History(int, char **);
extern int Icmp(int, char **);
extern int Ide(int, char **);
extern int I2cCmd(int, char **);
extern int If(int, char **);
extern int Igmp(int, char **);
extern int Item(int, char **);
extern int Jffs2Cmd(int, char **);
extern int Mt(int, char **);
extern int MtraceCmd(int, char **);
extern int Pm(int, char **);
extern int Prof(int, char **);
extern int Read(int, char **);
extern int Reg(int, char **);
extern int Reset(int, char **);
extern int Return(int, char **);
extern int SdCmd(int, char **);
extern int Set(int, char **);
extern int Sleep(int, char **);
extern int Sm(int, char **);
extern int SpifCmd(int, char **);
extern int Strace(int, char **);
extern int StructCmd(int, char **);
extern int SyslogCmd(int, char **);
extern int Tfs(int, char **);
extern int Tftp(int, char **);
extern int TsiCmd(int, char **);
extern int Ulvl(int, char **);
extern int Unzip(int, char **);
extern int Version(int, char **);
extern int WhatCmd(int, char **);
extern int Xmodem(int, char **);
extern char *ArpHelp[];
extern char *BbcHelp[];
extern char *BinfoHelp[];
extern char *BmemHelp[];
extern char *CallHelp[];
extern char *CastHelp[];
extern char *CfHelp[];
extern char *CmHelp[];
extern char *DisHelp[];
extern char *DhcpHelp[];
extern char *DmHelp[];
extern char *DnsHelp[];
extern char *EchoHelp[];
extern char *EditHelp[];
extern char *EtherHelp[];
extern char *ExitHelp[];
extern char *FatfsHelp[];
extern char *FbiHelp[];
extern char *FlashHelp[];
extern char *FmHelp[];
extern char *GdbHelp[];
extern char *GosubHelp[];
extern char *GotoHelp[];
extern char *HelpHelp[];
extern char *HeapHelp[];
extern char *HistoryHelp[];
extern char *IcmpHelp[];
extern char *IdeHelp[];
extern char *I2cHelp[];
extern char *IfHelp[];
extern char *IgmpHelp[];
extern char *ItemHelp[];
extern char *Jffs2Help[];
extern char *MtHelp[];
extern char *MtraceHelp[];
extern char *PmHelp[];
extern char *ProfHelp[];
extern char *ReadHelp[];
extern char *RegHelp[];
extern char *ResetHelp[];
extern char *ReturnHelp[];
extern char *SdHelp[];
extern char *SetHelp[];
extern char *SleepHelp[];
extern char *SmHelp[];
extern char *SpifHelp[];
extern char *StraceHelp[];
extern char *StructHelp[];
extern char *SyslogHelp[];
extern char *TfsHelp[];
extern char *TftpHelp[];
extern char *TsiHelp[];
extern char *UlvlHelp[];
extern char *UnzipHelp[];
extern char *VersionHelp[];
extern char *WhatHelp[];
extern char *XmodemHelp[];
struct monCommand cmdlist[] = {
#if INCLUDE_ETHERNET
{ "arp", Arp, ArpHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_BBC
{ "bbc", BbcCmd, BbcHelp, 0 },
#endif
#if INCLUDE_BMEM
{ "bmem", BmemCmd, BmemHelp, 0 },
#endif
#if INCLUDE_BOARDINFO
{ "brdinfo", BinfoCmd, BinfoHelp, 0 },
#endif
{ "call", Call, CallHelp, CMDFLAG_NOMONRC },
#if INCLUDE_CAST
{ "cast", Cast, CastHelp, 0 },
#endif
#if INCLUDE_CF
{ "cf", CfCmd, CfHelp, 0 },
#endif
#if INCLUDE_CM
{ "cm", Cm, CmHelp, 0 },
#endif
#if INCLUDE_DHCPBOOT
{ "dhcp", Dhcp, DhcpHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_DISASSEMBLER
{ "dis", Dis, DisHelp, 0 },
#endif
#if INCLUDE_DM
{ "dm", Dm, DmHelp, 0 },
#endif
#if INCLUDE_DNS
{ "dns", DnsCmd, DnsHelp, 0 },
#endif
#if INCLUDE_TFSSCRIPT
{ "echo", Echo, EchoHelp, 0 },
#endif
#if INCLUDE_EDIT
{ "edit", Edit, EditHelp, 0 },
#endif
#if INCLUDE_ETHERNET
{ "ether", Ether, EtherHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_TFSSCRIPT
{ "exit", Exit, ExitHelp, 0 },
#endif
#if INCLUDE_FATFS
{ "fatfs", FatfsCmd, FatfsHelp, 0 },
#endif
#if INCLUDE_FBI
{ "fbi", FbiCmd, FbiHelp, 0 },
#endif
#if INCLUDE_FLASH
{ "flash", FlashCmd, FlashHelp, 0 },
#endif
#if INCLUDE_FM
{ "fm", Fm, FmHelp, 0 },
#endif
#if INCLUDE_GDB
{ "gdb", Gdb, GdbHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_TFSSCRIPT
{ "gosub", Gosub, GosubHelp, 0 },
{ "goto", Goto, GotoHelp, 0 },
#endif
#if INCLUDE_MALLOC
{ "heap", Heap, HeapHelp, 0 },
#endif
{ "help", Help, HelpHelp, 0 },
{ "?", Help, HelpHelp, 0 },
#if INCLUDE_LINEEDIT
{ "history", History, HistoryHelp, 0 },
#endif
#if INCLUDE_I2C
{ "i2c", I2cCmd, I2cHelp, 0 },
#endif
#if INCLUDE_ICMP
{ "icmp", Icmp, IcmpHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_IDE
{ "ide", Ide, IdeHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_IGMP
{ "igmp", Igmp, IgmpHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_TFSSCRIPT
{ "if", If, IfHelp, 0 },
#endif
#if INCLUDE_TFSSCRIPT
{ "item", Item, ItemHelp, 0 },
#endif
#if INCLUDE_JFFS2
{ "jffs2", Jffs2Cmd, Jffs2Help, 0 },
#endif
#if INCLUDE_MT
{ "mt", Mt, MtHelp, 0 },
#endif
#if INCLUDE_MEMTRACE
{ "mtrace", MtraceCmd, MtraceHelp, 0 },
#endif
#if INCLUDE_PM
{ "pm", Pm, PmHelp, 0 },
#endif
#if INCLUDE_PROFILER
{ "prof", Prof, ProfHelp, 0 },
#endif
#if INCLUDE_TFSSCRIPT
{ "read", Read, ReadHelp, 0 },
#endif
#if INCLUDE_STRACE
{ "reg", Reg, RegHelp, 0 },
#endif
{ "reset", Reset, ResetHelp, 0 },
#if INCLUDE_TFSSCRIPT
{ "return", Return, ReturnHelp, 0 },
#endif
#if INCLUDE_SD
{ "sd", SdCmd, SdHelp, 0 },
#endif
{ "set", Set, SetHelp, 0 },
#if INCLUDE_TFSSCRIPT
{ "sleep", Sleep, SleepHelp, 0 },
#endif
#if INCLUDE_SM
{ "sm", Sm, SmHelp, 0 },
#endif
#if INCLUDE_SPIF
{ "spif", SpifCmd, SpifHelp, 0 },
#endif
#if INCLUDE_STRACE
{ "strace", Strace, StraceHelp, 0 },
#endif
#if INCLUDE_STRUCT
{ "struct", StructCmd, StructHelp, 0 },
#endif
#if INCLUDE_SYSLOG
{ "syslog", SyslogCmd, SyslogHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_USRLVL
{ ULVLCMD, Ulvl, UlvlHelp, 0 },
#endif
#if INCLUDE_TFTP
{ "tftp", Tftp, TftpHelp, CMDFLAG_NOMONRC },
#endif
#if INCLUDE_TFSCLI
{ "tfs", Tfs, TfsHelp, 0 },
#endif
#if INCLUDE_TSI
{ "tsi", TsiCmd, TsiHelp, 0 },
#endif
#if INCLUDE_UNZIP
{ "unzip", Unzip, UnzipHelp, 0 },
#endif
#if INCLUDE_XMODEM
{ "xmodem", Xmodem, XmodemHelp, 0 },
#endif
{ "version", Version, VersionHelp, 0 },
#if INCLUDE_TFS
{ "what", WhatCmd, WhatHelp, 0 },
#endif
#include "xcmdtbl.h" /* For non-generic commands that are */
/* specific to a particular target. */
{ 0,0,0,0 },
};
#if INCLUDE_USRLVL
/* cmdUlvl[]:
* This table stores one char per command that contains that command's
* user level. The default user level of all commands is 0, but can
* be re-defined by the ulvl -c command.
*/
char cmdUlvl[(sizeof(cmdlist)/sizeof(struct monCommand))];
/* setCmdUlvl():
* The incoming string is a command name followed by a comma and a user
* level (ranging from 0 thru 4).
* Return 0 if pass, 1 if new level was user-level rejected, -1 if error.
*/
int
setCmdUlvl(char *cmdlvl, int verbose)
{
extern char *appcmdUlvl;
extern struct monCommand *appCmdlist;
struct monCommand *cptr;
int newlevel, idx, pass, doall;
char *comma, *lvlptr, buffer[32], *cmdandlevel;
/* Make a copy of the incoming string so that we can
* modify it...
*/
if(strlen(cmdlvl) > (sizeof(buffer)-1)) {
goto showerr;
}
strcpy(buffer,cmdlvl);
cmdandlevel = buffer;
/* First verify that the comma is in the string... */
comma = strchr(cmdandlevel,',');
if(!comma) {
goto showerr;
}
/* Retrieve and verify the new level to be assigned...
* If the level value is the string "off", then we assign a level
* value that is greater than MAXUSRLEVEL so that the command is
* essentially disabled as a built-in.
*/
if(strcmp(comma+1,"off") == 0) {
newlevel = MAXUSRLEVEL+1;
} else {
newlevel = atoi(comma+1);
if((newlevel < MINUSRLEVEL) || (newlevel > MAXUSRLEVEL)) {
goto showerr;
}
}
*comma = 0;
/* Don't allow adjustment of the ulvl command itself. It must be
* able to run as user level 0 all the time...
*/
if(!strcmp(cmdandlevel,ULVLCMD)) {
printf("Can't adjust '%s' user level.\n",ULVLCMD);
return(-1);
}
if(appCmdlist) {
pass = 0;
cptr = appCmdlist;
lvlptr = appcmdUlvl;
} else {
pass = 1;
cptr = cmdlist;
lvlptr = cmdUlvl;
}
/* If the command string is "ALL" then we set all commands
* to the requested level.
*/
if(!strcmp(cmdandlevel,"ALL")) {
doall = 1;
} else {
doall = 0;
}
while(pass < 2) {
if((cptr == cmdlist) && (cmdandlevel[0] == '_')) {
cmdandlevel++;
}
/* Find the command in the table that is to be adjusted... */
for(idx=0; cptr->name; cptr++,idx++) {
if(doall || (!strcmp(cmdandlevel,cptr->name))) {
/* Even with doall set, we don't want to touch
* the ULVLCMD level...
*/
if(doall && !strcmp(cptr->name,ULVLCMD)) {
continue;
}
/* If the command's user level is to be lowered, then the
* current monitor userlevel must be at least as high as the
* command's current user level...
*/
if((newlevel < lvlptr[idx]) && (getUsrLvl() < lvlptr[idx])) {
if(verbose) {
printf("User-level access denied: %s\n",cmdandlevel);
}
return(1);
}
lvlptr[idx] = newlevel;
if(!doall) {
return(0);
}
}
}
cptr = cmdlist;
lvlptr = cmdUlvl;
pass++;
}
if(doall) {
return(0);
}
showerr:
if(verbose) {
printf("Input error: %s\n",cmdlvl);
}
return(-1);
}
#endif