about summary refs log tree commit diff stats
path: root/src/libtools/libc_net32.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-04 12:28:11 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-04 12:28:11 +0200
commit9f4eb36c99723f20e203bda0db07005284ae2eba (patch)
treec4b1de9a09ef69c3ba597a82ead6c8017d9ecaaf /src/libtools/libc_net32.c
parentcbbafafb46b39b5ccb6f4c08d085317bcf09fba0 (diff)
downloadbox64-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.c33
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