|
|
|
@ -1232,3 +1232,84 @@ int cmd_sh(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
@@ -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 |
|
|
|
|