X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Femu.c;h=837e77c5fdaded8d2f8c62e8a7886fe774738468;hp=2c64aa65f8c136a2c42ec548dd00789c28f8ceda;hb=499bf01c2f0e075caeb23714e3376a641c04eb7c;hpb=830ba1bf77492eb259dad9dea3d9531b51376009 diff --git a/loader/emu.c b/loader/emu.c index 2c64aa6..837e77c 100644 --- a/loader/emu.c +++ b/loader/emu.c @@ -1,4 +1,9 @@ -// vim:shiftwidth=2:expandtab +/* + * GINGE - GINGE Is Not Gp2x Emulator + * (C) notaz, 2010-2011 + * + * This work is licensed under the MAME license, see COPYING file for details. + */ // a "gentle" reminder #ifdef __ARM_EABI__ #error loader is meant to be OABI! @@ -7,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -961,13 +967,15 @@ void emu_init(void *map_bottom) exit(1); } -#ifdef WIZ - // we are short on memmory on Wiz, need special handling - extern void *host_mmap_upper(void); - mmsp2.umem = host_mmap_upper(); -#else + // TODO: check if this really fails on Wiz.. mmsp2.umem = mmap(NULL, 0x2000000, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); +#ifdef WIZ + if (mmsp2.umem == MAP_FAILED) { + // we are short on memmory on Wiz, need special handling + extern void *host_mmap_upper(void); + mmsp2.umem = host_mmap_upper(); + } #endif if (mmsp2.umem == MAP_FAILED) { perror(PFX "mmap upper mem"); @@ -1208,24 +1216,27 @@ static const struct { const char *from; const char *to; } path_map[] = { - { "/mnt/tmp/", "/tmp/" }, + { "/mnt/tmp", "./tmp" }, }; static const char *wrap_path(const char *path) { - char *buff; + char *buff, *p; size_t size; int i, len; // do only path mapping for now for (i = 0; i < ARRAY_SIZE(path_map); i++) { - len = strlen(path_map[i].from); - if (strncmp(path, path_map[i].from, len) == 0) { + p = strstr(path, path_map[i].from); + if (p != NULL) { size = strlen(path) + strlen(path_map[i].to) + 1; buff = malloc(size); if (buff == NULL) break; - snprintf(buff, size, "%s%s", path_map[i].to, path + len); + len = p - path; + strncpy(buff, path, len); + snprintf(buff + len, size - len, "%s%s", path_map[i].to, + path + len + strlen(path_map[i].from)); dbg("mapped path \"%s\" -> \"%s\"\n", path, buff); return buff; } @@ -1256,6 +1267,7 @@ void *emu_do_fopen(const char *path, const char *mode) int emu_do_system(const char *command) { static char tmp_path[512]; + int need_ginge = 0; const char *p2; char *p; int ret; @@ -1263,17 +1275,25 @@ int emu_do_system(const char *command) if (command == NULL) return -1; - // pass through stuff in PATH - p = strchr(command, ' '); - p2 = strchr(command, '/'); - if (p2 == NULL || (p != NULL && p2 > p)) - return system(command); + for (p2 = command; *p2 && isspace(*p2); p2++) + ; - make_local_path(tmp_path, sizeof(tmp_path), "ginge_prep"); - p = tmp_path + strlen(tmp_path); + if (*p2 == '.') // relative path? + need_ginge = 1; + else if (*p2 == '/' && strncmp(p2, "/bin", 4) && strncmp(p2, "/lib", 4) + && strncmp(p2, "/sbin", 4) && strncmp(p2, "/usr", 4)) + // absolute path, but not a system command + need_ginge = 1; p2 = wrap_path(command); - snprintf(p, sizeof(tmp_path) - (p - tmp_path), " --nomenu %s", p2); + if (need_ginge) { + make_local_path(tmp_path, sizeof(tmp_path), "ginge_prep"); + p = tmp_path + strlen(tmp_path); + + snprintf(p, sizeof(tmp_path) - (p - tmp_path), " --nomenu %s", p2); + } + else + snprintf(tmp_path, sizeof(tmp_path), "%s", p2); wrap_path_free(p2, command); dbg("system: \"%s\"\n", tmp_path); @@ -1324,3 +1344,4 @@ int emu_do_execve(const char *filename, char *const argv[], char *const envp[]) return ret; } +// vim:shiftwidth=2:expandtab