pacemaker 2.1.4-dc6eb4362e
Scalable High-Availability cluster resource manager
cib_client.c
Go to the documentation of this file.
1/*
2 * Copyright 2004-2021 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10#include <crm_internal.h>
11#include <unistd.h>
12#include <stdlib.h>
13#include <stdio.h>
14#include <stdarg.h>
15#include <string.h>
16#include <pwd.h>
17
18#include <sys/stat.h>
19#include <sys/types.h>
20
21#include <glib.h>
22
23#include <crm/crm.h>
24#include <crm/cib/internal.h>
25#include <crm/msg_xml.h>
26#include <crm/common/xml.h>
27
28static GHashTable *cib_op_callback_table = NULL;
29
30int cib_client_set_op_callback(cib_t * cib, void (*callback) (const xmlNode * msg, int call_id,
31 int rc, xmlNode * output));
32
33int cib_client_add_notify_callback(cib_t * cib, const char *event,
34 void (*callback) (const char *event, xmlNode * msg));
35
36int cib_client_del_notify_callback(cib_t * cib, const char *event,
37 void (*callback) (const char *event, xmlNode * msg));
38
39gint ciblib_GCompareFunc(gconstpointer a, gconstpointer b);
40
41#define op_common(cib) do { \
42 if(cib == NULL) { \
43 return -EINVAL; \
44 } else if(cib->delegate_fn == NULL) { \
45 return -EPROTONOSUPPORT; \
46 } \
47 } while(0)
48
49static int
50cib_client_noop(cib_t * cib, int call_options)
51{
52 op_common(cib);
53 return cib_internal_op(cib, CRM_OP_NOOP, NULL, NULL, NULL, NULL, call_options, NULL);
54}
55
56static int
57cib_client_ping(cib_t * cib, xmlNode ** output_data, int call_options)
58{
59 op_common(cib);
60 return cib_internal_op(cib, CRM_OP_PING, NULL, NULL, NULL, output_data, call_options, NULL);
61}
62
63static int
64cib_client_query(cib_t * cib, const char *section, xmlNode ** output_data, int call_options)
65{
66 return cib->cmds->query_from(cib, NULL, section, output_data, call_options);
67}
68
69static int
70cib_client_query_from(cib_t * cib, const char *host, const char *section,
71 xmlNode ** output_data, int call_options)
72{
73 op_common(cib);
74 return cib_internal_op(cib, CIB_OP_QUERY, host, section, NULL, output_data, call_options, NULL);
75}
76
77static int
78cib_client_is_master(cib_t * cib)
79{
80 op_common(cib);
81 return cib_internal_op(cib, CIB_OP_ISMASTER, NULL, NULL, NULL, NULL,
83}
84
85static int
86cib_client_set_slave(cib_t * cib, int call_options)
87{
88 op_common(cib);
89 return cib_internal_op(cib, CIB_OP_SLAVE, NULL, NULL, NULL, NULL, call_options, NULL);
90}
91
92static int
93cib_client_set_slave_all(cib_t * cib, int call_options)
94{
95 return -EPROTONOSUPPORT;
96}
97
98static int
99cib_client_set_master(cib_t * cib, int call_options)
100{
101 op_common(cib);
102 crm_trace("Adding cib_scope_local to options");
103 return cib_internal_op(cib, CIB_OP_MASTER, NULL, NULL, NULL, NULL,
104 call_options | cib_scope_local, NULL);
105}
106
107static int
108cib_client_bump_epoch(cib_t * cib, int call_options)
109{
110 op_common(cib);
111 return cib_internal_op(cib, CIB_OP_BUMP, NULL, NULL, NULL, NULL, call_options, NULL);
112}
113
114static int
115cib_client_upgrade(cib_t * cib, int call_options)
116{
117 op_common(cib);
118 return cib_internal_op(cib, CIB_OP_UPGRADE, NULL, NULL, NULL, NULL, call_options, NULL);
119}
120
121static int
122cib_client_sync(cib_t * cib, const char *section, int call_options)
123{
124 return cib->cmds->sync_from(cib, NULL, section, call_options);
125}
126
127static int
128cib_client_sync_from(cib_t * cib, const char *host, const char *section, int call_options)
129{
130 op_common(cib);
131 return cib_internal_op(cib, CIB_OP_SYNC, host, section, NULL, NULL, call_options, NULL);
132}
133
134static int
135cib_client_create(cib_t * cib, const char *section, xmlNode * data, int call_options)
136{
137 op_common(cib);
138 return cib_internal_op(cib, CIB_OP_CREATE, NULL, section, data, NULL, call_options, NULL);
139}
140
141static int
142cib_client_modify(cib_t * cib, const char *section, xmlNode * data, int call_options)
143{
144 op_common(cib);
145 return cib_internal_op(cib, CIB_OP_MODIFY, NULL, section, data, NULL, call_options, NULL);
146}
147
148static int
149cib_client_update(cib_t * cib, const char *section, xmlNode * data, int call_options)
150{
151 op_common(cib);
152 return cib_internal_op(cib, CIB_OP_MODIFY, NULL, section, data, NULL, call_options, NULL);
153}
154
155static int
156cib_client_replace(cib_t * cib, const char *section, xmlNode * data, int call_options)
157{
158 op_common(cib);
159 return cib_internal_op(cib, CIB_OP_REPLACE, NULL, section, data, NULL, call_options, NULL);
160}
161
162static int
163cib_client_delete(cib_t * cib, const char *section, xmlNode * data, int call_options)
164{
165 op_common(cib);
166 return cib_internal_op(cib, CIB_OP_DELETE, NULL, section, data, NULL, call_options, NULL);
167}
168
169static int
170cib_client_delete_absolute(cib_t * cib, const char *section, xmlNode * data, int call_options)
171{
172 op_common(cib);
173 return cib_internal_op(cib, CIB_OP_DELETE_ALT, NULL, section, data, NULL, call_options, NULL);
174}
175
176static int
177cib_client_erase(cib_t * cib, xmlNode ** output_data, int call_options)
178{
179 op_common(cib);
180 return cib_internal_op(cib, CIB_OP_ERASE, NULL, NULL, NULL, output_data, call_options, NULL);
181}
182
183static void
184cib_destroy_op_callback(gpointer data)
185{
187
188 if (blob->timer && blob->timer->ref > 0) {
189 g_source_remove(blob->timer->ref);
190 }
191 free(blob->timer);
192
193 if (blob->user_data && blob->free_func) {
194 blob->free_func(blob->user_data);
195 }
196
197 free(blob);
198}
199
200static void
201destroy_op_callback_table(void)
202{
203 if (cib_op_callback_table != NULL) {
204 g_hash_table_destroy(cib_op_callback_table);
205 cib_op_callback_table = NULL;
206 }
207}
208
209char *
210get_shadow_file(const char *suffix)
211{
212 char *cib_home = NULL;
213 char *fullname = NULL;
214 char *name = crm_strdup_printf("shadow.%s", suffix);
215 const char *dir = getenv("CIB_shadow_dir");
216
217 if (dir == NULL) {
218 uid_t uid = geteuid();
219 struct passwd *pwent = getpwuid(uid);
220 const char *user = NULL;
221
222 if (pwent) {
223 user = pwent->pw_name;
224 } else {
225 user = getenv("USER");
226 crm_perror(LOG_ERR,
227 "Assuming %s because cannot get user details for user ID %d",
228 (user? user : "unprivileged user"), uid);
229 }
230
231 if (pcmk__strcase_any_of(user, "root", CRM_DAEMON_USER, NULL)) {
232 dir = CRM_CONFIG_DIR;
233
234 } else {
235 const char *home = NULL;
236
237 if ((home = getenv("HOME")) == NULL) {
238 if (pwent) {
239 home = pwent->pw_dir;
240 }
241 }
242
243 dir = pcmk__get_tmpdir();
244 if (home && home[0] == '/') {
245 int rc = 0;
246
247 cib_home = crm_strdup_printf("%s/.cib", home);
248
249 rc = mkdir(cib_home, 0700);
250 if (rc < 0 && errno != EEXIST) {
251 crm_perror(LOG_ERR, "Couldn't create user-specific shadow directory: %s",
252 cib_home);
253 errno = 0;
254
255 } else {
256 dir = cib_home;
257 }
258 }
259 }
260 }
261
262 fullname = crm_strdup_printf("%s/%s", dir, name);
263 free(cib_home);
264 free(name);
265
266 return fullname;
267}
268
269cib_t *
270cib_shadow_new(const char *shadow)
271{
272 cib_t *new_cib = NULL;
273 char *shadow_file = NULL;
274
275 CRM_CHECK(shadow != NULL, return NULL);
276
277 shadow_file = get_shadow_file(shadow);
278 new_cib = cib_file_new(shadow_file);
279 free(shadow_file);
280
281 return new_cib;
282}
283
284cib_t *
286{
287 unsetenv("CIB_shadow");
288 return cib_new();
289}
290
291cib_t *
293{
294 const char *value = getenv("CIB_shadow");
295 int port;
296
297 if (value && value[0] != 0) {
298 return cib_shadow_new(value);
299 }
300
301 value = getenv("CIB_file");
302 if (value) {
303 return cib_file_new(value);
304 }
305
306 value = getenv("CIB_port");
307 if (value) {
308 gboolean encrypted = TRUE;
309 const char *server = getenv("CIB_server");
310 const char *user = getenv("CIB_user");
311 const char *pass = getenv("CIB_passwd");
312
313 /* We don't ensure port is valid (>= 0) because cib_new() currently
314 * can't return NULL in practice, and introducing a NULL return here
315 * could cause core dumps that would previously just cause signon()
316 * failures.
317 */
318 pcmk__scan_port(value, &port);
319
320 value = getenv("CIB_encrypted");
321 if (value && crm_is_true(value) == FALSE) {
322 crm_info("Disabling TLS");
323 encrypted = FALSE;
324 }
325
326 if (user == NULL) {
327 user = CRM_DAEMON_USER;
328 crm_info("Defaulting to user: %s", user);
329 }
330
331 if (server == NULL) {
332 server = "localhost";
333 crm_info("Defaulting to localhost");
334 }
335
336 return cib_remote_new(server, user, pass, port, encrypted);
337 }
338
339 return cib_native_new();
340}
341
351cib_t *
353{
354 cib_t *new_cib = NULL;
355
356 new_cib = calloc(1, sizeof(cib_t));
357
358 if (new_cib == NULL) {
359 return NULL;
360 }
361
362 remove_cib_op_callback(0, TRUE); /* remove all */
363
364 new_cib->call_id = 1;
365 new_cib->variant = cib_undefined;
366
367 new_cib->type = cib_no_connection;
368 new_cib->state = cib_disconnected;
369
370 new_cib->op_callback = NULL;
371 new_cib->variant_opaque = NULL;
372 new_cib->notify_list = NULL;
373
374 /* the rest will get filled in by the variant constructor */
375 new_cib->cmds = calloc(1, sizeof(cib_api_operations_t));
376
377 if (new_cib->cmds == NULL) {
378 free(new_cib);
379 return NULL;
380 }
381
387
388 new_cib->cmds->noop = cib_client_noop;
389 new_cib->cmds->ping = cib_client_ping;
390 new_cib->cmds->query = cib_client_query;
391 new_cib->cmds->sync = cib_client_sync;
392
393 new_cib->cmds->query_from = cib_client_query_from;
394 new_cib->cmds->sync_from = cib_client_sync_from;
395
396 new_cib->cmds->is_master = cib_client_is_master;
397 new_cib->cmds->set_master = cib_client_set_master;
398 new_cib->cmds->set_slave = cib_client_set_slave;
399 new_cib->cmds->set_slave_all = cib_client_set_slave_all;
400
401 new_cib->cmds->upgrade = cib_client_upgrade;
402 new_cib->cmds->bump_epoch = cib_client_bump_epoch;
403
404 new_cib->cmds->create = cib_client_create;
405 new_cib->cmds->modify = cib_client_modify;
406 new_cib->cmds->update = cib_client_update;
407 new_cib->cmds->replace = cib_client_replace;
408 new_cib->cmds->remove = cib_client_delete;
409 new_cib->cmds->erase = cib_client_erase;
410
411 new_cib->cmds->delete_absolute = cib_client_delete_absolute;
412
413 return new_cib;
414}
415
416void
418{
419
420 if (cib) {
421 GList *list = cib->notify_list;
422
423 while (list != NULL) {
424 cib_notify_client_t *client = g_list_nth_data(list, 0);
425
426 list = g_list_remove(list, client);
427 free(client);
428 }
429 cib->notify_list = NULL;
430 }
431}
437void
439{
440 cib_free_notify(cib);
441
442 destroy_op_callback_table();
443}
444
450void
452{
454 if (cib) {
455 cib->cmds->free(cib);
456 }
457}
458
459int
460cib_client_set_op_callback(cib_t * cib, void (*callback) (const xmlNode * msg, int call_id,
461 int rc, xmlNode * output))
462{
463 if (callback == NULL) {
464 crm_info("Un-Setting operation callback");
465
466 } else {
467 crm_trace("Setting operation callback");
468 }
469 cib->op_callback = callback;
470 return pcmk_ok;
471}
472
473int
474cib_client_add_notify_callback(cib_t * cib, const char *event,
475 void (*callback) (const char *event, xmlNode * msg))
476{
477 GList *list_item = NULL;
478 cib_notify_client_t *new_client = NULL;
479
480 if (cib->variant != cib_native && cib->variant != cib_remote) {
481 return -EPROTONOSUPPORT;
482 }
483
484 crm_trace("Adding callback for %s events (%d)", event, g_list_length(cib->notify_list));
485
486 new_client = calloc(1, sizeof(cib_notify_client_t));
487 new_client->event = event;
488 new_client->callback = callback;
489
490 list_item = g_list_find_custom(cib->notify_list, new_client, ciblib_GCompareFunc);
491
492 if (list_item != NULL) {
493 crm_warn("Callback already present");
494 free(new_client);
495 return -EINVAL;
496
497 } else {
498 cib->notify_list = g_list_append(cib->notify_list, new_client);
499
500 cib->cmds->register_notification(cib, event, 1);
501
502 crm_trace("Callback added (%d)", g_list_length(cib->notify_list));
503 }
504 return pcmk_ok;
505}
506
507static int
508get_notify_list_event_count(cib_t * cib, const char *event)
509{
510 GList *l = NULL;
511 int count = 0;
512
513 for (l = g_list_first(cib->notify_list); l; l = g_list_next(l)) {
514 cib_notify_client_t *client = (cib_notify_client_t *)l->data;
515
516 if (strcmp(client->event, event) == 0) {
517 count++;
518 }
519 }
520 crm_trace("event(%s) count : %d", event, count);
521 return count;
522}
523
524int
525cib_client_del_notify_callback(cib_t * cib, const char *event,
526 void (*callback) (const char *event, xmlNode * msg))
527{
528 GList *list_item = NULL;
529 cib_notify_client_t *new_client = NULL;
530
531 if (cib->variant != cib_native && cib->variant != cib_remote) {
532 return -EPROTONOSUPPORT;
533 }
534
535 if (get_notify_list_event_count(cib, event) == 0) {
536 crm_debug("The callback of the event does not exist(%s)", event);
537 return pcmk_ok;
538 }
539
540 crm_debug("Removing callback for %s events", event);
541
542 new_client = calloc(1, sizeof(cib_notify_client_t));
543 new_client->event = event;
544 new_client->callback = callback;
545
546 list_item = g_list_find_custom(cib->notify_list, new_client, ciblib_GCompareFunc);
547
548 if (list_item != NULL) {
549 cib_notify_client_t *list_client = list_item->data;
550
551 cib->notify_list = g_list_remove(cib->notify_list, list_client);
552 free(list_client);
553
554 crm_trace("Removed callback");
555
556 } else {
557 crm_trace("Callback not present");
558 }
559
560 if (get_notify_list_event_count(cib, event) == 0) {
561 /* When there is not the registration of the event, the processing turns off a notice. */
562 cib->cmds->register_notification(cib, event, 0);
563 }
564
565 free(new_client);
566 return pcmk_ok;
567}
568
569gint
570ciblib_GCompareFunc(gconstpointer a, gconstpointer b)
571{
572 int rc = 0;
573 const cib_notify_client_t *a_client = a;
574 const cib_notify_client_t *b_client = b;
575
576 CRM_CHECK(a_client->event != NULL && b_client->event != NULL, return 0);
577 rc = strcmp(a_client->event, b_client->event);
578 if (rc == 0) {
579 if (a_client->callback == b_client->callback) {
580 return 0;
581 } else if (((long)a_client->callback) < ((long)b_client->callback)) {
582 crm_trace("callbacks for %s are not equal: %p < %p",
583 a_client->event, a_client->callback, b_client->callback);
584 return -1;
585 }
586 crm_trace("callbacks for %s are not equal: %p > %p",
587 a_client->event, a_client->callback, b_client->callback);
588 return 1;
589 }
590 return rc;
591}
592
593static gboolean
594cib_async_timeout_handler(gpointer data)
595{
596 struct timer_rec_s *timer = data;
597
598 crm_debug("Async call %d timed out after %ds", timer->call_id, timer->timeout);
599 cib_native_callback(timer->cib, NULL, timer->call_id, -ETIME);
600
601 /* Always return TRUE, never remove the handler
602 * We do that in remove_cib_op_callback()
603 */
604 return TRUE;
605}
606
607gboolean
608cib_client_register_callback(cib_t * cib, int call_id, int timeout, gboolean only_success,
609 void *user_data, const char *callback_name,
610 void (*callback) (xmlNode *, int, int, xmlNode *, void *))
611{
613 only_success, user_data,
614 callback_name, callback, NULL);
615}
616
617gboolean
619 gboolean only_success, void *user_data,
620 const char *callback_name,
621 void (*callback)(xmlNode *, int, int,
622 xmlNode *, void *),
623 void (*free_func)(void *))
624{
625 cib_callback_client_t *blob = NULL;
626
627 if (call_id < 0) {
628 if (only_success == FALSE) {
629 callback(NULL, call_id, call_id, NULL, user_data);
630 } else {
631 crm_warn("CIB call failed: %s", pcmk_strerror(call_id));
632 }
633 if (user_data && free_func) {
634 free_func(user_data);
635 }
636 return FALSE;
637 }
638
639 blob = calloc(1, sizeof(cib_callback_client_t));
640 blob->id = callback_name;
641 blob->only_success = only_success;
642 blob->user_data = user_data;
643 blob->callback = callback;
644 blob->free_func = free_func;
645
646 if (timeout > 0) {
647 struct timer_rec_s *async_timer = NULL;
648
649 async_timer = calloc(1, sizeof(struct timer_rec_s));
650 blob->timer = async_timer;
651
652 async_timer->cib = cib;
653 async_timer->call_id = call_id;
654 async_timer->timeout = timeout * 1000;
655 async_timer->ref =
656 g_timeout_add(async_timer->timeout, cib_async_timeout_handler, async_timer);
657 }
658
659 crm_trace("Adding callback %s for call %d", callback_name, call_id);
660 pcmk__intkey_table_insert(cib_op_callback_table, call_id, blob);
661
662 return TRUE;
663}
664
665void
666remove_cib_op_callback(int call_id, gboolean all_callbacks)
667{
668 if (all_callbacks) {
669 destroy_op_callback_table();
670 cib_op_callback_table = pcmk__intkey_table(cib_destroy_op_callback);
671 } else {
672 pcmk__intkey_table_remove(cib_op_callback_table, call_id);
673 }
674}
675
676int
678{
679 if (cib_op_callback_table == NULL) {
680 return 0;
681 }
682 return g_hash_table_size(cib_op_callback_table);
683}
684
685static void
686cib_dump_pending_op(gpointer key, gpointer value, gpointer user_data)
687{
688 int call = GPOINTER_TO_INT(key);
689 cib_callback_client_t *blob = value;
690
691 crm_debug("Call %d (%s): pending", call, crm_str(blob->id));
692}
693
694void
696{
697 if (cib_op_callback_table == NULL) {
698 return;
699 }
700 return g_hash_table_foreach(cib_op_callback_table, cib_dump_pending_op, NULL);
701}
702
705{
706 return pcmk__intkey_table_lookup(cib_op_callback_table, call_id);
707}
#define CIB_OP_MODIFY
Definition: internal.h:25
void cib_native_callback(cib_t *cib, xmlNode *msg, int call_id, int rc)
Definition: cib_utils.c:470
#define CIB_OP_UPGRADE
Definition: internal.h:30
#define CIB_OP_ERASE
Definition: internal.h:27
#define CIB_OP_MASTER
Definition: internal.h:18
int cib_internal_op(cib_t *cib, const char *op, const char *host, const char *section, xmlNode *data, xmlNode **output_data, int call_options, const char *user_name)
Definition: cib_utils.c:645
#define CIB_OP_CREATE
Definition: internal.h:24
#define CIB_OP_REPLACE
Definition: internal.h:28
#define CIB_OP_DELETE_ALT
Definition: internal.h:31
#define CIB_OP_SLAVE
Definition: internal.h:16
#define CIB_OP_SYNC
Definition: internal.h:19
#define CIB_OP_ISMASTER
Definition: internal.h:21
#define CIB_OP_QUERY
Definition: internal.h:23
#define CIB_OP_BUMP
Definition: internal.h:22
#define CIB_OP_DELETE
Definition: internal.h:26
const char * name
Definition: cib.c:24
cib_t * cib_remote_new(const char *server, const char *user, const char *passwd, int port, gboolean encrypted)
Definition: cib_remote.c:104
cib_t * cib_native_new(void)
Definition: cib_native.c:56
cib_t * cib_file_new(const char *filename)
Definition: cib_file.c:493
gboolean cib_client_register_callback_full(cib_t *cib, int call_id, int timeout, gboolean only_success, void *user_data, const char *callback_name, void(*callback)(xmlNode *, int, int, xmlNode *, void *), void(*free_func)(void *))
Definition: cib_client.c:618
cib_t * cib_new_no_shadow(void)
Definition: cib_client.c:285
cib_t * cib_new_variant(void)
Definition: cib_client.c:352
void cib_delete(cib_t *cib)
Free all memory used by CIB connection.
Definition: cib_client.c:451
#define op_common(cib)
Definition: cib_client.c:41
cib_t * cib_shadow_new(const char *shadow)
Definition: cib_client.c:270
int num_cib_op_callbacks(void)
Definition: cib_client.c:677
int cib_client_set_op_callback(cib_t *cib, void(*callback)(const xmlNode *msg, int call_id, int rc, xmlNode *output))
Definition: cib_client.c:460
int cib_client_add_notify_callback(cib_t *cib, const char *event, void(*callback)(const char *event, xmlNode *msg))
Definition: cib_client.c:474
cib_t * cib_new(void)
Definition: cib_client.c:292
char * get_shadow_file(const char *suffix)
Definition: cib_client.c:210
int cib_client_del_notify_callback(cib_t *cib, const char *event, void(*callback)(const char *event, xmlNode *msg))
Definition: cib_client.c:525
void remove_cib_op_callback(int call_id, gboolean all_callbacks)
Definition: cib_client.c:666
cib_callback_client_t * cib__lookup_id(int call_id)
Definition: cib_client.c:704
void cib_dump_pending_callbacks(void)
Definition: cib_client.c:695
void cib_free_callbacks(cib_t *cib)
Free all callbacks for a CIB connection.
Definition: cib_client.c:438
void cib_free_notify(cib_t *cib)
Definition: cib_client.c:417
gboolean cib_client_register_callback(cib_t *cib, int call_id, int timeout, gboolean only_success, void *user_data, const char *callback_name, void(*callback)(xmlNode *, int, int, xmlNode *, void *))
Definition: cib_client.c:608
gint ciblib_GCompareFunc(gconstpointer a, gconstpointer b)
Definition: cib_client.c:570
@ cib_no_connection
Definition: cib_types.h:45
@ cib_scope_local
Definition: cib_types.h:59
@ cib_sync_call
Definition: cib_types.h:61
@ cib_native
Definition: cib_types.h:30
@ cib_undefined
Definition: cib_types.h:29
@ cib_remote
Definition: cib_types.h:32
@ cib_disconnected
Definition: cib_types.h:39
const char * pcmk__get_tmpdir(void)
Definition: io.c:540
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
gboolean crm_is_true(const char *s)
Definition: strings.c:416
#define CRM_DAEMON_USER
Definition: config.h:30
#define CRM_CONFIG_DIR
Definition: config.h:17
pcmk__cpg_host_t host
Definition: cpg.c:4
char data[0]
Definition: cpg.c:10
A dumping ground.
#define CRM_OP_NOOP
Definition: crm.h:128
#define CRM_OP_PING
Definition: crm.h:134
#define crm_str(x)
Definition: logging.h:384
#define crm_info(fmt, args...)
Definition: logging.h:361
#define crm_warn(fmt, args...)
Definition: logging.h:359
#define crm_perror(level, fmt, args...)
Send a system error message to both the log and stderr.
Definition: logging.h:309
#define CRM_CHECK(expr, failure_action)
Definition: logging.h:226
#define crm_debug(fmt, args...)
Definition: logging.h:363
#define crm_trace(fmt, args...)
Definition: logging.h:364
unsigned int timeout
Definition: pcmk_fence.c:31
#define ETIME
Definition: portability.h:150
const char * pcmk_strerror(int rc)
Definition: results.c:58
#define pcmk_ok
Definition: results.h:68
int pcmk__scan_port(const char *text, int *port)
Definition: strings.c:161
bool pcmk__strcase_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
Definition: strings.c:931
int(* upgrade)(cib_t *cib, int call_options)
Definition: cib_types.h:103
int(* create)(cib_t *cib, const char *section, xmlNode *data, int call_options)
Definition: cib_types.h:105
int(* set_master)(cib_t *cib, int call_options)
Definition: cib_types.h:97
int(* noop)(cib_t *cib, int call_options)
Definition: cib_types.h:90
int(* delete_absolute)(cib_t *cib, const char *section, xmlNode *data, int call_options)
Definition: cib_types.h:116
int(* erase)(cib_t *cib, xmlNode **output_data, int call_options)
Definition: cib_types.h:115
int(* del_notify_callback)(cib_t *cib, const char *event, void(*callback)(const char *event, xmlNode *msg))
Definition: cib_types.h:84
int(* add_notify_callback)(cib_t *cib, const char *event, void(*callback)(const char *event, xmlNode *msg))
Definition: cib_types.h:81
int(* bump_epoch)(cib_t *cib, int call_options)
Definition: cib_types.h:104
int(* is_master)(cib_t *cib)
Definition: cib_types.h:96
int(* set_slave_all)(cib_t *cib, int call_options)
Definition: cib_types.h:99
int(* remove)(cib_t *cib, const char *section, xmlNode *data, int call_options)
Definition: cib_types.h:113
int(* set_slave)(cib_t *cib, int call_options)
Definition: cib_types.h:98
int(* query_from)(cib_t *cib, const char *host, const char *section, xmlNode **output_data, int call_options)
Definition: cib_types.h:94
int(* update)(cib_t *cib, const char *section, xmlNode *data, int call_options)
Definition: cib_types.h:109
int(* query)(cib_t *cib, const char *section, xmlNode **output_data, int call_options)
Definition: cib_types.h:92
int(* set_op_callback)(cib_t *cib, void(*callback)(const xmlNode *msg, int callid, int rc, xmlNode *output))
Definition: cib_types.h:78
int(* sync_from)(cib_t *cib, const char *host, const char *section, int call_options)
Definition: cib_types.h:101
gboolean(* register_callback)(cib_t *cib, int call_id, int timeout, gboolean only_success, void *user_data, const char *callback_name, void(*callback)(xmlNode *, int, int, xmlNode *, void *))
Definition: cib_types.h:121
int(* ping)(cib_t *cib, xmlNode **output_data, int call_options)
Definition: cib_types.h:91
int(* register_notification)(cib_t *cib, const char *callback, int enabled)
Definition: cib_types.h:119
int(* replace)(cib_t *cib, const char *section, xmlNode *data, int call_options)
Definition: cib_types.h:111
int(* sync)(cib_t *cib, const char *section, int call_options)
Definition: cib_types.h:100
int(* free)(cib_t *cib)
Definition: cib_types.h:77
int(* modify)(cib_t *cib, const char *section, xmlNode *data, int call_options)
Definition: cib_types.h:107
gboolean(* register_callback_full)(cib_t *cib, int call_id, int timeout, gboolean only_success, void *user_data, const char *callback_name, void(*callback)(xmlNode *, int, int, xmlNode *, void *), void(*free_func)(void *))
Definition: cib_types.h:126
const char * id
Definition: internal.h:96
void(* callback)(xmlNode *, int, int, xmlNode *, void *)
Definition: internal.h:95
void(* free_func)(void *)
Definition: internal.h:100
struct timer_rec_s * timer
Definition: internal.h:99
gboolean only_success
Definition: internal.h:98
const char * event
Definition: internal.h:87
void(* callback)(const char *event, xmlNode *msg)
Definition: internal.h:90
enum cib_conn_type type
Definition: cib_types.h:136
enum cib_state state
Definition: cib_types.h:135
GList * notify_list
Definition: cib_types.h:144
void * variant_opaque
Definition: cib_types.h:141
cib_api_operations_t * cmds
Definition: cib_types.h:147
enum cib_variant variant
Definition: cib_types.h:137
int call_id
Definition: cib_types.h:139
void(* op_callback)(const xmlNode *msg, int call_id, int rc, xmlNode *output)
Definition: cib_types.h:145
int call_id
Definition: internal.h:104
cib_t * cib
Definition: internal.h:107
guint ref
Definition: internal.h:106
int timeout
Definition: internal.h:105
Wrappers for and extensions to libxml2.