/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 |