diff --git a/archie.c b/archie.c index 07ac26b..14b7d6d 100644 --- a/archie.c +++ b/archie.c @@ -107,7 +107,7 @@ char *archie_get_floppy_name(char i) void archie_save_config(void) { - FileSave(CONFIG_FILENAME, &config, sizeof(config)); + FileSaveConfig(CONFIG_FILENAME, &config, sizeof(config)); } void archie_send_file(unsigned char id, char *name) @@ -252,7 +252,6 @@ static void archie_kbd_reset(void) void archie_init(void) { - fileTYPE file; char i; archie_debugf("init"); @@ -262,15 +261,15 @@ void archie_init(void) strcpy(config.rom_img, "RISCOS.ROM"); // try to load config from card - if (FileOpen(&file, CONFIG_FILENAME)) + int size = FileLoadConfig(CONFIG_FILENAME, 0, 0); + if (size>0) { - if (file.size == sizeof(archie_config_t)) + if (size == sizeof(archie_config_t)) { - FileReadAdv(&file, &config, sizeof(archie_config_t)); + FileLoadConfig(CONFIG_FILENAME, &config, sizeof(archie_config_t)); } else - archie_debugf("Unexpected config size %d != %d", file.size, sizeof(archie_config_t)); - FileClose(&file); + archie_debugf("Unexpected config size %d != %d", size, sizeof(archie_config_t)); } else archie_debugf("No %s config found", CONFIG_FILENAME); diff --git a/config.c b/config.c index 0e8eb84..96245c2 100644 --- a/config.c +++ b/config.c @@ -260,15 +260,15 @@ unsigned char LoadConfiguration(char *filename) filename = configfilename; } - fileTYPE file; // load configuration data - if (FileOpen(&file, filename)) { - FileClose(&file); + int size = FileLoadConfig(filename, 0, 0); + if(size>0) + { BootPrint("Opened configuration file\n"); - printf("Configuration file size: %s, %lu\n", file.name, file.size); - if (file.size == sizeof(config)) + printf("Configuration file size: %s, %lu\n", filename, size); + if (size == sizeof(config)) { - if (FileLoad(filename, &tmpconf, sizeof(tmpconf))) + if (FileLoadConfig(filename, &tmpconf, sizeof(tmpconf))) { // check file id and version if (strncmp(tmpconf.id, config_id, sizeof(config.id)) == 0) { @@ -288,7 +288,7 @@ unsigned char LoadConfiguration(char *filename) } else printf("Cannot load configuration file\n"); } - else printf("Wrong configuration file size: %lu (expected: %lu)\n", file.size, sizeof(config)); + else printf("Wrong configuration file size: %lu (expected: %lu)\n", size, sizeof(config)); } if (!result) { BootPrint("Can not open configuration file!\n"); @@ -489,5 +489,5 @@ unsigned char SaveConfiguration(char *filename) // use slot-based filename if none provided filename = configfilename; } - return FileSave(filename, &config, sizeof(config)); + return FileSaveConfig(filename, &config, sizeof(config)); } diff --git a/file_io.c b/file_io.c index 664a475..dc361ea 100644 --- a/file_io.c +++ b/file_io.c @@ -14,6 +14,7 @@ #include "osd.h" #include "fpga_io.h" #include "menu.h" +#include "errno.h" int nDirEntries = 0; struct dirent DirItem[1000]; @@ -203,8 +204,7 @@ unsigned long FileWriteSec(fileTYPE *file, void *pBuffer) return FileWriteAdv(file, pBuffer, 512); } - -unsigned char FileSave(char *name, void *pBuffer, int size) +int FileSave(char *name, void *pBuffer, int size) { sprintf(full_path, "%s/%s", getRootDir(), name); int fd = open(full_path, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, S_IRWXU | S_IRWXG | S_IRWXO); @@ -215,14 +215,22 @@ unsigned char FileSave(char *name, void *pBuffer, int size) } int ret = write(fd, pBuffer, size); + close(fd); + if (ret < 0) { printf("FileSave(write) File:%s, error: %d.\n", full_path, ret); return 0; } - close(fd); - return 1; + return ret; +} + +int FileSaveConfig(char *name, void *pBuffer, int size) +{ + char path[256] = { CONFIG_DIR"/" }; + strcat(path, name); + return FileSave(path, pBuffer, size); } int FileLoad(char *name, void *pBuffer, int size) @@ -240,20 +248,35 @@ int FileLoad(char *name, void *pBuffer, int size) if (ret < 0) { printf("FileLoad(fstat) File:%s, error: %d.\n", full_path, ret); - return -1; - } - - ret = read(fd, pBuffer, size ? size : st.st_size); - if (ret < 0) - { - printf("FileLoad(write) File:%s, error: %d.\n", full_path, ret); + close(fd); return 0; } + if (!pBuffer) + { + close(fd); + return (int)st.st_size; + } + + ret = read(fd, pBuffer, size ? size : st.st_size); close(fd); + + if (ret < 0) + { + printf("FileLoad(read) File:%s, error: %d.\n", full_path, ret); + return 0; + } + return ret; } +int FileLoadConfig(char *name, void *pBuffer, int size) +{ + char path[256] = { CONFIG_DIR"/" }; + strcat(path, name); + return FileLoad(path, pBuffer, size); +} + int FileCanWrite(char *name) { sprintf(full_path, "%s/%s", getRootDir(), name); @@ -437,6 +460,11 @@ void FindStorage(void) { printf("Using SD card as a root device\n"); } + + sprintf(full_path, "%s/"CONFIG_DIR, getRootDir()); + DIR* dir = opendir(full_path); + if (dir) closedir(dir); + else if (ENOENT == errno) mkdir(full_path, S_IRWXU | S_IRWXG | S_IRWXO); } int de_cmp(const void *e1, const void *e2) diff --git a/file_io.h b/file_io.h index b1d40b2..16398a6 100644 --- a/file_io.h +++ b/file_io.h @@ -55,11 +55,15 @@ unsigned long FileReadSec(fileTYPE *file, void *pBuffer); unsigned long FileWriteAdv(fileTYPE *file, void *pBuffer, unsigned long length); unsigned long FileWriteSec(fileTYPE *file, void *pBuffer); - int FileCanWrite(char *name); -unsigned char FileSave(char *name, void *pBuffer, int size); -int FileLoad(char *name, void *pBuffer, int size); +int FileSave(char *name, void *pBuffer, int size); +int FileLoad(char *name, void *pBuffer, int size); // supply pBuffer = 0 to get the file size without loading + +//save/load from config dir +#define CONFIG_DIR "config" +int FileSaveConfig(char *name, void *pBuffer, int size); +int FileLoadConfig(char *name, void *pBuffer, int size); // supply pBuffer = 0 to get the file size without loading void AdjustDirectory(char *path); int ScanDirectory(char* path, unsigned long mode, char *extension, unsigned char options); diff --git a/input.c b/input.c index 5baf7a3..fa34b38 100644 --- a/input.c +++ b/input.c @@ -461,7 +461,7 @@ void finish_map_setting() char name[32]; sprintf(name, "input_%04x_%04x.map", input[mapping_dev].vid, input[mapping_dev].pid); - FileSave(name, &input[mapping_dev].map, sizeof(input[mapping_dev].map)); + FileSaveConfig(name, &input[mapping_dev].map, sizeof(input[mapping_dev].map)); } uint16_t get_map_vid() @@ -640,7 +640,7 @@ static void input_cb(struct input_event *ev, int dev) { char name[32]; sprintf(name, "input_%04x_%04x.map", input[dev].vid, input[dev].pid); - if (!FileLoad(name, &input[dev].map, sizeof(input[dev].map))) + if (!FileLoadConfig(name, &input[dev].map, sizeof(input[dev].map))) { memset(&input[dev].map, 0, sizeof(input[dev].map)); } diff --git a/menu.c b/menu.c index 2faa1dd..f7801d2 100644 --- a/menu.c +++ b/menu.c @@ -1116,7 +1116,7 @@ void HandleUI(void) char *filename = user_io_create_config_name(); unsigned long status = user_io_8bit_set_status(0, 0); iprintf("Saving config to %s\n", filename); - FileSave(filename, &status, 4); + FileSaveConfig(filename, &status, 4); menustate = MENU_8BIT_MAIN1; menusub = 0; } @@ -2390,7 +2390,7 @@ void HandleUI(void) char *filename = user_io_create_config_name(); unsigned long status = user_io_8bit_set_status(0, 0xffffffff); iprintf("Saving config to %s\n", filename); - FileSave(filename, &status, 4); + FileSaveConfig(filename, &status, 4); menustate = MENU_8BIT_MAIN1; menusub = 0; } diff --git a/mist_cfg.c b/mist_cfg.c index 7e0129a..08e28da 100644 --- a/mist_cfg.c +++ b/mist_cfg.c @@ -36,7 +36,7 @@ const ini_var_t mist_ini_vars[] = { // mist ini config const ini_cfg_t mist_ini_cfg = { - "MiSTer.ini", + CONFIG_DIR"/MiSTer.ini", mist_ini_sections, mist_ini_vars, (int)(sizeof(mist_ini_sections) / sizeof(ini_section_t)), diff --git a/tos.c b/tos.c index 4c46433..01d9240 100644 --- a/tos.c +++ b/tos.c @@ -1121,8 +1121,6 @@ unsigned long tos_system_ctrl(void) void tos_config_init(void) { - fileTYPE file; - // set default values config.system_ctrl = TOS_MEMCONFIG_4M | TOS_CONTROL_BLITTER; memcpy(config.tos_img, "TOS.IMG", 12); @@ -1132,14 +1130,14 @@ void tos_config_init(void) config.video_adjust[0] = config.video_adjust[1] = 0; // try to load config - if (FileOpen(&file, CONFIG_FILENAME)) + int size = FileLoadConfig(CONFIG_FILENAME, 0, 0); + if (size>0) { - tos_debugf("Configuration file size: %lu (should be %lu)", file.size, sizeof(tos_config_t)); - if (file.size == sizeof(tos_config_t)) + tos_debugf("Configuration file size: %lu (should be %lu)", size, sizeof(tos_config_t)); + if (size == sizeof(tos_config_t)) { - FileReadAdv(&file, &config, file.size); + FileLoadConfig(CONFIG_FILENAME, &config, size); } - FileClose(&file); } // ethernet is auto detected later @@ -1149,5 +1147,5 @@ void tos_config_init(void) // save configuration void tos_config_save(void) { - FileSave(CONFIG_FILENAME, &config, sizeof(tos_config_t)); + FileSaveConfig(CONFIG_FILENAME, &config, sizeof(tos_config_t)); } diff --git a/user_io.c b/user_io.c index 5b390cf..1f5970b 100644 --- a/user_io.c +++ b/user_io.c @@ -211,7 +211,7 @@ void user_io_detect_core_type() { iprintf("Loading config %s\n", name); unsigned long status = 0; - if (FileLoad(name, &status, 4)) + if (FileLoadConfig(name, &status, 4)) { iprintf("Found config\n"); user_io_8bit_set_status(status, 0xffffffff);