未验证 提交 246bdd11 编写于 作者: O openharmony_ci 提交者: Gitee

!760 fix: shell支持exit退出,完善帮助信息,特殊处理不可见字符

Merge pull request !760 from huangshan/cherry-pick-1640932477
...@@ -47,6 +47,9 @@ extern "C" { ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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[]) ...@@ -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 ...@@ -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) ...@@ -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;
......
...@@ -1568,7 +1568,7 @@ static void lwip_ping_usage(void) ...@@ -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)
......
...@@ -67,6 +67,9 @@ STATIC SPIN_LOCK_INIT(g_consoleSpin); ...@@ -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))
...@@ -1442,15 +1445,31 @@ BOOL ConsoleEnable(VOID) ...@@ -1442,15 +1445,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)
......
...@@ -31,6 +31,10 @@ ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册