36#ifdef HAVE_SYS_SOCKET_H
37#include <sys/socket.h>
55#if !defined(_WIN32) && !defined(HAVE_KQUEUE)
56#define USE_PPOLL_IN_VIO
59#if defined(__cplusplus) && defined(USE_PPOLL_IN_VIO)
63#elif defined(__cplusplus) && defined(HAVE_KQUEUE)
68#ifdef HAVE_PSI_INTERFACE
76#define MYSQL_VIO Vio *
138#define VIO_SOCKET_ERROR ((size_t)-1)
139#define VIO_SOCKET_WANT_READ ((size_t)-2)
140#define VIO_SOCKET_WANT_WRITE ((size_t)-3)
142#define VIO_LOCALHOST 1
143#define VIO_BUFFERED_READ 2
144#define VIO_READ_BUFFER_SIZE 16384
153 HANDLE event_server_wrote,
155 HANDLE event_client_wrote,
157 HANDLE event_conn_closed);
182#define VIO_DESCRIPTION_SIZE 30
204 bool *connect_done =
nullptr);
207 size_t addr_length,
char *ip_string,
208 size_t ip_string_size);
213 size_t hostname_size,
char *
port,
size_t port_size,
216#define HEADER_DES_LOCL_H dummy_something
218#include <openssl/err.h>
219#include <openssl/ssl.h>
254 unsigned long *errptr);
256 SSL_SESSION *session,
unsigned long *errptr, SSL **
ssl,
257 const char *sni_servername);
260 const char *key_file,
const char *cert_file,
const char *ca_file,
261 const char *ca_path,
const char *cipher,
const char *ciphersuites,
264 const char *
tls_kex,
const char *server_host);
269 const char *key_file,
const char *cert_file,
const char *ca_file,
270 const char *ca_path,
const char *cipher,
const char *ciphersuites,
281#if !defined(DONT_MAP_VIO)
282#define vio_delete(vio) (vio)->viodelete(vio)
283#define vio_errno(vio) (vio)->vioerrno(vio)
284#define vio_read(vio, buf, size) ((vio)->read)(vio, buf, size)
285#define vio_write(vio, buf, size) ((vio)->write)(vio, buf, size)
286#define vio_fastsend(vio) (vio)->fastsend(vio)
287#define vio_keepalive(vio, set_keep_alive) \
288 (vio)->viokeepalive(vio, set_keep_alive)
289#define vio_should_retry(vio) (vio)->should_retry(vio)
290#define vio_was_timeout(vio) (vio)->was_timeout(vio)
291#define vio_shutdown(vio) ((vio)->vioshutdown)(vio)
292#define vio_peer_addr(vio, buf, prt, buflen) \
293 (vio)->peer_addr(vio, buf, prt, buflen)
294#define vio_io_wait(vio, event, timeout) (vio)->io_wait(vio, event, timeout)
295#define vio_is_connected(vio) (vio)->is_connected(vio)
296#define vio_is_blocking(vio) (vio)->is_blocking(vio)
297#define vio_set_blocking(vio, val) (vio)->set_blocking(vio, val)
298#define vio_set_blocking_flag(vio, val) (vio)->set_blocking_flag(vio, val)
333#ifdef USE_PPOLL_IN_VIO
361#elif defined HAVE_KQUEUE
363 std::atomic_flag kevent_wakeup_flag = ATOMIC_FLAG_INIT;
404 OVERLAPPED overlapped = {0, 0, {{0, 0}},
nullptr};
407 OVERLAPPED overlapped = {0};
417 HANDLE handle_file_map = {
nullptr};
418 char *handle_map = {
nullptr};
419 HANDLE event_server_wrote = {
nullptr};
420 HANDLE event_server_read = {
nullptr};
421 HANDLE event_client_wrote = {
nullptr};
422 HANDLE event_client_read = {
nullptr};
423 HANDLE event_conn_closed = {
nullptr};
424 size_t shared_memory_remain = {0};
425 char *shared_memory_pos = {
nullptr};
449#define SSL_handle SSL *
struct PSI_socket_locker PSI_socket_locker
Definition: psi_socket_bits.h:77
static int flags[50]
Definition: hp_test1.cc:40
static int kq_fd
Definition: kqueue_timers.cc:45
Some integer typedefs for easier portability.
unsigned char uchar
Definition: my_inttypes.h:52
uint16_t uint16
Definition: my_inttypes.h:65
Types to make file and socket I/O compatible.
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
Types to make different thread packages compatible.
int my_socket
Definition: mysql.h:65
void error(const char *format,...)
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1077
Definition: buf0block_hint.cc:30
constexpr value_type ssl
Definition: classic_protocol_constants.h:49
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:943
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:499
size_t size(const char *const c)
Definition: base64.h:46
required uint64 port
Definition: replication_asynchronous_connection_failover.proto:33
required string type
Definition: replication_group_member_actions.proto:34
required string event
Definition: replication_group_member_actions.proto:32
struct sockaddr sockaddr
Definition: sock_probe_win32.h:63
struct in_addr in_addr
Definition: sock_probe_win32.h:65
An instrumented socket.
Definition: mysql_socket_bits.h:35
State data storage for start_socket_wait_v1_t.
Definition: psi_socket_bits.h:158
Definition: violite.h:315
size_t(* read)(MYSQL_VIO, uchar *, size_t)
Definition: violite.h:383
PSI_socket_locker_state m_psi_write_state
Definition: violite.h:415
char * read_end
Definition: violite.h:331
bool localhost
Definition: violite.h:317
friend bool vio_reset(Vio *vio, enum_vio_type type, my_socket sd, void *ssl, uint flags)
Reinitialize an existing Vio object.
Definition: vio.cc:364
int(* vioshutdown)(MYSQL_VIO)
Definition: violite.h:397
int write_timeout
Definition: violite.h:321
int(* fastsend)(MYSQL_VIO)
Definition: violite.h:387
sigset_t signal_mask
Definition: violite.h:345
char * read_buffer
Definition: violite.h:328
std::optional< my_thread_t > thread_id
Thread PID which is to be sent SIGALRM to terminate ppoll wait when shutting down vio.
Definition: violite.h:344
int(* set_blocking)(Vio *vio, bool val)
Definition: violite.h:429
PSI_socket_locker_state m_psi_read_state
Definition: violite.h:413
bool(* should_retry)(MYSQL_VIO)
Definition: violite.h:390
std::atomic_flag poll_shutdown_flag
Definition: violite.h:360
char network_namespace[256]
Socket network namespace.
Definition: violite.h:370
char * read_pos
Definition: violite.h:329
int(* set_blocking_flag)(Vio *vio, bool val)
Definition: violite.h:430
int(* vioerrno)(MYSQL_VIO)
Definition: violite.h:382
bool(* is_blocking)(Vio *vio)
Definition: violite.h:428
size_t(* write)(MYSQL_VIO, const uchar *, size_t)
Definition: violite.h:384
bool is_blocking_flag
Definition: violite.h:432
bool(* peer_addr)(MYSQL_VIO, char *, uint16 *, size_t)
Definition: violite.h:388
enum_vio_type type
Definition: violite.h:318
bool(* connect)(MYSQL_VIO, struct sockaddr *, socklen_t, int)
Definition: violite.h:401
friend void internal_vio_delete(Vio *vio)
Definition: vio.cc:558
void(* viodelete)(MYSQL_VIO)
Definition: violite.h:381
bool inactive
Definition: violite.h:323
~Vio()
Definition: vio.cc:127
int(* viokeepalive)(MYSQL_VIO, bool)
Definition: violite.h:386
struct PSI_socket_locker * m_psi_write_locker
Definition: violite.h:414
friend Vio * internal_vio_create(uint flags)
Definition: vio.cc:429
size_t addrLen
Definition: violite.h:327
MYSQL_SOCKET mysql_socket
Definition: violite.h:316
bool(* was_timeout)(MYSQL_VIO)
Definition: violite.h:391
struct PSI_socket_locker * m_psi_read_locker
Definition: violite.h:412
int retry_count
Definition: violite.h:322
void * ssl_arg
Definition: violite.h:411
Vio & operator=(const Vio &)=delete
Vio(uint flags)
Definition: vio.cc:113
int read_timeout
Definition: violite.h:320
int(* io_wait)(MYSQL_VIO, enum enum_vio_io_event, int)
Definition: violite.h:400
int(* timeout)(MYSQL_VIO, uint, bool)
Definition: violite.h:385
struct sockaddr_storage remote
Definition: violite.h:326
bool(* is_connected)(MYSQL_VIO)
Definition: violite.h:398
bool(* has_data)(MYSQL_VIO)
Definition: violite.h:399
Definition: violite.h:245
char * tls_kex
Definition: violite.h:250
bool tls_force_pqc
Definition: violite.h:247
bool tls_session_cache_pqc_only
Definition: violite.h:248
bool tls_use_pqc_sign
Definition: violite.h:249
SSL_CTX * ssl_context
Definition: violite.h:246
void vio_ssl_end()
Definition: viosslfactories.cc:187
struct st_VioSSLFd * new_VioSSLAcceptorFd(const char *key_file, const char *cert_file, const char *ca_file, const char *ca_path, const char *cipher, const char *ciphersuites, enum enum_ssl_init_error *error, const char *crl_file, const char *crl_path, const long ssl_ctx_flags, bool tls_force_pqc, bool tls_use_pqc_sign, const char *tls_kex)
Definition: viosslfactories.cc:516
#define vio_errno(vio)
Definition: violite.h:283
my_socket vio_fd(MYSQL_VIO vio)
SSL_type
Definition: violite.h:302
@ SSL_TYPE_NOT_SPECIFIED
Definition: violite.h:303
@ SSL_TYPE_NONE
Definition: violite.h:304
@ SSL_TYPE_ANY
Definition: violite.h:305
@ SSL_TYPE_X509
Definition: violite.h:306
@ SSL_TYPE_SPECIFIED
Definition: violite.h:307
#define vio_is_blocking(vio)
Definition: violite.h:296
#define vio_keepalive(vio, set_keep_alive)
Definition: violite.h:287
MYSQL_VIO vio_new(my_socket sd, enum enum_vio_type type, uint flags)
Definition: vio.cc:456
bool vio_reset(MYSQL_VIO vio, enum enum_vio_type type, my_socket sd, void *ssl, uint flags)
long process_tls_version(const char *tls_version)
Definition: viosslfactories.cc:208
enum enum_vio_type vio_type(const MYSQL_VIO vio)
void ssl_start(void)
Definition: viosslfactories.cc:198
int sslaccept(struct st_VioSSLFd *, MYSQL_VIO, long timeout, unsigned long *errptr)
void vio_end(void)
Definition: vio.cc:572
int vio_timeout(MYSQL_VIO vio, uint which, int timeout_sec)
#define MYSQL_VIO
Definition: violite.h:76
#define vio_should_retry(vio)
Definition: violite.h:289
#define vio_set_blocking_flag(vio, val)
Definition: violite.h:298
void get_vio_type_name(enum enum_vio_type vio_type, const char **str, int *len)
Convert a vio type to a printable string.
Definition: vio.cc:593
int sslconnect(struct st_VioSSLFd *, MYSQL_VIO, long timeout, SSL_SESSION *session, unsigned long *errptr, SSL **ssl, const char *sni_servername)
void vio_description(MYSQL_VIO vio, char *buf)
const char * sslGetErrString(enum enum_ssl_init_error err)
Definition: viosslfactories.cc:107
enum_ssl_init_error
Definition: violite.h:221
@ SSL_FIPS_MODE_INVALID
Definition: violite.h:232
@ SSL_INITERR_NO_USABLE_CTX
Definition: violite.h:229
@ SSL_FIPS_MODE_FAILED
Definition: violite.h:233
@ SSL_INITERR_X509_VERIFY_PARAM
Definition: violite.h:237
@ SSL_INITERR_SESSION_ID_CONTEXT
Definition: violite.h:240
@ SSL_INITERR_KEY
Definition: violite.h:224
@ SSL_INITERR_LASTERR
Definition: violite.h:241
@ SSL_INITERR_CERT
Definition: violite.h:223
@ SSL_INITERR_BAD_PATHS
Definition: violite.h:226
@ SSL_INITERR_INVALID_CERTIFICATES
Definition: violite.h:238
@ SSL_INITERR_NOMATCH
Definition: violite.h:225
@ SSL_INITERR_MEMFAIL
Definition: violite.h:228
@ SSL_INITERR_ECDHFAIL
Definition: violite.h:234
@ SSL_INITERR_CIPHERS
Definition: violite.h:227
@ SSL_INITERR_SIGALGS
Definition: violite.h:239
@ SSL_INITERR_KEX_GROUPS
Definition: violite.h:235
@ SSL_TLS_VERSION_INVALID
Definition: violite.h:231
@ SSL_INITERR_PQC_UNSUPPORTED
Definition: violite.h:236
@ SSL_INITERR_NOERROR
Definition: violite.h:222
@ SSL_INITERR_DHFAIL
Definition: violite.h:230
void free_vio_ssl_acceptor_fd(struct st_VioSSLFd *fd)
Definition: viosslfactories.cc:563
bool vio_is_no_name_error(int err_code)
Checks if the error code, returned by vio_getnameinfo(), means it was the "No-name" error.
Definition: viosocket.cc:1257
enum_vio_io_event
VIO I/O events.
Definition: violite.h:132
@ VIO_IO_EVENT_WRITE
Definition: violite.h:134
@ VIO_IO_EVENT_CONNECT
Definition: violite.h:135
@ VIO_IO_EVENT_READ
Definition: violite.h:133
#define vio_fastsend(vio)
Definition: violite.h:286
#define vio_set_blocking(vio, val)
Definition: violite.h:297
#define vio_shutdown(vio)
Definition: violite.h:291
size_t vio_read_buff(MYSQL_VIO vio, uchar *buf, size_t size)
#define vio_delete(vio)
Definition: violite.h:282
bool vio_socket_connect(MYSQL_VIO vio, struct sockaddr *addr, socklen_t len, bool nonblocking, int timeout, bool *connect_done=nullptr)
void init_vio_psi_keys()
Definition: vio.cc:74
#define HANDLE
Definition: violite.h:159
#define vio_peer_addr(vio, buf, prt, buflen)
Definition: violite.h:292
ssize_t vio_pending(MYSQL_VIO vio)
Vio Vio
Definition: violite.h:73
#define vio_was_timeout(vio)
Definition: violite.h:290
#define vio_read(vio, buf, size)
Definition: violite.h:284
#define vio_write(vio, buf, size)
Definition: violite.h:285
#define vio_io_wait(vio, event, timeout)
Definition: violite.h:294
enum_vio_type
Definition: violite.h:79
@ LAST_VIO_TYPE
Definition: violite.h:118
@ VIO_TYPE_SHARED_MEMORY
Used for shared memory connections.
Definition: violite.h:103
@ NO_VIO_TYPE
Type of the connection is unknown.
Definition: violite.h:83
@ FIRST_VIO_TYPE
Definition: violite.h:113
@ VIO_TYPE_PLUGIN
Implicitly used by plugins that doesn't support any other VIO_TYPE.
Definition: violite.h:111
@ VIO_TYPE_SSL
Used in case of SSL connections.
Definition: violite.h:99
@ VIO_TYPE_NAMEDPIPE
Used for named pipe connections.
Definition: violite.h:95
@ VIO_TYPE_TCPIP
Used in case of TCP/IP connections.
Definition: violite.h:87
@ VIO_TYPE_LOCAL
Used internally by the prepared statements.
Definition: violite.h:107
@ VIO_TYPE_SOCKET
Used for Unix Domain socket connections.
Definition: violite.h:91
bool vio_get_normalized_ip_string(const struct sockaddr *addr, size_t addr_length, char *ip_string, size_t ip_string_size)
Return the normalized IP address string for a sock-address.
Definition: viosocket.cc:660
#define vio_is_connected(vio)
Definition: violite.h:295
struct st_VioSSLFd * new_VioSSLConnectorFd(const char *key_file, const char *cert_file, const char *ca_file, const char *ca_path, const char *cipher, const char *ciphersuites, enum enum_ssl_init_error *error, const char *crl_file, const char *crl_path, const long ssl_ctx_flags, bool tls_force_pqc, bool tls_use_pqc_sign, const char *tls_kex, const char *server_host)
Definition: viosslfactories.cc:483
MYSQL_VIO mysql_socket_vio_new(MYSQL_SOCKET mysql_socket, enum enum_vio_type type, uint flags)
Definition: vio.cc:437
int vio_getnameinfo(const struct sockaddr *sa, char *hostname, size_t hostname_size, char *port, size_t port_size, int flags)
This is a wrapper for the system getnameinfo(), because different OS differ in the getnameinfo() impl...
Definition: viosocket.cc:1278