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.

Signed-off-by: Scott Anderson <saa@google.com>

(cherry picked from commit d0455c952d)

Change-Id: I3be7751b6e301eb2d12844f88f1f5b9ed1225f6b
This commit is contained in:
Scott Anderson 2012-01-11 18:13:26 -08:00
parent a9fac4155f
commit a9d6a534ca
2 changed files with 81 additions and 1 deletions

View file

@ -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).

77
toolbox/md5.c Normal file
View file

@ -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;
}