Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion nshlib/nsh_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
54 changes: 30 additions & 24 deletions nshlib/nsh_ddcmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

/****************************************************************************
Expand Down Expand Up @@ -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;
Expand All @@ -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 */

Expand Down Expand Up @@ -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 */

Expand All @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down