about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-06-05 15:03:37 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-06-05 15:03:37 +0200
commit3bdcae10c8e0ed7b958137124585b0ff594a21fc (patch)
tree03073bc8d2d4c27d446c16924122e1982573fd55 /src
parent681df1604dd27688fdcc07c7fd1640b3f1bd8a54 (diff)
downloadbox64-3bdcae10c8e0ed7b958137124585b0ff594a21fc.tar.gz
box64-3bdcae10c8e0ed7b958137124585b0ff594a21fc.zip
Added a few more wrapped function and improved getopt handling
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/globalsymbols.h3
-rwxr-xr-xsrc/librarian/globalsymbols.c13
-rw-r--r--src/wrapped/generated/functions_list.txt2
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h2
-rwxr-xr-xsrc/wrapped/wrappedlibc.c40
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h22
6 files changed, 58 insertions, 24 deletions
diff --git a/src/include/globalsymbols.h b/src/include/globalsymbols.h
index e2bd19d3..8af78d05 100755
--- a/src/include/globalsymbols.h
+++ b/src/include/globalsymbols.h
@@ -11,4 +11,7 @@
 // NCurse / TInfo

 void my_checkGlobalTInfo();

 

+// getopt

+void my_checkGlobalOpt();

+

 #endif //_GLOBAL_SYMBOLS_H_
\ No newline at end of file
diff --git a/src/librarian/globalsymbols.c b/src/librarian/globalsymbols.c
index a6dc73c0..a5ca89c1 100755
--- a/src/librarian/globalsymbols.c
+++ b/src/librarian/globalsymbols.c
@@ -87,4 +87,17 @@ void my_checkGlobalTInfo()
     GLOB(PC)

     GLOB(ospeed)

     GLOB(ttytype)

+}

+

+// **************** getopts ****************

+EXPORT char *optarg;

+EXPORT int optind, opterr, optopt;

+

+void my_checkGlobalOpt()

+{

+    uintptr_t globoffs, globend;

+    GLOB(optarg);

+    GLOB(optind);

+    GLOB(opterr);

+    GLOB(optopt);

 }
\ No newline at end of file
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index a86bb76c..5caac75b 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -1473,8 +1473,10 @@ wrappedlibc:
   - vfprintf
   - vsscanf
 - iFppV:
+  - __asprintf
   - __isoc99_fscanf
   - __isoc99_sscanf
+  - asprintf
   - fprintf
   - fscanf
   - fwprintf
diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h
index e5bc173e..f5a6b7d6 100644
--- a/src/wrapped/generated/wrappedlibctypes.h
+++ b/src/wrapped/generated/wrappedlibctypes.h
@@ -124,8 +124,10 @@ typedef int64_t (*iFpippppp_t)(void*, int64_t, void*, void*, void*, void*, void*
 	GO(vasprintf, iFppp_t) \
 	GO(vfprintf, iFppp_t) \
 	GO(vsscanf, iFppp_t) \
+	GO(__asprintf, iFppV_t) \
 	GO(__isoc99_fscanf, iFppV_t) \
 	GO(__isoc99_sscanf, iFppV_t) \
+	GO(asprintf, iFppV_t) \
 	GO(fprintf, iFppV_t) \
 	GO(fscanf, iFppV_t) \
 	GO(fwprintf, iFppV_t) \
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 3cd8a75b..270066ad 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -36,6 +36,7 @@
 #include <spawn.h>
 #include <fts.h>
 #include <syslog.h>
+#include <getopt.h>
 #undef LOG_INFO
 #undef LOG_DEBUG
 
@@ -57,7 +58,7 @@
 #include "auxval.h"
 #include "elfloader.h"
 #include "bridge.h"
-
+#include "globalsymbols.h"
 
 #define LIBNAME libc
 const char* libcName = "libc.so.6";
@@ -674,20 +675,12 @@ EXPORT int my___sprintf_chk(x64emu_t* emu, void* buff, int flag, size_t l, void
     return vsprintf(buff, (const char*)fmt, VARARGS);
 }
 
-#if 0
-EXPORT int my_asprintf(x64emu_t* emu, void** buff, void * fmt, void * b, va_list V) {
-    #ifndef NOALIGN
-    // need to align on arm
-    myStackAlign((const char*)fmt, b, emu->scratch);
+EXPORT int my_asprintf(x64emu_t* emu, void** buff, void * fmt, uint64_t * b) {
+    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 2);
     PREPARE_VALIST;
-    void* f = vasprintf;
-    return ((iFppp_t)f)(buff, fmt, VARARGS);
-    #else
-    return vasprintf((char**)buff, (char*)fmt, V);
-    #endif
+    return vasprintf((char**)buff, (char*)fmt, VARARGS);
 }
-EXPORT int my___asprintf(x64emu_t* emu, void** buff, void * fmt, void * b, va_list V) __attribute__((alias("my_asprintf")));
-#endif
+EXPORT int my___asprintf(x64emu_t* emu, void** buff, void * fmt, uint64_t * b) __attribute__((alias("my_asprintf")));
 
 EXPORT int my_vasprintf(x64emu_t* emu, char** buff, void* fmt, x64_va_list_t b) {
     (void)emu;
@@ -2061,6 +2054,27 @@ EXPORT int my_mprotect(x64emu_t* emu, void *addr, unsigned long len, int prot)
     return ret;
 }
 
+EXPORT int my_getopt(int argc, char* const argv[], const char *optstring)
+{
+    int ret = getopt(argc, argv, optstring);
+    my_checkGlobalOpt();
+    return ret;
+}
+
+EXPORT int my_getopt_long(int argc, char* const argv[], const char* optstring, const struct option *longopts, int *longindex)
+{
+    int ret = getopt_long(argc, argv, optstring, longopts, longindex);
+    my_checkGlobalOpt();
+    return ret;
+}
+
+EXPORT int my_getopt_long_only(int argc, char* const argv[], const char* optstring, const struct option *longopts, int *longindex)
+{
+    int ret = getopt_long_only(argc, argv, optstring, longopts, longindex);
+    my_checkGlobalOpt();
+    return ret;
+}
+
 #if 0
 typedef struct my_cookie_s {
     uintptr_t r, w, s, c;
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index 607b5a5a..ceb3e1ab 100755
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -54,8 +54,8 @@ GOW(alphasort64, iFpp)
 //GOW(argz_stringify, 
 GO(asctime, pFp)
 GOW(asctime_r, pFpp)
-//GO(__asprintf, 
-//GOW(asprintf, 
+GOM(__asprintf, iFEppV)
+GOM(asprintf, iFEppV)   //Weak
 //GO(__asprintf_chk, 
 //GO(__assert, 
 GO(__assert_fail, vFppup)
@@ -554,9 +554,9 @@ GO(getnameinfo, iFpupLpLi)
 //GO(getnetname, 
 GOW(get_nprocs, iFv)
 GOW(get_nprocs_conf, iFv)
-GO(getopt, iFipp)
-GO(getopt_long, iFipppp)
-GO(getopt_long_only, iFipppp)
+GOM(getopt, iFipp)
+GOM(getopt_long, iFipppp)
+GOM(getopt_long_only, iFipppp)
 GO(__getpagesize, iFv)
 GOW(getpagesize, iFv)
 //GO(getpass, 
@@ -1284,10 +1284,10 @@ GO(openlog, vFpii)
 //GOW(open_memstream, 
 //GO(__open_nocancel, 
 //GO(open_wmemstream, 
-//DATAB(optarg, 
-//DATA(opterr, 
-//DATA(optind, 
-//DATA(optopt, 
+DATA(optarg, sizeof(void*))
+DATA(opterr, sizeof(int))
+DATA(optind, sizeof(int))
+DATA(optopt, sizeof(int))
 //GO(__overflow, 
 //GO(parse_printf_format, 
 //GO(passwd2des, 
@@ -1575,12 +1575,12 @@ GOW(sched_get_priority_max, iFi)
 GO(__sched_get_priority_min, iFi)
 GOW(sched_get_priority_min, iFi)
 //GO(__sched_getscheduler, 
-//GOW(sched_getscheduler, 
+GOW(sched_getscheduler, iFp)
 //GOW(sched_rr_get_interval, 
 GO(sched_setaffinity, iFLLp)
 //GOW(sched_setparam, 
 //GO(__sched_setscheduler, 
-//GOW(sched_setscheduler, 
+GOW(sched_setscheduler, iFpip)
 GO(__sched_yield, iFv)
 GOW(sched_yield, iFv)
 GO2(__secure_getenv, pFp, getenv)   // not always present