This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push: new 95f32fd01 nsh: Decouple with CONFIG_FILE_STREAM 95f32fd01 is described below commit 95f32fd018be7a66354942647d9e1c778ad5d488 Author: Huang Qi <huang...@xiaomi.com> AuthorDate: Fri Feb 10 17:50:46 2023 +0800 nsh: Decouple with CONFIG_FILE_STREAM Replace all fwrite/fread/fgets/... to write/read/... Before: ``` text data bss dec hex filename 109827 601 6608 117036 1c92c nuttx/nuttx ``` After: ``` text data bss dec hex filename 108053 601 6608 115262 1c23e nuttx/nuttx ``` After with CONFIG_FILE_STREAM disabled: ``` text data bss dec hex filename 105667 601 6608 112876 1b8ec nuttx/nuttx ``` Signed-off-by: Huang Qi <huang...@xiaomi.com> --- nshlib/Makefile | 7 -- nshlib/README.md | 2 +- nshlib/nsh.h | 6 +- nshlib/nsh_altconsole.c | 33 +------ nshlib/nsh_builtin.c | 4 +- nshlib/nsh_console.c | 155 +++++------------------------ nshlib/nsh_console.h | 44 +++------ nshlib/nsh_login.c | 27 +++-- nshlib/nsh_parse.c | 30 +----- nshlib/nsh_script.c | 33 +++---- nshlib/nsh_session.c | 25 ++--- nshlib/nsh_stdlogin.c | 253 ----------------------------------------------- nshlib/nsh_stdsession.c | 236 ------------------------------------------- nshlib/nsh_telnetlogin.c | 34 +++---- nshlib/nsh_timcmds.c | 6 -- system/nsh/nsh_main.c | 2 +- 16 files changed, 99 insertions(+), 798 deletions(-) diff --git a/nshlib/Makefile b/nshlib/Makefile index 03c163e7a..3987a3a7d 100644 --- a/nshlib/Makefile +++ b/nshlib/Makefile @@ -26,17 +26,10 @@ CSRCS = nsh_init.c nsh_parse.c nsh_console.c nsh_script.c nsh_system.c CSRCS += nsh_command.c nsh_fscmds.c nsh_ddcmd.c nsh_proccmds.c nsh_mmcmds.c CSRCS += nsh_timcmds.c nsh_envcmds.c nsh_syscmds.c nsh_dbgcmds.c -ifeq ($(CONFIG_FILE_STREAM),y) CSRCS += nsh_session.c ifeq ($(CONFIG_NSH_CONSOLE_LOGIN),y) CSRCS += nsh_login.c endif -else -CSRCS += nsh_stdsession.c -ifeq ($(CONFIG_NSH_CONSOLE_LOGIN),y) -CSRCS += nsh_stdlogin.c -endif -endif CSRCS += nsh_fsutils.c diff --git a/nshlib/README.md b/nshlib/README.md index 975df7ea1..336d72a69 100644 --- a/nshlib/README.md +++ b/nshlib/README.md @@ -1616,7 +1616,7 @@ rptun | `CONFIG_RPTUN` set | `CONFIG_NSH_VARS` || !`CONFIG_DISABLE_ENVIRON` shutdown | `CONFIG_BOARDCTL_POWEROFF` || `CONFIG_BOARDCTL_RESET` sleep | - -source | `CONFIG_FILE_STREAM` && !`CONFIG_NSH_DISABLESCRIPT` +source | !`CONFIG_NSH_DISABLESCRIPT` test | !`CONFIG_NSH_DISABLESCRIPT` telnetd | `CONFIG_NSH_TELNET` && `CONFIG_SYSTEM_TELNETD` time | - diff --git a/nshlib/nsh.h b/nshlib/nsh.h index e072b1057..0ccd5992b 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -687,9 +687,7 @@ struct nsh_parser_s #ifndef CONFIG_NSH_DISABLEBG bool np_bg; /* true: The last command executed in background */ #endif -#ifdef CONFIG_FILE_STREAM bool np_redirect; /* true: Output from the last command was re-directed */ -#endif bool np_fail; /* true: The last command failed */ #ifndef CONFIG_NSH_DISABLESCRIPT uint8_t np_flags; /* See nsh_npflags_e above */ @@ -699,7 +697,7 @@ struct nsh_parser_s #endif #ifndef CONFIG_NSH_DISABLESCRIPT - FILE *np_stream; /* Stream of current script */ + int np_fd; /* Stream of current script */ #ifndef CONFIG_NSH_DISABLE_LOOPS long np_foffs; /* File offset to the beginning of a line */ #ifndef NSH_DISABLE_SEMICOLON @@ -801,7 +799,7 @@ int nsh_usbconsole(void); # define nsh_usbconsole() (-ENOSYS) #endif -#if defined(CONFIG_FILE_STREAM) && !defined(CONFIG_NSH_DISABLESCRIPT) +#ifndef CONFIG_NSH_DISABLESCRIPT int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd, FAR const char *path, bool log); #ifdef CONFIG_NSH_ROMFSETC diff --git a/nshlib/nsh_altconsole.c b/nshlib/nsh_altconsole.c index 49aad333b..82f284fda 100644 --- a/nshlib/nsh_altconsole.c +++ b/nshlib/nsh_altconsole.c @@ -60,10 +60,6 @@ static int nsh_clone_console(FAR struct console_stdio_s *pstate) return -ENODEV; } - /* Flush stderr: we only flush stderr if we opened the alternative one */ - - fflush(stderr); - /* Associate the new opened file descriptor to stderr */ dup2(fd, 2); @@ -83,10 +79,6 @@ static int nsh_clone_console(FAR struct console_stdio_s *pstate) return -ENODEV; } - /* Flush stdout: we only flush stdout if we opened the alternative one */ - - fflush(stdout); - /* Associate the new opened file descriptor to stdout */ dup2(fd, 1); @@ -100,23 +92,11 @@ static int nsh_clone_console(FAR struct console_stdio_s *pstate) /* Setup the stderr */ - pstate->cn_errfd = 2; - pstate->cn_errstream = fdopen(pstate->cn_errfd, "a"); - if (!pstate->cn_errstream) - { - free(pstate); - return -EIO; - } + ERRFD(pstate) = 2; /* Setup the stdout */ - pstate->cn_outfd = 1; - pstate->cn_outstream = fdopen(pstate->cn_outfd, "a"); - if (!pstate->cn_outstream) - { - free(pstate); - return -EIO; - } + OUTFD(pstate) = 1; return OK; } @@ -196,15 +176,6 @@ static int nsh_wait_inputdev(FAR struct console_stdio_s *pstate, pstate->cn_confd = 0; - /* Create a standard C stream on the console device */ - - pstate->cn_constream = fdopen(pstate->cn_confd, "r+"); - if (!pstate->cn_constream) - { - free(pstate); - return -EIO; - } - /* Close the input device that we just opened */ close(fd); diff --git a/nshlib/nsh_builtin.c b/nshlib/nsh_builtin.c index 59ec8d439..877af0fc1 100644 --- a/nshlib/nsh_builtin.c +++ b/nshlib/nsh_builtin.c @@ -136,7 +136,7 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd, { /* Setup up to receive SIGINT if control-C entered. */ - tc = ioctl(stdout->fs_fd, TIOCSCTTY, ret); + tc = ioctl(STDOUT_FILENO, TIOCSCTTY, ret); } /* Wait for the application to exit. We did lock the scheduler @@ -201,7 +201,7 @@ int nsh_builtin(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd, if (vtbl->isctty && tc == 0) { - ioctl(stdout->fs_fd, TIOCNOTTY); + ioctl(STDOUT_FILENO, TIOCNOTTY); } } # ifndef CONFIG_NSH_DISABLEBG diff --git a/nshlib/nsh_console.c b/nshlib/nsh_console.c index aa83af8e6..e12a88c80 100644 --- a/nshlib/nsh_console.c +++ b/nshlib/nsh_console.c @@ -42,15 +42,11 @@ * Private Types ****************************************************************************/ -#ifdef CONFIG_FILE_STREAM struct serialsave_s { int cn_errfd; /* Re-directed error output file descriptor */ int cn_outfd; /* Re-directed output file descriptor */ - FILE *cn_errstream; /* Re-directed error output stream */ - FILE *cn_outstream; /* Re-directed output stream */ }; -#endif /**************************************************************************** * Private Function Prototypes @@ -78,35 +74,6 @@ static void nsh_consoleexit(FAR struct nsh_vtbl_s *vtbl, int exitstatus) * Private Functions ****************************************************************************/ -/**************************************************************************** - * Name: nsh_openifnotopen - ****************************************************************************/ - -static int nsh_openifnotopen(struct console_stdio_s *pstate) -{ - /* The stream is open in a lazy fashion. This is done because the file - * descriptor may be opened on a different task than the stream. - */ - - if (!pstate->cn_outstream) - { - pstate->cn_outstream = fdopen(pstate->cn_outfd, "w"); - if (!pstate->cn_outstream) - { - return ERROR; - } - -#if !defined(CONFIG_NSH_ALTCONDEV) - /* If the alternative console is not enabled then stderr = stdout */ - - pstate->cn_errfd = pstate->cn_outfd; - pstate->cn_errstream = pstate->cn_outstream; -#endif - } - - return 0; -} - /**************************************************************************** * Name: nsh_closeifnotclosed * @@ -115,33 +82,22 @@ static int nsh_openifnotopen(struct console_stdio_s *pstate) * ****************************************************************************/ -#ifdef CONFIG_FILE_STREAM static void nsh_closeifnotclosed(struct console_stdio_s *pstate) { - if (pstate->cn_outstream == OUTSTREAM(pstate)) + if (OUTFD(pstate) >= 0 && OUTFD(pstate) != STDOUT_FILENO) { - fflush(OUTSTREAM(pstate)); - pstate->cn_outfd = OUTFD(pstate); + close(OUTFD(pstate)); } - else + + if (ERRFD(pstate) >= 0 && ERRFD(pstate) != STDERR_FILENO + && ERRFD(pstate) != OUTFD(pstate)) { - if (pstate->cn_outstream) - { - fflush(pstate->cn_outstream); - fclose(pstate->cn_outstream); - } - else if (pstate->cn_outfd >= 0 && pstate->cn_outfd != OUTFD(pstate)) - { - close(pstate->cn_outfd); - } - - pstate->cn_errfd = -1; - pstate->cn_outfd = -1; - pstate->cn_errstream = NULL; - pstate->cn_outstream = NULL; + close(ERRFD(pstate)); } + + ERRFD(pstate) = -1; + OUTFD(pstate) = -1; } -#endif /**************************************************************************** * Name: nsh_consolewrite @@ -159,29 +115,15 @@ static ssize_t nsh_consolewrite(FAR struct nsh_vtbl_s *vtbl, FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl; ssize_t ret; - /* The stream is open in a lazy fashion. This is done because the file - * descriptor may be opened on a different task than the stream. The - * actual open will then occur with the first output from the new task. - */ - - if (nsh_openifnotopen(pstate) != 0) - { - return ERROR; - } - /* Write the data to the output stream */ - ret = fwrite(buffer, 1, nbytes, pstate->cn_outstream); + ret = write(OUTFD(pstate), buffer, nbytes); if (ret < 0) { _err("ERROR: [%d] Failed to send buffer: %d\n", - pstate->cn_outfd, errno); + OUTFD(pstate), errno); } - /* Flush the data to the output stream */ - - fflush(pstate->cn_outstream); - return ret; } @@ -200,18 +142,8 @@ static int nsh_consoleoutput(FAR struct nsh_vtbl_s *vtbl, va_list ap; int ret; - /* The stream is open in a lazy fashion. This is done because the file - * descriptor may be opened on a different task than the stream. The - * actual open will then occur with the first output from the new task. - */ - - if (nsh_openifnotopen(pstate) != 0) - { - return ERROR; - } - va_start(ap, fmt); - ret = vfprintf(pstate->cn_outstream, fmt, ap); + ret = vdprintf(OUTFD(pstate), fmt, ap); va_end(ap); return ret; @@ -232,18 +164,8 @@ static int nsh_erroroutput(FAR struct nsh_vtbl_s *vtbl, va_list ap; int ret; - /* The stream is open in a lazy fashion. This is done because the file - * descriptor may be opened on a different task than the stream. The - * actual open will then occur with the first output from the new task. - */ - - if (nsh_openifnotopen(pstate) != 0) - { - return ERROR; - } - va_start(ap, fmt); - ret = vfprintf(pstate->cn_errstream, fmt, ap); + ret = vdprintf(ERRFD(pstate), fmt, ap); va_end(ap); return ret; @@ -298,7 +220,7 @@ static void nsh_consolerelease(FAR struct nsh_vtbl_s *vtbl) /* Close the console stream */ #ifdef CONFIG_NSH_ALTCONDEV - fclose(pstate->cn_constream); + close(pstate->cn_confd); #endif #ifdef CONFIG_NSH_VARS @@ -351,44 +273,21 @@ static void nsh_consoleredirect(FAR struct nsh_vtbl_s *vtbl, int fd, FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl; FAR struct serialsave_s *ssave = (FAR struct serialsave_s *)save; - /* Case 1: Redirected foreground commands */ + /* Redirected foreground commands */ if (ssave) { - /* pstate->cn_outstream and cn_outfd refer refer to the - * currently opened output stream. If the output stream is open, flush - * any pending output. - */ - - if (pstate->cn_outstream) - { - fflush(pstate->cn_errstream); - fflush(pstate->cn_outstream); - } - /* Save the current fd and stream values. These will be restored * when nsh_consoleundirect() is called. */ - ssave->cn_errfd = pstate->cn_errfd; - ssave->cn_outfd = pstate->cn_outfd; - ssave->cn_errstream = pstate->cn_errstream; - ssave->cn_outstream = pstate->cn_outstream; - } - else - { - /* nsh_consoleclone() set pstate->cn_outfd and cn_outstream to refer - * to standard out. We just want to leave these alone and overwrite - * them with the fd for the re-directed stream. - */ + ERRFD(ssave) = ERRFD(pstate); + OUTFD(ssave) = OUTFD(pstate); } - /* In either case, set the fd of the new, re-directed output and nullify - * the output stream (it will be fdopen'ed if it is used). - */ + /* Set the fd of the new. */ - pstate->cn_outfd = fd; - pstate->cn_outstream = NULL; + OUTFD(pstate) = fd; } /**************************************************************************** @@ -403,13 +302,11 @@ static void nsh_consoleundirect(FAR struct nsh_vtbl_s *vtbl, FAR uint8_t *save) { FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl; - FAR struct serialsave_s *ssave = (FAR struct serialsave_s *)save; + FAR struct serialsave_s *ssave = (FAR struct serialsave_s *)save; nsh_closeifnotclosed(pstate); - pstate->cn_errfd = ssave->cn_errfd; - pstate->cn_outfd = ssave->cn_outfd; - pstate->cn_errstream = ssave->cn_errstream; - pstate->cn_outstream = ssave->cn_outstream; + ERRFD(pstate) = ERRFD(ssave); + OUTFD(pstate) = OUTFD(ssave); } /**************************************************************************** @@ -462,20 +359,16 @@ FAR struct console_stdio_s *nsh_newconsole(bool isctty) pstate->cn_vtbl.np.np_flags = NSH_NP_SET_OPTIONS_INIT; #endif -#ifdef CONFIG_FILE_STREAM pstate->cn_vtbl.redirect = nsh_consoleredirect; pstate->cn_vtbl.undirect = nsh_consoleundirect; /* Initialize the error stream */ - pstate->cn_errfd = ERRFD(pstate); - pstate->cn_errstream = ERRSTREAM(pstate); + ERRFD(pstate) = STDERR_FILENO; /* Initialize the output stream */ - pstate->cn_outfd = OUTFD(pstate); - pstate->cn_outstream = OUTSTREAM(pstate); -#endif + OUTFD(pstate) = STDOUT_FILENO; } return pstate; diff --git a/nshlib/nsh_console.h b/nshlib/nsh_console.h index 5e1c02cc6..249480bae 100644 --- a/nshlib/nsh_console.h +++ b/nshlib/nsh_console.h @@ -64,33 +64,24 @@ /* Are we using the NuttX console for I/O? Or some other character device? */ -#ifdef CONFIG_FILE_STREAM -# ifdef CONFIG_NSH_ALTCONDEV - -# if !defined(CONFIG_NSH_ALTSTDIN) && !defined(CONFIG_NSH_ALTSTDOUT) && \ - !defined(CONFIG_NSH_ALTSTDERR) -# error CONFIG_NSH_ALTCONDEV selected but CONFIG_NSH_ALTSTDxxx not provided -# endif - -# define INFD(p) ((p)->cn_confd) -# define INSTREAM(p) ((p)->cn_constream) -# define OUTFD(p) ((p)->cn_outfd) -# define OUTSTREAM(p) ((p)->cn_outstream) -# define ERRFD(p) ((p)->cn_errfd) -# define ERRSTREAM(p) ((p)->cn_errstream) - -# else - -# define INFD(p) 0 -# define INSTREAM(p) stdin -# define OUTFD(p) 1 -# define OUTSTREAM(p) stdout -# define ERRFD(p) 2 -# define ERRSTREAM(p) stderr +#ifdef CONFIG_NSH_ALTCONDEV +# if !defined(CONFIG_NSH_ALTSTDIN) && !defined(CONFIG_NSH_ALTSTDOUT) && \ + !defined(CONFIG_NSH_ALTSTDERR) +# error CONFIG_NSH_ALTCONDEV selected but CONFIG_NSH_ALTSTDxxx not provided # endif + +# define INFD(p) ((p)->cn_confd) + +#else + +# define INFD(p) 0 + #endif +# define OUTFD(p) ((p)->cn_outfd) +# define ERRFD(p) ((p)->cn_errfd) + /**************************************************************************** * Public Types ****************************************************************************/ @@ -148,18 +139,11 @@ struct console_stdio_s /* NSH input/output streams */ -#ifdef CONFIG_FILE_STREAM #ifdef CONFIG_NSH_ALTCONDEV int cn_confd; /* Console I/O file descriptor */ #endif int cn_outfd; /* Output file descriptor (possibly redirected) */ int cn_errfd; /* Error Output file descriptor (possibly redirected) */ -#ifdef CONFIG_NSH_ALTCONDEV - FILE *cn_constream; /* Console I/O stream (possibly redirected) */ -#endif - FILE *cn_outstream; /* Output stream */ - FILE *cn_errstream; /* Error Output stream */ -#endif #ifdef CONFIG_NSH_VARS /* Allocation and size of NSH variables */ diff --git a/nshlib/nsh_login.c b/nshlib/nsh_login.c index 4d3976136..19be58ae5 100644 --- a/nshlib/nsh_login.c +++ b/nshlib/nsh_login.c @@ -166,13 +166,12 @@ int nsh_login(FAR struct console_stdio_s *pstate) /* Ask for the login username */ username[0] = '\0'; - fputs(g_userprompt, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_userprompt, strlen(g_userprompt)); /* readline() returns EOF on failure */ - ret = readline(pstate->cn_line, CONFIG_NSH_LINELEN, - INSTREAM(pstate), OUTSTREAM(pstate)); + ret = readline_fd(pstate->cn_line, CONFIG_NSH_LINELEN, + INFD(pstate), OUTFD(pstate)); if (ret != EOF) { /* Parse out the username */ @@ -188,18 +187,16 @@ int nsh_login(FAR struct console_stdio_s *pstate) #ifdef CONFIG_NSH_PLATFORM_CHALLENGE platform_challenge(challenge, sizeof(challenge)); - fputs(challenge, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), challenge, strlen(challenge)); #endif /* Ask for the login password */ - fputs(g_passwordprompt, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_passwordprompt, strlen(g_passwordprompt)); password[0] = '\0'; - if (fgets(pstate->cn_line, CONFIG_NSH_LINELEN, - INSTREAM(pstate)) != NULL) + if (readline_fd(pstate->cn_line, CONFIG_NSH_LINELEN, + INFD(pstate), -1) > 0) { /* Parse out the password */ @@ -226,14 +223,13 @@ int nsh_login(FAR struct console_stdio_s *pstate) # error No user verification method selected #endif { - fputs(g_loginsuccess, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_loginsuccess, strlen(g_loginsuccess)); return OK; } else { - fputs(g_badcredentials, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_badcredentials, + strlen(g_badcredentials)); #if CONFIG_NSH_LOGIN_FAILDELAY > 0 usleep(CONFIG_NSH_LOGIN_FAILDELAY * 1000L); #endif @@ -243,8 +239,7 @@ int nsh_login(FAR struct console_stdio_s *pstate) /* Too many failed login attempts */ - fputs(g_loginfailure, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_loginfailure, strlen(g_loginsuccess)); return -1; } diff --git a/nshlib/nsh_parse.c b/nshlib/nsh_parse.c index 7f86a1702..169561e4c 100644 --- a/nshlib/nsh_parse.c +++ b/nshlib/nsh_parse.c @@ -338,7 +338,6 @@ static void nsh_releaseargs(struct cmdarg_s *arg) FAR struct nsh_vtbl_s *vtbl = arg->vtbl; int i; -#ifdef CONFIG_FILE_STREAM /* If the output was redirected, then file descriptor should * be closed. The created task has its one, independent copy of * the file descriptor @@ -348,7 +347,6 @@ static void nsh_releaseargs(struct cmdarg_s *arg) { close(arg->fd); } -#endif /* Released the cloned vtbl instance */ @@ -487,9 +485,7 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char *argv[], FAR const char *redirfile, int oflags) { -#if defined(CONFIG_FILE_STREAM) || !defined(CONFIG_NSH_DISABLEBG) int fd = -1; -#endif int ret; /* DO NOT CHANGE THE ORDERING OF THE FOLLOWING STEPS @@ -527,11 +523,7 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, */ #ifdef CONFIG_NSH_BUILTIN_APPS -#ifdef CONFIG_FILE_STREAM ret = nsh_builtin(vtbl, argv[0], argv, redirfile, oflags); -#else - ret = nsh_builtin(vtbl, argv[0], argv, NULL, 0); -#endif if (ret >= 0) { /* nsh_builtin() returned 0 or 1. This means that the built-in @@ -587,7 +579,6 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, #endif -#ifdef CONFIG_FILE_STREAM /* Redirected output? */ if (vtbl->np.np_redirect) @@ -605,7 +596,6 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, goto errout; } } -#endif /* Handle the case where the command is executed in background. * However is app is to be started as built-in new process will @@ -641,14 +631,12 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, goto errout_with_redirect; } -#ifdef CONFIG_FILE_STREAM /* Handle redirection of output via a file descriptor */ if (vtbl->np.np_redirect) { nsh_redirect(bkgvtbl, fd, NULL); } -#endif /* Get the execution priority of this task */ @@ -723,7 +711,6 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, else #endif { -#ifdef CONFIG_FILE_STREAM uint8_t save[SAVE_SIZE]; /* Handle redirection of output via a file descriptor */ @@ -732,7 +719,6 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, { nsh_redirect(vtbl, fd, save); } -#endif /* Then execute the command in "foreground" -- i.e., while the user * waits for the next prompt. nsh_command will return: @@ -743,7 +729,6 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, ret = nsh_command(vtbl, argc, argv); -#ifdef CONFIG_FILE_STREAM /* Restore the original output. Undirect will close the redirection * file descriptor. */ @@ -752,7 +737,6 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, { nsh_undirect(vtbl, save); } -#endif /* Mark errors so that it is possible to test for non-zero return * values in nsh scripts. @@ -772,13 +756,11 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl, #ifndef CONFIG_NSH_DISABLEBG errout_with_redirect: -#ifdef CONFIG_FILE_STREAM if (vtbl->np.np_redirect) { close(fd); } #endif -#endif errout: return nsh_saveresult(vtbl, true); @@ -1879,7 +1861,7 @@ static int nsh_loop(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, #endif np->np_lpstate[np->np_lpndx].lp_state == NSH_LOOP_WHILE || np->np_lpstate[np->np_lpndx].lp_state == NSH_LOOP_UNTIL || - np->np_stream == NULL || np->np_foffs < 0) + np->np_fd < 0 || np->np_foffs < 0) { nsh_error(vtbl, g_fmtcontext, cmd); goto errout; @@ -1971,7 +1953,7 @@ static int nsh_loop(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, { /* Set the new file position to the top of the loop offset */ - ret = fseek(np->np_stream, + ret = lseek(np->np_fd, np->np_lpstate[np->np_lpndx].lp_topoffs, SEEK_SET); if (ret < 0) @@ -2392,9 +2374,7 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) int oflags = 0; int argc; int ret; -#ifdef CONFIG_FILE_STREAM bool redirect_save = false; -#endif /* Initialize parser state */ @@ -2405,9 +2385,7 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) vtbl->np.np_bg = false; #endif -#ifdef CONFIG_FILE_STREAM vtbl->np.np_redirect = false; -#endif /* Parse out the command at the beginning of the line */ @@ -2550,7 +2528,6 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) } #endif -#ifdef CONFIG_FILE_STREAM /* Check if the output was re-directed using > or >> */ if (argc > 2) @@ -2577,7 +2554,6 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) argc -= 2; } } -#endif /* Last argument vector must be empty */ @@ -2596,7 +2572,6 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) /* Free any allocated resources */ -#ifdef CONFIG_FILE_STREAM /* Free the redirected output file path */ if (redirfile) @@ -2604,7 +2579,6 @@ static int nsh_parse_command(FAR struct nsh_vtbl_s *vtbl, FAR char *cmdline) nsh_freefullpath(redirfile); vtbl->np.np_redirect = redirect_save; } -#endif NSH_MEMLIST_FREE(&memlist); return ret; diff --git a/nshlib/nsh_script.c b/nshlib/nsh_script.c index 0174c0fbb..99e61a60b 100644 --- a/nshlib/nsh_script.c +++ b/nshlib/nsh_script.c @@ -30,7 +30,9 @@ #include "nsh.h" #include "nsh_console.h" -#if defined(CONFIG_FILE_STREAM) && !defined(CONFIG_NSH_DISABLESCRIPT) +#include <system/readline.h> + +#ifndef CONFIG_NSH_DISABLESCRIPT /**************************************************************************** * Private Functions @@ -85,9 +87,8 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const FAR char *cmd, FAR const char *path, bool log) { FAR char *fullpath; - FAR FILE *savestream; + int savestream; FAR char *buffer; - FAR char *pret; int ret = ERROR; /* The path to the script may relative to the current working directory */ @@ -105,12 +106,12 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const FAR char *cmd, { /* Save the parent stream in case of nested script processing */ - savestream = vtbl->np.np_stream; + savestream = vtbl->np.np_fd; /* Open the file containing the script */ - vtbl->np.np_stream = fopen(fullpath, "r"); - if (!vtbl->np.np_stream) + vtbl->np.np_fd = open(fullpath, O_RDOK); + if (vtbl->np.np_fd < 0) { if (log) { @@ -123,7 +124,7 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const FAR char *cmd, /* Restore the parent script stream */ - vtbl->np.np_stream = savestream; + vtbl->np.np_fd = savestream; return ERROR; } @@ -133,10 +134,6 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const FAR char *cmd, do { - /* Flush any output generated by the previous line */ - - fflush(stdout); - #ifndef CONFIG_NSH_DISABLE_LOOPS /* Get the current file position. This is used to control * looping. If a loop begins in the next line, then this file @@ -144,7 +141,7 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const FAR char *cmd, * script file. Note that ftell will return -1 on failure. */ - vtbl->np.np_foffs = ftell(vtbl->np.np_stream); + vtbl->np.np_foffs = lseek(vtbl->np.np_fd, 0, SEEK_CUR); vtbl->np.np_loffs = 0; if (vtbl->np.np_foffs < 0 && log) @@ -155,8 +152,8 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const FAR char *cmd, /* Now read the next line from the script file */ - pret = fgets(buffer, CONFIG_NSH_LINELEN, vtbl->np.np_stream); - if (pret) + ret = readline_fd(buffer, CONFIG_NSH_LINELEN, vtbl->np.np_fd, -1); + if (ret >= 0) { /* Parse process the command. NOTE: this is recursive... * we got to cmd_source via a call to nsh_parse. So some @@ -171,15 +168,15 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const FAR char *cmd, ret = nsh_parse(vtbl, buffer); } } - while (pret && (ret == OK || (vtbl->np.np_flags & NSH_PFLAG_IGNORE))); + while (ret >= 0 || (vtbl->np.np_flags & NSH_PFLAG_IGNORE)); /* Close the script file */ - fclose(vtbl->np.np_stream); + close(vtbl->np.np_fd); /* Restore the parent script stream */ - vtbl->np.np_stream = savestream; + vtbl->np.np_fd = savestream; } /* Free the allocated path */ @@ -265,4 +262,4 @@ int nsh_loginscript(FAR struct nsh_vtbl_s *vtbl) #endif #endif /* CONFIG_NSH_ROMFSETC */ -#endif /* CONFIG_FILE_STREAM && !CONFIG_NSH_DISABLESCRIPT */ +#endif /* CONFIG_NSH_DISABLESCRIPT */ diff --git a/nshlib/nsh_session.c b/nshlib/nsh_session.c index 5fe67f2db..4e5621552 100644 --- a/nshlib/nsh_session.c +++ b/nshlib/nsh_session.c @@ -104,24 +104,21 @@ int nsh_session(FAR struct console_stdio_s *pstate, { /* Present a greeting and possibly a Message of the Day (MOTD) */ - fputs(g_nshgreeting, pstate->cn_outstream); + write(OUTFD(pstate), g_nshgreeting, strlen(g_nshgreeting)); #ifdef CONFIG_NSH_MOTD # ifdef CONFIG_NSH_PLATFORM_MOTD /* Output the platform message of the day */ platform_motd(vtbl->iobuffer, IOBUFFERSIZE); - fprintf(pstate->cn_outstream, "%s\n", vtbl->iobuffer); - + dprintf(OUTFD(pstate), "%s\n", vtbl->iobuffer); # else /* Output the fixed message of the day */ - fprintf(pstate->cn_outstream, "%s\n", g_nshmotd); + dprintf(OUTFD(pstate), "%s\n", g_nshmotd); # endif #endif - fflush(pstate->cn_outstream); - /* Execute the login script */ #ifdef CONFIG_NSH_ROMFSRC @@ -194,34 +191,33 @@ int nsh_session(FAR struct console_stdio_s *pstate, * occurs. Either will cause the session to terminate. */ - ret = cle(pstate->cn_line, g_nshprompt, CONFIG_NSH_LINELEN, - INSTREAM(pstate), OUTSTREAM(pstate)); + ret = cle_fd(pstate->cn_line, g_nshprompt, CONFIG_NSH_LINELEN, + INFD(pstate), OUTFD(pstate)); if (ret < 0) { - fprintf(pstate->cn_errstream, g_fmtcmdfailed, "nsh_session", + dprintf(ERRFD(pstate), g_fmtcmdfailed, "nsh_session", "cle", NSH_ERRNO_OF(-ret)); continue; } #else /* Display the prompt string */ - fputs(g_nshprompt, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_nshprompt, strlen(g_nshprompt)); /* readline() normally returns the number of characters read, but * will return EOF on end of file or if an error occurs. EOF * will cause the session to terminate. */ - ret = readline(pstate->cn_line, CONFIG_NSH_LINELEN, - INSTREAM(pstate), OUTSTREAM(pstate)); + ret = readline_fd(pstate->cn_line, CONFIG_NSH_LINELEN, + INFD(pstate), OUTFD(pstate)); if (ret == EOF) { /* NOTE: readline() does not set the errno variable, but * perhaps we will be lucky and it will still be valid. */ - fprintf(pstate->cn_errstream, g_fmtcmdfailed, "nsh_session", + dprintf(ERRFD(pstate), g_fmtcmdfailed, "nsh_session", "readline", NSH_ERRNO); ret = EXIT_SUCCESS; break; @@ -231,7 +227,6 @@ int nsh_session(FAR struct console_stdio_s *pstate, /* Parse process the command */ nsh_parse(vtbl, pstate->cn_line); - fflush(pstate->cn_outstream); } return ret; diff --git a/nshlib/nsh_stdlogin.c b/nshlib/nsh_stdlogin.c deleted file mode 100644 index 0cadf19cb..000000000 --- a/nshlib/nsh_stdlogin.c +++ /dev/null @@ -1,253 +0,0 @@ -/**************************************************************************** - * apps/nshlib/nsh_stdlogin.c - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF 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. You may 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. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include <nuttx/config.h> - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <unistd.h> - -#include "fsutils/passwd.h" -#ifdef CONFIG_NSH_CLE -# include "system/cle.h" -#else -# include "system/readline.h" -#endif - -#include "nsh.h" -#include "nsh_console.h" -#include "nshlib/nshlib.h" - -#ifdef CONFIG_NSH_CONSOLE_LOGIN - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: nsh_stdtoken - ****************************************************************************/ - -static void nsh_stdtoken(FAR struct console_stdio_s *pstate, - FAR char *buffer, size_t buflen) -{ - FAR char *start; - FAR char *endp1; - bool quoted = false; - - /* Find the start of token. Either (1) the first non-white space - * character on the command line or (2) the character immediately after - * a quotation mark. - */ - - for (start = pstate->cn_line; *start; start++) - { - /* Does the token open with a quotation mark */ - - if (*start == '"') - { - /* Yes.. break out with start set to the character after the - * quotation mark. - */ - - quoted = true; - start++; - break; - } - - /* No, then any non-whitespace is the first character of the token */ - - else if (!isspace(*start)) - { - /* Break out with start set to the first character of the token */ - - break; - } - } - - /* Find the terminating character after the token on the command line. The - * terminating character is either (1) the matching quotation mark, or (2) - * any whitespace. - */ - - for (endp1 = start; *endp1; endp1++) - { - /* Did the token begin with a quotation mark? */ - - if (quoted) - { - /* Yes.. then only the matching quotation mark (or end of string) - * terminates - */ - - if (*endp1 == '"') - { - /* Break out... endp1 points to closing quotation mark */ - - break; - } - } - - /* No.. any whitespace (or end of string) terminates */ - - else if (isspace(*endp1)) - { - /* Break out... endp1 points to first while space encountered */ - - break; - } - } - - /* Replace terminating character with a NUL terminator */ - - *endp1 = '\0'; - - /* Copied the token into the buffer */ - - strncpy(buffer, start, buflen); -} - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: nsh_stdlogin - * - * Description: - * Prompt the user for a username and password. Return a failure if valid - * credentials are not returned (after some retries. - * - ****************************************************************************/ - -int nsh_stdlogin(FAR struct console_stdio_s *pstate) -{ - char username[16]; - char password[128]; -#ifdef CONFIG_NSH_PLATFORM_CHALLENGE - char challenge[128]; -#endif - int ret; - int i; - -#ifdef CONFIG_NSH_PLATFORM_SKIP_LOGIN - if (platform_skip_login() == OK) - { - return OK; - } -#endif - - /* Loop for the configured number of retries */ - - for (i = 0; i < CONFIG_NSH_LOGIN_FAILCOUNT; i++) - { - /* Get the response, handling all possible cases */ - - username[0] = '\0'; - -#ifdef CONFIG_NSH_CLE - /* cle() returns a negated errno value on failure */ - - ret = cle(pstate->cn_line, g_userprompt, CONFIG_NSH_LINELEN, - stdin, stdout); - if (ret >= 0) -#else - /* Ask for the login username */ - - printf("%s", g_userprompt); - - /* readline() returns EOF on failure */ - - ret = std_readline(pstate->cn_line, CONFIG_NSH_LINELEN); - if (ret != EOF) -#endif - { - /* Parse out the username */ - - nsh_stdtoken(pstate, username, sizeof(username)); - } - - if (username[0] == '\0') - { - i--; - continue; - } - -#ifdef CONFIG_NSH_PLATFORM_CHALLENGE - platform_challenge(challenge, sizeof(challenge)); - printf("%s", challenge); -#endif - /* Ask for the login password */ - - printf("%s", g_passwordprompt); - - password[0] = '\0'; - if (fgets(pstate->cn_line, CONFIG_NSH_LINELEN, stdin) != NULL) - { - /* Parse out the password */ - - nsh_stdtoken(pstate, password, sizeof(password)); - - /* Verify the username and password */ - -#if defined(CONFIG_NSH_LOGIN_PASSWD) - ret = passwd_verify(username, password); - if (PASSWORD_VERIFY_MATCH(ret)) - -#elif defined(CONFIG_NSH_LOGIN_PLATFORM) -#ifdef CONFIG_NSH_PLATFORM_CHALLENGE - ret = platform_user_verify(username, challenge, password); -#else - ret = platform_user_verify(username, password); -#endif - if (PASSWORD_VERIFY_MATCH(ret)) - -#elif defined(CONFIG_NSH_LOGIN_FIXED) - if (strcmp(password, CONFIG_NSH_LOGIN_PASSWORD) == 0 && - strcmp(username, CONFIG_NSH_LOGIN_USERNAME) == 0) -#else -# error No user verification method selected -#endif - { - printf("%s", g_loginsuccess); - return OK; - } - else - { - printf("%s", g_badcredentials); -#if CONFIG_NSH_LOGIN_FAILDELAY > 0 - usleep(CONFIG_NSH_LOGIN_FAILDELAY * 1000L); -#endif - } - } - } - - /* Too many failed login attempts */ - - printf("%s", g_loginfailure); - return -1; -} - -#endif /* CONFIG_NSH_CONSOLE_LOGIN */ diff --git a/nshlib/nsh_stdsession.c b/nshlib/nsh_stdsession.c deleted file mode 100644 index 17b56e7b5..000000000 --- a/nshlib/nsh_stdsession.c +++ /dev/null @@ -1,236 +0,0 @@ -/**************************************************************************** - * apps/nshlib/nsh_stdsession.c - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF 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. You may 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. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include <nuttx/config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#ifdef CONFIG_NSH_CLE -# include "system/cle.h" -#else -# include "system/readline.h" -#endif - -#include "nsh.h" -#include "nsh_console.h" - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: nsh_session - * - * Description: - * This is the common session login on any NSH session that uses only stdin - * and stdout. - * - * This function: - * - Performs the login sequence if so configured - * - Executes the NSH login script - * - Presents a greeting - * - Then provides a prompt then gets and processes the command line. - * - This continues until an error occurs, then the session returns. - * - * Input Parameters: - * pstate - Abstracts the underlying session. - * - * Returned Values: - * EXIT_SUCCESS or EXIT_FAILURE is returned. - * - ****************************************************************************/ - -int nsh_session(FAR struct console_stdio_s *pstate, - int login, int argc, FAR char *argv[]) -{ - FAR struct nsh_vtbl_s *vtbl; - int ret = EXIT_FAILURE; - int i; - - DEBUGASSERT(pstate); - vtbl = &pstate->cn_vtbl; - -#ifdef CONFIG_NSH_CONSOLE_LOGIN - if (login == NSH_LOGIN_LOCAL) - { - /* Login User and Password Check */ - - if (nsh_stdlogin(pstate) != OK) - { - nsh_exit(vtbl, 1); - return -1; /* nsh_exit does not return */ - } - } - else -#endif /* CONFIG_NSH_CONSOLE_LOGIN */ -#ifdef CONFIG_NSH_TELNET_LOGIN - if (login == NSH_LOGIN_TELNET) - { - /* Login User and Password Check */ - - if (nsh_telnetlogin(pstate) != OK) - { - nsh_exit(vtbl, 1); - return -1; /* nsh_exit does not return */ - } - } -#endif /* CONFIG_NSH_TELNET_LOGIN */ - - if (login != NSH_LOGIN_NONE) - { - /* Present a greeting and possibly a Message of the Day (MOTD) */ - - printf("%s", g_nshgreeting); - -#ifdef CONFIG_NSH_MOTD -# ifdef CONFIG_NSH_PLATFORM_MOTD - /* Output the platform message of the day */ - - platform_motd(vtbl->iobuffer, IOBUFFERSIZE); - printf("%s\n", vtbl->iobuffer); - -# else - /* Output the fixed message of the day */ - - printf("%s\n", g_nshmotd); -# endif -#endif - - /* Execute the login script */ - -#ifdef CONFIG_NSH_ROMFSRC - nsh_loginscript(vtbl); -#endif - } - - /* Process the command line option */ - - for (i = 1; i < argc; i++) - { - if (strcmp(argv[i], "-h") == 0) - { - nsh_output(vtbl, "Usage: %s [<script-path>|-c <command>]\n", - argv[0]); - return EXIT_SUCCESS; - } - else if (strcmp(argv[i], "-c") == 0) - { - /* Process the inline command */ - - if (i + 1 < argc) - { - return nsh_parse(vtbl, argv[i + 1]); - } - else - { - nsh_error(vtbl, g_fmtargrequired, argv[0]); - return EXIT_FAILURE; - } - } - else if (argv[i][0] != '-') - { - break; - } - - /* Unknown option */ - - nsh_error(vtbl, g_fmtsyntax, argv[0]); - return EXIT_FAILURE; - } - - if (i < argc) - { -#ifndef CONFIG_NSH_DISABLESCRIPT - /* Execute the shell script */ - - return nsh_script(vtbl, argv[0], argv[i], true); -#else - return EXIT_FAILURE; -#endif - } - - /* Then enter the command line parsing loop */ - - for (; ; ) - { - /* For the case of debugging the USB console... - * dump collected USB trace data - */ - -#ifdef CONFIG_NSH_USBDEV_TRACE - nsh_usbtrace(); -#endif - - /* Get the next line of input. readline() returns EOF - * on end-of-file or any read failure. - */ - -#ifdef CONFIG_NSH_CLE - /* cle() normally returns the number of characters read, but will - * return a negated errno value on end of file or if an error - * occurs. Either will cause the session to terminate. - */ - - ret = cle(pstate->cn_line, g_nshprompt, CONFIG_NSH_LINELEN, - stdin, stdout); - if (ret < 0) - { - printf(g_fmtcmdfailed, "nsh_session", - "cle", NSH_ERRNO_OF(-ret)); - continue; - } -#else - /* Display the prompt string */ - - printf("%s", g_nshprompt); - - /* readline() normally returns the number of characters read, but - * will return EOF on end of file or if an error occurs. EOF - * will cause the session to terminate. - */ - - ret = std_readline(pstate->cn_line, CONFIG_NSH_LINELEN); - if (ret == EOF) - { - /* NOTE: readline() does not set the errno variable, but - * perhaps we will be lucky and it will still be valid. - */ - - printf(g_fmtcmdfailed, "nsh_session", - "readline", NSH_ERRNO); - ret = EXIT_SUCCESS; - break; - } -#endif - - /* Parse process the command */ - - nsh_parse(vtbl, pstate->cn_line); - } - - return ret; -} diff --git a/nshlib/nsh_telnetlogin.c b/nshlib/nsh_telnetlogin.c index c8e6bdad4..6592403b6 100644 --- a/nshlib/nsh_telnetlogin.c +++ b/nshlib/nsh_telnetlogin.c @@ -34,6 +34,7 @@ #include "nsh.h" #include "nsh_console.h" #include "nshlib/nshlib.h" +#include "system/readline.h" #ifdef CONFIG_NSH_TELNET_LOGIN @@ -65,8 +66,7 @@ static void nsh_telnetecho(FAR struct console_stdio_s *pstate, optbuf[1] = (is_use == TELNET_USE_ECHO) ? TELNET_WILL : TELNET_DO; optbuf[2] = 1; optbuf[3] = 0; - fputs((FAR char *)optbuf, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), optbuf, strlen((FAR const char *)optbuf)); } /**************************************************************************** @@ -178,8 +178,7 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate) /* Present the NSH Telnet greeting */ - fputs(g_telnetgreeting, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_telnetgreeting, strlen(g_telnetgreeting)); /* Loop for the configured number of retries */ @@ -187,12 +186,12 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate) { /* Ask for the login username */ - fputs(g_userprompt, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_userprompt, strlen(g_userprompt)); username[0] = '\0'; - if (fgets(pstate->cn_line, CONFIG_NSH_LINELEN, - INSTREAM(pstate)) != NULL) + if (readline_fd(pstate->cn_line, CONFIG_NSH_LINELEN, + INFD(pstate), OUTFD(pstate)) >= 0) + { /* Parse out the username */ @@ -207,18 +206,17 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate) #ifdef CONFIG_NSH_PLATFORM_CHALLENGE platform_challenge(challenge, sizeof(challenge)); - fputs(challenge, pstate->cn_outstream); + write(OUTFD(pstate), challenge, strlen(challenge)); #endif /* Ask for the login password */ - fputs(g_passwordprompt, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_passwordprompt, strlen(g_passwordprompt)); nsh_telnetecho(pstate, TELNET_NOTUSE_ECHO); password[0] = '\0'; - if (fgets(pstate->cn_line, CONFIG_NSH_LINELEN, - INSTREAM(pstate)) != NULL) + if (readline_fd(pstate->cn_line, CONFIG_NSH_LINELEN, + INFD(pstate), OUTFD(pstate)) >= 0) { /* Parse out the password */ @@ -244,15 +242,14 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate) # error No user verification method selected #endif { - fputs(g_loginsuccess, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_loginsuccess, strlen(g_loginsuccess)); nsh_telnetecho(pstate, TELNET_USE_ECHO); return OK; } else { - fputs(g_badcredentials, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_badcredentials, + strlen(g_badcredentials)); #if CONFIG_NSH_LOGIN_FAILDELAY > 0 usleep(CONFIG_NSH_LOGIN_FAILDELAY * 1000L); #endif @@ -264,8 +261,7 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate) /* Too many failed login attempts */ - fputs(g_loginfailure, pstate->cn_outstream); - fflush(pstate->cn_outstream); + write(OUTFD(pstate), g_loginfailure, strlen(g_loginfailure)); return -1; } diff --git a/nshlib/nsh_timcmds.c b/nshlib/nsh_timcmds.c index 32d8675a0..19d53ebc1 100644 --- a/nshlib/nsh_timcmds.c +++ b/nshlib/nsh_timcmds.c @@ -297,9 +297,7 @@ int cmd_time(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) #ifndef CONFIG_NSH_DISABLEBG bool bgsave; #endif -#ifdef CONFIG_FILE_STREAM bool redirsave; -#endif int ret; /* Get the current time */ @@ -316,9 +314,7 @@ int cmd_time(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) #ifndef CONFIG_NSH_DISABLEBG bgsave = vtbl->np.np_bg; #endif -#ifdef CONFIG_FILE_STREAM redirsave = vtbl->np.np_redirect; -#endif /* Execute the command */ @@ -357,9 +353,7 @@ int cmd_time(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) #ifndef CONFIG_NSH_DISABLEBG vtbl->np.np_bg = bgsave; #endif -#ifdef CONFIG_FILE_STREAM vtbl->np.np_redirect = redirsave; -#endif return ret; } diff --git a/system/nsh/nsh_main.c b/system/nsh/nsh_main.c index f4f8ab91d..01fcb2a6f 100644 --- a/system/nsh/nsh_main.c +++ b/system/nsh/nsh_main.c @@ -76,7 +76,7 @@ int main(int argc, FAR char *argv[]) * is wrong. */ - fprintf(stderr, "ERROR: nsh_consolemain() returned: %d\n", ret); + dprintf(STDERR_FILENO, "ERROR: nsh_consolemain() returned: %d\n", ret); ret = 1; #endif