NSH now supports an MOTD string that will be presented after the greeting

This commit is contained in:
Gregory Nutt 2016-01-20 11:18:08 -06:00
parent fe05a8444f
commit 3dad8a29a2
7 changed files with 116 additions and 14 deletions

View File

@ -1514,4 +1514,6 @@
file like /etc/passwd (2016-01-19).
* apps/nshlib/nsh_passwdcmds.c: Add useradd, userdel, and passwd
commands (2019-01-20).
* apps/nshlib: Now supports a Message of the Day (MOTD) that will
be presented after the NSH greeting (2015-01-20).

View File

@ -17,6 +17,44 @@ config NSH_LIBRARY
if NSH_LIBRARY
menuconfig NSH_MOTD
bool "Message of the Day (MOTD)"
default n
---help---
Support a user-provided Message of the Day (MOTD) that will be
presented each time new NSH session is opened.
if NSH_MOTD
config NSH_PLATFORM_MOTD
bool "Platform MOTD"
default n
---help---
If this option is selected, the NSH will call into platform-specific
logic in order to get the MOTD. The function prototype for this
call is:
void platform_motd(FAR char *buffer, size_t buflen);
Where buffer is the location to return the MOTD and buflen is the
length of that buffer. The maximum size of the buffer is detemined
by NSH_FILEIOSIZE. An appopriate location for the
implementation of platform_motd would be within apps/platform/<board>.
One newline will be inserted after the platform-supplied message.
config NSH_MOTD_STRING
string "MOTD String"
default "No MOTD string provided"
depends on !NSH_PLATFORM_MOTD
---help---
If NSH_MOTD is selected, but NSH_PLATFORM_MOTD is not, then a fixed
MOTD string will be used. That string is provided by this selection.
One newline will be inserted after supplied MOTD message.
endif # NSH_MOTD
menu "Command Line Configuration"
choice

View File

