diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-10-09 10:23:29 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-10-09 10:23:29 +0200 |
| commit | 89e5c644d070163383bf4f892333ec84352d776b (patch) | |
| tree | 47245e6acf9850f2bcb96cd7a1bb190de8ade324 | |
| parent | 2ae7402fd7dab5ecffcfe14e45ba53fd3aae4631 (diff) | |
| download | box64-89e5c644d070163383bf4f892333ec84352d776b.tar.gz box64-89e5c644d070163383bf4f892333ec84352d776b.zip | |
[BOX32][WRAPPER] Improved glob(64) support
| -rwxr-xr-x | src/wrapped32/wrappedlibc.c | 70 | ||||
| -rwxr-xr-x | src/wrapped32/wrappedlibc_private.h | 6 |
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) |