/* RetroArch - A frontend for libretro. * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #include #include #include #include #include #include #include #include #define DEVICE_SLASH "/" #define DEVICE_MC0 "mc0:" #define DEVICE_MC1 "mc1:" #define DEVICE_CDROM "cdrom0:" #define DEVICE_CDFS "cdfs:" #define DEVICE_MASS "mass:" #define DEVICE_MASS0 "mass0:" #define DEVICE_HDD "hdd:" #define DEVICE_HDD0 "hdd0:" #define DEVICE_HOST "host:" #define DEVICE_HOST0 "host0:" #define DEVICE_HOST1 "host1:" #define DEVICE_HOST2 "host2:" #define DEVICE_HOST3 "host3:" #define DEVICE_HOST4 "host4:" #define DEVICE_HOST5 "host5:" #define DEVICE_HOST6 "host6:" #define DEVICE_HOST7 "host7:" #define DEVICE_HOST8 "host8:" #define DEVICE_HOST9 "host9:" #define DEVICE_MC0_PATH DEVICE_MC0 DEVICE_SLASH #define DEVICE_MC1_PATH DEVICE_MC1 DEVICE_SLASH #define DEVICE_CDFS_PATH DEVICE_CDFS DEVICE_SLASH #define DEVICE_CDROM_PATH DEVICE_CDROM DEVICE_SLASH #define DEVICE_MASS_PATH DEVICE_MASS DEVICE_SLASH #define DEVICE_MASS0_PATH DEVICE_MASS0 DEVICE_SLASH #define DEVICE_HDD_PATH DEVICE_HDD DEVICE_SLASH #define DEVICE_HDD0_PATH DEVICE_HDD0 DEVICE_SLASH #define DEVICE_HOST_PATH DEVICE_HOST DEVICE_SLASH #define DEVICE_HOST0_PATH DEVICE_HOST0 DEVICE_SLASH #define DEVICE_HOST1_PATH DEVICE_HOST1 DEVICE_SLASH #define DEVICE_HOST2_PATH DEVICE_HOST2 DEVICE_SLASH #define DEVICE_HOST3_PATH DEVICE_HOST3 DEVICE_SLASH #define DEVICE_HOST4_PATH DEVICE_HOST4 DEVICE_SLASH #define DEVICE_HOST5_PATH DEVICE_HOST5 DEVICE_SLASH #define DEVICE_HOST6_PATH DEVICE_HOST6 DEVICE_SLASH #define DEVICE_HOST7_PATH DEVICE_HOST7 DEVICE_SLASH #define DEVICE_HOST8_PATH DEVICE_HOST8 DEVICE_SLASH #define DEVICE_HOST9_PATH DEVICE_HOST9 DEVICE_SLASH char *rootDevicePath(enum BootDeviceIDs device_id) { switch (device_id) { case BOOT_DEVICE_MC0: return DEVICE_MC0_PATH; case BOOT_DEVICE_MC1: return DEVICE_MC1_PATH; case BOOT_DEVICE_CDROM: return DEVICE_CDROM_PATH; case BOOT_DEVICE_CDFS: return DEVICE_CDFS_PATH; case BOOT_DEVICE_MASS: return DEVICE_MASS_PATH; case BOOT_DEVICE_MASS0: return DEVICE_MASS_PATH; case BOOT_DEVICE_HDD: return DEVICE_HDD_PATH; case BOOT_DEVICE_HDD0: return DEVICE_HDD0_PATH; case BOOT_DEVICE_HOST: return DEVICE_HOST_PATH; case BOOT_DEVICE_HOST0: return DEVICE_HOST0_PATH; case BOOT_DEVICE_HOST1: return DEVICE_HOST1_PATH; case BOOT_DEVICE_HOST2: return DEVICE_HOST2_PATH; case BOOT_DEVICE_HOST3: return DEVICE_HOST3_PATH; case BOOT_DEVICE_HOST4: return DEVICE_HOST4_PATH; case BOOT_DEVICE_HOST5: return DEVICE_HOST5_PATH; case BOOT_DEVICE_HOST6: return DEVICE_HOST6_PATH; case BOOT_DEVICE_HOST7: return DEVICE_HOST7_PATH; case BOOT_DEVICE_HOST8: return DEVICE_HOST8_PATH; case BOOT_DEVICE_HOST9: return DEVICE_HOST9_PATH; default: return ""; } } enum BootDeviceIDs getBootDeviceID(char *path) { if (!strncmp(path, DEVICE_MC0, 4)) return BOOT_DEVICE_MC0; else if (!strncmp(path, DEVICE_MC1, 4)) return BOOT_DEVICE_MC1; else if (!strncmp(path, DEVICE_CDROM, 7)) return BOOT_DEVICE_CDROM; else if (!strncmp(path, DEVICE_CDFS, 5)) return BOOT_DEVICE_CDFS; else if (!strncmp(path, DEVICE_MASS, 5)) return BOOT_DEVICE_MASS; else if (!strncmp(path, DEVICE_MASS0, 6)) return BOOT_DEVICE_MASS0; else if (!strncmp(path, DEVICE_HDD, 4)) return BOOT_DEVICE_HDD; else if (!strncmp(path, DEVICE_HDD0, 5)) return BOOT_DEVICE_HDD0; else if (!strncmp(path, DEVICE_HOST, 5)) return BOOT_DEVICE_HOST; else if (!strncmp(path, DEVICE_HOST0, 6)) return BOOT_DEVICE_HOST0; else if (!strncmp(path, DEVICE_HOST1, 6)) return BOOT_DEVICE_HOST1; else if (!strncmp(path, DEVICE_HOST2, 6)) return BOOT_DEVICE_HOST2; else if (!strncmp(path, DEVICE_HOST3, 6)) return BOOT_DEVICE_HOST3; else if (!strncmp(path, DEVICE_HOST4, 6)) return BOOT_DEVICE_HOST4; else if (!strncmp(path, DEVICE_HOST5, 6)) return BOOT_DEVICE_HOST5; else if (!strncmp(path, DEVICE_HOST6, 6)) return BOOT_DEVICE_HOST6; else if (!strncmp(path, DEVICE_HOST7, 6)) return BOOT_DEVICE_HOST7; else if (!strncmp(path, DEVICE_HOST8, 6)) return BOOT_DEVICE_HOST8; else if (!strncmp(path, DEVICE_HOST9, 6)) return BOOT_DEVICE_HOST9; else return BOOT_DEVICE_UNKNOWN; } /* This method returns true if it can extract needed info from path, otherwise false. * In case of true, it also updates mountString, mountPoint and newCWD parameters * It splits path by ":", and requires a minimum of 3 elements * Example: if path = hdd0:__common:pfs:/retroarch/ then * mountString = "pfs:" * mountPoint = "hdd0:__common" * newCWD = pfs:/retroarch/ * return true */ bool getMountInfo(char *path, char *mountString, char *mountPoint, char *newCWD) { struct string_list *str_list = string_split(path, ":"); if (str_list->size < 3 ) { return false; } sprintf(mountPoint, "%s:%s", str_list->elems[0].data, str_list->elems[1].data); sprintf(mountString, "%s:", str_list->elems[2].data); sprintf(newCWD, "%s%s", mountString, str_list->size == 4 ? str_list->elems[3].data : ""); return true; } /* HACK! If booting from a USB device, keep trying to * open this program again until it succeeds. * * This will ensure that the emulator will be able to load its files. */ bool waitUntilDeviceIsReady(char *path) { struct stat buffer; int ret = -1; int retries = 50; while(ret != 0 && retries > 0) { ret = stat(path, &buffer); /* Wait untill the device is ready */ nopdelay(); retries--; } return ret == 0; }