From cdedb412ed1fcef3f5eced8055ebb9cd6973deae Mon Sep 17 00:00:00 2001 From: Alan Carvalho de Assis Date: Sat, 1 Oct 2016 07:44:15 -0600 Subject: [PATCH] apps/nshlib: Add printf command to NSH, e.g., controlling /dev/userleds from command line: nsh> printf \x01 > /dev/userleds --- nshlib/Kconfig | 4 ++ nshlib/Makefile | 4 ++ nshlib/nsh.h | 3 ++ nshlib/nsh_command.c | 22 +++++---- nshlib/nsh_printf.c | 114 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 9 deletions(-) create mode 100644 nshlib/nsh_printf.c diff --git a/nshlib/Kconfig b/nshlib/Kconfig index 0253086e7..fdf4da9cd 100644 --- a/nshlib/Kconfig +++ b/nshlib/Kconfig @@ -399,6 +399,10 @@ config NSH_DISABLE_POWEROFF default y if DEFAULT_SMALL || BOARDCTL_RESET depends on BOARDCTL_POWEROFF +config NSH_DISABLE_PRINTF + bool "Disable printf" + default y + config NSH_DISABLE_PS bool "Disable ps" default y if !FS_PROCFS || FS_PROCFS_EXCLUDE_PROCESS diff --git a/nshlib/Makefile b/nshlib/Makefile index 0e5f2beb7..feeb28298 100644 --- a/nshlib/Makefile +++ b/nshlib/Makefile @@ -93,6 +93,10 @@ ifeq ($(CONFIG_NSH_CONSOLE),y) CSRCS += nsh_consolemain.c endif +ifneq ($(CONFIG_NSH_DISABLE_PRINTF),y) +CSRCS += nsh_printf.c +endif + ifeq ($(CONFIG_NSH_TELNET),y) CSRCS += nsh_telnetd.c ifeq ($(CONFIG_NSH_TELNET_LOGIN),y) diff --git a/nshlib/nsh.h b/nshlib/nsh.h index b0ce1da01..eef16ed88 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -947,6 +947,9 @@ void nsh_usbtrace(void); #ifndef CONFIG_NSH_DISABLE_ECHO int cmd_echo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif +#ifndef CONFIG_NSH_DISABLE_PRINTF + int cmd_printf(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); +#endif #ifndef CONFIG_NSH_DISABLE_EXEC int cmd_exec(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c index c784993dd..d466fbf7f 100644 --- a/nshlib/nsh_command.c +++ b/nshlib/nsh_command.c @@ -184,9 +184,17 @@ static const struct cmdmap_s g_cmdmap[] = #ifndef CONFIG_NSH_DISABLE_ECHO # ifndef CONFIG_DISABLE_ENVIRON - { "echo", cmd_echo, 0, CONFIG_NSH_MAXARGUMENTS, "[ [...]]" }, + { "echo", cmd_echo, 1, CONFIG_NSH_MAXARGUMENTS, "[ [...]]" }, # else - { "echo", cmd_echo, 0, CONFIG_NSH_MAXARGUMENTS, "[ [...]]" }, + { "echo", cmd_echo, 1, CONFIG_NSH_MAXARGUMENTS, "[ [...]]" }, +# endif +#endif + +#ifndef CONFIG_NSH_DISABLE_PRINTF +# ifndef CONFIG_DISABLE_ENVIRON + { "printf", cmd_printf, 1, CONFIG_NSH_MAXARGUMENTS, "[\\xNN] [\\n\\r\\t] [ [...]]" }, +# else + { "printf", cmd_printf, 1, CONFIG_NSH_MAXARGUMENTS, "[\\xNN] [\\n\\r\\t] [ [...]]" }, # endif #endif @@ -413,7 +421,7 @@ static const struct cmdmap_s g_cmdmap[] = #endif #if defined(CONFIG_MODULE) && !defined(CONFIG_NSH_DISABLE_MODCMDS) - { "rmmod", cmd_rmmod, 2, 2, "" }, + { "rmmod", cmd_rmmod, 2, 2, "" }, #endif #ifndef CONFIG_DISABLE_ENVIRON @@ -489,10 +497,10 @@ static const struct cmdmap_s g_cmdmap[] = defined(CONFIG_FS_WRITABLE) && defined(CONFIG_NSH_LOGIN_PASSWD) && \ !defined(CONFIG_FSUTILS_PASSWD_READONLY) # ifndef CONFIG_NSH_DISABLE_USERADD - { "useradd", cmd_useradd, 3, 3, " " }, + { "useradd", cmd_useradd, 3, 3, " " }, # endif # ifndef CONFIG_NSH_DISABLE_USERDEL - { "userdel", cmd_userdel, 2, 2, "" }, + { "userdel", cmd_userdel, 2, 2, "" }, # endif #endif @@ -515,10 +523,6 @@ static const struct cmdmap_s g_cmdmap[] = { NULL, NULL, 1, 1, NULL } }; -/**************************************************************************** - * Public Data - ****************************************************************************/ - /**************************************************************************** * Private Functions ****************************************************************************/ diff --git a/nshlib/nsh_printf.c b/nshlib/nsh_printf.c new file mode 100644 index 000000000..60550b1af --- /dev/null +++ b/nshlib/nsh_printf.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * apps/nshlib/nsh_printf.c + * + * Copyright (C) 2016 Alan Carvalho de Assis. All rights reserved. + * Author: Alan Carvalho de Assis + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "nsh.h" +#include "nsh_console.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: cmd_printf + ****************************************************************************/ + +#ifndef CONFIG_NSH_DISABLE_PRINTF +int cmd_printf(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) +{ + FAR char *fmt; + char ch; + int i; + + /* parse each argument, detecting the right action to take + * case it doesn't starts with a format then just print it + */ + + for (i = 1; i < argc; i++) + { + fmt = argv[i]; + + /* Is it really a FORMAT ? */ + + if (fmt[0] == '\\') + { + fmt++; + ch = fmt[0]; + + switch (ch) + { + case 'x': + fmt++; + nsh_output(vtbl, "%c", strtol(fmt, NULL, 16)); + break; + + case 'n': + nsh_output(vtbl, "\n"); + break; + + case 'r': + nsh_output(vtbl, "\r"); + break; + + case 't': + nsh_output(vtbl, "\t"); + break; + + default: + break; + } + } + else + { + nsh_output(vtbl, "%s", argv[i]); + } + } + + return OK; +} +#endif