forked from Archive/PX4-Autopilot
nshlib: added cmp command to nsh
this is useful for startup scripts testing for auto-upgrade of add-on board firmware
This commit is contained in:
parent
9b7ee0c91b
commit
1670b8afe1
|
@ -55,6 +55,10 @@ config NSH_DISABLE_CP
|
|||
bool "Disable cp"
|
||||
default n
|
||||
|
||||
config NSH_DISABLE_CMP
|
||||
bool "Disable cmp"
|
||||
default n
|
||||
|
||||
config NSH_DISABLE_DD
|
||||
bool "Disable dd"
|
||||
default n
|
||||
|
|
|
@ -603,6 +603,9 @@ void nsh_usbtrace(void);
|
|||
# ifndef CONFIG_NSH_DISABLE_CP
|
||||
int cmd_cp(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_CMP
|
||||
int cmd_cmp(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_DD
|
||||
int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
|
|
|
@ -1232,3 +1232,84 @@ int cmd_sh(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
|||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||
#ifndef CONFIG_NSH_DISABLE_CMP
|
||||
int cmd_cmp(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
char *path1 = NULL;
|
||||
char *path2 = NULL;
|
||||
int fd1 = -1, fd2 = -1;
|
||||
int ret = ERROR;
|
||||
unsigned total_read = 0;
|
||||
|
||||
/* Get the full path to the two files */
|
||||
|
||||
path1 = nsh_getfullpath(vtbl, argv[1]);
|
||||
if (!path1)
|
||||
{
|
||||
goto errout;
|
||||
}
|
||||
|
||||
path2 = nsh_getfullpath(vtbl, argv[2]);
|
||||
if (!path2)
|
||||
{
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Open the files for reading */
|
||||
fd1 = open(path1, O_RDONLY);
|
||||
if (fd1 < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
fd2 = open(path2, O_RDONLY);
|
||||
if (fd2 < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
char buf1[128];
|
||||
char buf2[128];
|
||||
|
||||
int nbytesread1 = read(fd1, buf1, sizeof(buf1));
|
||||
int nbytesread2 = read(fd2, buf2, sizeof(buf2));
|
||||
|
||||
if (nbytesread1 < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
if (nbytesread2 < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
total_read += nbytesread1>nbytesread2?nbytesread2:nbytesread1;
|
||||
|
||||
if (nbytesread1 != nbytesread2 || memcmp(buf1, buf2, nbytesread1) != 0)
|
||||
{
|
||||
nsh_output(vtbl, "files differ: byte %u\n", total_read);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
if (nbytesread1 < sizeof(buf1)) break;
|
||||
}
|
||||
|
||||
ret = OK;
|
||||
|
||||
errout:
|
||||
if (fd1 != -1) close(fd1);
|
||||
if (fd2 != -1) close(fd2);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -175,6 +175,9 @@ static const struct cmdmap_s g_cmdmap[] =
|
|||
# ifndef CONFIG_NSH_DISABLE_CP
|
||||
{ "cp", cmd_cp, 3, 3, "<source-path> <dest-path>" },
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_CMP
|
||||
{ "cmp", cmd_cmp, 3, 3, "<path1> <path2>" },
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined (CONFIG_RTC) && !defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_NSH_DISABLE_DATE)
|
||||
|
|
Loading…
Reference in New Issue