aboutsummaryrefslogtreecommitdiff
path: root/apps/nshlib
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2013-02-18 10:19:38 +1100
committerAndrew Tridgell <tridge@samba.org>2013-02-18 10:19:38 +1100
commit1670b8afe13ba6c845800228d1c8829aa1bf31c9 (patch)
tree1dc66cb870de469ff252687d0f209def425d177c /apps/nshlib
parent9b7ee0c91b978ffd897e45366050ce8faf02606f (diff)
downloadpx4-firmware-1670b8afe13ba6c845800228d1c8829aa1bf31c9.tar.gz
px4-firmware-1670b8afe13ba6c845800228d1c8829aa1bf31c9.tar.bz2
px4-firmware-1670b8afe13ba6c845800228d1c8829aa1bf31c9.zip
nshlib: added cmp command to nsh
this is useful for startup scripts testing for auto-upgrade of add-on board firmware
Diffstat (limited to 'apps/nshlib')
-rw-r--r--apps/nshlib/Kconfig4
-rw-r--r--apps/nshlib/nsh.h3
-rw-r--r--apps/nshlib/nsh_fscmds.c81
-rw-r--r--apps/nshlib/nsh_parse.c3
4 files changed, 91 insertions, 0 deletions
diff --git a/apps/nshlib/Kconfig b/apps/nshlib/Kconfig
index 92bc83cfd..d7a7b8a99 100644
--- a/apps/nshlib/Kconfig
+++ b/apps/nshlib/Kconfig
@@ -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
diff --git a/apps/nshlib/nsh.h b/apps/nshlib/nsh.h
index 23209dba5..83cf25aa7 100644
--- a/apps/nshlib/nsh.h
+++ b/apps/nshlib/nsh.h
@@ -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
diff --git a/apps/nshlib/nsh_fscmds.c b/apps/nshlib/nsh_fscmds.c
index f47dca896..83717e416 100644
--- a/apps/nshlib/nsh_fscmds.c
+++ b/apps/nshlib/nsh_fscmds.c
@@ -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
diff --git a/apps/nshlib/nsh_parse.c b/apps/nshlib/nsh_parse.c
index f679d9b32..4d8f04b23 100644
--- a/apps/nshlib/nsh_parse.c
+++ b/apps/nshlib/nsh_parse.c
@@ -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)