this repo has no description
1
fork

Configure Feed

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

at fixPythonPipStalling 110 lines 3.4 kB view raw
1#include <sys/socket.h> 2#include <sys/un.h> 3#include <unistd.h> 4#include <sys/syscall.h> 5#include <stdlib.h> 6#include <string.h> 7#include <errno.h> 8#include <stdio.h> 9#include <signal.h> 10 11#include <darlingserver/rpc-supplement.h> 12 13#include <rtsig.h> 14 15#define dserver_rpc_hooks_msghdr_t struct msghdr 16#define dserver_rpc_hooks_iovec_t struct iovec 17#define dserver_rpc_hooks_cmsghdr_t struct cmsghdr 18#define DSERVER_RPC_HOOKS_CMSG_SPACE CMSG_SPACE 19#define DSERVER_RPC_HOOKS_CMSG_FIRSTHDR CMSG_FIRSTHDR 20#define DSERVER_RPC_HOOKS_SOL_SOCKET SOL_SOCKET 21#define DSERVER_RPC_HOOKS_SCM_RIGHTS SCM_RIGHTS 22#define DSERVER_RPC_HOOKS_CMSG_LEN CMSG_LEN 23#define DSERVER_RPC_HOOKS_CMSG_DATA CMSG_DATA 24#define DSERVER_RPC_HOOKS_ATTRIBUTE static 25 26#define dserver_rpc_hooks_get_pid getpid 27 28#define dserver_rpc_hooks_get_tid() ((pid_t)syscall(SYS_gettid)) 29 30#if __x86_64__ 31 #define dserver_rpc_hooks_get_architecture() dserver_rpc_architecture_x86_64 32#elif __i386__ 33 #define dserver_rpc_hooks_get_architecture() dserver_rpc_architecture_i386 34#elif __aarch64__ 35 #define dserver_rpc_hooks_get_architecture() dserver_rpc_architecture_arm64 36#elif __arm__ 37 #define dserver_rpc_hooks_get_architecture() dserver_rpc_architecture_arm32 38#else 39 #define dserver_rpc_hooks_get_architecture() dserver_rpc_architecture_invalid 40#endif 41 42extern struct sockaddr_un __dserver_socket_address_data; 43 44#define dserver_rpc_hooks_get_server_address() ((void*)&__dserver_socket_address_data) 45 46#define dserver_rpc_hooks_get_server_address_length() sizeof(__dserver_socket_address_data) 47 48#define dserver_rpc_hooks_memcpy memcpy 49 50static long int dserver_rpc_hooks_send_message(int socket, const dserver_rpc_hooks_msghdr_t* message) { 51 ssize_t ret = sendmsg(socket, message, 0); 52 if (ret < 0) { 53 return -errno; 54 } 55 return ret; 56}; 57 58static long int dserver_rpc_hooks_receive_message(int socket, dserver_rpc_hooks_msghdr_t* out_message) { 59 ssize_t ret = recvmsg(socket, out_message, 0); 60 if (ret < 0) { 61 return -errno; 62 } 63 64 if (ret >= sizeof(dserver_s2c_callhdr_t)) { 65 dserver_s2c_callhdr_t* callhdr = out_message->msg_iov->iov_base; 66 if (callhdr->call_number == 0x52cca11) { 67 // this is an S2C call 68 // mldr shouldn't need to be doing S2C calls 69 fprintf(stderr, "mldr darlingserver RPC hooks received S2C call\n"); 70 abort(); 71 } 72 } 73 74 return ret; 75}; 76 77#define dserver_rpc_hooks_get_bad_message_status() (-EBADMSG) 78 79#define dserver_rpc_hooks_get_communication_error_status() (-ECOMM) 80 81#define dserver_rpc_hooks_get_broken_pipe_status() (-EPIPE) 82 83#define dserver_rpc_hooks_close_fd close 84 85extern int __dserver_main_thread_socket_fd; 86 87#define dserver_rpc_hooks_get_socket() __dserver_main_thread_socket_fd 88 89#define dserver_rpc_hooks_printf(...) fprintf(stderr, ## __VA_ARGS__) 90 91#define dserver_rpc_hooks_atomic_save_t sigset_t 92 93static void dserver_rpc_hooks_atomic_begin(dserver_rpc_hooks_atomic_save_t* atomic_save) { 94 sigset_t set; 95 sigfillset(&set); 96 sigdelset(&set, LINUX_SIGRTMIN); 97 sigdelset(&set, LINUX_SIGRTMIN + 1); 98 pthread_sigmask(SIG_BLOCK, &set, atomic_save); 99}; 100 101static void dserver_rpc_hooks_atomic_end(dserver_rpc_hooks_atomic_save_t* atomic_save) { 102 pthread_sigmask(SIG_SETMASK, atomic_save, NULL); 103}; 104 105#define dserver_rpc_hooks_get_interrupt_status() (-EINTR) 106 107static void dserver_rpc_hooks_push_reply(int socket, const dserver_rpc_hooks_msghdr_t* reply, size_t size) { 108 // we shouldn't need to push any replies in mldr 109 abort(); 110};