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