diff --git a/src/kernel/emulation/linux/network/recvmsg.c b/src/kernel/emulation/linux/network/recvmsg.c index d2abaeb9c..6130e61b8 100644 --- a/src/kernel/emulation/linux/network/recvmsg.c +++ b/src/kernel/emulation/linux/network/recvmsg.c @@ -4,6 +4,7 @@ #include #include #include "duct.h" +#include "getsockopt.h" extern void *malloc(__SIZE_TYPE__ size); extern void free(void* ptr); @@ -70,7 +71,7 @@ long sys_recvmsg_nocancel(int socket, struct bsd_msghdr* msg, int flags) if (lmsg.msg_controllen > 0) { bchdr->cmsg_len = lchdr->cmsg_len; - bchdr->cmsg_level = lchdr->cmsg_level; + bchdr->cmsg_level = socket_level_linux_to_bsd(lchdr->cmsg_level); bchdr->cmsg_type = lchdr->cmsg_type; // __simple_printf("Copy %p to %p, %d bytes (of %d)\n", lchdr->cmsg_data, bchdr->cmsg_data, lchdr->cmsg_len - sizeof(struct linux_cmsghdr), lchdr->cmsg_len); @@ -98,3 +99,25 @@ long sys_recvmsg_nocancel(int socket, struct bsd_msghdr* msg, int flags) } +int socket_level_bsd_to_linux(int level) +{ + switch (level) + { + case BSD_SOL_SOCKET: + return LINUX_SOL_SOCKET; + default: + return level; + } +} + +int socket_level_linux_to_bsd(int level) +{ + switch (level) + { + case LINUX_SOL_SOCKET: + return BSD_SOL_SOCKET; + default: + return level; + } +} + diff --git a/src/kernel/emulation/linux/network/recvmsg.h b/src/kernel/emulation/linux/network/recvmsg.h index 0effc4610..0ac78eed8 100644 --- a/src/kernel/emulation/linux/network/recvmsg.h +++ b/src/kernel/emulation/linux/network/recvmsg.h @@ -44,6 +44,9 @@ struct linux_cmsghdr long sys_recvmsg(int socket, struct bsd_msghdr* msg, int flags); long sys_recvmsg_nocancel(int socket, struct bsd_msghdr* msg, int flags); +int socket_level_bsd_to_linux(int level); +int socket_level_linux_to_bsd(int level); + #define LINUX_SYS_RECVMSG 17 #endif diff --git a/src/kernel/emulation/linux/network/sendmsg.c b/src/kernel/emulation/linux/network/sendmsg.c index 457b9e628..6ab375ecf 100644 --- a/src/kernel/emulation/linux/network/sendmsg.c +++ b/src/kernel/emulation/linux/network/sendmsg.c @@ -41,7 +41,7 @@ long sys_sendmsg_nocancel(int socket, const struct bsd_msghdr* msg, int flags) lmsg.msg_controllen = msg->msg_controllen + 4; lchdr->cmsg_len = bchdr->cmsg_len; - lchdr->cmsg_level = bchdr->cmsg_level; + lchdr->cmsg_level = socket_level_bsd_to_linux(bchdr->cmsg_level); lchdr->cmsg_type = bchdr->cmsg_type; memcpy(lchdr->cmsg_data, bchdr->cmsg_data,