[BOX32][WRAPPER] Improved glob(64) support

This commit is contained in:
ptitSeb
2025-10-09 10:23:29 +02:00
parent 2ae7402fd7
commit 89e5c644d0
2 changed files with 68 additions and 8 deletions

View File

@@ -1628,24 +1628,84 @@ EXPORT int32_t my32_epoll_wait(x64emu_t* emu, int32_t epfd, void* events, int32_
UnalignEpollEvent32(events, _events, ret); UnalignEpollEvent32(events, _events, ret);
return 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) 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; static iFpipp_t f = NULL;
if(!f) { if(!f) {
library_t* lib = my_lib; library_t* lib = my_lib;
if(!lib) return 0; if(!lib) return 0;
f = (iFpipp_t)dlsym(NULL, "glob"); f = (iFpipp_t)dlsym(NULL, "glob");
} }
int ret = f(pat, flags, findgloberrFct(errfnc), pglob);
return 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 #ifndef ANDROID
EXPORT int32_t my32_glob64(x64emu_t *emu, void* pat, int32_t flags, void* errfnc, void* pglob) 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 #endif
EXPORT int my32_scandir(x64emu_t *emu, void* dir, ptr_t* namelist, void* sel, void* comp) EXPORT int my32_scandir(x64emu_t *emu, void* dir, ptr_t* namelist, void* sel, void* comp)
{ {

View File

@@ -636,9 +636,9 @@ GO(getwchar_unlocked, uEv)
// __getwd_chk // __getwd_chk
GO(getxattr, iEpppL) GO(getxattr, iEpppL)
GOM(glob, iEEpipp) //%% GOM(glob, iEEpipp) //%%
//GOM(glob64, iEEpipp) //%% GOM(glob64, iEEpipp) //%%
GO(globfree, vEp) GOM(globfree, vEEp) //%%
//GO(globfree64, vEp) GOM(globfree64, vEEp) //%%
// glob_pattern_p // Weak // glob_pattern_p // Weak
GOM(gmtime, pEEp) GOM(gmtime, pEEp)
GOM(__gmtime64, pEEp) GOM(__gmtime64, pEEp)