Add md5 command to toolbox.
This command outputs the MD5 for specified files. The output is in the same form as the md5sum command on Linux. Change-Id: Ie0e6faf678469ac886bba8b46d98c0e54976a1ed Signed-off-by: Scott Anderson <saa@google.com>
This commit is contained in:
parent
a33c6ee92b
commit
d0455c952d
|
@ -55,7 +55,8 @@ TOOLS := \
|
|||
nandread \
|
||||
ionice \
|
||||
touch \
|
||||
lsof
|
||||
lsof \
|
||||
md5
|
||||
|
||||
ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
|
||||
TOOLS += r
|
||||
|
@ -68,6 +69,8 @@ LOCAL_SRC_FILES:= \
|
|||
|
||||
LOCAL_SHARED_LIBRARIES := libcutils libc libusbhost
|
||||
|
||||
LOCAL_C_INCLUDES := bionic/libc/bionic
|
||||
|
||||
LOCAL_MODULE:= toolbox
|
||||
|
||||
# Including this will define $(intermediates).
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <md5.h>
|
||||
|
||||
/* When this was written, bionic's md5.h did not define this. */
|
||||
#ifndef MD5_DIGEST_LENGTH
|
||||
#define MD5_DIGEST_LENGTH 16
|
||||
#endif
|
||||
|
||||
static int usage()
|
||||
{
|
||||
fprintf(stderr,"md5 file ...\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int do_md5(const char *path)
|
||||
{
|
||||
unsigned int i;
|
||||
int fd;
|
||||
MD5_CTX md5_ctx;
|
||||
unsigned char md5[MD5_DIGEST_LENGTH];
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr,"could not open %s, %s\n", path, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Note that bionic's MD5_* functions return void. */
|
||||
MD5_Init(&md5_ctx);
|
||||
|
||||
while (1) {
|
||||
char buf[4096];
|
||||
ssize_t rlen;
|
||||
rlen = read(fd, buf, sizeof(buf));
|
||||
if (rlen == 0)
|
||||
break;
|
||||
else if (rlen < 0) {
|
||||
(void)close(fd);
|
||||
fprintf(stderr,"could not read %s, %s\n", path, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
MD5_Update(&md5_ctx, buf, rlen);
|
||||
}
|
||||
if (close(fd)) {
|
||||
fprintf(stderr,"could not close %s, %s\n", path, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
MD5_Final(md5, &md5_ctx);
|
||||
|
||||
for (i = 0; i < (int)sizeof(md5); i++)
|
||||
printf("%02x", md5[i]);
|
||||
printf(" %s\n", path);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int md5_main(int argc, char *argv[])
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
||||
if (argc < 2)
|
||||
return usage();
|
||||
|
||||
/* loop over the file args */
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (do_md5(argv[i]))
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
Loading…
Reference in New Issue