1c64685aaSPoul-Henning Kamp /* mdXhl.c * ---------------------------------------------------------------------------- 2c9502b53SPoul-Henning Kamp * "THE BEER-WARE LICENSE" (Revision 42): 3aaead0dfSPoul-Henning Kamp * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 4c9502b53SPoul-Henning Kamp * can do whatever you want with this stuff. If we meet some day, and you think 5c9502b53SPoul-Henning Kamp * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 6c9502b53SPoul-Henning Kamp * ---------------------------------------------------------------------------- 7c9502b53SPoul-Henning Kamp */ 8c9502b53SPoul-Henning Kamp 95d946b40SMatthew Dillon #include <sys/cdefs.h> 105d946b40SMatthew Dillon __FBSDID("$FreeBSD$"); 115d946b40SMatthew Dillon 126c20486dSPoul-Henning Kamp #include <sys/types.h> 138a24546cSPoul-Henning Kamp #include <sys/stat.h> 141ab6205cSBruce Evans #include <fcntl.h> 156c20486dSPoul-Henning Kamp #include <unistd.h> 16c9502b53SPoul-Henning Kamp 171ab6205cSBruce Evans #include <errno.h> 181ab6205cSBruce Evans #include <stdio.h> 191ab6205cSBruce Evans #include <stdlib.h> 201ab6205cSBruce Evans 211ab6205cSBruce Evans #include "mdX.h" 221ab6205cSBruce Evans 23c9502b53SPoul-Henning Kamp char * 2405f65b29SPoul-Henning Kamp MDXEnd(MDX_CTX *ctx, char *buf) 25c9502b53SPoul-Henning Kamp { 26c9502b53SPoul-Henning Kamp int i; 27c177a86bSGarrett Wollman unsigned char digest[LENGTH]; 28003d2998SGarrett Wollman static const char hex[]="0123456789abcdef"; 29c9502b53SPoul-Henning Kamp 308bc66d9bSPoul-Henning Kamp if (!buf) 31c177a86bSGarrett Wollman buf = malloc(2*LENGTH + 1); 328bc66d9bSPoul-Henning Kamp if (!buf) 3305f65b29SPoul-Henning Kamp return 0; 34c9502b53SPoul-Henning Kamp MDXFinal(digest, ctx); 35c177a86bSGarrett Wollman for (i = 0; i < LENGTH; i++) { 368bc66d9bSPoul-Henning Kamp buf[i+i] = hex[digest[i] >> 4]; 378bc66d9bSPoul-Henning Kamp buf[i+i+1] = hex[digest[i] & 0x0f]; 38c9502b53SPoul-Henning Kamp } 398bc66d9bSPoul-Henning Kamp buf[i+i] = '\0'; 408bc66d9bSPoul-Henning Kamp return buf; 41c9502b53SPoul-Henning Kamp } 42c9502b53SPoul-Henning Kamp 43c9502b53SPoul-Henning Kamp char * 44f7787644SJoerg Wunsch MDXFile(const char *filename, char *buf) 45c9502b53SPoul-Henning Kamp { 46c64685aaSPoul-Henning Kamp return (MDXFileChunk(filename, buf, 0, 0)); 478a24546cSPoul-Henning Kamp } 488a24546cSPoul-Henning Kamp 498a24546cSPoul-Henning Kamp char * 508a24546cSPoul-Henning Kamp MDXFileChunk(const char *filename, char *buf, off_t ofs, off_t len) 518a24546cSPoul-Henning Kamp { 526c20486dSPoul-Henning Kamp unsigned char buffer[BUFSIZ]; 53c9502b53SPoul-Henning Kamp MDX_CTX ctx; 548a24546cSPoul-Henning Kamp struct stat stbuf; 558a24546cSPoul-Henning Kamp int f, i, e; 568a24546cSPoul-Henning Kamp off_t n; 57c9502b53SPoul-Henning Kamp 58c9502b53SPoul-Henning Kamp MDXInit(&ctx); 59c9502b53SPoul-Henning Kamp f = open(filename, O_RDONLY); 60c64685aaSPoul-Henning Kamp if (f < 0) 61c64685aaSPoul-Henning Kamp return 0; 62c64685aaSPoul-Henning Kamp if (fstat(f, &stbuf) < 0) 63c64685aaSPoul-Henning Kamp return 0; 648a24546cSPoul-Henning Kamp if (ofs > stbuf.st_size) 658a24546cSPoul-Henning Kamp ofs = stbuf.st_size; 668a24546cSPoul-Henning Kamp if ((len == 0) || (len > stbuf.st_size - ofs)) 678a24546cSPoul-Henning Kamp len = stbuf.st_size - ofs; 68c64685aaSPoul-Henning Kamp if (lseek(f, ofs, SEEK_SET) < 0) 69c64685aaSPoul-Henning Kamp return 0; 708a24546cSPoul-Henning Kamp n = len; 712ca72005SBruce A. Mah i = 0; 728a24546cSPoul-Henning Kamp while (n > 0) { 738a24546cSPoul-Henning Kamp if (n > sizeof(buffer)) 748a24546cSPoul-Henning Kamp i = read(f, buffer, sizeof(buffer)); 758a24546cSPoul-Henning Kamp else 768a24546cSPoul-Henning Kamp i = read(f, buffer, n); 77c64685aaSPoul-Henning Kamp if (i < 0) 78c64685aaSPoul-Henning Kamp break; 79c9502b53SPoul-Henning Kamp MDXUpdate(&ctx, buffer, i); 808a24546cSPoul-Henning Kamp n -= i; 81c9502b53SPoul-Henning Kamp } 828a24546cSPoul-Henning Kamp e = errno; 83c9502b53SPoul-Henning Kamp close(f); 848a24546cSPoul-Henning Kamp errno = e; 85c64685aaSPoul-Henning Kamp if (i < 0) 86c64685aaSPoul-Henning Kamp return 0; 87c64685aaSPoul-Henning Kamp return (MDXEnd(&ctx, buf)); 88c9502b53SPoul-Henning Kamp } 89c9502b53SPoul-Henning Kamp 90c9502b53SPoul-Henning Kamp char * 9105f65b29SPoul-Henning Kamp MDXData (const unsigned char *data, unsigned int len, char *buf) 92c9502b53SPoul-Henning Kamp { 93c9502b53SPoul-Henning Kamp MDX_CTX ctx; 94c9502b53SPoul-Henning Kamp 95c9502b53SPoul-Henning Kamp MDXInit(&ctx); 96c9502b53SPoul-Henning Kamp MDXUpdate(&ctx,data,len); 97c64685aaSPoul-Henning Kamp return (MDXEnd(&ctx, buf)); 98c9502b53SPoul-Henning Kamp } 99