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 93060aa59 nshlib/nsh_builtin.c : Add support to run builtin dirrectly 
as command
93060aa59 is described below

commit 93060aa59df830d2a4906138dec5253f161aeaf0
Author: wangchengdong <[email protected]>
AuthorDate: Tue Sep 9 09:12:31 2025 +0800

    nshlib/nsh_builtin.c : Add support to run builtin dirrectly as command
    
      Add a new config: NSH_BUILTIN_AS_COMMAND.
      Provide a new implementation for nsh_builtin
      when CONFIG_NSH_BUILTIN_APPS_AS_COMMAND is enabled.
    
    Signed-off-by: Chengdong Wang <[email protected]>
---
 nshlib/CMakeLists.txt |  4 +++-
 nshlib/Kconfig        |  8 ++++++++
 nshlib/Makefile       |  2 ++
 nshlib/nsh_command.c  | 29 +++++++++++++++++++++++++----
 nshlib/nsh_parse.c    |  8 ++++----
 5 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/nshlib/CMakeLists.txt b/nshlib/CMakeLists.txt
index ddfe1f87e..86b1b06ae 100644
--- a/nshlib/CMakeLists.txt
+++ b/nshlib/CMakeLists.txt
@@ -51,7 +51,9 @@ if(CONFIG_NSH_LIBRARY)
   list(APPEND CSRCS nsh_fsutils.c)
 
   if(CONFIG_NSH_BUILTIN_APPS)
-    list(APPEND CSRCS nsh_builtin.c)
+    if(NOT CONFIG_NSH_BUILTIN_AS_COMMAND)
+      list(APPEND CSRCS nsh_builtin.c)
+    endif()
   endif()
 
   if(CONFIG_NSH_FILE_APPS)
diff --git a/nshlib/Kconfig b/nshlib/Kconfig
index fa7215ce2..7fd49bbc7 100644
--- a/nshlib/Kconfig
+++ b/nshlib/Kconfig
@@ -242,6 +242,14 @@ config NSH_BUILTIN_APPS
                more information).  This options requires support for builtin
                applications (BUILTIN).
 
+config NSH_BUILTIN_AS_COMMAND
+       bool "Run builtin apps as command"
+       default n
+       depends on BUILTIN
+       ---help---
+               Enable to run builtin application directly without creating
+               a separate thread.
+
 config NSH_FILE_APPS
        bool "Enable execution of program files"
        default n
diff --git a/nshlib/Makefile b/nshlib/Makefile
index bf6ec06f7..26dbbd0de 100644
--- a/nshlib/Makefile
+++ b/nshlib/Makefile
@@ -36,8 +36,10 @@ endif
 CSRCS += nsh_fsutils.c
 
 ifeq ($(CONFIG_NSH_BUILTIN_APPS),y)
+ifneq ($(CONFIG_NSH_BUILTIN_AS_COMMAND),y)
 CSRCS += nsh_builtin.c
 endif
+endif
 
 ifeq ($(CONFIG_NSH_FILE_APPS),y)
 CSRCS += nsh_fileapps.c
diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c
index 7bbaf69be..3911e0844 100644
--- a/nshlib/nsh_command.c
+++ b/nshlib/nsh_command.c
@@ -1213,10 +1213,14 @@ static int cmd_expr(FAR struct nsh_vtbl_s *vtbl, int 
argc, FAR char **argv)
 
 int nsh_command(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char *argv[])
 {
-  const struct cmdmap_s *cmdmap;
-  const char            *cmd;
-  nsh_cmd_t              handler = cmd_unrecognized;
-  int                    ret;
+  const struct cmdmap_s  *cmdmap;
+  const char             *cmd;
+  nsh_cmd_t               handler = cmd_unrecognized;
+#ifdef CONFIG_NSH_BUILTIN_AS_COMMAND
+  const struct builtin_s *builtin;
+  int                     index;
+#endif
+  int                     ret;
 
   /* The form of argv is:
    *
@@ -1228,6 +1232,23 @@ int nsh_command(FAR struct nsh_vtbl_s *vtbl, int argc, 
FAR char *argv[])
 
   cmd = argv[0];
 
+#ifdef CONFIG_NSH_BUILTIN_AS_COMMAND
+  /* Check if the command is available in the builtin list */
+
+  index = builtin_isavail(cmd);
+
+  if (index > 0)
+    {
+      /* Get the builtin structure by index */
+
+      builtin = builtin_for_index(index);
+      if (builtin != NULL)
+        {
+          return (builtin->main)(argc, (FAR char **)argv);
+        }
+    }
+#endif
+
   /* See if the command is one that we understand */
 
   for (cmdmap = g_cmdmap; cmdmap->cmd; cmdmap++)
diff --git a/nshlib/nsh_parse.c b/nshlib/nsh_parse.c
index e21381b9f..ab5d39050 100644
--- a/nshlib/nsh_parse.c
+++ b/nshlib/nsh_parse.c
@@ -512,12 +512,12 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl,
    *
    * 1. Load a file from file system if possible.  An external command on a
    *    file system with the provided name (and on the defined PATH) takes
-   *    precendence over any other source of a command by that name.  This
+   *    precedence over any other source of a command by that name.  This
    *    allows the user to replace a built-in command with a command on a`
    *    file system
    *
    * 2. If not, run a built-in application of that name if possible.  A
-   *    built-in application will take precendence over any NSH command.
+   *    built-in application will take precedence over any NSH command.
    *
    * 3. If not, run an NSH command line command if possible.
    *
@@ -540,7 +540,7 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl,
    * Note the priority is not effected by nice-ness.
    */
 
-#ifdef CONFIG_NSH_BUILTIN_APPS
+#if defined(CONFIG_NSH_BUILTIN_APPS) && !defined(CONFIG_NSH_BUILTIN_AS_COMMAND)
   ret = nsh_builtin(vtbl, argv[0], argv, param);
   if (ret >= 0)
     {
@@ -637,7 +637,7 @@ static int nsh_execute(FAR struct nsh_vtbl_s *vtbl,
       sh_argv[3] = NULL;
 
       /* np.np_bg still there, try use nsh_builtin or nsh_fileapp to
-       * dispatch the backgroud by sh -c ""
+       * dispatch the background by sh -c ""
        */
 
       ret = nsh_execute(vtbl, 4, sh_argv, param);

Reply via email to