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 e5a1bb179 nshlib/dd: Add support for reading from/writing to standard 
input/output
e5a1bb179 is described below

commit e5a1bb17969ca40c0706dcffe9052eeab32c1a10
Author: wangjianyu3 <wangjian...@xiaomi.com>
AuthorDate: Thu Oct 17 16:32:15 2024 +0800

    nshlib/dd: Add support for reading from/writing to standard input/output
    
    Test
      1. Input from stdin and output to stdout
           Keyboard input: 12345AAAAABBBBB
        nsh> dd bs=5
        1234512345AAAAAAAAAABBBBBBBBBB
    
      2. Input from file and output to stdout
        nsh> dd if=/etc/init.d/rc.sysinit
        mkrd -m 2 -s 512 1024
        mkfatfs /dev/ram2
        mount -t vfat /dev/ram2 "/tmp"
    
      3. Input from stdin and output to file
           Keyboard input: QWERT
        dd of=/data/dd_stdout bs=5
    
        Then, cat the output file in host (based on HostFS):
        $ cat ./dd_stdout
        QWERT
    
    Signed-off-by: wangjianyu3 <wangjian...@xiaomi.com>
---
 nshlib/nsh_command.c |  2 +-
 nshlib/nsh_ddcmd.c   | 54 +++++++++++++++++++++++++++++-----------------------
 2 files changed, 31 insertions(+), 25 deletions(-)

diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c
index 155b0fa6e..9358d0a9c 100644
--- a/nshlib/nsh_command.c
+++ b/nshlib/nsh_command.c
@@ -186,7 +186,7 @@ static const struct cmdmap_s g_cmdmap[] =
 #endif
 
 #ifndef CONFIG_NSH_DISABLE_DD
-  CMD_MAP("dd",       cmd_dd,       3, 7,
+  CMD_MAP("dd",       cmd_dd,       1, 7,
     "if=<infile> of=<outfile> [bs=<sectsize>] [count=<sectors>] "
     "[skip=<sectors>] [seek=<sectors>] [verify] [conv=<nocreat,notrunc>]"),
 #endif
diff --git a/nshlib/nsh_ddcmd.c b/nshlib/nsh_ddcmd.c
index c56997ff6..db1aff68c 100644
--- a/nshlib/nsh_ddcmd.c
+++ b/nshlib/nsh_ddcmd.c
@@ -54,13 +54,6 @@
  */
 
 #define DEFAULT_SECTSIZE 512
-
-/* At present, piping of input and output are not support, i.e., both of=
- * and if= arguments are required.
- */
-
-#undef CAN_PIPE_FROM_STD
-
 #define g_dd "dd"
 
 /****************************************************************************
@@ -258,10 +251,15 @@ static int dd_verify(FAR const char *infile, FAR const 
char *outfile,
 
 /****************************************************************************
  * Name: cmd_dd
+ *
+ * At present, redirect of input and output are supported.
+ * of= and if= arguments are required only when verify enabled.
+ *
  ****************************************************************************/
 
 int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
 {
+  FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl;
   struct dd_s dd;
   FAR char *infile = NULL;
   FAR char *outfile = NULL;
@@ -287,17 +285,13 @@ int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR 
char **argv)
    * from stdin.
    */
 
-#ifdef CAN_PIPE_FROM_STD
-  dd->infd     = 0;       /* stdin */
-#endif
+  dd.infd      = INFD(pstate);      /* stdin */
 
   /* If no OF= option is provided on the command line, then write
    * to stdout.
    */
 
-#ifdef CAN_PIPE_FROM_STD
-  dd->outfd    = 1;       /* stdout */
-#endif
+  dd.outfd     = OUTFD(pstate);     /* stdout */
 
   /* Parse command line parameters */
 
@@ -354,13 +348,13 @@ int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR 
char **argv)
         }
     }
 
-#ifndef CAN_PIPE_FROM_STD
-  if (infile == NULL || outfile == NULL)
+  /* If verify enabled, infile and outfile are mandatory */
+
+  if ((dd.oflags & O_RDONLY) && (infile == NULL || outfile == NULL))
     {
       nsh_error(vtbl, g_fmtargrequired, g_dd);
       goto errout_with_paths;
     }
-#endif
 
   /* Allocate the I/O buffer */
 
@@ -373,18 +367,24 @@ int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR 
char **argv)
 
   /* Open the input file */
 
-  ret = dd_infopen(infile, &dd);
-  if (ret < 0)
+  if (infile)
     {
-      goto errout_with_alloc;
+      ret = dd_infopen(infile, &dd);
+      if (ret < 0)
+        {
+          goto errout_with_alloc;
+        }
     }
 
   /* Open the output file */
 
-  ret = dd_outfopen(outfile, &dd);
-  if (ret < 0)
+  if (outfile)
     {
-      goto errout_with_inf;
+      ret = dd_outfopen(outfile, &dd);
+      if (ret < 0)
+        {
+          goto errout_with_inf;
+        }
     }
 
   /* Then perform the data transfer */
@@ -467,10 +467,16 @@ int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR 
char **argv)
     }
 
 errout_with_outf:
-  close(dd.outfd);
+  if (outfile)
+    {
+      close(dd.outfd);
+    }
 
 errout_with_inf:
-  close(dd.infd);
+  if (infile)
+    {
+      close(dd.infd);
+    }
 
 errout_with_alloc:
   free(dd.buffer);

Reply via email to