mirror of
https://github.com/ptitSeb/box64.git
synced 2025-10-14 02:38:54 +08:00
[BOX32][WRAPPER] Improved glob(64) support
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user