112 |
112 |
113 /* Calculate and check the MD5 hash of the supplied filename. |
113 /* Calculate and check the MD5 hash of the supplied filename. |
114 * returns true if the checksum is correct */ |
114 * returns true if the checksum is correct */ |
115 static bool FileMD5(const MD5File file, bool warn) |
115 static bool FileMD5(const MD5File file, bool warn) |
116 { |
116 { |
117 FILE *f = FioFOpenFile(file.filename); |
117 size_t size; |
|
118 FILE *f = FioFOpenFile(file.filename, "rb", DATA_DIR, &size); |
118 |
119 |
119 if (f != NULL) { |
120 if (f != NULL) { |
120 md5_state_t filemd5state; |
121 md5_state_t filemd5state; |
121 md5_byte_t buffer[1024]; |
122 md5_byte_t buffer[1024]; |
122 md5_byte_t digest[16]; |
123 md5_byte_t digest[16]; |
123 size_t len; |
124 size_t len; |
124 |
125 |
125 md5_init(&filemd5state); |
126 md5_init(&filemd5state); |
126 while ((len = fread(buffer, 1, sizeof(buffer), f)) != 0) |
127 while ((len = fread(buffer, 1, (size > sizeof(buffer)) ? sizeof(buffer) : size, f)) != 0 && size != 0) { |
|
128 size -= len; |
127 md5_append(&filemd5state, buffer, len); |
129 md5_append(&filemd5state, buffer, len); |
|
130 } |
128 |
131 |
129 if (ferror(f) && warn) ShowInfoF("Error Reading from %s \n", file.filename); |
132 if (ferror(f) && warn) ShowInfoF("Error Reading from %s \n", file.filename); |
130 fclose(f); |
133 fclose(f); |
131 |
134 |
132 md5_finish(&filemd5state, digest); |
135 md5_finish(&filemd5state, digest); |