aboutsummaryrefslogtreecommitdiffstats
path: root/toolbox
diff options
context:
space:
mode:
authorScott Anderson <saa@google.com>2012-01-11 18:13:26 -0800
committerScott Anderson <saa@google.com>2012-01-11 18:13:26 -0800
commitd0455c952d61d36e662f4a95d5e03689ecedca8f (patch)
tree666c4f896c31041bb1c8107fde8709eb70b8eb3a /toolbox
parenta33c6ee92b25f6f89ca2044832344d0a6b2ccd11 (diff)
downloadsystem_core-d0455c952d61d36e662f4a95d5e03689ecedca8f.tar.gz
system_core-d0455c952d61d36e662f4a95d5e03689ecedca8f.tar.bz2
system_core-d0455c952d61d36e662f4a95d5e03689ecedca8f.zip
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>
Diffstat (limited to 'toolbox')
-rw-r--r--toolbox/Android.mk5
-rw-r--r--toolbox/md5.c77
2 files changed, 81 insertions, 1 deletions
diff --git a/toolbox/Android.mk b/toolbox/Android.mk
index d7a675a7..7e20448b 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 00000000..2fb8b053
--- /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;
+}