From 7ccda132251b68669926669a27a9bdf6a610294d Mon Sep 17 00:00:00 2001 From: patacongo Date: Fri, 22 Aug 2008 00:07:57 +0000 Subject: [PATCH] cat accepts multiple files git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@836 42af7a65-404d-4744-a932-0658087f49c3 --- ChangeLog | 1 + Documentation/NuttX.html | 3 +- examples/nsh/nsh_fscmds.c | 96 +++++++++++++++++++++------------------ examples/nsh/nsh_main.c | 5 +- 4 files changed, 59 insertions(+), 46 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8d098eaea37..6f21cf3c19a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -416,4 +416,5 @@ * NSH now supports if-then[-else]-fi construct * NSH now supports comments beginning with '#' * NSH now supports commands to inspect and modify memory + * NSH cat command now supports multiple files on command line diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index 3c4bfe8ac2b..1c48e5d5838 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -8,7 +8,7 @@

NuttX RTOS

-

Last Updated: August 19, 2008

+

Last Updated: August 21, 2008

@@ -1050,6 +1050,7 @@ nuttx-0.3.13 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> * NSH now supports if-then[-else]-fi construct * NSH now supports comments beginning with '#' * NSH now supports commands to inspect and modify memory + * NSH cat command now supports multiple files on command line pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> diff --git a/examples/nsh/nsh_fscmds.c b/examples/nsh/nsh_fscmds.c index 75bbfc8e9d0..144cea9a47a 100644 --- a/examples/nsh/nsh_fscmds.c +++ b/examples/nsh/nsh_fscmds.c @@ -375,72 +375,82 @@ static int ls_recursive(FAR struct nsh_vtbl_s *vtbl, const char *dirpath, struct int cmd_cat(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { char buffer[IOBUFFERSIZE]; - int ret = ERROR; + int fd; + int i; + int ret = OK; - /* Open the file for reading */ + /* Loop for each file name on the command line */ - int fd = open(argv[1], O_RDONLY); - if (fd < 0) + for (i = 1; i < argc && ret == OK; i++) { - nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO); - return ERROR; - } + /* Open the file for reading */ - /* And just dump it byte for byte into stdout */ - - for (;;) - { - int nbytesread = read(fd, buffer, IOBUFFERSIZE); - - /* Check for read errors */ - - if (nbytesread < 0) + fd = open(argv[1], O_RDONLY); + if (fd < 0) { - /* EINTR is not an error */ - - if (errno != EINTR) - { - nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO); - break; - } + nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO); + ret = ERROR; } - - /* Check for data successfully read */ - - else if (nbytesread > 0) + else { - int nbyteswritten = 0; + /* And just dump it byte for byte into stdout */ - while (nbyteswritten < nbytesread) + for (;;) { - int n = write(1, buffer, nbytesread); - if (n < 0) + int nbytesread = read(fd, buffer, IOBUFFERSIZE); + + /* Check for read errors */ + + if (nbytesread < 0) { - /* EINTR is not an error */ + /* EINTR is not an error */ if (errno != EINTR) { - nsh_output(vtbl, g_fmtcmdfailed, argv[0], "write", NSH_ERRNO); + nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO); + ret = ERROR; break; } } + + /* Check for data successfully read */ + + else if (nbytesread > 0) + { + int nbyteswritten = 0; + + while (nbyteswritten < nbytesread) + { + int n = write(1, buffer, nbytesread); + if (n < 0) + { + /* EINTR is not an error */ + + if (errno != EINTR) + { + nsh_output(vtbl, g_fmtcmdfailed, argv[0], "write", NSH_ERRNO); + ret = ERROR; + break; + } + } + else + { + nbyteswritten += n; + } + } + } + + /* Otherwise, it is the end of file */ + else { - nbyteswritten += n; + break; } } - } - /* Otherwise, it is the end of file */ - - else - { - ret = OK; - break; + (void)close(fd); } } - - (void)close(fd); return ret; } #endif diff --git a/examples/nsh/nsh_main.c b/examples/nsh/nsh_main.c index b7070f43959..8cbf78ad9de 100644 --- a/examples/nsh/nsh_main.c +++ b/examples/nsh/nsh_main.c @@ -90,7 +90,7 @@ static const char g_failure[] = "1"; static const struct cmdmap_s g_cmdmap[] = { #if CONFIG_NFILE_DESCRIPTORS > 0 - { "cat", cmd_cat, 2, 2, "" }, + { "cat", cmd_cat, 2, NSH_MAX_ARGUMENTS, " [ [ ...]]" }, { "cp", cmd_cp, 3, 3, " " }, #endif #ifndef CONFIG_DISABLE_ENVIRON @@ -659,7 +659,8 @@ static inline int nsh_nice(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, FAR ch { char *endptr; vtbl->np.np_nice = (int)strtol(val, &endptr, 0); - if (vtbl->np.np_nice > 19 || vtbl->np.np_nice < -20 || endptr == val || *endptr != '\0') + if (vtbl->np.np_nice > 19 || vtbl->np.np_nice < -20 || + endptr == val || *endptr != '\0') { nsh_output(vtbl, g_fmtarginvalid, "nice"); return ERROR;