| Index: md5/md5hl.c
|
| diff --git a/md5/md5hl.c b/md5/md5hl.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d2b7ca456b629c31a55d0653d173a2d0c17934eb
|
| --- /dev/null
|
| +++ b/md5/md5hl.c
|
| @@ -0,0 +1,114 @@
|
| +/* mdXhl.c * ----------------------------------------------------------------------------
|
| + * "THE BEER-WARE LICENSE" (Revision 42):
|
| + * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you
|
| + * can do whatever you want with this stuff. If we meet some day, and you think
|
| + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
| + * ----------------------------------------------------------------------------
|
| + * libjpeg-turbo Modifications:
|
| + * Copyright (C) 2016, D. R. Commander
|
| + * Modifications are under the same license as the original code (see above)
|
| + * ----------------------------------------------------------------------------
|
| + */
|
| +
|
| +#include <sys/types.h>
|
| +#include <sys/stat.h>
|
| +#include <fcntl.h>
|
| +#ifdef _WIN32
|
| +#include <io.h>
|
| +#define close _close
|
| +#define fstat _fstat
|
| +#define lseek _lseek
|
| +#define read _read
|
| +#define stat _stat
|
| +#else
|
| +#include <unistd.h>
|
| +#endif
|
| +
|
| +#include <errno.h>
|
| +#include <stdio.h>
|
| +#include <stdlib.h>
|
| +
|
| +#define LENGTH 16
|
| +
|
| +#include "./md5.h"
|
| +
|
| +char *
|
| +MD5End(MD5_CTX *ctx, char *buf)
|
| +{
|
| + int i;
|
| + unsigned char digest[LENGTH];
|
| + static const char hex[]="0123456789abcdef";
|
| +
|
| + if (!buf)
|
| + buf = malloc(2*LENGTH + 1);
|
| + if (!buf)
|
| + return 0;
|
| + MD5Final(digest, ctx);
|
| + for (i = 0; i < LENGTH; i++) {
|
| + buf[i+i] = hex[digest[i] >> 4];
|
| + buf[i+i+1] = hex[digest[i] & 0x0f];
|
| + }
|
| + buf[i+i] = '\0';
|
| + return buf;
|
| +}
|
| +
|
| +char *
|
| +MD5File(const char *filename, char *buf)
|
| +{
|
| + return (MD5FileChunk(filename, buf, 0, 0));
|
| +}
|
| +
|
| +char *
|
| +MD5FileChunk(const char *filename, char *buf, off_t ofs, off_t len)
|
| +{
|
| + unsigned char buffer[BUFSIZ];
|
| + MD5_CTX ctx;
|
| + struct stat stbuf;
|
| + int f, i, e;
|
| + off_t n;
|
| +
|
| + MD5Init(&ctx);
|
| +#if _WIN32
|
| + f = _open(filename, O_RDONLY|O_BINARY);
|
| +#else
|
| + f = open(filename, O_RDONLY);
|
| +#endif
|
| + if (f < 0)
|
| + return 0;
|
| + if (fstat(f, &stbuf) < 0)
|
| + return 0;
|
| + if (ofs > stbuf.st_size)
|
| + ofs = stbuf.st_size;
|
| + if ((len == 0) || (len > stbuf.st_size - ofs))
|
| + len = stbuf.st_size - ofs;
|
| + if (lseek(f, ofs, SEEK_SET) < 0)
|
| + return 0;
|
| + n = len;
|
| + i = 0;
|
| + while (n > 0) {
|
| + if (n > sizeof(buffer))
|
| + i = read(f, buffer, sizeof(buffer));
|
| + else
|
| + i = read(f, buffer, n);
|
| + if (i < 0)
|
| + break;
|
| + MD5Update(&ctx, buffer, i);
|
| + n -= i;
|
| + }
|
| + e = errno;
|
| + close(f);
|
| + errno = e;
|
| + if (i < 0)
|
| + return 0;
|
| + return (MD5End(&ctx, buf));
|
| +}
|
| +
|
| +char *
|
| +MD5Data (const void *data, unsigned int len, char *buf)
|
| +{
|
| + MD5_CTX ctx;
|
| +
|
| + MD5Init(&ctx);
|
| + MD5Update(&ctx,data,len);
|
| + return (MD5End(&ctx, buf));
|
| +}
|
|
|