X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Foverride.c;h=f98a4db5aee6dca1b3f844312454a45e69e0ad46;hp=5a722d932e0f65740b60f1a6e8da1abf8726915b;hb=2692251daf4c8a3ca6986cece8f7fc0822de150f;hpb=c3831532675b527bd34ee92377b1b6d323345cb1 diff --git a/loader/override.c b/loader/override.c index 5a722d9..f98a4db 100644 --- a/loader/override.c +++ b/loader/override.c @@ -41,12 +41,14 @@ static const struct dev_fd_t takeover_devs[] = { { "/dev/mmuhack", FAKEDEV_MMUHACK }, { "/dev/tty", FAKEDEV_TTY0 }, { "/dev/tty0", FAKEDEV_TTY0 }, + { "/dev/touchscreen/wm97xx", FAKEDEV_WM97XX }, + { "/etc/pointercal", FAKEDEV_WM97XX_P }, #ifdef PND { "/dev/input/event*", -1 }, // hide for now, may cause dupe events #endif }; -static long w_open_raw(const char *pathname, int flags, mode_t mode) +long w_open_raw(const char *pathname, int flags, mode_t mode) { long ret; int i; @@ -68,8 +70,11 @@ static long w_open_raw(const char *pathname, int flags, mode_t mode) } } - if (i == ARRAY_SIZE(takeover_devs)) - ret = g_open_raw(pathname, flags, mode); + if (i == ARRAY_SIZE(takeover_devs)) { + const char *w_path = emu_wrap_path(pathname); + ret = g_open_raw(w_path, flags, mode); + emu_wrap_path_free(w_path, pathname); + } if (ret >= 0) { for (i = 0; emu_interesting_fds[i].name != NULL; i++) { @@ -137,12 +142,12 @@ long w_read_raw(int fd, void *buf, size_t count) { long ret; - if (fd == FAKEDEV_GPIO) - ret = emu_read_gpiodev(buf, count); + if (FAKEDEV_MEM <= fd && fd < FAKEDEV_FD_BOUNDARY) + ret = emu_do_read(fd, buf, count); else ret = g_read_raw(fd, buf, count); - //strace("read(%d, %p, %ld) = %ld\n", fd, buf, count, ret); + //strace("read(%d, %p, %zd) = %ld\n", fd, buf, count, ret); return ret; } @@ -251,15 +256,20 @@ static UNUSED int w_execvp(const char *file, char *const argv[]) return emu_do_execve(file, argv, environ); } -// static note: this can't safely return because of the way it's patched in -// static note2: can't be used, execve hangs? -static UNUSED int w_execve(const char *filename, char *const argv[], - char *const envp[]) +long w_execve_raw(const char *filename, char * const argv[], + char * const envp[]) { strace("execve(%s, %p, %p) = ?\n", filename, argv, envp); return emu_do_execve(filename, argv, envp); } +static UNUSED int w_execve(const char *filename, char * const argv[], + char * const envp[]) +{ + long ret = w_execve_raw(filename, argv, envp); + return g_syscall_error(ret); +} + static int w_chdir(const char *path) { long ret; @@ -277,6 +287,7 @@ static ssize_t w_readlink(const char *path, char *buf, size_t bufsiz) { long ret; +#ifndef DL if (path != NULL && strncmp(path, "/proc/", 6) == 0 && strcmp(strrchr(path, '/'), "/exe") == 0) { @@ -285,6 +296,7 @@ static ssize_t w_readlink(const char *path, char *buf, size_t bufsiz) ret = bufsiz; } else +#endif ret = g_readlink_raw(path, buf, bufsiz); strace("readlink(%s, %s, %zd) = %ld\n", path, buf, bufsiz, ret); @@ -338,7 +350,7 @@ MAKE_WRAP_SYM_N(execlp); MAKE_WRAP_SYM_N(execle); MAKE_WRAP_SYM_N(execv); MAKE_WRAP_SYM_N(execvp); -MAKE_WRAP_SYM(execve); +MAKE_WRAP_SYM_N(execve); MAKE_WRAP_SYM_N(chdir); MAKE_WRAP_SYM_N(readlink); typeof(mmap) mmap2 __attribute__((alias("w_mmap"))); @@ -361,7 +373,7 @@ static const struct { REAL_FUNC_NP(tcsetattr), REAL_FUNC_NP(system), // exec* - skipped - REAL_FUNC_NP(execve), + //REAL_FUNC_NP(execve), //REAL_FUNC_NP(chdir), }; @@ -375,7 +387,7 @@ static const struct { #define tcgetattr p_real_tcgetattr #define tcsetattr p_real_tcsetattr #define system p_real_system -#define execve p_real_execve +//#define execve p_real_execve //#define chdir p_real_chdir #undef MAKE_WRAP_SYM @@ -458,7 +470,8 @@ int real_system(const char *command) int real_execve(const char *filename, char *const argv[], char *const envp[]) { - return execve(filename, argv, envp); + long ret = g_execve_raw(filename, argv, envp); + return g_syscall_error(ret); } int real_chdir(const char *path)