35#ifdef HAVE_SYS_SOCKET_H
36#include <sys/socket.h>
54#if !defined(_WIN32) && !defined(HAVE_KQUEUE)
55#define USE_PPOLL_IN_VIO
58#if defined(__cplusplus) && defined(USE_PPOLL_IN_VIO)
62#elif defined(__cplusplus) && defined(HAVE_KQUEUE)
67#ifdef HAVE_PSI_INTERFACE
75#define MYSQL_VIO Vio *
137#define VIO_SOCKET_ERROR ((size_t)-1)
138#define VIO_SOCKET_WANT_READ ((size_t)-2)
139#define VIO_SOCKET_WANT_WRITE ((size_t)-3)
141#define VIO_LOCALHOST 1
142#define VIO_BUFFERED_READ 2
143#define VIO_READ_BUFFER_SIZE 16384
152 HANDLE event_server_wrote,
154 HANDLE event_client_wrote,
156 HANDLE event_conn_closed);
181#define VIO_DESCRIPTION_SIZE 30
203 bool *connect_done =
nullptr);
206 size_t addr_length,
char *ip_string,
207 size_t ip_string_size);
212 size_t hostname_size,
char *
port,
size_t port_size,
216#include <openssl/opensslv.h>
218#if OPENSSL_VERSION_NUMBER < 0x0090700f
219#define DES_cblock des_cblock
220#define DES_key_schedule des_key_schedule
221#define DES_set_key_unchecked(k, ks) des_set_key_unchecked((k), *(ks))
222#define DES_ede3_cbc_encrypt(i, o, l, k1, k2, k3, iv, e) \
223 des_ede3_cbc_encrypt((i), (o), (l), *(k1), *(k2), *(k3), (iv), (e))
226#if OPENSSL_VERSION_NUMBER >= 0x10100000L
227#define HAVE_OPENSSL11 1
230#define HEADER_DES_LOCL_H dummy_something
232#include <openssl/err.h>
233#include <openssl/ssl.h>
259 unsigned long *errptr);
261 SSL_SESSION *session,
unsigned long *errptr, SSL **
ssl);
264 const char *key_file,
const char *cert_file,
const char *ca_file,
265 const char *ca_path,
const char *cipher,
const char *ciphersuites,
267 const long ssl_ctx_flags,
const char *server_host);
272 const char *key_file,
const char *cert_file,
const char *ca_file,
273 const char *ca_path,
const char *cipher,
const char *ciphersuites,
275 const long ssl_ctx_flags);
283#if !defined(DONT_MAP_VIO)
284#define vio_delete(vio) (vio)->viodelete(vio)
285#define vio_errno(vio) (vio)->vioerrno(vio)
286#define vio_read(vio, buf, size) ((vio)->read)(vio, buf, size)
287#define vio_write(vio, buf, size) ((vio)->write)(vio, buf, size)
288#define vio_fastsend(vio) (vio)->fastsend(vio)
289#define vio_keepalive(vio, set_keep_alive) \
290 (vio)->viokeepalive(vio, set_keep_alive)
291#define vio_should_retry(vio) (vio)->should_retry(vio)
292#define vio_was_timeout(vio) (vio)->was_timeout(vio)
293#define vio_shutdown(vio) ((vio)->vioshutdown)(vio)
294#define vio_peer_addr(vio, buf, prt, buflen) \
295 (vio)->peer_addr(vio, buf, prt, buflen)
296#define vio_io_wait(vio, event, timeout) (vio)->io_wait(vio, event, timeout)
297#define vio_is_connected(vio) (vio)->is_connected(vio)
298#define vio_is_blocking(vio) (vio)->is_blocking(vio)
299#define vio_set_blocking(vio, val) (vio)->set_blocking(vio, val)
300#define vio_set_blocking_flag(vio, val) (vio)->set_blocking_flag(vio, val)
335#ifdef USE_PPOLL_IN_VIO
363#elif defined HAVE_KQUEUE
365 std::atomic_flag kevent_wakeup_flag = ATOMIC_FLAG_INIT;
406 OVERLAPPED overlapped = {0, 0, {{0, 0}},
nullptr};
409 OVERLAPPED overlapped = {0};
419 HANDLE handle_file_map = {
nullptr};
420 char *handle_map = {
nullptr};
421 HANDLE event_server_wrote = {
nullptr};
422 HANDLE event_server_read = {
nullptr};
423 HANDLE event_client_wrote = {
nullptr};
424 HANDLE event_client_read = {
nullptr};
425 HANDLE event_conn_closed = {
nullptr};
426 size_t shared_memory_remain = {0};
427 char *shared_memory_pos = {
nullptr};
451#define SSL_handle SSL *
struct PSI_socket_locker PSI_socket_locker
Definition: psi_socket_bits.h:76
static int flags[50]
Definition: hp_test1.cc:39
static int kq_fd
Definition: kqueue_timers.cc:44
Some integer typedefs for easier portability.
unsigned char uchar
Definition: my_inttypes.h:51
uint16_t uint16
Definition: my_inttypes.h:64
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:64
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1054
Definition: buf0block_hint.cc:29
constexpr value_type ssl
Definition: classic_protocol_constants.h:48
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:909
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:495
required uint64 port
Definition: replication_asynchronous_connection_failover.proto:32
required string type
Definition: replication_group_member_actions.proto:33
required string event
Definition: replication_group_member_actions.proto:31
struct sockaddr sockaddr
Definition: sock_probe_win32.h:62
struct in_addr in_addr
Definition: sock_probe_win32.h:64
An instrumented socket.
Definition: mysql_socket_bits.h:34
State data storage for start_socket_wait_v1_t.
Definition: psi_socket_bits.h:157
Definition: violite.h:317
size_t(* read)(MYSQL_VIO, uchar *, size_t)
Definition: violite.h:385
PSI_socket_locker_state m_psi_write_state
Definition: violite.h:417
char * read_end
Definition: violite.h:333
bool localhost
Definition: violite.h:319
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:350
int(* vioshutdown)(MYSQL_VIO)
Definition: violite.h:399
int write_timeout
Definition: violite.h:323
int(* fastsend)(MYSQL_VIO)
Definition: violite.h:389
sigset_t signal_mask
Definition: violite.h:347
char * read_buffer
Definition: violite.h:330
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:346
int(* set_blocking)(Vio *vio, bool val)
Definition: violite.h:431
PSI_socket_locker_state m_psi_read_state
Definition: violite.h:415
bool(* should_retry)(MYSQL_VIO)
Definition: violite.h:392
std::atomic_flag poll_shutdown_flag
Definition: violite.h:362
char network_namespace[256]
Socket network namespace.
Definition: violite.h:372
char * read_pos
Definition: violite.h:331
int(* set_blocking_flag)(Vio *vio, bool val)
Definition: violite.h:432
int(* vioerrno)(MYSQL_VIO)
Definition: violite.h:384
bool(* is_blocking)(Vio *vio)
Definition: violite.h:430
size_t(* write)(MYSQL_VIO, const uchar *, size_t)
Definition: violite.h:386
bool is_blocking_flag
Definition: violite.h:434
bool(* peer_addr)(MYSQL_VIO, char *, uint16 *, size_t)
Definition: violite.h:390
enum_vio_type type
Definition: violite.h:320
bool(* connect)(MYSQL_VIO, struct sockaddr *, socklen_t, int)
Definition: violite.h:403
friend void internal_vio_delete(Vio *vio)
Definition: vio.cc:544
void(* viodelete)(MYSQL_VIO)
Definition: violite.h:383
bool inactive
Definition: violite.h:325
~Vio()
Definition: vio.cc:114
int(* viokeepalive)(MYSQL_VIO, bool)
Definition: violite.h:388
struct PSI_socket_locker * m_psi_write_locker
Definition: violite.h:416
friend Vio * internal_vio_create(uint flags)
Definition: vio.cc:415
size_t addrLen
Definition: violite.h:329
MYSQL_SOCKET mysql_socket
Definition: violite.h:318
bool(* was_timeout)(MYSQL_VIO)
Definition: violite.h:393
struct PSI_socket_locker * m_psi_read_locker
Definition: violite.h:414
int retry_count
Definition: violite.h:324
void * ssl_arg
Definition: violite.h:413
Vio & operator=(const Vio &)=delete
Vio(uint flags)
Definition: vio.cc:100
int read_timeout
Definition: violite.h:322
int(* io_wait)(MYSQL_VIO, enum enum_vio_io_event, int)
Definition: violite.h:402
int(* timeout)(MYSQL_VIO, uint, bool)
Definition: violite.h:387
struct sockaddr_storage remote
Definition: violite.h:328
bool(* is_connected)(MYSQL_VIO)
Definition: violite.h:400
bool(* has_data)(MYSQL_VIO)
Definition: violite.h:401
Definition: violite.h:254
SSL_CTX * ssl_context
Definition: violite.h:255
unsigned int uint
Definition: uca9-dump.cc:74
void vio_ssl_end()
Definition: viosslfactories.cc:413
#define vio_errno(vio)
Definition: violite.h:285
my_socket vio_fd(MYSQL_VIO vio)
SSL_type
Definition: violite.h:304
@ SSL_TYPE_NOT_SPECIFIED
Definition: violite.h:305
@ SSL_TYPE_NONE
Definition: violite.h:306
@ SSL_TYPE_ANY
Definition: violite.h:307
@ SSL_TYPE_X509
Definition: violite.h:308
@ SSL_TYPE_SPECIFIED
Definition: violite.h:309
#define vio_is_blocking(vio)
Definition: violite.h:298
#define vio_keepalive(vio, set_keep_alive)
Definition: violite.h:289
MYSQL_VIO vio_new(my_socket sd, enum enum_vio_type type, uint flags)
Definition: vio.cc:442
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:452
enum enum_vio_type vio_type(const MYSQL_VIO vio)
void ssl_start(void)
Definition: viosslfactories.cc:436
int sslaccept(struct st_VioSSLFd *, MYSQL_VIO, long timeout, unsigned long *errptr)
void vio_end(void)
Definition: vio.cc:558
int vio_timeout(MYSQL_VIO vio, uint which, int timeout_sec)
#define MYSQL_VIO
Definition: violite.h:75
#define vio_should_retry(vio)
Definition: violite.h:291
#define vio_set_blocking_flag(vio, val)
Definition: violite.h:300
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, const char *server_host)
Definition: viosslfactories.cc:733
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:579
void vio_description(MYSQL_VIO vio, char *buf)
const char * sslGetErrString(enum enum_ssl_init_error err)
Definition: viosslfactories.cc:212
enum_ssl_init_error
Definition: violite.h:235
@ SSL_FIPS_MODE_INVALID
Definition: violite.h:246
@ SSL_INITERR_NO_USABLE_CTX
Definition: violite.h:243
@ SSL_FIPS_MODE_FAILED
Definition: violite.h:247
@ SSL_INITERR_X509_VERIFY_PARAM
Definition: violite.h:249
@ SSL_INITERR_KEY
Definition: violite.h:238
@ SSL_INITERR_LASTERR
Definition: violite.h:250
@ SSL_INITERR_CERT
Definition: violite.h:237
@ SSL_INITERR_BAD_PATHS
Definition: violite.h:240
@ SSL_INITERR_NOMATCH
Definition: violite.h:239
@ SSL_INITERR_MEMFAIL
Definition: violite.h:242
@ SSL_INITERR_ECDHFAIL
Definition: violite.h:248
@ SSL_INITERR_CIPHERS
Definition: violite.h:241
@ SSL_TLS_VERSION_INVALID
Definition: violite.h:245
@ SSL_INITERR_NOERROR
Definition: violite.h:236
@ SSL_INITERR_DHFAIL
Definition: violite.h:244
void free_vio_ssl_acceptor_fd(struct st_VioSSLFd *fd)
Definition: viosslfactories.cc:790
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:1235
int sslconnect(struct st_VioSSLFd *, MYSQL_VIO, long timeout, SSL_SESSION *session, unsigned long *errptr, SSL **ssl)
enum_vio_io_event
VIO I/O events.
Definition: violite.h:131
@ VIO_IO_EVENT_WRITE
Definition: violite.h:133
@ VIO_IO_EVENT_CONNECT
Definition: violite.h:134
@ VIO_IO_EVENT_READ
Definition: violite.h:132
#define vio_fastsend(vio)
Definition: violite.h:288
#define vio_set_blocking(vio, val)
Definition: violite.h:299
#define vio_shutdown(vio)
Definition: violite.h:293
size_t vio_read_buff(MYSQL_VIO vio, uchar *buf, size_t size)
#define vio_delete(vio)
Definition: violite.h:284
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:61
#define HANDLE
Definition: violite.h:158
#define vio_peer_addr(vio, buf, prt, buflen)
Definition: violite.h:294
ssize_t vio_pending(MYSQL_VIO vio)
Vio Vio
Definition: violite.h:72
#define vio_was_timeout(vio)
Definition: violite.h:292
#define vio_read(vio, buf, size)
Definition: violite.h:286
#define vio_write(vio, buf, size)
Definition: violite.h:287
#define vio_io_wait(vio, event, timeout)
Definition: violite.h:296
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)
Definition: viosslfactories.cc:761
enum_vio_type
Definition: violite.h:78
@ LAST_VIO_TYPE
Definition: violite.h:117
@ VIO_TYPE_SHARED_MEMORY
Used for shared memory connections.
Definition: violite.h:102
@ NO_VIO_TYPE
Type of the connection is unknown.
Definition: violite.h:82
@ FIRST_VIO_TYPE
Definition: violite.h:112
@ VIO_TYPE_PLUGIN
Implicitly used by plugins that doesn't support any other VIO_TYPE.
Definition: violite.h:110
@ VIO_TYPE_SSL
Used in case of SSL connections.
Definition: violite.h:98
@ VIO_TYPE_NAMEDPIPE
Used for named pipe connections.
Definition: violite.h:94
@ VIO_TYPE_TCPIP
Used in case of TCP/IP connections.
Definition: violite.h:86
@ VIO_TYPE_LOCAL
Used internally by the prepared statements.
Definition: violite.h:106
@ VIO_TYPE_SOCKET
Used for Unix Domain socket connections.
Definition: violite.h:90
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:638
#define vio_is_connected(vio)
Definition: violite.h:297
MYSQL_VIO mysql_socket_vio_new(MYSQL_SOCKET mysql_socket, enum enum_vio_type type, uint flags)
Definition: vio.cc:423
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:1256