7fc47129cf
It doesn't make any sense for the C library to contain private stuff that's only used by toolbox. Rather than move that stuff out of bionic and into here, let's just use the same MD5 implementation the rest of the system's using. Change-Id: Ia1c73164124094b532af3453b90c4bd1ebfdaa24
71 lines
1.4 KiB
C
71 lines
1.4 KiB
C
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <openssl/md5.h>
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|