Coverage Report

Created: 2026-03-31 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/pacemaker/include/crm/lrmd.h
Line
Count
Source
1
/*
2
 * Copyright 2012-2026 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
#ifndef PCMK__CRM_LRMD__H
11
#define PCMK__CRM_LRMD__H
12
13
#include <stdbool.h>                // bool
14
#include <stdint.h>                 // UINT32_C
15
16
#include <glib.h>                   // guint, GList
17
18
#include <crm_config.h>
19
#include <crm/common/internal.h>    // pcmk__compare_versions()
20
#include <crm/lrmd_events.h>
21
#include <crm/services.h>
22
23
#ifdef __cplusplus
24
extern "C" {
25
#endif
26
27
/**
28
 * \file
29
 * \brief Resource agent executor
30
 * \ingroup lrmd
31
 */
32
33
typedef struct lrmd_s lrmd_t;
34
35
/*!
36
 * \deprecated Use \c lrmd_key_value_t instead of
37
 *             <tt>struct lrmd_key_value_s</tt>.
38
 */
39
typedef struct lrmd_key_value_s {
40
    char *key;
41
    char *value;
42
    struct lrmd_key_value_s *next;
43
} lrmd_key_value_t;
44
45
/* The major version should be bumped every time there is an incompatible
46
 * change that prevents older clients from connecting to this version of
47
 * the server.  The minor version indicates feature support.
48
 *
49
 * Protocol  Pacemaker  Significant changes
50
 * --------  ---------  -------------------
51
 *   1.2       2.1.8    PCMK__CIB_REQUEST_SCHEMAS
52
 */
53
#define LRMD_PROTOCOL_VERSION "1.2"
54
55
#define LRMD_SUPPORTS_SCHEMA_XFER(x) (pcmk__compare_versions((x), "1.2") >= 0)
56
57
/* The major protocol version the client and server both need to support for
58
 * the connection to be successful.  This should only ever be the major
59
 * version - not a complete version number.
60
 */
61
#define LRMD_COMPATIBLE_PROTOCOL "1"
62
63
/* *INDENT-OFF* */
64
#define DEFAULT_REMOTE_KEY_LOCATION PACEMAKER_CONFIG_DIR "/authkey"
65
0
#define DEFAULT_REMOTE_PORT 3121
66
0
#define DEFAULT_REMOTE_USERNAME "lrmd"
67
68
#define LRMD_OP_RSC_REG           "lrmd_rsc_register"
69
#define LRMD_OP_RSC_EXEC          "lrmd_rsc_exec"
70
#define LRMD_OP_RSC_CANCEL        "lrmd_rsc_cancel"
71
#define LRMD_OP_RSC_UNREG         "lrmd_rsc_unregister"
72
#define LRMD_OP_RSC_INFO          "lrmd_rsc_info"
73
#define LRMD_OP_RSC_METADATA      "lrmd_rsc_metadata"
74
#define LRMD_OP_POKE              "lrmd_rsc_poke"
75
#define LRMD_OP_NEW_CLIENT        "lrmd_rsc_new_client"
76
#define LRMD_OP_CHECK             "lrmd_check"
77
#define LRMD_OP_ALERT_EXEC        "lrmd_alert_exec"
78
#define LRMD_OP_GET_RECURRING     "lrmd_get_recurring"
79
80
#define LRMD_IPC_OP_NEW           "new"
81
#define LRMD_IPC_OP_DESTROY       "destroy"
82
#define LRMD_IPC_OP_EVENT         "event"
83
#define LRMD_IPC_OP_REQUEST       "request"
84
#define LRMD_IPC_OP_RESPONSE      "response"
85
#define LRMD_IPC_OP_SHUTDOWN_REQ  "shutdown_req"
86
#define LRMD_IPC_OP_SHUTDOWN_ACK  "shutdown_ack"
87
#define LRMD_IPC_OP_SHUTDOWN_NACK "shutdown_nack"
88
/* *INDENT-ON* */
89
90
/*!
91
 * \brief Create a new connection to the local executor
92
 */
93
lrmd_t *lrmd_api_new(void);
94
95
/*!
96
 * \brief Create a new TLS connection to a remote executor
97
 *
98
 * \param[in] nodename  Name of remote node identified with this connection
99
 * \param[in] server    Hostname to connect to
100
 * \param[in] port      Port number to connect to (or 0 to use default)
101
 *
102
 * \return Newly created executor connection object
103
 * \note If only one of \p nodename and \p server is non-NULL, it will be used
104
 *       for both purposes. If both are NULL, a local IPC connection will be
105
 *       created instead.
106
 */
