xref: /freebsd/lib/libmd/mdXhl.c (revision 8a24546c85d1bd2cf5c71ec245301ff0b7712bae)
1c9502b53SPoul-Henning Kamp /* mdXhl.c
2c9502b53SPoul-Henning Kamp  * ----------------------------------------------------------------------------
3c9502b53SPoul-Henning Kamp  * "THE BEER-WARE LICENSE" (Revision 42):
4c9502b53SPoul-Henning Kamp  * <phk@login.dkuug.dk> wrote this file.  As long as you retain this notice you
5c9502b53SPoul-Henning Kamp  * can do whatever you want with this stuff. If we meet some day, and you think
6c9502b53SPoul-Henning Kamp  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7c9502b53SPoul-Henning Kamp  * ----------------------------------------------------------------------------
8c9502b53SPoul-Henning Kamp  *
97f3dea24SPeter Wemm  * $FreeBSD$
10c9502b53SPoul-Henning Kamp  *
11c9502b53SPoul-Henning Kamp  */
12c9502b53SPoul-Henning Kamp 
136c20486dSPoul-Henning Kamp #include <sys/types.h>
148a24546cSPoul-Henning Kamp #include <sys/stat.h>
151ab6205cSBruce Evans #include <fcntl.h>
166c20486dSPoul-Henning Kamp #include <unistd.h>
17c9502b53SPoul-Henning Kamp 
181ab6205cSBruce Evans #include <errno.h>
191ab6205cSBruce Evans #include <stdio.h>
201ab6205cSBruce Evans #include <stdlib.h>
211ab6205cSBruce Evans 
221ab6205cSBruce Evans #include "mdX.h"
231ab6205cSBruce Evans 
24c9502b53SPoul-Henning Kamp char *
2505f65b29SPoul-Henning Kamp MDXEnd(MDX_CTX *ctx, char *buf)
26c9502b53SPoul-Henning Kamp {
27c9502b53SPoul-Henning Kamp     int i;
28c177a86bSGarrett Wollman     unsigned char digest[LENGTH];
29003d2998SGarrett Wollman     static const char hex[]="0123456789abcdef";
30c9502b53SPoul-Henning Kamp 
318bc66d9bSPoul-Henning Kamp     if (!buf)
32c177a86bSGarrett Wollman         buf = malloc(2*LENGTH + 1);
338bc66d9bSPoul-Henning Kamp     if (!buf)
3405f65b29SPoul-Henning Kamp 	return 0;
35c9502b53SPoul-Henning Kamp     MDXFinal(digest, ctx);
36c177a86bSGarrett Wollman     for (i = 0; i < LENGTH; i++) {
378bc66d9bSPoul-Henning Kamp 	buf[i+i] = hex[digest[i] >> 4];
388bc66d9bSPoul-Henning Kamp 	buf[i+i+1] = hex[digest[i] & 0x0f];
39c9502b53SPoul-Henning Kamp     }
408bc66d9bSPoul-Henning Kamp     buf[i+i] = '\0';
418bc66d9bSPoul-Henning Kamp     return buf;
42c9502b53SPoul-Henning Kamp }
43c9502b53SPoul-Henning Kamp 
44c9502b53SPoul-Henning Kamp char *
45f7787644SJoerg Wunsch MDXFile(const char *filename, char *buf)
46c9502b53SPoul-Henning Kamp {
478a24546cSPoul-Henning Kamp     return MDXFileChunk(filename, buf, 0, 0);
488a24546cSPoul-Henning Kamp }
498a24546cSPoul-Henning Kamp 
508a24546cSPoul-Henning Kamp char *
518a24546cSPoul-Henning Kamp MDXFileChunk(const char *filename, char *buf, off_t ofs, off_t len)
528a24546cSPoul-Henning Kamp {
536c20486dSPoul-Henning Kamp     unsigned char buffer[BUFSIZ];
54c9502b53SPoul-Henning Kamp     MDX_CTX ctx;
558a24546cSPoul-Henning Kamp     struct stat stbuf;
568a24546cSPoul-Henning Kamp     int f, i, e;
578a24546cSPoul-Henning Kamp     off_t n;
58c9502b53SPoul-Henning Kamp 
59c9502b53SPoul-Henning Kamp     MDXInit(&ctx);
60c9502b53SPoul-Henning Kamp     f = open(filename, O_RDONLY);
61c9502b53SPoul-Henning Kamp     if (f < 0) return 0;
628a24546cSPoul-Henning Kamp     if (fstat(f, &stbuf) < 0) return 0;
638a24546cSPoul-Henning Kamp     if (ofs > stbuf.st_size)
648a24546cSPoul-Henning Kamp 	ofs = stbuf.st_size;
658a24546cSPoul-Henning Kamp     if ((len == 0) || (len > stbuf.st_size - ofs))
668a24546cSPoul-Henning Kamp 	len = stbuf.st_size - ofs;
678a24546cSPoul-Henning Kamp     if (lseek(f, ofs, SEEK_SET) < 0) return 0;
688a24546cSPoul-Henning Kamp     n = len;
698a24546cSPoul-Henning Kamp     while (n > 0) {
708a24546cSPoul-Henning Kamp 	if (n > sizeof(buffer))
718a24546cSPoul-Henning Kamp 	    i = read(f, buffer, sizeof(buffer));
728a24546cSPoul-Henning Kamp 	else
738a24546cSPoul-Henning Kamp 	    i = read(f, buffer, n);
748a24546cSPoul-Henning Kamp 	if (i < 0) break;
75c9502b53SPoul-Henning Kamp 	MDXUpdate(&ctx, buffer, i);
768a24546cSPoul-Henning Kamp 	n -= i;
77c9502b53SPoul-Henning Kamp     }
788a24546cSPoul-Henning Kamp     e = errno;
79c9502b53SPoul-Henning Kamp     close(f);
808a24546cSPoul-Henning Kamp     errno = e;
81c9502b53SPoul-Henning Kamp     if (i < 0) return 0;
8205f65b29SPoul-Henning Kamp     return MDXEnd(&ctx, buf);
83c9502b53SPoul-Henning Kamp }
84c9502b53SPoul-Henning Kamp 
85c9502b53SPoul-Henning Kamp char *
8605f65b29SPoul-Henning Kamp MDXData (const unsigned char *data, unsigned int len, char *buf)
87c9502b53SPoul-Henning Kamp {
88c9502b53SPoul-Henning Kamp     MDX_CTX ctx;
89c9502b53SPoul-Henning Kamp 
90c9502b53SPoul-Henning Kamp     MDXInit(&ctx);
91c9502b53SPoul-Henning Kamp     MDXUpdate(&ctx,data,len);
9205f65b29SPoul-Henning Kamp     return MDXEnd(&ctx, buf);
93c9502b53SPoul-Henning Kamp }
94