-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathconnection_monitor_service_v1.cpp
142 lines (129 loc) · 5.34 KB
/
connection_monitor_service_v1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
* Copyright (C) 2024-2025 Codership Oy <[email protected]>
*
* This file is part of wsrep-lib.
*
* Wsrep-lib is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* Wsrep-lib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with wsrep-lib. If not, see <https://www.gnu.org/licenses/>.
*/
#include "connection_monitor_service_v1.hpp"
#include "service_helpers.hpp"
#include "wsrep/buffer.hpp"
#include "v26/wsrep_connection_monitor_service.h"
#include "wsrep/connection_monitor_service.hpp"
#include <cassert>
#include <dlfcn.h>
#include <cerrno>
namespace wsrep_connection_monitor_service_v1
{
// Pointer to connection monitor service implementation provided by
// the application.
static wsrep::connection_monitor_service* connection_monitor_service_impl{ 0 };
static std::atomic<size_t> use_count;
//
// connection monitor service callbacks
//
void connection_monitor_connect_cb(
wsrep_connection_monitor_context_t*,
wsrep_connection_key_t id,
const wsrep_buf_t* scheme,
const wsrep_buf_t* local_address,
const wsrep_buf_t* remote_address
)
{
assert(connection_monitor_service_impl);
wsrep::const_buffer scheme_value(scheme->ptr, scheme->len);
wsrep::const_buffer remote_addr(remote_address->ptr, remote_address->len);
wsrep::const_buffer local_addr(local_address->ptr, local_address->len);
connection_monitor_service_impl->connection_monitor_connect_cb(
id,
scheme_value,
local_addr,
remote_addr);
}
void connection_monitor_disconnect_cb(
wsrep_connection_monitor_context_t*,
wsrep_connection_key_t id
)
{
assert(connection_monitor_service_impl);
connection_monitor_service_impl->connection_monitor_disconnect_cb(id);
}
void connection_monitor_ssl_info_cb(
wsrep_connection_monitor_context_t*,
wsrep_connection_key_t id,
const wsrep_buf_t* cipher,
const wsrep_buf_t* certificate_subject,
const wsrep_buf_t* certificate_issuer,
const wsrep_buf_t* version)
{
assert(connection_monitor_service_impl);
wsrep::const_buffer ssl_cipher(cipher->ptr, cipher->len);
wsrep::const_buffer cert_sub(certificate_subject->ptr, certificate_subject->len);
wsrep::const_buffer cert_iss(certificate_issuer->ptr, certificate_issuer->len);
wsrep::const_buffer vers(version->ptr, version->len);
connection_monitor_service_impl->connection_monitor_ssl_info_cb(
id, ssl_cipher, cert_sub, cert_iss, vers);
}
static wsrep_connection_monitor_service_v1_t connection_monitor_service_callbacks
= { connection_monitor_connect_cb,
connection_monitor_disconnect_cb,
connection_monitor_ssl_info_cb,
0 };
}
int wsrep::connection_monitor_service_v1_probe(void* dlh)
{
typedef int (*init_fn)(wsrep_connection_monitor_service_v1_t*);
typedef void (*deinit_fn)();
if (wsrep_impl::service_probe<init_fn>(
dlh, WSREP_CONNECTION_MONITOR_SERVICE_INIT_FUNC_V1, "connection monitor service v1") ||
wsrep_impl::service_probe<deinit_fn>(
dlh, WSREP_CONNECTION_MONITOR_SERVICE_DEINIT_FUNC_V1, "connection monitor service v1"))
{
wsrep::log_warning() << "Provider does not support connection monitor service v1";
return 1;
}
return 0;
}
int wsrep::connection_monitor_service_v1_init(void* dlh,
wsrep::connection_monitor_service* connection_service)
{
if (not (dlh && connection_service)) return EINVAL;
typedef int (*init_fn)(wsrep_connection_monitor_service_v1_t*);
wsrep_connection_monitor_service_v1::connection_monitor_service_impl = connection_service;
int ret(0);
if ((ret = wsrep_impl::service_init<init_fn>(
dlh, WSREP_CONNECTION_MONITOR_SERVICE_INIT_FUNC_V1,
&wsrep_connection_monitor_service_v1::connection_monitor_service_callbacks,
"connection monitor service v1")))
{
wsrep_connection_monitor_service_v1::connection_monitor_service_impl = 0;
}
else
{
++wsrep_connection_monitor_service_v1::use_count;
}
return ret;
}
void wsrep::connection_monitor_service_v1_deinit(void* dlh)
{
typedef int (*deinit_fn)();
wsrep_impl::service_deinit<deinit_fn>(
dlh, WSREP_CONNECTION_MONITOR_SERVICE_DEINIT_FUNC_V1, "connection monitor service v1");
assert(wsrep_connection_monitor_service_v1::use_count > 0);
--wsrep_connection_monitor_service_v1::use_count;
if (wsrep_connection_monitor_service_v1::use_count == 0)
{
wsrep_connection_monitor_service_v1::connection_monitor_service_impl = 0;
}
}