107
lrmd_t *lrmd_remote_api_new(const char *nodename, const char *server, int port);
108
109
/*!
110
 * \brief Use after lrmd_poll returns 1 to read and dispatch a message
111
 *
112
 * \param[in,out] lrmd  Executor connection object
113
 *
114
 * \return TRUE if connection is still up, FALSE if disconnected
115
 */
116
bool lrmd_dispatch(lrmd_t *lrmd);
117
118
/*!
119
 * \brief Check whether a message is available on an executor connection
120
 *
121
 * \param[in,out] lrmd     Executor connection object to check
122
 * \param[in]     timeout  Currently ignored
123
 *
124
 * \retval 1               Message is ready
125
 * \retval 0               Timeout occurred
126
 * \retval negative errno  Error occurred
127
 *
128
 * \note This is intended for callers that do not use a main loop.
129
 */
130
int lrmd_poll(lrmd_t *lrmd, int timeout);
131
132
/*!
133
 * \brief Destroy executor connection object
134
 *
135
 * \param[in,out] lrmd     Executor connection object to destroy
136
 */
137
void lrmd_api_delete(lrmd_t *lrmd);
138
139
lrmd_key_value_t *lrmd_key_value_add(lrmd_key_value_t * kvp, const char *key, const char *value);
140
141
enum lrmd_call_options {
142
    lrmd_opt_none                   = 0,
143
144
    /*!
145
     * Drop recurring operations initiated by a client when the client
146
     * disconnects. This option is only valid when registering a resource. When
147
     * used with a connection to a remote executor, recurring operations will be
148
     * dropped once all remote connections disconnect.
149
     */
150
    lrmd_opt_drop_recurring         = (UINT32_C(1) << 0),
151
152
    //! Notify only the client that made the request (rather than all clients)
153
    lrmd_opt_notify_orig_only       = (UINT32_C(1) << 1),
154
155
    //! Send notifications for recurring operations only when the result changes
156
    lrmd_opt_notify_changes_only    = (UINT32_C(1) << 2),
157
};
158
159
/*!
160
 * \deprecated Use \c lrmd_rsc_info_t instead of
161
 *             <tt>struct lrmd_rsc_info_s</tt>.
162
 */
163
typedef struct lrmd_rsc_info_s {
164
    char *id;
165
    char *type;
166
    char *standard;
167
    char *provider;
168
} lrmd_rsc_info_t;
169
170
//! \deprecated Use \c lrmd_op_info_t instead of <tt>struct lrmd_op_info_s</tt>
171
typedef struct lrmd_op_info_s {
172
    char *rsc_id;
173
    char *action;
174
    char *interval_ms_s;
175
    char *timeout_ms_s;
176
} lrmd_op_info_t;
177
178
lrmd_rsc_info_t *lrmd_new_rsc_info(const char *rsc_id, const char *standard,
179
                                   const char *provider, const char *type);
180
lrmd_rsc_info_t *lrmd_copy_rsc_info(lrmd_rsc_info_t * rsc_info);
181
void lrmd_free_rsc_info(lrmd_rsc_info_t * rsc_info);
182
void lrmd_free_op_info(lrmd_op_info_t *op_info);
183
184
typedef void (*lrmd_event_callback) (lrmd_event_data_t * event);
185
186
//! \deprecated Use \c lrmd_list_t instead of <tt>struct lrmd_list_s</tt>
187
typedef struct lrmd_list_s {
188
    const char *val;
189
    struct lrmd_list_s *next;
190
} lrmd_list_t;
191
192
void lrmd_list_freeall(lrmd_list_t * head);
193
void lrmd_key_value_freeall(lrmd_key_value_t * head);
194
195
/*!
196
 * \deprecated Use \c lrmd_api_operations_t instead of
197
 *             <tt>struct lrmd_api_operations_s</tt>.
198
 */
