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,
217#include <openssl/opensslv.h>
219#if OPENSSL_VERSION_NUMBER < 0x0090700f
220#define DES_cblock des_cblock
221#define DES_key_schedule des_key_schedule
222#define DES_set_key_unchecked(k, ks) des_set_key_unchecked((k), *(ks))
223#define DES_ede3_cbc_encrypt(i, o, l, k1, k2, k3, iv, e) \
224 des_ede3_cbc_encrypt((i), (o), (l), *(k1), *(k2), *(k3), (iv), (e))
227#if OPENSSL_VERSION_NUMBER >= 0x10100000L
228#define HAVE_OPENSSL11 1
231#define HEADER_DES_LOCL_H dummy_something
233#include <openssl/err.h>
234#include <openssl/ssl.h>
260 unsigned long *errptr);
262 SSL_SESSION *session,
unsigned long *errptr, SSL **
ssl);
265 const char *key_file,
const char *cert_file,
const char *ca_file,
266 const char *ca_path,
const char *cipher,
const char *ciphersuites,
268 const long ssl_ctx_flags,
const char *server_host);
273 const char *key_file,
const char *cert_file,
const char *ca_file,
274 const char *ca_path,
const char *cipher,
const char *ciphersuites,
276 const long ssl_ctx_flags);
284#if !defined(DONT_MAP_VIO)
285#define vio_delete(vio) (vio)->viodelete(vio)
286#define vio_errno(vio) (vio)->vioerrno(vio)
287#define vio_read(vio, buf, size) ((vio)->read)(vio, buf, size)
288#define vio_write(vio, buf, size) ((vio)->write)(vio, buf, size)
289#define vio_fastsend(vio) (vio)->fastsend(vio)
290#define vio_keepalive(vio, set_keep_alive) \
291 (vio)->viokeepalive(vio, set_keep_alive)
292#define vio_should_retry(vio) (vio)->should_retry(vio)
293#define vio_was_timeout(vio) (vio)->was_timeout(vio)
294#define vio_shutdown(vio) ((vio)->vioshutdown)(vio)
295#define vio_peer_addr(vio, buf, prt, buflen) \
296 (vio)->peer_addr(vio, buf, prt, buflen)
297#define vio_io_wait(vio, event, timeout) (vio)->io_wait(vio, event, timeout)
298#define vio_is_connected(vio) (vio)->is_connected(vio)
299#define vio_is_blocking(vio) (vio)->is_blocking(vio)
300#define vio_set_blocking(vio, val) (vio)->set_blocking(vio, val)
301#define vio_set_blocking_flag(vio, val) (vio)->set_blocking_flag(vio, val)
336#ifdef USE_PPOLL_IN_VIO
364#elif defined HAVE_KQUEUE
366 std::atomic_flag kevent_wakeup_flag = ATOMIC_FLAG_INIT;
407 OVERLAPPED overlapped = {0, 0, {{0, 0}},
nullptr};
410 OVERLAPPED overlapped = {0};
420 HANDLE handle_file_map = {
nullptr};
421 char *handle_map = {
nullptr};
422 HANDLE event_server_wrote = {
nullptr};
423 HANDLE event_server_read = {
nullptr};
424 HANDLE event_client_wrote = {
nullptr};
425 HANDLE event_client_read = {
nullptr};
426 HANDLE event_conn_closed = {
nullptr};
427 size_t shared_memory_remain = {0};
428 char *shared_memory_pos = {
nullptr};
452#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
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1052
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:910
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:496
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:318
size_t(* read)(MYSQL_VIO, uchar *, size_t)
Definition: violite.h:386
PSI_socket_locker_state m_psi_write_state
Definition: violite.h:418
char * read_end
Definition: violite.h:334
bool localhost
Definition: violite.h:320
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:351
int(* vioshutdown)(MYSQL_VIO)
Definition: violite.h:400
int write_timeout
Definition: violite.h:324
int(* fastsend)(MYSQL_VIO)
Definition: violite.h:390
sigset_t signal_mask
Definition: violite.h:348
char * read_buffer
Definition: violite.h:331
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:347
int(* set_blocking)(Vio *vio, bool val)
Definition: violite.h:432
PSI_socket_locker_state m_psi_read_state
Definition: violite.h:416
bool(* should_retry)(MYSQL_VIO)
Definition: violite.h:393
std::atomic_flag poll_shutdown_flag
Definition: violite.h:363
char network_namespace[256]
Socket network namespace.
Definition: violite.h:373
char * read_pos
Definition: violite.h:332
int(* set_blocking_flag)(Vio *vio, bool val)
Definition: violite.h:433
int(* vioerrno)(MYSQL_VIO)
Definition: violite.h:385
bool(* is_blocking)(Vio *vio)
Definition: violite.h:431
size_t(* write)(MYSQL_VIO, const uchar *, size_t)
Definition: violite.h:387
bool is_blocking_flag
Definition: violite.h:435
bool(* peer_addr)(MYSQL_VIO, char *, uint16 *, size_t)
Definition: violite.h:391
enum_vio_type type
Definition: violite.h:321
bool(* connect)(MYSQL_VIO, struct sockaddr *, socklen_t, int)
Definition: violite.h:404
friend void internal_vio_delete(Vio *vio)
Definition: vio.cc:545
void(* viodelete)(MYSQL_VIO)
Definition: violite.h:384
bool inactive
Definition: violite.h:326
~Vio()
Definition: vio.cc:115
int(* viokeepalive)(MYSQL_VIO, bool)
Definition: violite.h:389
struct PSI_socket_locker * m_psi_write_locker
Definition: violite.h:417
friend Vio * internal_vio_create(uint flags)
Definition: vio.cc:416
size_t addrLen
Definition: violite.h:330
MYSQL_SOCKET mysql_socket
Definition: violite.h:319
bool(* was_timeout)(MYSQL_VIO)
Definition: violite.h:394
struct PSI_socket_locker * m_psi_read_locker
Definition: violite.h:415
int retry_count
Definition: violite.h:325
void * ssl_arg
Definition: violite.h:414
Vio & operator=(const Vio &)=delete
Vio(uint flags)
Definition: vio.cc:101
int read_timeout
Definition: violite.h:323
int(* io_wait)(MYSQL_VIO, enum enum_vio_io_event, int)
Definition: violite.h:403
int(* timeout)(MYSQL_VIO, uint, bool)
Definition: violite.h:388
struct sockaddr_storage remote
Definition: violite.h:329
bool(* is_connected)(MYSQL_VIO)
Definition: violite.h:401
bool(* has_data)(MYSQL_VIO)
Definition: violite.h:402
Definition: violite.h:255
SSL_CTX * ssl_context
Definition: violite.h:256
unsigned int uint
Definition: uca9-dump.cc:75
void vio_ssl_end()
Definition: viosslfactories.cc:378
#define vio_errno(vio)
Definition: violite.h:286
my_socket vio_fd(MYSQL_VIO vio)
SSL_type
Definition: violite.h:305
@ SSL_TYPE_NOT_SPECIFIED
Definition: violite.h:306
@ SSL_TYPE_NONE
Definition: violite.h:307
@ SSL_TYPE_ANY
Definition: violite.h:308
@ SSL_TYPE_X509
Definition: violite.h:309
@ SSL_TYPE_SPECIFIED
Definition: violite.h:310
#define vio_is_blocking(vio)
Definition: violite.h:299
#define vio_keepalive(vio, set_keep_alive)
Definition: violite.h:290
MYSQL_VIO vio_new(my_socket sd, enum enum_vio_type type, uint flags)
Definition: vio.cc:443
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:417
enum enum_vio_type vio_type(const MYSQL_VIO vio)
void ssl_start(void)
Definition: viosslfactories.cc:401
int sslaccept(struct st_VioSSLFd *, MYSQL_VIO, long timeout, unsigned long *errptr)
void vio_end(void)
Definition: vio.cc:559
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:292
#define vio_set_blocking_flag(vio, val)
Definition: violite.h:301
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:659
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:580
void vio_description(MYSQL_VIO vio, char *buf)
const char * sslGetErrString(enum enum_ssl_init_error err)
Definition: viosslfactories.cc:177
enum_ssl_init_error
Definition: violite.h:236
@ SSL_FIPS_MODE_INVALID
Definition: violite.h:247
@ SSL_INITERR_NO_USABLE_CTX
Definition: violite.h:244
@ SSL_FIPS_MODE_FAILED
Definition: violite.h:248
@ SSL_INITERR_X509_VERIFY_PARAM
Definition: violite.h:250
@ SSL_INITERR_KEY
Definition: violite.h:239
@ SSL_INITERR_LASTERR
Definition: violite.h:251
@ SSL_INITERR_CERT
Definition: violite.h:238
@ SSL_INITERR_BAD_PATHS
Definition: violite.h:241
@ SSL_INITERR_NOMATCH
Definition: violite.h:240
@ SSL_INITERR_MEMFAIL
Definition: violite.h:243
@ SSL_INITERR_ECDHFAIL
Definition: violite.h:249
@ SSL_INITERR_CIPHERS
Definition: violite.h:242
@ SSL_TLS_VERSION_INVALID
Definition: violite.h:246
@ SSL_INITERR_NOERROR
Definition: violite.h:237
@ SSL_INITERR_DHFAIL
Definition: violite.h:245
void free_vio_ssl_acceptor_fd(struct st_VioSSLFd *fd)
Definition: viosslfactories.cc:716
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:1236
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: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:289
#define vio_set_blocking(vio, val)
Definition: violite.h:300
#define vio_shutdown(vio)
Definition: violite.h:294
size_t vio_read_buff(MYSQL_VIO vio, uchar *buf, size_t size)
#define vio_delete(vio)
Definition: violite.h:285
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:62
#define HANDLE
Definition: violite.h:159
#define vio_peer_addr(vio, buf, prt, buflen)
Definition: violite.h:295
ssize_t vio_pending(MYSQL_VIO vio)
Vio Vio
Definition: violite.h:73
#define vio_was_timeout(vio)
Definition: violite.h:293
#define vio_read(vio, buf, size)
Definition: violite.h:287
#define vio_write(vio, buf, size)
Definition: violite.h:288
#define vio_io_wait(vio, event, timeout)
Definition: violite.h:297
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:687
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:639
#define vio_is_connected(vio)
Definition: violite.h:298
MYSQL_VIO mysql_socket_vio_new(MYSQL_SOCKET mysql_socket, enum enum_vio_type type, uint flags)
Definition: vio.cc:424
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:1257