md5.c revision d0455c952d61d36e662f4a95d5e03689ecedca8f
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