199
typedef struct lrmd_api_operations_s {
200
    /*!
201
     * \brief Connect to an executor
202
     *
203
     * \param[in,out] lrmd         Executor connection object
204
     * \param[in]     client_name  Arbitrary identifier to pass to server
205
     * \param[out]    fd           If not NULL, where to store file descriptor
206
     *                             for connection's socket
207
     *
208
     * \return Legacy Pacemaker return code
209
     */
210
    int (*connect) (lrmd_t *lrmd, const char *client_name, int *fd);
211
212
    /*!
213
     * \brief Initiate an executor connection without blocking
214
     *
215
     * \param[in,out] lrmd         Executor connection object
216
     * \param[in]     client_name  Arbitrary identifier to pass to server
217
     * \param[in]     timeout      Error if not connected within this time
218
     *                             (milliseconds)
219
     *
220
     * \return Legacy Pacemaker return code (if pcmk_ok, the event callback will
221
     *         be called later with the result)
222
     * \note This function requires a mainloop.
223
     */
224
    int (*connect_async) (lrmd_t *lrmd, const char *client_name,
225
                          int timeout /*ms */ );
226
227
    /*!
228
     * \brief Check whether connection to executor daemon is (still) active
229
     *
230
     * \param[in,out] lrmd  Executor connection object to check
231
     *
232
     * \return 1 if the executor connection is active, 0 otherwise
233
     */
234
    int (*is_connected) (lrmd_t *lrmd);
235
236
    /*!
237
     * \brief Poke executor connection to verify it is still active
238
     *
239
     * \param[in,out] lrmd  Executor connection object to check
240
     *
241
     * \return Legacy Pacemaker return code (if pcmk_ok, the event callback will
242
     *         be called later with the result)
243
     * \note The response comes in the form of a poke event to the callback.
244
     *
245
     */
246
    int (*poke_connection) (lrmd_t *lrmd);
247
248
    /*!
249
     * \brief Disconnect from the executor.
250
     *
251
     * \param[in,out] lrmd  Executor connection object to disconnect
252
     *
253
     * \return Legacy Pacemaker return code
254
     */
255
    int (*disconnect) (lrmd_t *lrmd);
256
257
    /*!
258
     * \brief Register a resource with the executor
259
     *
260
     * \param[in,out] lrmd      Executor connection object
261
     * \param[in]     rsc_id    ID of resource to register
262
     * \param[in]     standard  Resource's resource agent standard
263
     * \param[in]     provider  Resource's resource agent provider (or NULL)
264
     * \param[in]     agent     Resource's resource agent name
265
     * \param[in]     options   Group of enum lrmd_call_options flags
266
     *
267
     * \note Synchronous, guaranteed to occur in daemon before function returns.
268
     *
269
     * \return Legacy Pacemaker return code
270
     */
271
    int (*register_rsc) (lrmd_t *lrmd, const char *rsc_id, const char *standard,
272
                         const char *provider, const char *agent,
273
                         enum lrmd_call_options options);
274
275
    /*!
276
     * \brief Retrieve a resource's registration information
277
     *
278
     * \param[in,out] lrmd      Executor connection object
279
     * \param[in]     rsc_id    ID of resource to check
280
     * \param[in]     options   Group of enum lrmd_call_options flags
281
     *
282
     * \return Resource information on success, otherwise NULL
283
     */
284
    lrmd_rsc_info_t *(*get_rsc_info) (lrmd_t *lrmd, const char *rsc_id,
285
                                      enum lrmd_call_options options);
286
287
    /*!
288
     * \brief Retrieve recurring operations registered for a resource
289
     *
290
     * \param[in,out] lrmd        Executor connection object
291
     * \param[in]     rsc_id      ID of resource to check
292
     * \param[in]     timeout_ms  Error if not completed within this time
293
     * \param[in]     options     Group of enum lrmd_call_options flags
294
     * \param[out]    output      Where to store list of lrmd_op_info_t
295
     *
296
     * \return Legacy Pacemaker return code
297
     */
298
    int (*get_recurring_ops) (lrmd_t *lrmd, const char *rsc_id, int timeout_ms,
299
                              enum lrmd_call_options options, GList **output);
300
301
    /*!
302
     * \brief Unregister a resource from the executor
303
     *
304
     * \param[in,out] lrmd     Executor connection object
305
     * \param[in]     rsc_id   ID of resource to unregister
306
     * \param[in]     options  Group of enum lrmd_call_options flags
307
     *
308
     * \return Legacy Pacemaker return code (of particular interest, EINPROGRESS
309
     *         means that operations are in progress for the resource, and the
310
     *         unregistration will be done when they complete)
311
     * \note Pending and recurring operations will be cancelled.
312
     * \note Synchronous, guaranteed to occur in daemon before function returns.
313
     *
314
     */
315
    int (*unregister_rsc) (lrmd_t *lrmd, const char *rsc_id,
316
                           enum lrmd_call_options options);
317
318
    /*!
319
     * \brief Set a callback for executor events
320
     *
321
     * \param[in,out] lrmd      Executor connection object
322
     * \param[in]     callback  Callback to set
323
     */
324
    void (*set_callback) (lrmd_t *lrmd, lrmd_event_callback callback);
325
326
    /*!
327
     * \brief Request execution of a resource action
328
     *
329
     * \param[in,out] lrmd         Executor connection object
330
     * \param[in]     rsc_id       ID of resource
331
     * \param[in]     action       Name of resource action to execute
332
     * \param[in]     userdata     Arbitrary string to pass to event callback
333
     * \param[in]     interval_ms  If 0, execute action once, otherwise
334
     *                             recurring at this interval (in milliseconds)
335
     * \param[in]     timeout      Error if not complete within this time (in
336
     *                             milliseconds)
337
     * \param[in]     start_delay  Wait this long before execution (in
338
     *                             milliseconds)
339
     * \param[in]     options      Group of enum lrmd_call_options flags
340
     * \param[in,out] params       Parameters to pass to agent (will be freed)
341
     *
342
     * \return A call ID for the action on success (in which case the action is
343
     *         queued in the executor, and the event callback will be called
344
     *         later with the result), otherwise a negative legacy Pacemaker
345
     *         return code
346
     * \note exec() and cancel() operations on an individual resource are
347
     *       guaranteed to occur in the order the client API is called. However,
348
     *       operations on different resources are not guaranteed to occur in
349
     *       any specific order.
350
     */
351
    int (*exec) (lrmd_t *lrmd, const char *rsc_id, const char *action,
352
                 const char *userdata, guint interval_ms, int timeout,
353
                 int start_delay, enum lrmd_call_options options,
354
                 lrmd_key_value_t *params);
355
356
    /*!
357
     * \brief Cancel a recurring resource action
358
     *
359
     * \param[in,out] lrmd         Executor connection object
360
     * \param[in]     rsc_id       ID of resource
361
     * \param[in]     action       Name of resource action to cancel
362
     * \param[in]     interval_ms  Action's interval (in milliseconds)
363
     *
364
     * \return Legacy Pacemaker return code (if pcmk_ok, cancellation is queued
365
     *         on function return, and the event callback will be called later
366
     *         with an exec_complete event with an lrmd_op_status signifying
367
     *         that the operation is cancelled)
368
     *
369
     * \note exec() and cancel() operations on an individual resource are
370
     *       guaranteed to occur in the order the client API is called. However,
371
     *       operations on different resources are not guaranteed to occur in
372
     *       any specific order.
373
     */
374
    int (*cancel) (lrmd_t *lrmd, const char *rsc_id, const char *action,
375
                   guint interval_ms);
376
377
    /*!
378
     * \brief Retrieve resource agent metadata synchronously
379
     *
380
     * \param[in]  lrmd      Executor connection (unused)
381
     * \param[in]  standard  Resource agent class
382
     * \param[in]  provider  Resource agent provider
383
     * \param[in]  agent     Resource agent type
384
     * \param[out] output    Where to store metadata (must not be NULL)
385
     * \param[in]  options   Group of enum lrmd_call_options flags (unused)
386
     *
387
     * \return Legacy Pacemaker return code
388
     *
389
     * \note Caller is responsible for freeing output. This call is always
390
     *       synchronous (blocking), and always done directly by the library
391
     *       (not via the executor connection). This means that it is based on
392
     *       the local host environment, even if the executor connection is to a
393
     *       remote node, so this may fail if the agent is not installed
394
     *       locally. This also means that, if an external agent must be
395
     *       executed, it will be executed by the caller's user, not the
396
     *       executor's.
397
     */
398
    int (*get_metadata) (lrmd_t *lrmd, const char *standard,
399
                         const char *provider, const char *agent,
400
                         char **output, enum lrmd_call_options options);
401
402
    /*!
403
     * \brief Retrieve a list of installed resource agents
404
     *
405
     * \param[in]  lrmd      Executor connection (unused)
406
     * \param[out] agents    Where to store agent list (must not be NULL)
407
     * \param[in]  standard  Resource agent standard to list
408
     * \param[in]  provider  Resource agent provider to list (or NULL)
409
     *
410
     * \return Number of items in list on success, negative legacy Pacemaker
411
     *         return code otherwise
412
     *
413
     * \note if standard is not provided, all known agents will be returned
414
     * \note list must be freed using lrmd_list_freeall()
415
     */
416
    int (*list_agents) (lrmd_t *lrmd, lrmd_list_t **agents,
417
                        const char *standard, const char *provider);
418
419
    /*!
420
     * \brief Retrieve a list of resource agent providers
421
     *
422
     * \param[in]  lrmd       Executor connection (unused)
423
     * \param[in]  agent      If not NULL, list providers for this agent only
424
     * \param[out] providers  Where to store provider list
425
     *
426
     * \return Number of items in list on success, negative legacy Pacemaker
427
     *         return code otherwise
428
     * \note The caller is responsible for freeing *providers with
429
     *       lrmd_list_freeall().
430
     */
431
    int (*list_ocf_providers) (lrmd_t *lrmd, const char *agent,
432
                               lrmd_list_t **providers);
433
434
    /*!
435
     * \brief Retrieve a list of supported standards
436
     *
437
     * \param[in]  lrmd       Executor connection (unused)
438
     * \param[out] standards  Where to store standards list
439
     *
440
     * \return Number of items in list on success, negative legacy Pacemaker
441
     *         return code otherwise
442
     * \note The caller is responsible for freeing *standards with
443
     *       lrmd_list_freeall().
444
     */
445
    int (*list_standards) (lrmd_t *lrmd, lrmd_list_t **standards);
446
447
    /*!
448
     * \brief Execute an alert agent
449
     *
450
     * \param[in,out] lrmd        Executor connection
451
     * \param[in]     alert_id    Name of alert to execute
452
     * \param[in]     alert_path  Full path to alert executable
453
     * \param[in]     timeout     Error if not complete within this many
454
     *                            milliseconds
455
     * \param[in,out] params      Parameters to pass to agent (will be freed)
456
     *
457
     * \return Legacy Pacemaker return code (if pcmk_ok, the alert is queued in
458
     *         the executor, and the event callback will be called later with
459
     *         the result)
460
     *
461
     * \note Operations on individual alerts (by ID) are guaranteed to occur in
462
     *       the order the client API is called. Operations on different alerts
463
     *       are not guaranteed to occur in any specific order.
464
     */
465
    int (*exec_alert) (lrmd_t *lrmd, const char *alert_id,
466
                       const char *alert_path, int timeout,
467
                       lrmd_key_value_t *params);
468
469
    /*!
470
     * \brief Retrieve resource agent metadata synchronously with parameters
471
     *
472
     * \param[in]     lrmd      Executor connection (unused)
473
     * \param[in]     standard  Resource agent class
474
     * \param[in]     provider  Resource agent provider
475
     * \param[in]     agent     Resource agent type
476
     * \param[out]    output    Where to store metadata (must not be NULL)
477
     * \param[in]     options   Group of enum lrmd_call_options flags (unused)
478
     * \param[in,out] params    Parameters to pass to agent (will be freed)
479
     *
480
     * \return Legacy Pacemaker return code
481
     *
482
     * \note This is identical to the get_metadata() API call, except parameters
483
     *       will be passed to the resource agent via environment variables.
484
     */
485
    int (*get_metadata_params) (lrmd_t *lrmd, const char *standard,
486
                                const char *provider, const char *agent,
487
                                char **output, enum lrmd_call_options options,
488
                                lrmd_key_value_t *params);
489
490
} lrmd_api_operations_t;
491
492
//! \deprecated Use \c lrmd_t instead of <tt>struct lrmd_s</tt>.
493
struct lrmd_s {
494
    lrmd_api_operations_t *cmds;
495
    void *lrmd_private;
496
};
497
498
static inline const char *
499
lrmd_event_type2str(enum lrmd_callback_event type)
500
0
{
501
0
    switch (type) {
502
0
        case lrmd_event_register:
503
0
            return "register";
504
0
        case lrmd_event_unregister:
505
0
            return "unregister";
506
0
        case lrmd_event_exec_complete:
507
0
            return "exec_complete";
508
0
        case lrmd_event_disconnect:
509
0
            return "disconnect";
510
0
        case lrmd_event_connect:
511
0
            return "connect";
512
0
        case lrmd_event_poke:
513
0
            return "poke";
514
0
        case lrmd_event_new_client:
515
0
            return "new_client";
516
0
    }
517
0
    return "unknown";
518
0
}
Unexecuted instantiation: results.c:lrmd_event_type2str
Unexecuted instantiation: scores.c:lrmd_event_type2str
Unexecuted instantiation: strings.c:lrmd_event_type2str
Unexecuted instantiation: utils.c:lrmd_event_type2str
Unexecuted instantiation: iso8601.c:lrmd_event_type2str
Unexecuted instantiation: logging.c:lrmd_event_type2str
Unexecuted instantiation: mainloop.c:lrmd_event_type2str
Unexecuted instantiation: options.c:lrmd_event_type2str
Unexecuted instantiation: output.c:lrmd_event_type2str
Unexecuted instantiation: output_log.c:lrmd_event_type2str
Unexecuted instantiation: output_text.c:lrmd_event_type2str
Unexecuted instantiation: output_xml.c:lrmd_event_type2str
Unexecuted instantiation: patchset_display.c:lrmd_event_type2str
Unexecuted instantiation: schemas.c:lrmd_event_type2str
Unexecuted instantiation: xml.c:lrmd_event_type2str
Unexecuted instantiation: xml_attr.c:lrmd_event_type2str
Unexecuted instantiation: xml_comment.c:lrmd_event_type2str
Unexecuted instantiation: xml_display.c:lrmd_event_type2str
Unexecuted instantiation: xml_element.c:lrmd_event_type2str
Unexecuted instantiation: xml_idref.c:lrmd_event_type2str
Unexecuted instantiation: xml_io.c:lrmd_event_type2str
Unexecuted instantiation: xpath.c:lrmd_event_type2str
Unexecuted instantiation: acl.c:lrmd_event_type2str
Unexecuted instantiation: actions.c:lrmd_event_type2str
Unexecuted instantiation: agents.c:lrmd_event_type2str
Unexecuted instantiation: cmdline.c:lrmd_event_type2str
Unexecuted instantiation: digest.c:lrmd_event_type2str
Unexecuted instantiation: health.c:lrmd_event_type2str
Unexecuted instantiation: io.c:lrmd_event_type2str
Unexecuted instantiation: ipc_client.c:lrmd_event_type2str
Unexecuted instantiation: ipc_common.c:lrmd_event_type2str
Unexecuted instantiation: ipc_controld.c:lrmd_event_type2str
Unexecuted instantiation: ipc_pacemakerd.c:lrmd_event_type2str
Unexecuted instantiation: ipc_schedulerd.c:lrmd_event_type2str
Unexecuted instantiation: ipc_server.c:lrmd_event_type2str
Unexecuted instantiation: messages.c:lrmd_event_type2str
Unexecuted instantiation: nodes.c:lrmd_event_type2str
Unexecuted instantiation: nvpair.c:lrmd_event_type2str
Unexecuted instantiation: options_display.c:lrmd_event_type2str
Unexecuted instantiation: patchset.c:lrmd_event_type2str
Unexecuted instantiation: procfs.c:lrmd_event_type2str
Unexecuted instantiation: rules.c:lrmd_event_type2str
Unexecuted instantiation: servers.c:lrmd_event_type2str
Unexecuted instantiation: cib.c:lrmd_event_type2str
Unexecuted instantiation: ipc_attrd.c:lrmd_event_type2str
Unexecuted instantiation: pid.c:lrmd_event_type2str
Unexecuted instantiation: attrs.c:lrmd_event_type2str
Unexecuted instantiation: strings_fuzzer.c:lrmd_event_type2str
Unexecuted instantiation: cib_file_fuzzer.c:lrmd_event_type2str
Unexecuted instantiation: cib_client.c:lrmd_event_type2str
Unexecuted instantiation: cib_file.c:lrmd_event_type2str
Unexecuted instantiation: cib_native.c:lrmd_event_type2str
Unexecuted instantiation: cib_ops.c:lrmd_event_type2str
Unexecuted instantiation: cib_remote.c:lrmd_event_type2str
Unexecuted instantiation: cib_utils.c:lrmd_event_type2str
Unexecuted instantiation: remote.c:lrmd_event_type2str
Unexecuted instantiation: tls.c:lrmd_event_type2str
Unexecuted instantiation: watchdog.c:lrmd_event_type2str
519
520
#ifdef __cplusplus
521
}
522
#endif
523
524
#endif  // PCMK__CRM_LRMD__H