@ -573,10 +573,12 @@
# undef NSH_HAVE_IOBUFFER
#endif
/* The I/O buffer is needed for the ls, cp, and ps commands */
/* The I/O buffer is needed for the ls, cp, and ps commands. It is also
* needed if the platform supplied MOTD is configured.
*/
#if defined(CONFIG_NSH_DISABLE_LS) && defined(CONFIG_NSH_DISABLE_CP) && \
defined(CONFIG_NSH_DISABLE_PS)
defined(CONFIG_NSH_DISABLE_PS) && !defined(CONFIG_NSH_PLATFORM_MOTD)
# undef NSH_HAVE_IOBUFFER
#endif
@ -798,6 +800,9 @@ typedef CODE int (*nsh_direntry_handler_t)(FAR struct nsh_vtbl_s *vtbl,
****************************************************************************/
extern const char g_nshgreeting[];
#if defined(CONFIG_NSH_MOTD) && !defined(CONFIG_NSH_PLATFORM_MOTD)
extern const char g_nshmotd[];
#endif
#if defined(CONFIG_NSH_TELNET_LOGIN) && defined(CONFIG_NSH_TELNET)
extern const char g_telnetgreeting[];
extern const char g_userprompt[];

View File

@ -224,6 +224,12 @@ const char g_nshgreeting[] = "\nNuttShell (NSH) NuttX-" CONFIG_VERSION_STR
const char g_nshgreeting[] = "\nNuttShell (NSH)\n";
#endif
/* Fixed Message of the Day (MOTD) */
#if defined(CONFIG_NSH_MOTD) && !defined(CONFIG_NSH_PLATFORM_MOTD)
const char g_nshmotd[] = CONFIG_NSH_MOTD_STRING;
#endif
/* Telnet login prompts */
#if defined(CONFIG_NSH_TELNET_LOGIN) && defined(CONFIG_NSH_TELNET)

View File

@ -103,19 +103,36 @@
int nsh_session(FAR struct console_stdio_s *pstate)
{
FAR struct nsh_vtbl_s *vtbl;
int ret;
DEBUGASSERT(pstate);
vtbl = &pstate->cn_vtbl;
/* Present a greeting */
/* Present a greeting and possibly a Message of the Day (MOTD) */
fputs(g_nshgreeting, pstate->cn_outstream);
#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);
# else
/* Output the fixed message of the day */
fprintf(pstate->cn_outstream, "%s\n", g_nshmotd);
# endif
#endif
fflush(pstate->cn_outstream);
/* Execute the login script */
#ifdef CONFIG_NSH_ROMFSRC
(void)nsh_loginscript(&pstate->cn_vtbl);
(void)nsh_loginscript(vtbl);
#endif
/* Then enter the command line parsing loop */
@ -148,7 +165,7 @@ int nsh_session(FAR struct console_stdio_s *pstate)
{
/* Parse process the command */
(void)nsh_parse(&pstate->cn_vtbl, pstate->cn_line);
(void)nsh_parse(vtbl, pstate->cn_line);
fflush(pstate->cn_outstream);
}

View File

@ -102,14 +102,30 @@
int nsh_session(FAR struct console_stdio_s *pstate)
{
FAR struct nsh_vtbl_s *vtbl;
int ret;
DEBUGASSERT(pstate);
vtbl = &pstate->cn_vtbl;
/* Present a greeting */
/* 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
/* Then enter the command line parsing loop */
for (;;)
@ -138,7 +154,7 @@ int nsh_session(FAR struct console_stdio_s *pstate)
{
/* Parse process the command */
(void)nsh_parse(&pstate->cn_vtbl, pstate->cn_line);
(void)nsh_parse(vtbl, pstate->cn_line);
}
/* Readline normally returns the number of characters read,

View File

@ -274,7 +274,10 @@ static int nsh_telnetlogin(FAR struct console_stdio_s *pstate)
int nsh_telnetmain(int argc, char *argv[])
{
FAR struct console_stdio_s *pstate = nsh_newconsole();
FAR struct nsh_vtbl_s *vtbl;
DEBUGASSERT(pstate != NULL);
vtbl = &pstate->cn_vtbl;
dbg("Session [%d] Started\n", getpid());
@ -283,7 +286,7 @@ int nsh_telnetmain(int argc, char *argv[])
#ifdef CONFIG_NSH_TELNET_LOGIN
if (nsh_telnetlogin(pstate) != OK)
{
nsh_exit(&pstate->cn_vtbl, 1);
nsh_exit(vtbl, 1);
return -1; /* nsh_exit does not return */
}
#endif /* CONFIG_NSH_TELNET_LOGIN */
@ -293,9 +296,24 @@ int nsh_telnetmain(int argc, char *argv[])
* readline().
*/
/* Present the NSH greeting */
/* Present a greeting and possibly a Message of the Day (MOTD) */
fputs(g_nshgreeting, pstate->cn_outstream);
#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);
# else
/* Output the fixed message of the day */
fprintf(pstate->cn_outstream, "%s/n", g_nshmotd);
# endif
#endif
fflush(pstate->cn_outstream);
/* Execute the startup script. If standard console is also defined, then
@ -304,13 +322,13 @@ int nsh_telnetmain(int argc, char *argv[])
*/
#if defined(CONFIG_NSH_ROMFSETC) && !defined(CONFIG_NSH_CONSOLE)
(void)nsh_initscript(&pstate->cn_vtbl);
(void)nsh_initscript(vtbl);
#endif
/* Execute the login script */
#ifdef CONFIG_NSH_ROMFSRC
(void)nsh_loginscript(&pstate->cn_vtbl);
(void)nsh_loginscript(vtbl);
#endif
/* Then enter the command line parsing loop */
@ -328,20 +346,20 @@ int nsh_telnetmain(int argc, char *argv[])
{
/* Parse process the received Telnet command */
(void)nsh_parse(&pstate->cn_vtbl, pstate->cn_line);
(void)nsh_parse(vtbl, pstate->cn_line);
fflush(pstate->cn_outstream);
}
else
{
fprintf(pstate->cn_outstream, g_fmtcmdfailed, "nsh_telnetmain",
"fgets", NSH_ERRNO);
nsh_exit(&pstate->cn_vtbl, 1);
nsh_exit(vtbl, 1);
}
}
/* Clean up */
nsh_exit(&pstate->cn_vtbl, 0);
nsh_exit(vtbl, 0);
/* We do not get here, but this is necessary to keep some compilers happy */