third_party/libuv/src/unix/internal.h
Go to the documentation of this file.
1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to
5  * deal in the Software without restriction, including without limitation the
6  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7  * sell copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19  * IN THE SOFTWARE.
20  */
21 
22 #ifndef UV_UNIX_INTERNAL_H_
23 #define UV_UNIX_INTERNAL_H_
24 
25 #include "uv-common.h"
26 
27 #include <assert.h>
28 #include <limits.h> /* _POSIX_PATH_MAX, PATH_MAX */
29 #include <stdlib.h> /* abort */
30 #include <string.h> /* strrchr */
31 #include <fcntl.h> /* O_CLOEXEC and O_NONBLOCK, if supported. */
32 #include <stdio.h>
33 #include <errno.h>
34 #include <sys/socket.h>
35 
36 #if defined(__STRICT_ANSI__)
37 # define inline __inline
38 #endif
39 
40 #if defined(__linux__)
41 # include "linux-syscalls.h"
42 #endif /* __linux__ */
43 
44 #if defined(__MVS__)
45 # include "os390-syscalls.h"
46 #endif /* __MVS__ */
47 
48 #if defined(__sun)
49 # include <sys/port.h>
50 # include <port.h>
51 #endif /* __sun */
52 
53 #if defined(_AIX)
54 # define reqevents events
55 # define rtnevents revents
56 # include <sys/poll.h>
57 #else
58 # include <poll.h>
59 #endif /* _AIX */
60 
61 #if defined(__APPLE__) && !TARGET_OS_IPHONE
62 # include <AvailabilityMacros.h>
63 #endif
64 
65 #if defined(_POSIX_PATH_MAX)
66 # define UV__PATH_MAX _POSIX_PATH_MAX
67 #elif defined(PATH_MAX)
68 # define UV__PATH_MAX PATH_MAX
69 #else
70 # define UV__PATH_MAX 8192
71 #endif
72 
73 #if defined(__ANDROID__)
74 int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset);
75 # ifdef pthread_sigmask
76 # undef pthread_sigmask
77 # endif
78 # define pthread_sigmask(how, set, oldset) uv__pthread_sigmask(how, set, oldset)
79 #endif
80 
81 #define ACCESS_ONCE(type, var) \
82  (*(volatile type*) &(var))
83 
84 #define ROUND_UP(a, b) \
85  ((a) % (b) ? ((a) + (b)) - ((a) % (b)) : (a))
86 
87 #define UNREACHABLE() \
88  do { \
89  assert(0 && "unreachable code"); \
90  abort(); \
91  } \
92  while (0)
93 
94 #define SAVE_ERRNO(block) \
95  do { \
96  int _saved_errno = errno; \
97  do { block; } while (0); \
98  errno = _saved_errno; \
99  } \
100  while (0)
101 
102 /* The __clang__ and __INTEL_COMPILER checks are superfluous because they
103  * define __GNUC__. They are here to convey to you, dear reader, that these
104  * macros are enabled when compiling with clang or icc.
105  */
106 #if defined(__clang__) || \
107  defined(__GNUC__) || \
108  defined(__INTEL_COMPILER)
109 # define UV_DESTRUCTOR(declaration) __attribute__((destructor)) declaration
110 # define UV_UNUSED(declaration) __attribute__((unused)) declaration
111 #else
112 # define UV_DESTRUCTOR(declaration) declaration
113 # define UV_UNUSED(declaration) declaration
114 #endif
115 
116 /* Leans on the fact that, on Linux, POLLRDHUP == EPOLLRDHUP. */
117 #ifdef POLLRDHUP
118 # define UV__POLLRDHUP POLLRDHUP
119 #else
120 # define UV__POLLRDHUP 0x2000
121 #endif
122 
123 #ifdef POLLPRI
124 # define UV__POLLPRI POLLPRI
125 #else
126 # define UV__POLLPRI 0
127 #endif
128 
129 #if !defined(O_CLOEXEC) && defined(__FreeBSD__)
130 /*
131  * It may be that we are just missing `__POSIX_VISIBLE >= 200809`.
132  * Try using fixed value const and give up, if it doesn't work
133  */
134 # define O_CLOEXEC 0x00100000
135 #endif
136 
138 
139 /* loop flags */
140 enum {
142 };
143 
144 /* flags of excluding ifaddr */
145 enum {
148 };
149 
150 typedef enum {
151  UV_CLOCK_PRECISE = 0, /* Use the highest resolution clock available. */
152  UV_CLOCK_FAST = 1 /* Use the fastest clock with <= 1ms granularity. */
154 
156  unsigned int size;
157  unsigned int offset;
158  int fds[1];
159 };
160 
161 
162 #if defined(_AIX) || \
163  defined(__APPLE__) || \
164  defined(__DragonFly__) || \
165  defined(__FreeBSD__) || \
166  defined(__FreeBSD_kernel__) || \
167  defined(__linux__) || \
168  defined(__OpenBSD__) || \
169  defined(__NetBSD__)
170 #define uv__cloexec uv__cloexec_ioctl
171 #define uv__nonblock uv__nonblock_ioctl
172 #else
173 #define uv__cloexec uv__cloexec_fcntl
174 #define uv__nonblock uv__nonblock_fcntl
175 #endif
176 
177 /* On Linux, uv__nonblock_fcntl() and uv__nonblock_ioctl() do not commute
178  * when O_NDELAY is not equal to O_NONBLOCK. Case in point: linux/sparc32
179  * and linux/sparc64, where O_NDELAY is O_NONBLOCK + another bit.
180  *
181  * Libuv uses uv__nonblock_fcntl() directly sometimes so ensure that it
182  * commutes with uv__nonblock().
183  */
184 #if defined(__linux__) && O_NDELAY != O_NONBLOCK
185 #undef uv__nonblock
186 #define uv__nonblock uv__nonblock_fcntl
187 #endif
188 
189 /* core */
190 int uv__cloexec_ioctl(int fd, int set);
191 int uv__cloexec_fcntl(int fd, int set);
192 int uv__nonblock_ioctl(int fd, int set);
193 int uv__nonblock_fcntl(int fd, int set);
194 int uv__close(int fd); /* preserves errno */
195 int uv__close_nocheckstdio(int fd);
196 int uv__close_nocancel(int fd);
197 int uv__socket(int domain, int type, int protocol);
198 ssize_t uv__recvmsg(int fd, struct msghdr *msg, int flags);
200 int uv__getiovmax(void);
201 
202 void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd);
203 void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events);
204 void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events);
207 int uv__io_active(const uv__io_t* w, unsigned int events);
208 int uv__io_check_fd(uv_loop_t* loop, int fd);
209 void uv__io_poll(uv_loop_t* loop, int timeout); /* in milliseconds or -1 */
211 int uv__fd_exists(uv_loop_t* loop, int fd);
212 
213 /* async */
216 
217 
218 /* loop */
222 
223 /* stream */
226 int uv__stream_open(uv_stream_t*, int fd, int flags);
228 #if defined(__APPLE__)
229 int uv__stream_try_select(uv_stream_t* stream, int* fd);
230 #endif /* defined(__APPLE__) */
231 void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events);
232 int uv__accept(int sockfd);
233 int uv__dup2_cloexec(int oldfd, int newfd);
234 int uv__open_cloexec(const char* path, int flags);
235 
236 /* tcp */
237 int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb);
238 int uv__tcp_nodelay(int fd, int on);
239 int uv__tcp_keepalive(int fd, int on, unsigned int delay);
240 
241 /* pipe */
243 
244 /* signal */
246 void uv__signal_global_once_init(void);
249 
250 /* platform specific */
256 
257 /* various */
271 FILE* uv__open_file(const char* path);
272 int uv__getpwuid_r(uv_passwd_t* pwd);
273 
274 /* random */
275 int uv__random_devurandom(void* buf, size_t buflen);
276 int uv__random_getrandom(void* buf, size_t buflen);
277 int uv__random_getentropy(void* buf, size_t buflen);
278 int uv__random_readpath(const char* path, void* buf, size_t buflen);
279 int uv__random_sysctl(void* buf, size_t buflen);
280 
281 #if defined(__APPLE__)
282 int uv___stream_fd(const uv_stream_t* handle);
283 #define uv__stream_fd(handle) (uv___stream_fd((const uv_stream_t*) (handle)))
284 #else
285 #define uv__stream_fd(handle) ((handle)->io_watcher.fd)
286 #endif /* defined(__APPLE__) */
287 
288 #ifdef O_NONBLOCK
289 # define UV__F_NONBLOCK O_NONBLOCK
290 #else
291 # define UV__F_NONBLOCK 1
292 #endif
293 
294 int uv__make_pipe(int fds[2], int flags);
295 
296 #if defined(__APPLE__)
297 
301 
302 #endif /* defined(__APPLE__) */
303 
304 UV_UNUSED(static void uv__update_time(uv_loop_t* loop)) {
305  /* Use a fast time source if available. We only need millisecond precision.
306  */
307  loop->time = uv__hrtime(UV_CLOCK_FAST) / 1000000;
308 }
309 
310 UV_UNUSED(static char* uv__basename_r(const char* path)) {
311  char* s;
312 
313  s = strrchr(path, '/');
314  if (s == NULL)
315  return (char*) path;
316 
317  return s + 1;
318 }
319 
320 #if defined(__linux__)
321 int uv__inotify_fork(uv_loop_t* loop, void* old_watchers);
322 #endif
323 
324 typedef int (*uv__peersockfunc)(int, struct sockaddr*, socklen_t*);
325 
328  struct sockaddr* name,
329  int* namelen);
330 
331 #if defined(__linux__) || \
332  defined(__FreeBSD__) || \
333  defined(__FreeBSD_kernel__)
334 #define HAVE_MMSG 1
335 struct uv__mmsghdr {
336  struct msghdr msg_hdr;
337  unsigned int msg_len;
338 };
339 
340 int uv__recvmmsg(int fd,
341  struct uv__mmsghdr* mmsg,
342  unsigned int vlen,
343  unsigned int flags,
344  struct timespec* timeout);
345 int uv__sendmmsg(int fd,
346  struct uv__mmsghdr* mmsg,
347  unsigned int vlen,
348  unsigned int flags);
349 #else
350 #define HAVE_MMSG 0
351 #endif
352 
353 
354 #endif /* UV_UNIX_INTERNAL_H_ */
async_greeter_server_with_graceful_shutdown.loop
loop
Definition: async_greeter_server_with_graceful_shutdown.py:59
uv_fs_event_s
Definition: uv.h:1533
uv__signal_global_once_init
void uv__signal_global_once_init(void)
Definition: unix/signal.c:111
uv__stream_close
void uv__stream_close(uv_stream_t *handle)
Definition: unix/stream.c:1633
uv__run_prepare
void uv__run_prepare(uv_loop_t *loop)
uv_process_s
Definition: uv.h:1037
uv__fsevents_init
int uv__fsevents_init(uv_fs_event_t *handle)
Definition: fsevents.c:29
uv__random_getentropy
int uv__random_getentropy(void *buf, size_t buflen)
Definition: random-getentropy.c:39
uv__io_poll
void uv__io_poll(uv_loop_t *loop, int timeout)
Definition: aix.c:132
uv__run_check
void uv__run_check(uv_loop_t *loop)
uv__udp_finish_close
void uv__udp_finish_close(uv_udp_t *handle)
Definition: unix/udp.c:96
uv__signal_loop_fork
int uv__signal_loop_fork(uv_loop_t *loop)
Definition: unix/signal.c:279
uv__pthread_sigmask
int uv__pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
Definition: pthread-fixes.c:37
uv_passwd_s
Definition: uv.h:1099
uv__kqueue_init
int uv__kqueue_init(uv_loop_t *loop)
Definition: kqueue.c:51
uv__random_sysctl
int uv__random_sysctl(void *buf, size_t buflen)
Definition: netbsd.c:238
uv__nonblock_fcntl
int uv__nonblock_fcntl(int fd, int set)
Definition: unix/core.c:596
uv_handle_type
uv_handle_type
Definition: uv.h:189
uv__platform_loop_delete
void uv__platform_loop_delete(uv_loop_t *loop)
Definition: aix.c:94
uv__close_nocancel
int uv__close_nocancel(int fd)
Definition: unix/core.c:518
uv_prepare_s
Definition: uv.h:804
uv__io_check_fd
int uv__io_check_fd(uv_loop_t *loop, int fd)
Definition: aix.c:114
uv__platform_invalidate_fd
void uv__platform_invalidate_fd(uv_loop_t *loop, int fd)
Definition: aix.c:1222
uv__tcp_close
void uv__tcp_close(uv_tcp_t *handle)
Definition: unix/tcp.c:456
uv-common.h
string.h
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
uv__poll_close
void uv__poll_close(uv_poll_t *handle)
Definition: unix/poll.c:148
protocol
Protocol protocol
Definition: client_callback_end2end_test.cc:67
UV__EXCLUDE_IFPHYS
@ UV__EXCLUDE_IFPHYS
Definition: third_party/libuv/src/unix/internal.h:146
tcp
static uv_tcp_t tcp
Definition: test-connection-fail.c:29
setup.name
name
Definition: setup.py:542
uv__async_close
void uv__async_close(uv_async_t *handle)
Definition: unix/async.c:102
check_documentation.path
path
Definition: check_documentation.py:57
uv__cloexec_ioctl
int uv__cloexec_ioctl(int fd, int set)
Definition: unix/core.c:581
uv__io_init
void uv__io_init(uv__io_t *w, uv__io_cb cb, int fd)
Definition: unix/core.c:853
uv__open_cloexec
int uv__open_cloexec(const char *path, int flags)
Definition: unix/core.c:991
uv_tcp_listen
int uv_tcp_listen(uv_tcp_t *tcp, int backlog, uv_connection_cb cb)
Definition: unix/tcp.c:328
uv_clocktype_t
uv_clocktype_t
Definition: third_party/libuv/src/unix/internal.h:150
uv__random_readpath
int uv__random_readpath(const char *path, void *buf, size_t buflen)
Definition: random-devurandom.c:32
UV_UNUSED
#define UV_UNUSED(declaration)
Definition: third_party/libuv/src/unix/internal.h:113
uv_stream_s
Definition: uv.h:491
uv__close
int uv__close(int fd)
Definition: unix/core.c:557
uv__run_idle
void uv__run_idle(uv_loop_t *loop)
uv__hrtime
uint64_t uv__hrtime(uv_clocktype_t type)
Definition: aix-common.c:62
uv_check_s
Definition: uv.h:814
uv_async_s
Definition: uv.h:834
ssize_t
intptr_t ssize_t
Definition: win.h:27
xds_interop_client.int
int
Definition: xds_interop_client.py:113
uv__recvmsg
ssize_t uv__recvmsg(int fd, struct msghdr *msg, int flags)
Definition: unix/core.c:658
uv__server_io
void uv__server_io(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: unix/stream.c:528
uv__signal_close
void uv__signal_close(uv_signal_t *handle)
Definition: unix/signal.c:333
uv__inotify_fork
int uv__inotify_fork(uv_loop_t *loop, void *old_watchers)
Definition: linux-inotify.c:86
uv__stream_queued_fds_s::size
unsigned int size
Definition: third_party/libuv/src/unix/internal.h:156
uv_pipe_listen
int uv_pipe_listen(uv_pipe_t *handle, int backlog, uv_connection_cb cb)
Definition: unix/pipe.c:94
uv__close_nocheckstdio
int uv__close_nocheckstdio(int fd)
Definition: unix/core.c:538
uv__getpwuid_r
int uv__getpwuid_r(uv_passwd_t *pwd)
Definition: unix/core.c:1134
uv_udp_s
Definition: uv.h:629
uv__tcp_keepalive
int uv__tcp_keepalive(int fd, int on, unsigned int delay)
Definition: unix/tcp.c:377
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
uv__io_feed
void uv__io_feed(uv_loop_t *loop, uv__io_t *w)
Definition: unix/core.c:940
uv__make_pipe
int uv__make_pipe(int fds[2], int flags)
Definition: unix/process.c:142
UV_CLOCK_PRECISE
@ UV_CLOCK_PRECISE
Definition: third_party/libuv/src/unix/internal.h:151
uv__pipe_close
void uv__pipe_close(uv_pipe_t *handle)
Definition: unix/pipe.c:120
uv__stream_init
void uv__stream_init(uv_loop_t *loop, uv_stream_t *stream, uv_handle_type type)
Definition: unix/stream.c:85
uv__fsevents_loop_delete
void uv__fsevents_loop_delete(uv_loop_t *loop)
Definition: fsevents.c:39
uv__platform_loop_init
int uv__platform_loop_init(uv_loop_t *loop)
Definition: aix.c:80
uv_tcp_s
Definition: uv.h:544
linux-syscalls.h
UV_CLOCK_FAST
@ UV_CLOCK_FAST
Definition: third_party/libuv/src/unix/internal.h:152
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
uv__async_fork
int uv__async_fork(uv_loop_t *loop)
Definition: unix/async.c:217
uv__random_getrandom
int uv__random_getrandom(void *buf, size_t buflen)
Definition: random-getrandom.c:56
UV__EXCLUDE_IFADDR
@ UV__EXCLUDE_IFADDR
Definition: third_party/libuv/src/unix/internal.h:147
uv__signal_loop_cleanup
void uv__signal_loop_cleanup(uv_loop_t *loop)
Definition: unix/signal.c:289
uv__recvmmsg
int uv__recvmmsg(int fd, struct uv__mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout)
Definition: freebsd.c:305
uv__io_active
int uv__io_active(const uv__io_t *w, unsigned int events)
Definition: unix/core.c:946
uv_signal_s
Definition: uv.h:1561
func
const EVP_CIPHER *(* func)(void)
Definition: cipher_extra.c:73
uv_poll_s
Definition: uv.h:783
uv__stream_destroy
void uv__stream_destroy(uv_stream_t *stream)
Definition: unix/stream.c:458
uv__io_fork
int uv__io_fork(uv_loop_t *loop)
Definition: aix.c:107
benchmark.FILE
FILE
Definition: benchmark.py:21
uv__io_cb
void(* uv__io_cb)(struct uv_loop_s *loop, struct uv__io_s *w, unsigned int events)
Definition: unix.h:89
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
poll.h
uv__peersockfunc
int(* uv__peersockfunc)(int, struct sockaddr *, socklen_t *)
Definition: third_party/libuv/src/unix/internal.h:324
uv_idle_s
Definition: uv.h:824
uv__fsevents_close
int uv__fsevents_close(uv_fs_event_t *handle)
Definition: fsevents.c:34
uv__cloexec_fcntl
int uv__cloexec_fcntl(int fd, int set)
Definition: unix/core.c:627
uv_connection_cb
void(* uv_connection_cb)(uv_stream_t *server, int status)
Definition: uv.h:315
UV_LOOP_BLOCK_SIGPROF
@ UV_LOOP_BLOCK_SIGPROF
Definition: third_party/libuv/src/unix/internal.h:141
uv__handle_type
uv_handle_type uv__handle_type(int fd)
Definition: unix/stream.c:958
uv__random_devurandom
int uv__random_devurandom(void *buf, size_t buflen)
Definition: random-devurandom.c:86
uv__dup2_cloexec
int uv__dup2_cloexec(int oldfd, int newfd)
Definition: unix/core.c:1019
uv__idle_close
void uv__idle_close(uv_idle_t *handle)
uv__getsockpeername
int uv__getsockpeername(const uv_handle_t *handle, uv__peersockfunc func, struct sockaddr *name, int *namelen)
Definition: unix/core.c:1485
cpp.gmock_class.set
set
Definition: bloaty/third_party/googletest/googlemock/scripts/generator/cpp/gmock_class.py:44
uv__nonblock_ioctl
int uv__nonblock_ioctl(int fd, int set)
Definition: unix/core.c:566
uv_pipe_s
Definition: uv.h:757
uv__io_stop
void uv__io_stop(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: unix/core.c:898
uv__stream_queued_fds_s::fds
int fds[1]
Definition: third_party/libuv/src/unix/internal.h:158
uv__tcp_nodelay
int uv__tcp_nodelay(int fd, int on)
Definition: unix/tcp.c:370
uv__getiovmax
int uv__getiovmax(void)
Definition: unix/core.c:219
uv__check_close
void uv__check_close(uv_check_t *handle)
uv__fd_exists
int uv__fd_exists(uv_loop_t *loop, int fd)
Definition: unix/core.c:953
uv__make_close_pending
void uv__make_close_pending(uv_handle_t *handle)
Definition: unix/core.c:212
uv__process_close
void uv__process_close(uv_process_t *handle)
Definition: unix/process.c:590
uv__open_file
FILE * uv__open_file(const char *path)
Definition: unix/core.c:461
handle
static csh handle
Definition: test_arm_regression.c:16
uv_handle_s
Definition: uv.h:441
uv_loop_s
Definition: uv.h:1767
uv__stream_queued_fds_s
Definition: third_party/libuv/src/unix/internal.h:155
os390-syscalls.h
uv__async_stop
void uv__async_stop(uv_loop_t *loop)
Definition: unix/async.c:227
uv__prepare_close
void uv__prepare_close(uv_prepare_t *handle)
uv__accept
int uv__accept(int sockfd)
Definition: unix/core.c:477
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
uv__udp_close
void uv__udp_close(uv_udp_t *handle)
Definition: unix/udp.c:85
uv__stream_open
int uv__stream_open(uv_stream_t *, int fd, int flags)
Definition: unix/stream.c:406
uv__io_s
Definition: unix.h:94
uv__io_close
void uv__io_close(uv_loop_t *loop, uv__io_t *w)
Definition: unix/core.c:930
uv__socket
int uv__socket(int domain, int type, int protocol)
Definition: unix/core.c:424
uv__io_start
void uv__io_start(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: unix/core.c:870
timeout
uv_timer_t timeout
Definition: libuv/docs/code/uvwget/main.c:9
errno.h
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
uv__stream_queued_fds_s::offset
unsigned int offset
Definition: third_party/libuv/src/unix/internal.h:157
uv__fs_event_close
void uv__fs_event_close(uv_fs_event_t *handle)
Definition: aix.c:823
uv__sendmmsg
int uv__sendmmsg(int fd, struct uv__mmsghdr *mmsg, unsigned int vlen, unsigned int flags)
Definition: freebsd.c:293
stream
voidpf stream
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:07