9
0
Fork 0

cat accepts multiple files

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@836 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2008-08-22 00:07:57 +00:00
parent 6808a20989
commit 9370f6c69c
4 changed files with 59 additions and 46 deletions

View File

@ -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

View File

@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
<p>Last Updated: August 19, 2008</p>
<p>Last Updated: August 21, 2008</p>
</td>
</tr>
</table>
@ -1050,6 +1050,7 @@ nuttx-0.3.13 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
* 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 &lt;spudmonkey@racsa.co.cr&gt;

View File

@ -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

View File

@ -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, "<path>" },
{ "cat", cmd_cat, 2, NSH_MAX_ARGUMENTS, "<path> [<path> [<path> ...]]" },
{ "cp", cmd_cp, 3, 3, "<source-path> <dest-path>" },
#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;