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);
|
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)
|
||||||
{
|
{
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user