From e39cfc97c7868b692e70be43a924ac2247b86bda Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Thu, 25 Aug 2016 11:31:08 -0600 Subject: [PATCH] Add logic to support an NSH-specific system command --- include/nshlib/nshlib.h | 21 +++++++++ nshlib/Makefile | 2 +- nshlib/nsh_consolemain.c | 24 ---------- nshlib/nsh_fileapps.c | 24 ---------- nshlib/nsh_system.c | 98 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 120 insertions(+), 49 deletions(-) create mode 100644 nshlib/nsh_system.c diff --git a/include/nshlib/nshlib.h b/include/nshlib/nshlib.h index 3976d669a..0029ab2e9 100644 --- a/include/nshlib/nshlib.h +++ b/include/nshlib/nshlib.h @@ -201,6 +201,27 @@ void platform_motd(FAR char *buffer, size_t buflen); int platform_user_verify(FAR const char *username, FAR const char *password); #endif +/**************************************************************************** + * Name: nsh_system + * + * Description: + * This is the NSH-specific implementation of the standard system() + * command. + * + * NOTE: This assumes that other NSH instances have previously ran and so + * common NSH logic is already initialized. + * + * Input Parameters: + * Standard task start-up arguments. Expects argc == 2 with argv[1] being + * the command to execute + * + * Returned Values: + * EXIT_SUCCESS or EXIT_FAILURE + * + ****************************************************************************/ + +int nsh_system(int argc, char *argv[]); + #undef EXTERN #ifdef __cplusplus } diff --git a/nshlib/Makefile b/nshlib/Makefile index 5675d2ce2..0e5f2beb7 100644 --- a/nshlib/Makefile +++ b/nshlib/Makefile @@ -40,7 +40,7 @@ include $(APPDIR)/Make.defs # NSH Library ASRCS = -CSRCS = nsh_init.c nsh_parse.c nsh_console.c nsh_script.c +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 diff --git a/nshlib/nsh_consolemain.c b/nshlib/nsh_consolemain.c index ec3f1c673..3d08122a5 100644 --- a/nshlib/nsh_consolemain.c +++ b/nshlib/nsh_consolemain.c @@ -47,30 +47,6 @@ #if !defined(HAVE_USB_CONSOLE) && !defined(HAVE_USB_KEYBOARD) -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Types - ****************************************************************************/ - -/**************************************************************************** - * Private Function Prototypes - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Public Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - /**************************************************************************** * Public Functions ****************************************************************************/ diff --git a/nshlib/nsh_fileapps.c b/nshlib/nsh_fileapps.c index f32f0d494..ca6cccbc8 100644 --- a/nshlib/nsh_fileapps.c +++ b/nshlib/nsh_fileapps.c @@ -53,30 +53,6 @@ #ifdef CONFIG_NSH_FILE_APPS -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Types - ****************************************************************************/ - -/**************************************************************************** - * Private Function Prototypes - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Public Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - /**************************************************************************** * Public Functions ****************************************************************************/ diff --git a/nshlib/nsh_system.c b/nshlib/nsh_system.c new file mode 100644 index 000000000..e882a5535 --- /dev/null +++ b/nshlib/nsh_system.c @@ -0,0 +1,98 @@ +/**************************************************************************** + * apps/nshlib/nsh_system.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 Gregory Nutt 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 "nsh.h" +#include "nsh_console.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nsh_system + * + * Description: + * This is the NSH-specific implementation of the standard system() + * command. + * + * NOTE: This assumes that other NSH instances have previously ran and so + * common NSH logic is already initialized. + * + * Input Parameters: + * Standard task start-up arguments. Expects argc == 2 with argv[1] being + * the command to execute + * + * Returned Values: + * EXIT_SUCCESS or EXIT_FAILURE + * + ****************************************************************************/ + +int nsh_system(int argc, char *argv[]) +{ + /* Expect argc == 2 with argv[1] being the command to execute */ + + if (argc >= 2) + { + FAR struct console_stdio_s *pstate = nsh_newconsole(); + FAR struct nsh_vtbl_s *vtbl; + + DEBUGASSERT(pstate != NULL && pstate->cn_vtbl != NULL); + vtbl = &pstate->cn_vtbl; + + /* Parse process the command */ + + (void)nsh_parse(vtbl, argv[1]); + fflush(pstate->cn_outstream); + + /* Exit upon return */ + + nsh_exit(&pstate->cn_vtbl, OK); + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } +}