00001 00002 #include <sys/errno.h> 00003 00004 #include "../debug/Log.h" 00005 #include "../io/FileUtils.h" 00006 #include "../io/MmapFile.h" 00007 #include "../util/MD5.h" 00008 00009 using namespace oasys; 00010 00011 int 00012 main(int argc, const char** argv) 00013 { 00014 const char* LOG = "/md5chunks"; 00015 00016 if (argc != 3) { 00017 fprintf(stderr, "usage: %s <filename> <size>\n", argv[0]); 00018 exit(1); 00019 } 00020 00021 const char* filename = argv[1]; 00022 size_t chunk_size = (size_t)atoi(argv[2]); 00023 00024 Log::init(); 00025 00026 int size = FileUtils::size(filename); 00027 if (size < 0) { 00028 log_err_p(LOG, "error getting file size %s: %s", 00029 filename, strerror(errno)); 00030 exit(1); 00031 } 00032 00033 MmapFile mm("/md5chunks/mmap"); 00034 const u_char* bp = (const u_char*)mm.map(filename, PROT_READ, 0); 00035 if (bp == NULL) { 00036 log_err_p(LOG, "error mmap'ing file: %s", strerror(errno)); 00037 exit(1); 00038 } 00039 00040 size_t todo = size; 00041 int i = 0; 00042 do { 00043 size_t chunk = std::min(chunk_size, todo); 00044 MD5 md5; 00045 md5.update(bp, chunk); 00046 md5.finalize(); 00047 printf("%s\t%d\t%zu\t%s\n", filename, i, chunk, md5.digest_ascii().c_str()); 00048 fflush(stdout); 00049 i++; 00050 todo -= chunk; 00051 bp += chunk; 00052 } while (todo != 0); 00053 }