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