this repo has no description
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};