diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-04 12:28:11 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-04 12:28:11 +0200 |
| commit | 9f4eb36c99723f20e203bda0db07005284ae2eba (patch) | |
| tree | c4b1de9a09ef69c3ba597a82ead6c8017d9ecaaf /src/libtools/libc_net32.c | |
| parent | cbbafafb46b39b5ccb6f4c08d085317bcf09fba0 (diff) | |
| download | box64-9f4eb36c99723f20e203bda0db07005284ae2eba.tar.gz box64-9f4eb36c99723f20e203bda0db07005284ae2eba.zip | |
[BOX32][WRAPPER] More wrapped function to libc, and many fixes some existing ones
Diffstat (limited to 'src/libtools/libc_net32.c')
| -rw-r--r-- | src/libtools/libc_net32.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/libtools/libc_net32.c b/src/libtools/libc_net32.c index 6bdbce82..533104d2 100644 --- a/src/libtools/libc_net32.c +++ b/src/libtools/libc_net32.c @@ -36,26 +36,43 @@ #include "box32.h" #include "converter32.h" -EXPORT ssize_t my32_recvmsg(x64emu_t* emu, int socket, void* msg, int flags) +EXPORT ssize_t my32_recvmsg(x64emu_t* emu, int socket, struct i386_msghdr* msg, int flags) { - struct iovec iov; + struct iovec iov[msg->msg_iovlen]; struct msghdr m; - AlignMsgHdr_32(&m, &iov, msg); + uint8_t buff[msg->msg_controllen+256]; + AlignMsgHdr_32(&m, iov, buff, msg, 0); ssize_t ret = recvmsg(socket, &m, flags); - // put back msg_flags in place - ((struct i386_msghdr*)msg)->msg_flags = m.msg_flags; + UnalignMsgHdr_32(msg, &m); return ret; } -EXPORT ssize_t my32_sendmsg(x64emu_t* emu, int socket, void* msg, int flags) +EXPORT ssize_t my32_sendmsg(x64emu_t* emu, int socket, struct i386_msghdr* msg, int flags) { - struct iovec iov[256]; + struct iovec iov[msg->msg_iovlen]; struct msghdr m; - AlignMsgHdr_32(&m, &iov, msg); + uint8_t buff[msg->msg_controllen+256]; + AlignMsgHdr_32(&m, iov, buff, msg, 1); ssize_t ret = sendmsg(socket, &m, flags); + UnalignMsgHdr_32(msg, &m); return ret; } +EXPORT void* my32___cmsg_nxthdr(struct i386_msghdr* mhdr, struct i386_cmsghdr* cmsg) +{ + // simpler to redo, also, will be used internaly + if(cmsg->cmsg_len < sizeof(struct i386_cmsghdr)) + return NULL; + // compute next + cmsg = (struct i386_cmsghdr*)(((uintptr_t)cmsg) + ((cmsg->cmsg_len+3)&~3)); + // check it still inside limits + if((uintptr_t)(cmsg+1) > mhdr->msg_control+mhdr->msg_controllen) + return NULL; + if((uintptr_t)(cmsg)+cmsg->cmsg_len > mhdr->msg_control+mhdr->msg_controllen) + return NULL; + return cmsg; +} + EXPORT int my32_getaddrinfo(x64emu_t* emu, void* node, void* service, struct i386_addrinfo* hints, ptr_t* res) { struct addrinfo* hints_ = (struct addrinfo*)hints; // only first part is used, wich is identical |