diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-07 10:45:31 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-07 10:45:31 +0200 |
| commit | 82c7d45c4b9ab85f718a4693ac08265f03bf0321 (patch) | |
| tree | 908bcce6c2a7b05bd1f2baaadb2dc4cadd6e1b82 /src/libtools | |
| parent | f81677278f6bbe387e20f7b9f642f8dcbef12387 (diff) | |
| download | box64-82c7d45c4b9ab85f718a4693ac08265f03bf0321.tar.gz box64-82c7d45c4b9ab85f718a4693ac08265f03bf0321.zip | |
[BOX32] Added a couple of 32bits function to libc
Diffstat (limited to 'src/libtools')
| -rw-r--r-- | src/libtools/libc_net32.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/libtools/libc_net32.c b/src/libtools/libc_net32.c index 73e660e6..cdbffeed 100644 --- a/src/libtools/libc_net32.c +++ b/src/libtools/libc_net32.c @@ -151,6 +151,84 @@ EXPORT void* my32_gethostbyname(x64emu_t* emu, const char* a) return &ret; } +EXPORT int my32_gethostbyname_r(x64emu_t* emu, void* name, struct i386_hostent* ret, void* buff, size_t buflen, ptr_t* result, int* h_err) +{ + struct hostent ret_l = {0}; + struct hostent *result_l = NULL; + int r = gethostbyname_r(name, &ret_l, buff, buflen, &result_l, h_err); + if(!result_l) + *result = 0; + else + *result = to_ptrv(ret); + // convert result, all memory allocated should be in program space + if(result_l) { + ret->h_name = to_cstring(result_l->h_name); + ret->h_addrtype = result_l->h_addrtype; + ret->h_length = result_l->h_length; + int idx = 0; + ret->h_aliases = to_ptrv(result_l->h_aliases); + if(result_l->h_aliases) { + char** p = result_l->h_aliases; + ptr_t* strings = from_ptrv(ret->h_aliases); + while(*p) { + strings[idx++] = to_cstring(*p); + ++p; + } + strings[idx++] = 0; + } + ret->h_addr_list = to_ptrv(result_l->h_addr_list); + if(result_l->h_addr_list) { + char** p = result_l->h_addr_list; + ptr_t* strings = from_ptrv(ret->h_addr_list); + while(*p) { + strings[idx++] = to_ptrv(*p); + ++p; + } + strings[idx++] = 0; + } + } + return r; +} + +EXPORT int my32_gethostbyaddr_r(x64emu_t* emu, void* addr, uint32_t len, int type, struct i386_hostent* ret, void* buff, size_t buflen, ptr_t* result, int* h_err) +{ + struct hostent ret_l = {0}; + struct hostent *result_l = NULL; + int r = gethostbyaddr_r(addr, len, type, &ret_l, buff, buflen, &result_l, h_err); + if(!result_l) + *result = 0; + else + *result = to_ptrv(ret); + // convert result, all memory allocated should be in program space + if(result_l) { + ret->h_name = to_cstring(result_l->h_name); + ret->h_addrtype = result_l->h_addrtype; + ret->h_length = result_l->h_length; + int idx = 0; + ret->h_aliases = to_ptrv(result_l->h_aliases); + if(result_l->h_aliases) { + char** p = result_l->h_aliases; + ptr_t* strings = from_ptrv(ret->h_aliases); + while(*p) { + strings[idx++] = to_cstring(*p); + ++p; + } + strings[idx++] = 0; + } + ret->h_addr_list = to_ptrv(result_l->h_addr_list); + if(result_l->h_addr_list) { + char** p = result_l->h_addr_list; + ptr_t* strings = from_ptrv(ret->h_addr_list); + while(*p) { + strings[idx++] = to_ptrv(*p); + ++p; + } + strings[idx++] = 0; + } + } + return r; +} + struct i386_ifaddrs { ptr_t ifa_next; // struct ifaddrs * |