From d0455c952d61d36e662f4a95d5e03689ecedca8f Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 11 Jan 2012 18:13:26 -0800 Subject: 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 --- toolbox/Android.mk | 5 +++- toolbox/md5.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 toolbox/md5.c (limited to 'toolbox') diff --git a/toolbox/Android.mk b/toolbox/Android.mk index d7a675a..7e20448 100644 --- a/toolbox/Android.mk +++ b/toolbox/Android.mk @@ -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). diff --git a/toolbox/md5.c b/toolbox/md5.c new file mode 100644 index 0000000..2fb8b05 --- /dev/null +++ b/toolbox/md5.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include +#include +#include + +/* 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; +} -- cgit v1.1