about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-11-21 22:20:28 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-11-21 22:20:28 +0100
commit07767d42ccd1a09fb78ccae6571d2a99a1d3b925 (patch)
tree0d77b4639250b6bdbe18e2cb4c70684853ca12be /src
parent9d97ce087a460b6b5be721b3673ac1543eb77484 (diff)
downloadbox64-07767d42ccd1a09fb78ccae6571d2a99a1d3b925.tar.gz
box64-07767d42ccd1a09fb78ccae6571d2a99a1d3b925.zip
Fixed some issue with getopt (for #170)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64int3.c2
-rwxr-xr-xsrc/include/globalsymbols.h2
-rwxr-xr-xsrc/librarian/globalsymbols.c34
-rwxr-xr-xsrc/wrapped/wrappedlibc.c3
4 files changed, 39 insertions, 2 deletions
diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c
index e8fc3ad7..86f1f0af 100755
--- a/src/emu/x64int3.c
+++ b/src/emu/x64int3.c
@@ -103,7 +103,7 @@ void x64Int3(x64emu_t* emu)
                     perr = 1;
                 } else if (!strcmp(s, "fopen") || !strcmp(s, "fopen64")) {
                     tmp = (char*)(R_RDI);
-                    snprintf(buff, 255, "%04d|%p: Calling %s(\"%s\", %d)", tid, *(void**)(R_RSP), s, (tmp)?tmp:"(nil)", (int)(R_ESI));
+                    snprintf(buff, 255, "%04d|%p: Calling %s(\"%s\", \"%s\")", tid, *(void**)(R_RSP), s, (tmp)?tmp:"(nil)", (char*)(R_RSI));
                     perr = 2;
                 } else if (!strcmp(s, "__openat64") || !strcmp(s, "openat64") || !strcmp(s, "__openat64_2")) {
                     tmp = (char*)(R_RSI);
diff --git a/src/include/globalsymbols.h b/src/include/globalsymbols.h
index 5368521e..fc2753ef 100755
--- a/src/include/globalsymbols.h
+++ b/src/include/globalsymbols.h
@@ -10,8 +10,10 @@ void** my_GetGthreadsGotInitialized();  // defined in wrappedgthread2
 

 // NCurse / TInfo

 void my_checkGlobalTInfo();

+void my_updateGlobalTInfo();

 

 // getopt

 void my_checkGlobalOpt();

+void my_updateGlobalOpt();

 

 #endif //_GLOBAL_SYMBOLS_H_
\ No newline at end of file
diff --git a/src/librarian/globalsymbols.c b/src/librarian/globalsymbols.c
index dfc163f3..3a932d86 100755
--- a/src/librarian/globalsymbols.c
+++ b/src/librarian/globalsymbols.c
@@ -18,10 +18,16 @@
 

 #define GLOB(A) \

     if (GetGlobalNoWeakSymbolStartEnd(my_context->maplib, #A, &globoffs, &globend, -1, NULL)) {     \

-        printf_log(LOG_DEBUG, "Global " #A " workaround, @%p <= %p\n", (void*)globoffs, &A);        \

+        printf_log(LOG_DEBUG, "Global " #A " workaround, @%p <- %p\n", (void*)globoffs, &A);        \

         memcpy((void*)globoffs, &A, sizeof(A));                                                     \

     }

 

+#define TOGLOB(A) \

+    if (GetGlobalNoWeakSymbolStartEnd(my_context->maplib, #A, &globoffs, &globend, -1, NULL)) {     \

+        printf_log(LOG_DEBUG, "Global " #A " workaround, @%p -> %p\n", (void*)globoffs, &A);        \

+        memcpy(&A, (void*)globoffs, sizeof(A));                                                     \

+    }

+

 

 // *********** GTK *****************

 EXPORT void* gdk_display = NULL;   // in case it's used...

@@ -87,10 +93,36 @@ void my_checkGlobalTInfo()
     GLOB(ttytype)

 }

 

+void my_updateGlobalTInfo()

+{

+    uintptr_t globoffs, globend;

+    TOGLOB(COLS)

+    TOGLOB(LINES)

+    TOGLOB(TABSIZE)

+    TOGLOB(curscr)

+    TOGLOB(newscr)

+    TOGLOB(stdscr)

+    TOGLOB(acs_map)

+    TOGLOB(UP)

+    TOGLOB(BC)

+    TOGLOB(PC)

+    TOGLOB(ospeed)

+    TOGLOB(ttytype)

+}

+

 // **************** getopts ****************

 EXPORT char *optarg;

 EXPORT int optind, opterr, optopt;

 

+void my_updateGlobalOpt()

+{

+    uintptr_t globoffs, globend;

+    TOGLOB(optarg);

+    TOGLOB(optind);

+    TOGLOB(opterr);

+    TOGLOB(optopt);

+}

+

 void my_checkGlobalOpt()

 {

     uintptr_t globoffs, globend;

diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 708051d8..210dc4cf 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2213,6 +2213,7 @@ EXPORT void* my_mallinfo(x64emu_t* emu, void* p)
 
 EXPORT int my_getopt(int argc, char* const argv[], const char *optstring)
 {
+    my_updateGlobalOpt();
     int ret = getopt(argc, argv, optstring);
     my_checkGlobalOpt();
     return ret;
@@ -2220,6 +2221,7 @@ EXPORT int my_getopt(int argc, char* const argv[], const char *optstring)
 
 EXPORT int my_getopt_long(int argc, char* const argv[], const char* optstring, const struct option *longopts, int *longindex)
 {
+    my_updateGlobalOpt();
     int ret = getopt_long(argc, argv, optstring, longopts, longindex);
     my_checkGlobalOpt();
     return ret;
@@ -2227,6 +2229,7 @@ EXPORT int my_getopt_long(int argc, char* const argv[], const char* optstring, c
 
 EXPORT int my_getopt_long_only(int argc, char* const argv[], const char* optstring, const struct option *longopts, int *longindex)
 {
+    my_updateGlobalOpt();
     int ret = getopt_long_only(argc, argv, optstring, longopts, longindex);
     my_checkGlobalOpt();
     return ret;