未验证 提交 0946b5e8 编写于 作者: H haojun Liao 提交者: GitHub

Merge pull request #5304 from taosdata/hotfix/TD-3122

[TD-3122]taos dead loop while shell quits
...@@ -64,7 +64,7 @@ extern TAOS* shellInit(SShellArguments* args); ...@@ -64,7 +64,7 @@ extern TAOS* shellInit(SShellArguments* args);
extern void* shellLoopQuery(void* arg); extern void* shellLoopQuery(void* arg);
extern void taos_error(TAOS_RES* tres, int64_t st); extern void taos_error(TAOS_RES* tres, int64_t st);
extern int regex_match(const char* s, const char* reg, int cflags); extern int regex_match(const char* s, const char* reg, int cflags);
void shellReadCommand(TAOS* con, char command[]); int32_t shellReadCommand(TAOS* con, char command[]);
int32_t shellRunCommand(TAOS* con, char* command); int32_t shellRunCommand(TAOS* con, char* command);
void shellRunCommandOnServer(TAOS* con, char command[]); void shellRunCommandOnServer(TAOS* con, char command[]);
void read_history(); void read_history();
......
...@@ -180,7 +180,7 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) { ...@@ -180,7 +180,7 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) {
} }
} }
void shellReadCommand(TAOS *con, char *command) { int32_t shellReadCommand(TAOS *con, char *command) {
unsigned hist_counter = history.hend; unsigned hist_counter = history.hend;
char utf8_array[10] = "\0"; char utf8_array[10] = "\0";
Command cmd; Command cmd;
...@@ -233,7 +233,7 @@ void shellReadCommand(TAOS *con, char *command) { ...@@ -233,7 +233,7 @@ void shellReadCommand(TAOS *con, char *command) {
sprintf(command, "%s%s", cmd.buffer, cmd.command); sprintf(command, "%s%s", cmd.buffer, cmd.command);
tfree(cmd.buffer); tfree(cmd.buffer);
tfree(cmd.command); tfree(cmd.command);
return; return 0;
} else { } else {
updateBuffer(&cmd); updateBuffer(&cmd);
} }
...@@ -324,6 +324,8 @@ void shellReadCommand(TAOS *con, char *command) { ...@@ -324,6 +324,8 @@ void shellReadCommand(TAOS *con, char *command) {
insertChar(&cmd, &c, 1); insertChar(&cmd, &c, 1);
} }
} }
return 0;
} }
void *shellLoopQuery(void *arg) { void *shellLoopQuery(void *arg) {
...@@ -342,11 +344,16 @@ void *shellLoopQuery(void *arg) { ...@@ -342,11 +344,16 @@ void *shellLoopQuery(void *arg) {
return NULL; return NULL;
} }
int32_t err = 0;
do { do {
// Read command from shell. // Read command from shell.
memset(command, 0, MAX_COMMAND_SIZE); memset(command, 0, MAX_COMMAND_SIZE);
set_terminal_mode(); set_terminal_mode();
shellReadCommand(con, command); err = shellReadCommand(con, command);
if (err) {
break;
}
reset_terminal_mode(); reset_terminal_mode();
} while (shellRunCommand(con, command) == 0); } while (shellRunCommand(con, command) == 0);
......
...@@ -172,7 +172,7 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) { ...@@ -172,7 +172,7 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) {
} }
} }
void shellReadCommand(TAOS *con, char *command) { int32_t shellReadCommand(TAOS *con, char *command) {
unsigned hist_counter = history.hend; unsigned hist_counter = history.hend;
char utf8_array[10] = "\0"; char utf8_array[10] = "\0";
Command cmd; Command cmd;
...@@ -186,6 +186,10 @@ void shellReadCommand(TAOS *con, char *command) { ...@@ -186,6 +186,10 @@ void shellReadCommand(TAOS *con, char *command) {
while (1) { while (1) {
c = (char)getchar(); // getchar() return an 'int' value c = (char)getchar(); // getchar() return an 'int' value
if (c == EOF) {
return c;
}
if (c < 0) { // For UTF-8 if (c < 0) { // For UTF-8
int count = countPrefixOnes(c); int count = countPrefixOnes(c);
utf8_array[0] = c; utf8_array[0] = c;
...@@ -225,7 +229,7 @@ void shellReadCommand(TAOS *con, char *command) { ...@@ -225,7 +229,7 @@ void shellReadCommand(TAOS *con, char *command) {
sprintf(command, "%s%s", cmd.buffer, cmd.command); sprintf(command, "%s%s", cmd.buffer, cmd.command);
tfree(cmd.buffer); tfree(cmd.buffer);
tfree(cmd.command); tfree(cmd.command);
return; return 0;
} else { } else {
updateBuffer(&cmd); updateBuffer(&cmd);
} }
...@@ -316,6 +320,8 @@ void shellReadCommand(TAOS *con, char *command) { ...@@ -316,6 +320,8 @@ void shellReadCommand(TAOS *con, char *command) {
insertChar(&cmd, &c, 1); insertChar(&cmd, &c, 1);
} }
} }
return 0;
} }
void *shellLoopQuery(void *arg) { void *shellLoopQuery(void *arg) {
...@@ -333,12 +339,17 @@ void *shellLoopQuery(void *arg) { ...@@ -333,12 +339,17 @@ void *shellLoopQuery(void *arg) {
uError("failed to malloc command"); uError("failed to malloc command");
return NULL; return NULL;
} }
int32_t err = 0;
do { do {
// Read command from shell. // Read command from shell.
memset(command, 0, MAX_COMMAND_SIZE); memset(command, 0, MAX_COMMAND_SIZE);
set_terminal_mode(); set_terminal_mode();
shellReadCommand(con, command); err = shellReadCommand(con, command);
if (err) {
break;
}
reset_terminal_mode(); reset_terminal_mode();
} while (shellRunCommand(con, command) == 0); } while (shellRunCommand(con, command) == 0);
......
...@@ -221,7 +221,7 @@ void insertChar(Command *cmd, char c) { ...@@ -221,7 +221,7 @@ void insertChar(Command *cmd, char c) {
cmd->command[cmd->cursorOffset++] = c; cmd->command[cmd->cursorOffset++] = c;
} }
void shellReadCommand(TAOS *con, char command[]) { int32_t shellReadCommand(TAOS *con, char command[]) {
Command cmd; Command cmd;
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));
cmd.buffer = (char *)calloc(1, MAX_COMMAND_SIZE); cmd.buffer = (char *)calloc(1, MAX_COMMAND_SIZE);
...@@ -241,7 +241,7 @@ void shellReadCommand(TAOS *con, char command[]) { ...@@ -241,7 +241,7 @@ void shellReadCommand(TAOS *con, char command[]) {
cmd.buffer = NULL; cmd.buffer = NULL;
free(cmd.command); free(cmd.command);
cmd.command = NULL; cmd.command = NULL;
return; return 0;
} else { } else {
shellPrintContinuePrompt(); shellPrintContinuePrompt();
updateBuffer(&cmd); updateBuffer(&cmd);
...@@ -251,6 +251,8 @@ void shellReadCommand(TAOS *con, char command[]) { ...@@ -251,6 +251,8 @@ void shellReadCommand(TAOS *con, char command[]) {
insertChar(&cmd, c); insertChar(&cmd, c);
} }
} }
return 0;
} }
void *shellLoopQuery(void *arg) { void *shellLoopQuery(void *arg) {
...@@ -258,12 +260,17 @@ void *shellLoopQuery(void *arg) { ...@@ -258,12 +260,17 @@ void *shellLoopQuery(void *arg) {
char *command = malloc(MAX_COMMAND_SIZE); char *command = malloc(MAX_COMMAND_SIZE);
if (command == NULL) return NULL; if (command == NULL) return NULL;
int32_t err = 0;
do { do {
memset(command, 0, MAX_COMMAND_SIZE); memset(command, 0, MAX_COMMAND_SIZE);
shellPrintPrompt(); shellPrintPrompt();
// Read command from shell. // Read command from shell.
shellReadCommand(con, command); err = shellReadCommand(con, command);
if (err) {
break;
}
} while (shellRunCommand(con, command) == 0); } while (shellRunCommand(con, command) == 0);
return NULL; return NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册