From b721c7483cde5ecdb5c8069747af727e7de4adc7 Mon Sep 17 00:00:00 2001 From: "K. Lange" Date: Thu, 25 Oct 2018 23:22:38 +0900 Subject: [PATCH] debug_sh: use current process fd 0, 1 for shell, don't implement bad readline --- modules/debug_sh.c | 58 +++++++++++----------------------------------- 1 file changed, 14 insertions(+), 44 deletions(-) diff --git a/modules/debug_sh.c b/modules/debug_sh.c index 49e8641a..c6b5568e 100644 --- a/modules/debug_sh.c +++ b/modules/debug_sh.c @@ -58,49 +58,13 @@ void tty_set_vintr(fs_node_t * dev, char vintr) { * TODO history is also nice */ int debug_shell_readline(fs_node_t * dev, char * linebuf, int max) { - int read = 0; - tty_set_unbuffered(dev); - while (read < max) { - uint8_t buf[1]; - int r = read_fs(dev, 0, 1, (unsigned char *)buf); - if (!r) { - debug_print(WARNING, "Read nothing?"); - continue; - } - linebuf[read] = buf[0]; - if (buf[0] == '\n') { - fprintf(dev, "\n"); - linebuf[read] = 0; - break; - } else if (buf[0] == 0x08) { - if (read > 0) { - fprintf(dev, "\010 \010"); - read--; - linebuf[read] = 0; - } - } else if (buf[0] < ' ') { - switch (buf[0]) { - case 0x04: - if (read == 0) { - fprintf(dev, "exit\n"); - sprintf(linebuf, "exit"); - return strlen(linebuf); - } - break; - case 0x0C: /* ^L */ - /* Should reset display here */ - break; - default: - /* do nothing */ - break; - } - } else { - fprintf(dev, "%c", buf[0]); - read += r; - } + int r = read_fs(dev, 0, max, (uint8_t *)linebuf); + if (r <= 0) return -1; + if (r && linebuf[r-1] == '\n') { + linebuf[r-1] = '\0'; + return r-1; } - tty_set_buffered(dev); - return read; + return r; } /* @@ -742,7 +706,7 @@ static void debug_shell_handle_out(void * data, char * name) { static void debug_shell_actual(void * data, char * name) { current_process->image.entry = 0; - fs_node_t * tty = (fs_node_t *)data; + fs_node_t * tty = (fs_node_t *)current_process->fds->entries[1]; /* Our prompt will include the version number of the current kernel */ char version_number[1024]; @@ -766,7 +730,9 @@ static void debug_shell_actual(void * data, char * name) { } /* Read a line */ - debug_shell_readline(tty, command, 511); + if (debug_shell_readline(current_process->fds->entries[0], command, 511) < 0) { + kexit(0); + } char * arg = strdup(command); char * argv[1024]; /* Command tokens (space-separated elements) */ @@ -813,6 +779,10 @@ static void debug_shell_run(void * data, char * name) { /* Set the device to be the actual TTY slave */ tty = fs_slave; + int fd = process_append_fd((process_t *)current_process, tty); + process_move_fd((process_t *)current_process, fd, 0); + process_move_fd((process_t *)current_process, fd, 1); + fs_master->refcount = -1; fs_slave->refcount = -1;