38 #include <sys/types.h> 40 #include <sys/socket.h> 42 #include <netinet/in.h> 43 #include <arpa/inet.h> 55 #include <qb/qbipc_common.h> 57 #include <qb/qblist.h> 58 #include <qb/qbutil.h> 84 #define DEFAULT_SHUTDOWN_TIMEOUT 5000 86 static struct qb_list_head trackers_list;
92 static struct cfg_info *shutdown_con;
93 static uint32_t shutdown_flags;
94 static int shutdown_yes;
95 static int shutdown_no;
96 static int shutdown_expected;
106 static void cfg_confchg_fn (
108 const unsigned int *member_list,
size_t member_list_entries,
109 const unsigned int *left_list,
size_t left_list_entries,
110 const unsigned int *joined_list,
size_t joined_list_entries,
115 static struct corosync_api_v1 *api;
117 static int cfg_lib_init_fn (
void *
conn);
119 static int cfg_lib_exit_fn (
void *
conn);
121 static void message_handler_req_exec_cfg_ringreenable (
125 static void message_handler_req_exec_cfg_killnode (
129 static void message_handler_req_exec_cfg_shutdown (
133 static void message_handler_req_exec_cfg_reload_config (
137 static void message_handler_req_exec_cfg_reconfig_crypto (
141 static void exec_cfg_killnode_endian_convert (
void *msg);
143 static void message_handler_req_lib_cfg_ringstatusget (
147 static void message_handler_req_lib_cfg_nodestatusget (
151 static void message_handler_req_lib_cfg_ringreenable (
155 static void message_handler_req_lib_cfg_killnode (
159 static void message_handler_req_lib_cfg_tryshutdown (
163 static void message_handler_req_lib_cfg_replytoshutdown (
167 static void message_handler_req_lib_cfg_trackstart (
171 static void message_handler_req_lib_cfg_trackstop (
175 static void message_handler_req_lib_cfg_get_node_addrs (
179 static void message_handler_req_lib_cfg_local_get (
183 static void message_handler_req_lib_cfg_reload_config (
187 static void message_handler_req_lib_cfg_reopen_log_files (
201 .lib_handler_fn = message_handler_req_lib_cfg_ringreenable,
205 .lib_handler_fn = message_handler_req_lib_cfg_killnode,
209 .lib_handler_fn = message_handler_req_lib_cfg_tryshutdown,
213 .lib_handler_fn = message_handler_req_lib_cfg_replytoshutdown,
217 .lib_handler_fn = message_handler_req_lib_cfg_get_node_addrs,
221 .lib_handler_fn = message_handler_req_lib_cfg_local_get,
225 .lib_handler_fn = message_handler_req_lib_cfg_reload_config,
229 .lib_handler_fn = message_handler_req_lib_cfg_reopen_log_files,
233 .lib_handler_fn = message_handler_req_lib_cfg_nodestatusget,
237 .lib_handler_fn = message_handler_req_lib_cfg_trackstart,
241 .lib_handler_fn = message_handler_req_lib_cfg_trackstop,
253 .exec_handler_fn = message_handler_req_exec_cfg_killnode,
254 .exec_endian_convert_fn = exec_cfg_killnode_endian_convert
257 .exec_handler_fn = message_handler_req_exec_cfg_shutdown,
260 .exec_handler_fn = message_handler_req_exec_cfg_reload_config,
263 .exec_handler_fn = message_handler_req_exec_cfg_reconfig_crypto,
271 .
name =
"corosync configuration service",
274 .private_data_size =
sizeof(
struct cfg_info),
277 .lib_init_fn = cfg_lib_init_fn,
278 .lib_exit_fn = cfg_lib_exit_fn,
279 .lib_engine = cfg_lib_engine,
281 .exec_init_fn = cfg_exec_init_fn,
282 .exec_engine = cfg_exec_engine,
284 .confchg_fn = cfg_confchg_fn
289 return (&cfg_service_engine);
293 struct qb_ipc_request_header header __attribute__((aligned(8)));
298 struct qb_ipc_request_header header __attribute__((aligned(8)));
303 struct qb_ipc_request_header header __attribute__((aligned(8)));
308 struct qb_ipc_request_header header __attribute__((aligned(8)));
314 struct qb_ipc_request_header header __attribute__((aligned(8)));
319 static char *cfg_exec_init_fn (
320 struct corosync_api_v1 *corosync_api_v1)
322 api = corosync_api_v1;
324 qb_list_init(&trackers_list);
328 static void cfg_confchg_fn (
330 const unsigned int *member_list,
size_t member_list_entries,
331 const unsigned int *left_list,
size_t left_list_entries,
332 const unsigned int *joined_list,
size_t joined_list_entries,
340 static int send_shutdown(
void)
346 req_exec_cfg_shutdown.header.size =
347 sizeof (
struct req_exec_cfg_shutdown);
351 iovec.iov_base = (
char *)&req_exec_cfg_shutdown;
352 iovec.iov_len =
sizeof (
struct req_exec_cfg_shutdown);
360 static void send_test_shutdown(
void *only_conn,
void *exclude_conn,
int status)
363 struct qb_list_head *iter;
366 res_lib_cfg_testshutdown.header.size =
sizeof(
struct res_lib_cfg_testshutdown);
368 res_lib_cfg_testshutdown.header.error = status;
369 res_lib_cfg_testshutdown.
flags = shutdown_flags;
372 TRACE1(
"sending testshutdown to only %p", only_conn);
374 sizeof(res_lib_cfg_testshutdown));
376 qb_list_for_each(iter, &trackers_list) {
379 if (ci->
conn != exclude_conn) {
382 sizeof(res_lib_cfg_testshutdown));
389 static void check_shutdown_status(
void)
404 if (shutdown_yes + shutdown_no >= shutdown_expected) {
409 if (shutdown_yes >= shutdown_expected ||
411 TRACE1(
"shutdown confirmed");
413 res_lib_cfg_tryshutdown.header.size =
sizeof(
struct res_lib_cfg_tryshutdown);
415 res_lib_cfg_tryshutdown.header.error =
CS_OK;
421 sizeof(res_lib_cfg_tryshutdown));
432 TRACE1(
"shutdown cancelled");
433 res_lib_cfg_tryshutdown.header.size =
sizeof(
struct res_lib_cfg_tryshutdown);
435 res_lib_cfg_tryshutdown.header.error =
CS_ERR_BUSY;
441 sizeof(res_lib_cfg_tryshutdown));
446 shutdown_yes, shutdown_no, shutdown_flags);
455 static void shutdown_timer_fn(
void *arg)
462 shutdown_no = shutdown_expected;
463 check_shutdown_status();
469 static void remove_ci_from_shutdown(
struct cfg_info *ci)
477 if (ci == shutdown_con) {
482 if (!qb_list_empty(&ci->
list)) {
483 qb_list_del(&ci->
list);
484 qb_list_init(&ci->
list);
502 check_shutdown_status();
508 int cfg_lib_exit_fn (
void *
conn)
513 remove_ci_from_shutdown(ci);
518 static int cfg_lib_init_fn (
void *
conn)
523 qb_list_init(&ci->
list);
532 static void message_handler_req_exec_cfg_ringreenable (
541 static void exec_cfg_killnode_endian_convert (
void *msg)
544 (
struct req_exec_cfg_killnode *)msg;
547 swab_mar_name_t(&req_exec_cfg_killnode->reason);
552 static void message_handler_req_exec_cfg_killnode (
563 marshall_from_mar_name_t(&reason, &req_exec_cfg_killnode->reason);
565 nodeid, reason.
value);
574 static void message_handler_req_exec_cfg_shutdown (
588 static int nullcheck_strcmp(
const char* left,
const char *right)
598 return strcmp(left, right);
604 static void delete_and_notify_if_changed(
icmap_map_t temp_map,
const char *key_name)
619 static void remove_ro_entries(
icmap_map_t temp_map)
621 #ifndef HAVE_KNET_CRYPTO_RECONF 622 delete_and_notify_if_changed(temp_map,
"totem.secauth");
623 delete_and_notify_if_changed(temp_map,
"totem.crypto_hash");
624 delete_and_notify_if_changed(temp_map,
"totem.crypto_cipher");
625 delete_and_notify_if_changed(temp_map,
"totem.keyfile");
626 delete_and_notify_if_changed(temp_map,
"totem.key");
628 delete_and_notify_if_changed(temp_map,
"totem.version");
629 delete_and_notify_if_changed(temp_map,
"totem.threads");
630 delete_and_notify_if_changed(temp_map,
"totem.ip_version");
631 delete_and_notify_if_changed(temp_map,
"totem.rrp_mode");
632 delete_and_notify_if_changed(temp_map,
"totem.netmtu");
633 delete_and_notify_if_changed(temp_map,
"totem.interface.ringnumber");
634 delete_and_notify_if_changed(temp_map,
"totem.interface.bindnetaddr");
635 delete_and_notify_if_changed(temp_map,
"totem.interface.mcastaddr");
636 delete_and_notify_if_changed(temp_map,
"totem.interface.broadcast");
637 delete_and_notify_if_changed(temp_map,
"totem.interface.mcastport");
638 delete_and_notify_if_changed(temp_map,
"totem.interface.ttl");
639 delete_and_notify_if_changed(temp_map,
"totem.transport");
640 delete_and_notify_if_changed(temp_map,
"totem.cluster_name");
641 delete_and_notify_if_changed(temp_map,
"quorum.provider");
642 delete_and_notify_if_changed(temp_map,
"system.move_to_root_cgroup");
643 delete_and_notify_if_changed(temp_map,
"system.allow_knet_handle_fallback");
644 delete_and_notify_if_changed(temp_map,
"system.sched_rr");
645 delete_and_notify_if_changed(temp_map,
"system.priority");
646 delete_and_notify_if_changed(temp_map,
"system.qb_ipc_type");
647 delete_and_notify_if_changed(temp_map,
"system.state_dir");
657 static void remove_deleted_entries(
icmap_map_t temp_map,
const char *prefix)
661 const char *old_key, *new_key;
670 while (old_key || new_key) {
671 ret = nullcheck_strcmp(old_key, new_key);
672 if ((ret < 0 && old_key) || !new_key) {
682 ret = nullcheck_strcmp(old_key, new_key);
683 }
while (ret < 0 && old_key);
685 else if ((ret > 0 && new_key) || !old_key) {
695 ret = nullcheck_strcmp(old_key, new_key);
696 }
while (ret > 0 && new_key);
710 static void message_handler_req_exec_cfg_reload_config (
718 const char *error_string;
728 memset(&new_config, 0,
sizeof(new_config));
734 goto reload_fini_nomap;
744 goto reload_fini_nofree;
751 remove_deleted_entries(temp_map,
"logging.");
752 remove_deleted_entries(temp_map,
"totem.");
753 remove_deleted_entries(temp_map,
"nodelist.");
754 remove_deleted_entries(temp_map,
"quorum.");
755 remove_deleted_entries(temp_map,
"uidgid.config.");
756 remove_deleted_entries(temp_map,
"nozzle.");
759 remove_ro_entries(temp_map);
762 memset(&new_config, 0,
sizeof(new_config));
807 #ifndef HAVE_KNET_CRYPTO_RECONF 851 req_exec_cfg_crypto_reconfig.header.size =
852 sizeof (
struct req_exec_cfg_crypto_reconfig);
857 iovec.iov_base = (
char *)&req_exec_cfg_crypto_reconfig;
858 iovec.iov_len =
sizeof (
struct req_exec_cfg_crypto_reconfig);
865 res_lib_cfg_reload_config.header.size =
sizeof(res_lib_cfg_reload_config);
867 res_lib_cfg_reload_config.header.error = res;
869 &res_lib_cfg_reload_config,
870 sizeof(res_lib_cfg_reload_config));
884 static void message_handler_req_exec_cfg_reconfig_crypto (
899 struct req_exec_cfg_crypto_reconfig req_exec_cfg_crypto_reconfig2;
902 req_exec_cfg_crypto_reconfig2.header.size =
903 sizeof (
struct req_exec_cfg_crypto_reconfig);
908 iovec.iov_base = (
char *)&req_exec_cfg_crypto_reconfig2;
909 iovec.iov_len =
sizeof (
struct req_exec_cfg_crypto_reconfig);
920 static void message_handler_req_lib_cfg_ringstatusget (
926 unsigned int iface_count;
928 const char *totem_ip_string;
937 res_lib_cfg_ringstatusget.header.size =
sizeof (
struct res_lib_cfg_ringstatusget);
949 res_lib_cfg_ringstatusget.interface_count = iface_count;
951 for (i = 0; i < iface_count; i++) {
955 if (!totem_ip_string) {
965 snprintf(ifname,
sizeof(ifname),
"%d %s", iface_ids[i], totem_ip_string);
973 strcpy ((
char *)&res_lib_cfg_ringstatusget.interface_status[i],
975 strcpy ((
char *)&res_lib_cfg_ringstatusget.interface_name[i],
980 res_lib_cfg_ringstatusget.header.error = res;
983 &res_lib_cfg_ringstatusget,
984 sizeof (
struct res_lib_cfg_ringstatusget));
990 static void message_handler_req_lib_cfg_nodestatusget (
996 void *res_lib_cfg_nodestatusget_ptr = NULL;
997 size_t res_lib_cfg_nodestatusget_size;
1004 memset(&node_status, 0,
sizeof(node_status));
1006 res_lib_cfg_nodestatusget_ptr = &res_lib_cfg_nodestatusget_version;
1007 res_lib_cfg_nodestatusget_size =
sizeof(res_lib_cfg_nodestatusget_version);
1011 res_lib_cfg_nodestatusget_version.header.size = res_lib_cfg_nodestatusget_size;
1013 goto ipc_response_send;
1017 switch (req_lib_cfg_nodestatusget->version) {
1019 res_lib_cfg_nodestatusget_ptr = &res_lib_cfg_nodestatusget_v1;
1020 res_lib_cfg_nodestatusget_size =
sizeof(res_lib_cfg_nodestatusget_v1);
1022 res_lib_cfg_nodestatusget_v1.header.error =
CS_OK;
1024 res_lib_cfg_nodestatusget_v1.header.size = res_lib_cfg_nodestatusget_size;
1027 res_lib_cfg_nodestatusget_v1.node_status.nodeid = req_lib_cfg_nodestatusget->nodeid;
1028 res_lib_cfg_nodestatusget_v1.node_status.reachable = node_status.
reachable;
1029 res_lib_cfg_nodestatusget_v1.node_status.remote = node_status.
remote;
1030 res_lib_cfg_nodestatusget_v1.node_status.external = node_status.
external;
1031 res_lib_cfg_nodestatusget_v1.node_status.onwire_min = node_status.
onwire_min;
1032 res_lib_cfg_nodestatusget_v1.node_status.onwire_max = node_status.
onwire_max;
1033 res_lib_cfg_nodestatusget_v1.node_status.onwire_ver = node_status.
onwire_ver;
1035 for (i=0; i < KNET_MAX_LINK; i++) {
1036 res_lib_cfg_nodestatusget_v1.node_status.link_status[i].enabled = node_status.
link_status[i].enabled;
1037 res_lib_cfg_nodestatusget_v1.node_status.link_status[i].connected = node_status.
link_status[i].connected;
1038 res_lib_cfg_nodestatusget_v1.node_status.link_status[i].dynconnected = node_status.
link_status[i].dynconnected;
1039 res_lib_cfg_nodestatusget_v1.node_status.link_status[i].mtu = node_status.
link_status[i].mtu;
1040 memcpy(res_lib_cfg_nodestatusget_v1.node_status.link_status[i].src_ipaddr,
1042 memcpy(res_lib_cfg_nodestatusget_v1.node_status.link_status[i].dst_ipaddr,
1050 res_lib_cfg_nodestatusget_ptr = &res_lib_cfg_nodestatusget_version;
1051 res_lib_cfg_nodestatusget_size =
sizeof(res_lib_cfg_nodestatusget_version);
1055 res_lib_cfg_nodestatusget_version.header.size = res_lib_cfg_nodestatusget_size;
1062 res_lib_cfg_nodestatusget_ptr,
1063 res_lib_cfg_nodestatusget_size);
1068 static void message_handler_req_lib_cfg_trackstart (
1080 if (qb_list_empty(&ci->
list)) {
1081 qb_list_add(&ci->
list, &trackers_list);
1089 shutdown_expected++;
1094 res_lib_cfg_trackstart.
header.size =
sizeof(
struct res_lib_cfg_trackstart);
1099 sizeof(res_lib_cfg_trackstart));
1104 static void message_handler_req_lib_cfg_trackstop (
1112 remove_ci_from_shutdown(ci);
1114 res_lib_cfg_trackstop.
header.size =
sizeof(
struct res_lib_cfg_trackstop);
1119 sizeof(res_lib_cfg_trackstop));
1123 static void message_handler_req_lib_cfg_ringreenable (
1131 res_lib_cfg_ringreenable.header.size =
sizeof (
struct res_lib_cfg_ringreenable);
1134 conn, &res_lib_cfg_ringreenable,
1135 sizeof (
struct res_lib_cfg_ringreenable));
1140 static void message_handler_req_lib_cfg_killnode (
1152 const char *iter_key;
1154 char *status_str = NULL;
1155 int match_nodeid_flag = 0;
1163 if (sscanf(iter_key,
"runtime.members.%u.%s", &nodeid, key_name) != 2) {
1166 if (strcmp(key_name,
"status") != 0) {
1169 if (nodeid != req_lib_cfg_killnode->nodeid) {
1172 match_nodeid_flag = 1;
1178 if (strcmp(status_str,
"joined") != 0) {
1185 if (!match_nodeid_flag) {
1190 req_exec_cfg_killnode.header.size =
1191 sizeof (
struct req_exec_cfg_killnode);
1194 req_exec_cfg_killnode.nodeid = req_lib_cfg_killnode->nodeid;
1195 marshall_to_mar_name_t(&req_exec_cfg_killnode.reason, &req_lib_cfg_killnode->reason);
1197 iovec.iov_base = (
char *)&req_exec_cfg_killnode;
1198 iovec.iov_len =
sizeof (
struct req_exec_cfg_killnode);
1203 res_lib_cfg_killnode.header.size =
sizeof(
struct res_lib_cfg_killnode);
1205 res_lib_cfg_killnode.header.error = error;
1208 sizeof(res_lib_cfg_killnode));
1216 static void message_handler_req_lib_cfg_tryshutdown (
1222 struct qb_list_head *iter;
1234 res_lib_cfg_tryshutdown.header.size =
sizeof(
struct res_lib_cfg_tryshutdown);
1236 res_lib_cfg_tryshutdown.header.error =
CS_OK;
1238 sizeof(res_lib_cfg_tryshutdown));
1250 res_lib_cfg_tryshutdown.header.size =
sizeof(
struct res_lib_cfg_tryshutdown);
1255 sizeof(res_lib_cfg_tryshutdown));
1265 shutdown_flags = req_lib_cfg_tryshutdown->
flags;
1272 shutdown_expected = 0;
1274 qb_list_for_each(iter, &trackers_list) {
1281 shutdown_expected++;
1288 if (shutdown_expected == 0) {
1291 res_lib_cfg_tryshutdown.header.size =
sizeof(
struct res_lib_cfg_tryshutdown);
1293 res_lib_cfg_tryshutdown.header.error =
CS_OK;
1299 sizeof(res_lib_cfg_tryshutdown));
1317 api->
timer_add_duration((
unsigned long long)shutdown_timeout*QB_TIME_NS_IN_MSEC, NULL,
1318 shutdown_timer_fn, &shutdown_timer);
1334 static void message_handler_req_lib_cfg_replytoshutdown (
1344 if (!shutdown_con) {
1349 if (req_lib_cfg_replytoshutdown->
response) {
1357 check_shutdown_status();
1360 res_lib_cfg_replytoshutdown.header.error = status;
1362 res_lib_cfg_replytoshutdown.header.size =
sizeof(res_lib_cfg_replytoshutdown);
1365 sizeof(res_lib_cfg_replytoshutdown));
1370 static void message_handler_req_lib_cfg_get_node_addrs (
void *
conn,
1377 unsigned int num_interfaces = 0;
1378 struct sockaddr_storage *ss;
1384 unsigned int nodeid = req_lib_cfg_get_node_addrs->
nodeid;
1390 if (api->
totem_ifaces_get(nodeid, iface_ids, node_ifs, INTERFACE_MAX, &status, &num_interfaces)) {
1395 res_lib_cfg_get_node_addrs->header.size =
sizeof(
struct res_lib_cfg_get_node_addrs) + (num_interfaces *
TOTEMIP_ADDRLEN);
1397 res_lib_cfg_get_node_addrs->header.error = ret;
1398 if (num_interfaces) {
1399 res_lib_cfg_get_node_addrs->
family = node_ifs[0].
family;
1400 for (i = 0, addr_buf = (
char *)res_lib_cfg_get_node_addrs->
addrs;
1401 i < num_interfaces; i++) {
1402 ss = (
struct sockaddr_storage *)&node_ifs[i].
addr;
1403 if (ss->ss_family) {
1409 res_lib_cfg_get_node_addrs->
num_addrs = live_addrs;
1416 static void message_handler_req_lib_cfg_local_get (
void *
conn,
const void *msg)
1420 res_lib_cfg_local_get.header.size =
sizeof(res_lib_cfg_local_get);
1422 res_lib_cfg_local_get.header.error =
CS_OK;
1426 sizeof(res_lib_cfg_local_get));
1429 static void message_handler_req_lib_cfg_reload_config (
void *
conn,
const void *msg)
1436 req_exec_cfg_reload_config.header.size =
1437 sizeof (
struct req_exec_cfg_reload_config);
1443 iovec.iov_base = (
char *)&req_exec_cfg_reload_config;
1444 iovec.iov_len =
sizeof (
struct req_exec_cfg_reload_config);
1451 static void message_handler_req_lib_cfg_reopen_log_files (
void *
conn,
const void *msg)
1462 res_lib_cfg_reopen_log_files.header.size =
sizeof(res_lib_cfg_reopen_log_files);
1464 res_lib_cfg_reopen_log_files.header.error = res;
1466 &res_lib_cfg_reopen_log_files,
1467 sizeof(res_lib_cfg_reopen_log_files));
void *(* ipc_private_data_get)(void *conn)
The res_lib_cfg_reopen_log_files struct.
struct knet_link_status link_status[KNET_MAX_LINK]
void(* timer_delete)(corosync_timer_handle_t timer_handle)
int(* timer_add_duration)(unsigned long long nanoseconds_in_future, void *data, void(*timer_nf)(void *data), corosync_timer_handle_t *handle)
const char * icmap_iter_next(icmap_iter_t iter, size_t *value_len, icmap_value_types_t *type)
Return next item in iterator iter.
#define CFG_INTERFACE_STATUS_MAX_LEN
struct totem_interface * interfaces
cs_error_t icmap_copy_map(icmap_map_t dst_map, const icmap_map_t src_map)
Copy content of src_map icmap to dst_map icmap.
The res_lib_cfg_replytoshutdown struct.
The res_lib_cfg_testshutdown struct.
The totem_ip_address struct.
The corosync_service_engine struct.
void icmap_iter_finalize(icmap_iter_t iter)
Finalize iterator.
totem_transport_t transport_number
void(* shutdown_request)(void)
cs_error_t logsys_reopen_log_files(void)
uint8_t value[CS_MAX_NAME_LENGTH]
int coroparse_configparse(icmap_map_t config_map, const char **error_string)
#define corosync_fatal_error(err)
int(* ipc_response_send)(void *conn, const void *msg, size_t mlen)
void totemconfig_commit_new_params(struct totem_config *totem_config, icmap_map_t map)
LOGSYS_DECLARE_SUBSYS("CFG")
int totempg_crypto_reconfigure_phase(cfg_message_crypto_reconfig_phase_t phase)
The res_lib_cfg_nodestatusget struct.
int icmap_key_value_eq(const icmap_map_t map1, const char *key_name1, const icmap_map_t map2, const char *key_name2)
Compare value of key with name key_name1 in map1 with key with name key_name2 in map2.
totem_configuration_type
The totem_configuration_type enum.
int(* totem_ifaces_get)(unsigned int nodeid, unsigned int *interface_ids, struct totem_ip_address *interfaces, unsigned int interfaces_size, char ***status, unsigned int *iface_count)
The res_lib_cfg_get_node_addrs struct.
The corosync_lib_handler struct.
void totempg_put_config(struct totem_config *config)
unsigned char addr[TOTEMIP_ADDRLEN]
The req_lib_cfg_get_node_addrs struct.
void totempg_get_config(struct totem_config *config)
The corosync_exec_handler struct.
void icmap_fini_r(const icmap_map_t map)
Finalize local, reentrant icmap.
icmap_map_t icmap_get_global_map(void)
Return global icmap.
enum cfg_info::@8 shutdown_reply
int(* totem_mcast)(const struct iovec *iovec, unsigned int iov_len, unsigned int guarantee)
#define log_printf(level, format, args...)
void(* exec_handler_fn)(const void *msg, unsigned int nodeid)
#define SERVICE_ID_MAKE(a, b)
#define ICMAP_KEYNAME_MAXLEN
Maximum length of key in icmap.
The res_lib_cfg_local_get struct.
The res_lib_cfg_killnode struct.
The req_lib_cfg_tryshutdown struct.
unsigned int(* totem_nodeid_get)(void)
void(* ipc_refcnt_dec)(void *conn)
The res_lib_cfg_ringreenable struct.
cs_error_t icmap_get_string_r(const icmap_map_t map, const char *key_name, char **str)
int totem_volatile_config_validate(struct totem_config *totem_config, icmap_map_t temp_map, const char **error_string)
#define LOGSYS_LEVEL_ERROR
#define TRACE1(format, args...)
#define CFG_INTERFACE_NAME_MAX_LEN
cs_error_t icmap_delete(const char *key_name)
Delete key from map.
cs_error_t
The cs_error_t enum.
#define LOGSYS_LEVEL_DEBUG
The corosync_api_v1 struct.
The req_lib_cfg_replytoshutdown struct.
The res_lib_cfg_tryshutdown struct.
cs_error_t icmap_get_uint32(const char *key_name, uint32_t *u32)
#define DEFAULT_SHUTDOWN_TIMEOUT
#define CFG_MAX_INTERFACES
const char *(* totem_ip_print)(const struct totem_ip_address *addr)
cs_error_t icmap_set_int32(const char *key_name, int32_t value)
void totem_volatile_config_read(struct totem_config *totem_config, icmap_map_t temp_map, const char *deleted_key)
cs_error_t icmap_delete_r(const icmap_map_t map, const char *key_name)
icmap_delete_r
struct qb_ipc_response_header header
The res_lib_cfg_ringstatusget struct.
int totemconfig_configure_new_params(struct totem_config *totem_config, icmap_map_t map, const char **error_string)
cs_error_t icmap_init_r(icmap_map_t *result)
Initialize additional (local, reentrant) icmap_map.
qb_loop_timer_handle corosync_timer_handle_t
corosync_timer_handle_t
int totem_reread_crypto_config(struct totem_config *totem_config, icmap_map_t map, const char **error_string)
struct totem_interface * orig_interfaces
struct corosync_service_engine cfg_service_engine
The req_lib_cfg_nodestatusget struct.
The res_lib_cfg_reload_config struct.
#define LOGSYS_LEVEL_NOTICE
cs_error_t icmap_set_uint8(const char *key_name, uint8_t value)
void(* lib_handler_fn)(void *conn, const void *msg)
struct corosync_service_engine * cfg_get_service_engine_ver0(void)
int(* ipc_dispatch_send)(void *conn, const void *msg, size_t mlen)
int totempg_nodestatus_get(unsigned int nodeid, struct totem_node_status *node_status)
icmap_iter_t icmap_iter_init_r(const icmap_map_t map, const char *prefix)
icmap_iter_init_r
icmap_iter_t icmap_iter_init(const char *prefix)
Initialize iterator with given prefix.
struct memb_ring_id ring_id
void(* ipc_source_set)(mar_message_source_t *source, void *conn)
struct qb_ipc_response_header header
The req_lib_cfg_killnode struct.
qb_map_iter_t * icmap_iter_t
Itterator type.
The mar_message_source_t struct.
void(* ipc_refcnt_inc)(void *conn)