about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-10-09 10:23:29 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-10-09 10:23:29 +0200
commit89e5c644d070163383bf4f892333ec84352d776b (patch)
tree47245e6acf9850f2bcb96cd7a1bb190de8ade324
parent2ae7402fd7dab5ecffcfe14e45ba53fd3aae4631 (diff)
downloadbox64-89e5c644d070163383bf4f892333ec84352d776b.tar.gz
box64-89e5c644d070163383bf4f892333ec84352d776b.zip
[BOX32][WRAPPER] Improved glob(64) support
-rwxr-xr-xsrc/wrapped32/wrappedlibc.c70
-rwxr-xr-xsrc/wrapped32/wrappedlibc_private.h6
2 files changed, 68 insertions, 8 deletions
diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c
index 8665f593..ad11a9f7 100755
--- a/src/wrapped32/wrappedlibc.c
+++ b/src/wrapped32/wrappedlibc.c
@@ -1628,24 +1628,84 @@ EXPORT int32_t my32_epoll_wait(x64emu_t* emu, int32_t epfd, void* events, int32_
         UnalignEpollEvent32(events, _events, ret);
     return ret;
 }
+typedef struct my_glob_32_s
+{
+    ulong_t gl_pathc;
+    ptr_t   gl_pathv;       //char**
+    ulong_t gl_offs;
+    int     gl_flags;
+    ptr_t   gl_closedir;    //void (*gl_closedir) (void *);
+    ptr_t   gl_readir;      //struct dirent *(*gl_readdir) (void *);
+    ptr_t   gl_opendir;     //void *(*gl_opendir) (const char *);
+    ptr_t   gl_lstat;       //int (*gl_lstat) (const char *__restrict, struct stat *__restrict);
+    ptr_t   gl_stat;        //int (*gl_stat) (const char *__restrict, struct stat *__restrict);
+} my_glob_32_t;
+// glob64 is identical, except function are 64bits versions
+
+static void convert_glob_to_32(void* d, void* s, int is64)
+{
+    if(!d || !s) return;
+    glob_t* src = s;
+    my_glob_32_t* dst = d;
+    for(int i=0; i<src->gl_pathc; ++i)
+        ((ptr_t*)src->gl_pathv)[i] = to_ptrv(src->gl_pathv[i]);
+    dst->gl_pathc = to_ulong(src->gl_pathc);
+    dst->gl_pathv = to_ptrv(src->gl_pathv);
+    dst->gl_offs = to_ulong(src->gl_offs);
+    dst->gl_flags = src->gl_flags;
+    // TODO: functions pointers
+}
+static void convert_glob_to_64(void* d, void* s, int is64)
+{
+    if(!d || !s) return;
+    my_glob_32_t* src = s;
+    glob_t* dst = d;
+    dst->gl_pathc = from_ulong(src->gl_pathc);
+    dst->gl_pathv = from_ptrv(src->gl_pathv);
+    dst->gl_offs = from_ulong(src->gl_offs);
+    dst->gl_flags = src->gl_flags;
+    for(int i=dst->gl_pathc-1; i>=0; --i)
+        dst->gl_pathv[i] = from_ptrv(((ptr_t*)dst->gl_pathv)[i]);
+    // TODO: functions pointers
+}
+
 EXPORT int32_t my32_glob(x64emu_t *emu, void* pat, int32_t flags, void* errfnc, void* pglob)
 {
+    glob_t glob_l = {0};
+    if(flags & GLOB_ALTDIRFUNC) printf_log(LOG_NONE, "Error: using unsupport GLOB_ALTDIRFUNC in glob\n");
+    convert_glob_to_64(&glob_l, pglob, 0);
     static iFpipp_t f = NULL;
     if(!f) {
         library_t* lib = my_lib;
         if(!lib) return 0;
         f = (iFpipp_t)dlsym(NULL, "glob");
     }
-
-    return f(pat, flags, findgloberrFct(errfnc), pglob);
+    int ret = f(pat, flags, findgloberrFct(errfnc), pglob);
+    convert_glob_to_32(pglob, &glob_l, 0);
+    return ret;
+}
+EXPORT void my32_globfree(x64emu_t* emu, void* pglob)
+{
+    glob_t glob_l = {0};
+    convert_glob_to_64(&glob_l, pglob, 0);
+    globfree(&glob_l);
 }
-#if 0
 #ifndef ANDROID
 EXPORT int32_t my32_glob64(x64emu_t *emu, void* pat, int32_t flags, void* errfnc, void* pglob)
 {
-    return glob64(pat, flags, findgloberrFct(errfnc), pglob);
+    glob64_t glob_l = {0};
+    if(flags & GLOB_ALTDIRFUNC) printf_log(LOG_NONE, "Error: using unsupport GLOB_ALTDIRFUNC in glob64\n");
+    convert_glob_to_64(&glob_l, pglob, 1);
+    int ret = glob64(pat, flags, findgloberrFct(errfnc), pglob);
+    convert_glob_to_32(pglob, &glob_l, 1);
+    return ret;
+}
+EXPORT void my32_globfree64(x64emu_t* emu, void* pglob)
+{
+    glob64_t glob_l = {0};
+    convert_glob_to_64(&glob_l, pglob, 1);
+    globfree64(&glob_l);
 }
-#endif
 #endif
 EXPORT int my32_scandir(x64emu_t *emu, void* dir, ptr_t* namelist, void* sel, void* comp)
 {
diff --git a/src/wrapped32/wrappedlibc_private.h b/src/wrapped32/wrappedlibc_private.h
index 4e8bcd88..e2ec4692 100755
--- a/src/wrapped32/wrappedlibc_private.h
+++ b/src/wrapped32/wrappedlibc_private.h
@@ -636,9 +636,9 @@ GO(getwchar_unlocked, uEv)
 // __getwd_chk
 GO(getxattr, iEpppL)
 GOM(glob, iEEpipp)             //%%
-//GOM(glob64, iEEpipp)           //%%
-GO(globfree, vEp)
-//GO(globfree64, vEp)
+GOM(glob64, iEEpipp)           //%%
+GOM(globfree, vEEp)             //%%
+GOM(globfree64, vEEp)           //%%
 // glob_pattern_p   // Weak
 GOM(gmtime, pEEp)
 GOM(__gmtime64, pEEp)