+static const struct {
+ const char *from;
+ const char *to;
+} path_map[] = {
+ { "/mnt/tmp/", "/tmp/" },
+};
+
+// FIXME: threads..
+static const char *wrap_path(const char *path)
+{
+ static char tmp_path[512];
+ 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) {
+ snprintf(tmp_path, sizeof(tmp_path), "%s%s", path_map[i].to, path + len);
+ dbg("mapped path \"%s\" -> \"%s\"\n", path, tmp_path);
+ return tmp_path;
+ }
+ }
+
+ return path;
+}
+
+void *emu_do_fopen(const char *path, const char *mode)
+{
+ return fopen(wrap_path(path), mode);
+}
+
+int emu_do_system(const char *command)
+{
+ static char tmp_path[512];
+ char *p, *p2;
+
+ 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);
+
+ make_local_path(tmp_path, sizeof(tmp_path), "ginge_prep");
+ p = tmp_path + strlen(tmp_path);
+
+ snprintf(p, sizeof(tmp_path) - (p - tmp_path), " %s", wrap_path(command));
+ dbg("system: \"%s\"\n", tmp_path);
+ return system(tmp_path);
+}
+