Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9d6a534 authored by Scott Anderson's avatar Scott Anderson
Browse files

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: default avatarScott Anderson <saa@google.com>

(cherry picked from commit d0455c95)

Change-Id: I3be7751b6e301eb2d12844f88f1f5b9ed1225f6b
parent a9fac415
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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).

toolbox/md5.c

0 → 100644
+77 −0
Original line number Diff line number Diff line
#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;
}