Fix initializing savegames when writing to disk fails

This commit is contained in:
Jeffrey Pfau 2013-09-22 02:13:03 -07:00
parent e80ab4c855
commit 4523777bee
1 changed files with 25 additions and 14 deletions

View File

@ -2,6 +2,7 @@
#include "gba.h"
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
@ -38,32 +39,42 @@ void GBASavedataDeinit(struct GBASavedata* savedata) {
void GBASavedataInitFlash(struct GBASavedata* savedata) {
savedata->type = SAVEDATA_FLASH512;
savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666);
off_t end;
int flags = MAP_SHARED;
if (savedata->fd < 0) {
GBALog(GBA_LOG_WARN, "Cannot open savedata file %s", savedata->filename);
return;
GBALog(GBA_LOG_WARN, "Cannot open savedata file %s (errno: %d)", savedata->filename, errno);
end = 0;
flags |= MAP_ANON;
} else {
end = lseek(savedata->fd, 0, SEEK_END);
if (end < SIZE_CART_FLASH512) {
ftruncate(savedata->fd, SIZE_CART_FLASH1M);
}
}
// mmap enough so that we can expand the file if we need to
savedata->data = mmap(0, SIZE_CART_FLASH1M, PROT_READ | PROT_WRITE, MAP_SHARED, savedata->fd, 0);
off_t end = lseek(savedata->fd, 0, SEEK_END);
savedata->data = mmap(0, SIZE_CART_FLASH1M, PROT_READ | PROT_WRITE, flags, savedata->fd, 0);
if (end < SIZE_CART_FLASH512) {
ftruncate(savedata->fd, SIZE_CART_SRAM);
memset(&savedata->data[end], 0xFF, SIZE_CART_SRAM - end);
memset(&savedata->data[end], 0xFF, SIZE_CART_FLASH512 - end);
}
}
void GBASavedataInitEEPROM(struct GBASavedata* savedata) {
savedata->type = SAVEDATA_EEPROM;
savedata->fd = open(savedata->filename, O_RDWR | O_CREAT, 0666);
off_t end;
int flags = MAP_SHARED;
if (savedata->fd < 0) {
GBALog(GBA_LOG_WARN, "Cannot open savedata file %s", savedata->filename);
return;
GBALog(GBA_LOG_WARN, "Cannot open savedata file %s (errno: %d)", savedata->filename, errno);
end = 0;
flags |= MAP_ANON;
} else {
end = lseek(savedata->fd, 0, SEEK_END);
if (end < SIZE_CART_EEPROM) {
ftruncate(savedata->fd, SIZE_CART_EEPROM);
}
}
savedata->data = mmap(0, SIZE_CART_EEPROM, PROT_READ | PROT_WRITE, MAP_SHARED, savedata->fd, 0);
off_t end = lseek(savedata->fd, 0, SEEK_END);
savedata->data = mmap(0, SIZE_CART_EEPROM, PROT_READ | PROT_WRITE, flags, savedata->fd, 0);
if (end < SIZE_CART_EEPROM) {
ftruncate(savedata->fd, SIZE_CART_EEPROM);
memset(&savedata->data[end], 0xFF, SIZE_CART_EEPROM - end);
}
}
@ -74,7 +85,7 @@ void GBASavedataInitSRAM(struct GBASavedata* savedata) {
off_t end;
int flags = MAP_SHARED;
if (savedata->fd < 0) {
GBALog(GBA_LOG_WARN, "Cannot open savedata file %s", savedata->filename);
GBALog(GBA_LOG_WARN, "Cannot open savedata file %s (errno: %d)", savedata->filename, errno);
end = 0;
flags |= MAP_ANON;
} else {