!702 fix: shell支持exit退出,完善帮助信息,特殊处理不可见字符
Merge pull request !702 from huangshan/chore
This commit is contained in:
commit
e317f9b5b5
|
@ -47,6 +47,9 @@ extern "C" {
|
||||||
#define SHELL_EXEC_COMMAND_BYTES 4
|
#define SHELL_EXEC_COMMAND_BYTES 4
|
||||||
#define CMD_EXEC_COMMAND SHELL_EXEC_COMMAND" "
|
#define CMD_EXEC_COMMAND SHELL_EXEC_COMMAND" "
|
||||||
#define CMD_EXEC_COMMAND_BYTES (SHELL_EXEC_COMMAND_BYTES+1)
|
#define CMD_EXEC_COMMAND_BYTES (SHELL_EXEC_COMMAND_BYTES+1)
|
||||||
|
#define CMD_EXIT_COMMAND "exit"
|
||||||
|
#define CMD_EXIT_COMMAND_BYTES 4
|
||||||
|
#define CMD_EXIT_CODE_BASE_DEC 10
|
||||||
|
|
||||||
#define CONSOLE_IOC_MAGIC 'c'
|
#define CONSOLE_IOC_MAGIC 'c'
|
||||||
#define CONSOLE_CONTROL_REG_USERTASK _IO(CONSOLE_IOC_MAGIC, 7)
|
#define CONSOLE_CONTROL_REG_USERTASK _IO(CONSOLE_IOC_MAGIC, 7)
|
||||||
|
|
|
@ -44,7 +44,10 @@
|
||||||
#include "shell_pri.h"
|
#include "shell_pri.h"
|
||||||
#include "shcmd.h"
|
#include "shcmd.h"
|
||||||
|
|
||||||
|
#define CHAR_CTRL_C '\x03'
|
||||||
|
#define CHAR_CTRL_DEL '\x7F'
|
||||||
|
|
||||||
|
#define VISIABLE_CHAR(ch) ((ch) > 0x1F && (ch) < 0x7F)
|
||||||
|
|
||||||
char *GetCmdline(ShellCB *shellCB)
|
char *GetCmdline(ShellCB *shellCB)
|
||||||
{
|
{
|
||||||
|
@ -202,7 +205,21 @@ void ParseEnterKey(OutputFunc outputFunc, ShellCB *shellCB)
|
||||||
shellCB->shellBuf[shellCB->shellBufOffset] = '\0';
|
shellCB->shellBuf[shellCB->shellBufOffset] = '\0';
|
||||||
}
|
}
|
||||||
NOTIFY:
|
NOTIFY:
|
||||||
outputFunc("\n");
|
shellCB->shellBufOffset = 0;
|
||||||
|
ShellTaskNotify(shellCB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParseCancelKey(OutputFunc outputFunc, ShellCB *shellCB)
|
||||||
|
{
|
||||||
|
if ((shellCB == NULL) || (outputFunc == NULL)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shellCB->shellBufOffset <= (SHOW_MAX_LEN - 1)) {
|
||||||
|
shellCB->shellBuf[0] = CHAR_CTRL_C;
|
||||||
|
shellCB->shellBuf[1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
shellCB->shellBufOffset = 0;
|
shellCB->shellBufOffset = 0;
|
||||||
ShellTaskNotify(shellCB);
|
ShellTaskNotify(shellCB);
|
||||||
}
|
}
|
||||||
|
@ -238,7 +255,7 @@ void ParseTabKey(OutputFunc outputFunc, ShellCB *shellCB)
|
||||||
|
|
||||||
void ParseNormalChar(char ch, OutputFunc outputFunc, ShellCB *shellCB)
|
void ParseNormalChar(char ch, OutputFunc outputFunc, ShellCB *shellCB)
|
||||||
{
|
{
|
||||||
if ((shellCB == NULL) || (outputFunc == NULL)) {
|
if ((shellCB == NULL) || (outputFunc == NULL) || !VISIABLE_CHAR(ch)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +273,7 @@ void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB)
|
||||||
const char ch = c;
|
const char ch = c;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if ((shellCB->shellBufOffset == 0) && (ch != '\n') && (ch != '\0')) {
|
if ((shellCB->shellBufOffset == 0) && (ch != '\n') && (ch != CHAR_CTRL_C) && (ch != '\0')) {
|
||||||
(void)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);
|
(void)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,8 +282,11 @@ void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB)
|
||||||
case '\n': /* enter */
|
case '\n': /* enter */
|
||||||
ParseEnterKey(outputFunc, shellCB);
|
ParseEnterKey(outputFunc, shellCB);
|
||||||
break;
|
break;
|
||||||
|
case CHAR_CTRL_C: /* ctrl + c */
|
||||||
|
ParseCancelKey(outputFunc, shellCB);
|
||||||
|
break;
|
||||||
case '\b': /* backspace */
|
case '\b': /* backspace */
|
||||||
case 0x7F: /* delete(0x7F) */
|
case CHAR_CTRL_DEL: /* delete(0x7F) */
|
||||||
ParseDeleteKey(outputFunc, shellCB);
|
ParseDeleteKey(outputFunc, shellCB);
|
||||||
break;
|
break;
|
||||||
case '\t': /* tab */
|
case '\t': /* tab */
|
||||||
|
@ -358,6 +378,30 @@ void ChildExec(const char *cmdName, char *const paramArray[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CheckExit(const char *cmdName, const CmdParsed *cmdParsed)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (strlen(cmdName) != CMD_EXIT_COMMAND_BYTES || strncmp(cmdName, CMD_EXIT_COMMAND, CMD_EXIT_COMMAND_BYTES) != 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmdParsed->paramCnt > 1) {
|
||||||
|
printf("exit: too many arguments\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (cmdParsed->paramCnt == 1) {
|
||||||
|
char *p;
|
||||||
|
ret = strtol(cmdParsed->paramArray[0], &p, CMD_EXIT_CODE_BASE_DEC);
|
||||||
|
if (*p != '\0') {
|
||||||
|
printf("exit: bad number: %s\n", cmdParsed->paramArray[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
static void DoCmdExec(const char *cmdName, const char *cmdline, unsigned int len, const CmdParsed *cmdParsed)
|
static void DoCmdExec(const char *cmdName, const char *cmdline, unsigned int len, const CmdParsed *cmdParsed)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -378,6 +422,9 @@ static void DoCmdExec(const char *cmdName, const char *cmdline, unsigned int len
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (CheckExit(cmdName, cmdParsed) < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
(void)syscall(__NR_shellexec, cmdName, cmdline);
|
(void)syscall(__NR_shellexec, cmdName, cmdline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -535,7 +582,11 @@ static void ShellCmdProcess(ShellCB *shellCB)
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (buf[0] == CHAR_CTRL_C) {
|
||||||
|
printf("^C");
|
||||||
|
buf[0] = '\n';
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
ExecCmdline(buf);
|
ExecCmdline(buf);
|
||||||
ShellSaveHistoryCmd(buf, shellCB);
|
ShellSaveHistoryCmd(buf, shellCB);
|
||||||
shellCB->cmdMaskKeyLink = shellCB->cmdHistoryKeyLink;
|
shellCB->cmdMaskKeyLink = shellCB->cmdHistoryKeyLink;
|
||||||
|
|
|
@ -67,6 +67,9 @@ STATIC SPIN_LOCK_INIT(g_consoleSpin);
|
||||||
#define CONSOLE_SEND_TASK_EXIT 0x04U
|
#define CONSOLE_SEND_TASK_EXIT 0x04U
|
||||||
#define CONSOLE_SEND_TASK_RUNNING 0x10U
|
#define CONSOLE_SEND_TASK_RUNNING 0x10U
|
||||||
|
|
||||||
|
#define SHELL_ENTRY_NAME "ShellEntry"
|
||||||
|
#define SHELL_ENTRY_NAME_LEN 10
|
||||||
|
|
||||||
CONSOLE_CB *g_console[CONSOLE_NUM];
|
CONSOLE_CB *g_console[CONSOLE_NUM];
|
||||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
|
||||||
|
@ -1440,15 +1443,31 @@ BOOL ConsoleEnable(VOID)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL IsShellEntryRunning(UINT32 shellEntryId)
|
||||||
|
{
|
||||||
|
LosTaskCB *taskCB;
|
||||||
|
if (shellEntryId == SHELL_ENTRYID_INVALID) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
taskCB = OsGetTaskCB(shellEntryId);
|
||||||
|
return !OsTaskIsUnused(taskCB) &&
|
||||||
|
(strlen(taskCB->taskName) == SHELL_ENTRY_NAME_LEN &&
|
||||||
|
strncmp(taskCB->taskName, SHELL_ENTRY_NAME, SHELL_ENTRY_NAME_LEN) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
INT32 ConsoleTaskReg(INT32 consoleID, UINT32 taskID)
|
INT32 ConsoleTaskReg(INT32 consoleID, UINT32 taskID)
|
||||||
{
|
{
|
||||||
if (g_console[consoleID - 1]->shellEntryId == SHELL_ENTRYID_INVALID) {
|
UINT32 intSave;
|
||||||
|
|
||||||
|
LOS_SpinLockSave(&g_consoleSpin, &intSave);
|
||||||
|
if (!IsShellEntryRunning(g_console[consoleID - 1]->shellEntryId)) {
|
||||||
g_console[consoleID - 1]->shellEntryId = taskID;
|
g_console[consoleID - 1]->shellEntryId = taskID;
|
||||||
|
LOS_SpinUnlockRestore(&g_consoleSpin, intSave);
|
||||||
(VOID)OsSetCurrProcessGroupID(OsGetUserInitProcessID());
|
(VOID)OsSetCurrProcessGroupID(OsGetUserInitProcessID());
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
LOS_SpinUnlockRestore(&g_consoleSpin, intSave);
|
||||||
return LOS_NOK;
|
return g_console[consoleID - 1]->shellEntryId == taskID ? LOS_OK : LOS_NOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL SetSerialNonBlock(const CONSOLE_CB *consoleCB)
|
BOOL SetSerialNonBlock(const CONSOLE_CB *consoleCB)
|
||||||
|
|
|
@ -1568,7 +1568,7 @@ static void lwip_ping_usage(void)
|
||||||
"\n ping [-n cnt] [-w interval] [-l data_len] destination"
|
"\n ping [-n cnt] [-w interval] [-l data_len] destination"
|
||||||
"\n ping [-t] [-w interval] destination"
|
"\n ping [-t] [-w interval] destination"
|
||||||
"\n ping -k");
|
"\n ping -k");
|
||||||
PRINTK("\n -t means ping forever, user can use -k to stop the forever ping");
|
PRINTK("\n -t means ping forever, user can use -k to stop the forever ping\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
LWIP_STATIC int osPingFunc(u32_t destip, u32_t cnt, u32_t interval, u32_t data_len)
|
LWIP_STATIC int osPingFunc(u32_t destip, u32_t cnt, u32_t interval, u32_t data_len)
|
||||||
|
|
|
@ -31,6 +31,10 @@
|
||||||
|
|
||||||
#include "shcmd.h"
|
#include "shcmd.h"
|
||||||
|
|
||||||
|
#define DEFAULT_SCREEN_WIDTH 80
|
||||||
|
#define MAX_CMD_KEY_WIDTH 12
|
||||||
|
#define CMD_ITEM_PER_LINE (DEFAULT_SCREEN_WIDTH / (MAX_CMD_KEY_WIDTH + 1))
|
||||||
|
|
||||||
UINT32 OsShellCmdHelp(UINT32 argc, const CHAR **argv)
|
UINT32 OsShellCmdHelp(UINT32 argc, const CHAR **argv)
|
||||||
{
|
{
|
||||||
UINT32 loop = 0;
|
UINT32 loop = 0;
|
||||||
|
@ -45,15 +49,16 @@ UINT32 OsShellCmdHelp(UINT32 argc, const CHAR **argv)
|
||||||
|
|
||||||
PRINTK("*******************shell commands:*************************\n");
|
PRINTK("*******************shell commands:*************************\n");
|
||||||
LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(cmdInfo->cmdList.list), CmdItemNode, list) {
|
LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(cmdInfo->cmdList.list), CmdItemNode, list) {
|
||||||
if ((loop & (8 - 1)) == 0) { /* 8 - 1:just align print */
|
if ((loop % CMD_ITEM_PER_LINE) == 0) { /* just align print */
|
||||||
PRINTK("\n");
|
PRINTK("\n");
|
||||||
}
|
}
|
||||||
PRINTK("%-12s ", curCmdItem->cmd->cmdKey);
|
PRINTK("%-12s ", curCmdItem->cmd->cmdKey);
|
||||||
|
|
||||||
loop++;
|
loop++;
|
||||||
}
|
}
|
||||||
|
PRINTK("\n\nAfter shell prompt \"OHOS # \":\n"
|
||||||
PRINTK("\n");
|
"Use `<cmd> [args ...]` to run built-in shell commands listed above.\n"
|
||||||
|
"Use `exec <cmd> [args ...]` or `./<cmd> [args ...]` to run external commands.\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue