static ssize_t read_rom_file(const char *path, void **buf) { uint8_t *ret_buf = NULL; ssize_t ret = read_file(path, (void**)&ret_buf); if (ret <= 0) return ret; if (!g_extern.block_patch) { // Attempt to apply a patch. patch_rom(&ret_buf, &ret); } g_extern.cart_crc = crc32_calculate(ret_buf, ret); sha256_hash(g_extern.sha256, ret_buf, ret); RARCH_LOG("CRC32: 0x%x, SHA256: %s\n", (unsigned)g_extern.cart_crc, g_extern.sha256); *buf = ret_buf; return ret; }
static ssize_t read_rom_file(FILE *file, void **buf) { ssize_t ret = 0; uint8_t *ret_buf = NULL; if (file == NULL) // stdin { #if defined(_WIN32) && !defined(_XBOX) _setmode(0, O_BINARY); #endif RARCH_LOG("Reading ROM from stdin ...\n"); size_t buf_size = 0xfffff; // Some initial guesstimate. size_t buf_ptr = 0; uint8_t *rom_buf = (uint8_t*)malloc(buf_size); if (rom_buf == NULL) { RARCH_ERR("Couldn't allocate memory.\n"); return -1; } for (;;) { size_t ret = fread(rom_buf + buf_ptr, 1, buf_size - buf_ptr, stdin); buf_ptr += ret; // We've reached the end if (buf_ptr < buf_size) break; rom_buf = (uint8_t*)realloc(rom_buf, buf_size * 2); if (rom_buf == NULL) { RARCH_ERR("Couldn't allocate memory.\n"); return -1; } buf_size *= 2; } ret_buf = rom_buf; ret = buf_ptr; } else { fseek(file, 0, SEEK_END); ret = ftell(file); rewind(file); void *rom_buf = malloc(ret); if (rom_buf == NULL) { RARCH_ERR("Couldn't allocate memory.\n"); return -1; } if (fread(rom_buf, 1, ret, file) < (size_t)ret) { RARCH_ERR("Didn't read whole file.\n"); free(rom_buf); return -1; } ret_buf = (uint8_t*)rom_buf; } if (!g_extern.block_patch) { // Attempt to apply a patch. patch_rom(&ret_buf, &ret); } g_extern.cart_crc = crc32_calculate(ret_buf, ret); sha256_hash(g_extern.sha256, ret_buf, ret); RARCH_LOG("CRC32: 0x%x, SHA256: %s\n", (unsigned)g_extern.cart_crc, g_extern.sha256); *buf = ret_buf; return ret; }
// Load SNES rom only. Applies a hack for headered ROMs. static ssize_t read_rom_file(FILE *file, void **buf) { ssize_t ret = 0; uint8_t *ret_buf = NULL; if (file == NULL) // stdin { #if defined(_WIN32) && !defined(_XBOX) setmode(0, O_BINARY); #endif RARCH_LOG("Reading ROM from stdin ...\n"); size_t buf_size = 0xFFFFF; // Some initial guesstimate. size_t buf_ptr = 0; uint8_t *rom_buf = (uint8_t*)malloc(buf_size); if (rom_buf == NULL) { RARCH_ERR("Couldn't allocate memory.\n"); return -1; } for (;;) { size_t ret = fread(rom_buf + buf_ptr, 1, buf_size - buf_ptr, stdin); buf_ptr += ret; // We've reached the end if (buf_ptr < buf_size) break; rom_buf = (uint8_t*)realloc(rom_buf, buf_size * 2); if (rom_buf == NULL) { RARCH_ERR("Couldn't allocate memory.\n"); return -1; } buf_size *= 2; } ret_buf = rom_buf; ret = buf_ptr; } else { fseek(file, 0, SEEK_END); ret = ftell(file); rewind(file); void *rom_buf = malloc(ret); if (rom_buf == NULL) { RARCH_ERR("Couldn't allocate memory.\n"); return -1; } if (fread(rom_buf, 1, ret, file) < (size_t)ret) { RARCH_ERR("Didn't read whole file.\n"); free(rom_buf); return -1; } ret_buf = (uint8_t*)rom_buf; } if (!g_extern.block_patch) { // Attempt to apply a patch. patch_rom(&ret_buf, &ret); } // Remove copier header if present (512 first bytes). if ((ret & 0x7fff) == 512) { memmove(ret_buf, ret_buf + 512, ret - 512); ret -= 512; } g_extern.cart_crc = crc32_calculate(ret_buf, ret); #ifdef HAVE_XML sha256_hash(g_extern.sha256, ret_buf, ret); RARCH_LOG("SHA256 sum: %s\n", g_extern.sha256); #endif *buf = ret_buf; return ret; }