diff options
| author | Scott Anderson <saa@google.com> | 2012-01-13 16:20:01 -0800 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-01-13 16:20:01 -0800 |
| commit | 7abfff55a3436ea97d15c76719d95ea6721a38c2 (patch) | |
| tree | 0111d95a8533bf8763e7a3fc0eaba9046c80b97a | |
| parent | 7681059436324609c84c0ca2208827e8ba098373 (diff) | |
| parent | a9d6a534ca0d6eef631833ff891e015ad29ee9ce (diff) | |
Merge "Add md5 command to toolbox." into ics-aah
| -rw-r--r-- | toolbox/Android.mk | 5 | ||||
| -rw-r--r-- | toolbox/md5.c | 77 |
2 files changed, 81 insertions, 1 deletions
diff --git a/toolbox/Android.mk b/toolbox/Android.mk index d7a675a70b..7e20448b19 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 0000000000..2fb8b053ad --- /dev/null +++ b/toolbox/md5.c @@ -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; +} |
