1d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#include <errno.h> 2d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#include <fcntl.h> 3d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#include <stdio.h> 4d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#include <unistd.h> 5d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#include <sys/stat.h> 6d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#include <sys/types.h> 7d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#include <md5.h> 8d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 9d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson/* When this was written, bionic's md5.h did not define this. */ 10d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#ifndef MD5_DIGEST_LENGTH 11d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#define MD5_DIGEST_LENGTH 16 12d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson#endif 13d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 14d0455c952d61d36e662f4a95d5e03689ecedca8fScott Andersonstatic int usage() 15d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson{ 16d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson fprintf(stderr,"md5 file ...\n"); 17d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson return -1; 18d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson} 19d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 20d0455c952d61d36e662f4a95d5e03689ecedca8fScott Andersonstatic int do_md5(const char *path) 21d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson{ 22d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson unsigned int i; 23d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson int fd; 24d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson MD5_CTX md5_ctx; 25d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson unsigned char md5[MD5_DIGEST_LENGTH]; 26d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 27d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson fd = open(path, O_RDONLY); 28d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson if (fd < 0) { 29d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson fprintf(stderr,"could not open %s, %s\n", path, strerror(errno)); 30d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson return -1; 31d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson } 32d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 33d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson /* Note that bionic's MD5_* functions return void. */ 34d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson MD5_Init(&md5_ctx); 35d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 36d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson while (1) { 37d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson char buf[4096]; 38d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson ssize_t rlen; 39d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson rlen = read(fd, buf, sizeof(buf)); 40d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson if (rlen == 0) 41d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson break; 42d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson else if (rlen < 0) { 43d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson (void)close(fd); 44d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson fprintf(stderr,"could not read %s, %s\n", path, strerror(errno)); 45d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson return -1; 46d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson } 47d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson MD5_Update(&md5_ctx, buf, rlen); 48d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson } 49d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson if (close(fd)) { 50d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson fprintf(stderr,"could not close %s, %s\n", path, strerror(errno)); 51d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson return -1; 52d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson } 53d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 54d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson MD5_Final(md5, &md5_ctx); 55d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 56d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson for (i = 0; i < (int)sizeof(md5); i++) 57d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson printf("%02x", md5[i]); 58d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson printf(" %s\n", path); 59d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 60d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson return 0; 61d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson} 62d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 63d0455c952d61d36e662f4a95d5e03689ecedca8fScott Andersonint md5_main(int argc, char *argv[]) 64d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson{ 65d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson int i, ret = 0; 66d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 67d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson if (argc < 2) 68d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson return usage(); 69d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 70d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson /* loop over the file args */ 71d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson for (i = 1; i < argc; i++) { 72d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson if (do_md5(argv[i])) 73d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson ret = 1; 74d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson } 75d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson 76d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson return ret; 77d0455c952d61d36e662f4a95d5e03689ecedca8fScott Anderson} 78