this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Translate cmsg_level in recvmsg()/sendmsg() - needed for passing fds over Unix sockets

+28 -2
+24 -1
src/kernel/emulation/linux/network/recvmsg.c
··· 4 4 #include <linux-syscalls/linux.h> 5 5 #include <stddef.h> 6 6 #include "duct.h" 7 + #include "getsockopt.h" 7 8 8 9 extern void *malloc(__SIZE_TYPE__ size); 9 10 extern void free(void* ptr); ··· 70 71 if (lmsg.msg_controllen > 0) 71 72 { 72 73 bchdr->cmsg_len = lchdr->cmsg_len; 73 - bchdr->cmsg_level = lchdr->cmsg_level; 74 + bchdr->cmsg_level = socket_level_linux_to_bsd(lchdr->cmsg_level); 74 75 bchdr->cmsg_type = lchdr->cmsg_type; 75 76 76 77 // __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 99 } 99 100 100 101 102 + int socket_level_bsd_to_linux(int level) 103 + { 104 + switch (level) 105 + { 106 + case BSD_SOL_SOCKET: 107 + return LINUX_SOL_SOCKET; 108 + default: 109 + return level; 110 + } 111 + } 112 + 113 + int socket_level_linux_to_bsd(int level) 114 + { 115 + switch (level) 116 + { 117 + case LINUX_SOL_SOCKET: 118 + return BSD_SOL_SOCKET; 119 + default: 120 + return level; 121 + } 122 + } 123 +
+3
src/kernel/emulation/linux/network/recvmsg.h
··· 44 44 long sys_recvmsg(int socket, struct bsd_msghdr* msg, int flags); 45 45 long sys_recvmsg_nocancel(int socket, struct bsd_msghdr* msg, int flags); 46 46 47 + int socket_level_bsd_to_linux(int level); 48 + int socket_level_linux_to_bsd(int level); 49 + 47 50 #define LINUX_SYS_RECVMSG 17 48 51 49 52 #endif
+1 -1
src/kernel/emulation/linux/network/sendmsg.c
··· 41 41 lmsg.msg_controllen = msg->msg_controllen + 4; 42 42 43 43 lchdr->cmsg_len = bchdr->cmsg_len; 44 - lchdr->cmsg_level = bchdr->cmsg_level; 44 + lchdr->cmsg_level = socket_level_bsd_to_linux(bchdr->cmsg_level); 45 45 lchdr->cmsg_type = bchdr->cmsg_type; 46 46 47 47 memcpy(lchdr->cmsg_data, bchdr->cmsg_data,