X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Floader.c;h=2d7d3d2ca1855e36e6394dd2e67de6848acb0337;hp=fea8bb637266814e06afb5c0b0823101d5fa121c;hb=c3831532675b527bd34ee92377b1b6d323345cb1;hpb=4d0451847a77d420284c7fb0f50b1f167c1118ee diff --git a/loader/loader.c b/loader/loader.c index fea8bb6..2d7d3d2 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -1,13 +1,23 @@ -// 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. + */ #include #include #include #include +#include +#include +#include #include #include "header.h" #include "realfuncs.h" +char *bin_path; + #define CHECK_(val, fail_operator, expect, err_msg) \ if (val fail_operator expect) { \ fprintf(stderr, err_msg ", exiting (%d)\n", (int)(long)val); \ @@ -63,6 +73,8 @@ int main(int argc, char *argv[]) int map_cnt; int i, ret, envc, sfp; long *stack_frame; + struct stat st; + char buf[64]; if (argc < 2) { fprintf(stderr, "usage: %s [args]\n", argv[0]); @@ -149,6 +161,19 @@ int main(int argc, char *argv[]) lowest_segment = map_ptr; } + // build self bin path + snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fileno(fi)); + if (lstat(buf, &st) != 0) + FAIL_PERROR("lstat bin_path"); + bin_path = malloc(st.st_size + 1); + CHECK_NE(bin_path, NULL, "bin_path"); + ret = readlink(buf, bin_path, st.st_size); + if (ret < 0) + FAIL_PERROR("readlink"); + bin_path[ret] = 0; + + fclose(fi); + emu_init(lowest_segment); // generate stack frame: argc, argv[], NULL, env[], NULL @@ -161,6 +186,9 @@ int main(int argc, char *argv[]) return 1; } + // update the environment + setenv("_", bin_path, 1); + sfp = 0; stack_frame[sfp++] = argc - 1; for (i = 1; i < argc; i++) @@ -177,3 +205,4 @@ int main(int argc, char *argv[]) return 1; } +// vim:shiftwidth=2:expandtab