/src/pacemaker/include/crm/common/results_internal.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright 2020-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__INCLUDED_CRM_COMMON_INTERNAL_H |
11 | | #error "Include <crm/common/internal.h> instead of <results_internal.h> directly" |
12 | | #endif |
13 | | |
14 | | #ifndef PCMK__CRM_COMMON_RESULTS_INTERNAL__H |
15 | | #define PCMK__CRM_COMMON_RESULTS_INTERNAL__H |
16 | | |
17 | | #include <stdbool.h> |
18 | | |
19 | | #include <glib.h> // GQuark |
20 | | |
21 | | #include <crm/common/results.h> |
22 | | |
23 | | #ifdef __cplusplus |
24 | | extern "C" { |
25 | | #endif |
26 | | |
27 | | extern const size_t pcmk__n_rc; |
28 | | |
29 | | int pcmk__result_bounds(enum pcmk_result_type, int *lower, int *upper); |
30 | | |
31 | | _Noreturn void pcmk__abort_as(const char *file, const char *function, int line, |
32 | | const char *assert_condition); |
33 | | |
34 | 52.3k | #define pcmk__assert(expr) do { \ |
35 | 104k | if (!(expr)) { \ |
36 | 0 | pcmk__abort_as(__FILE__, __func__, __LINE__, #expr); \ |
37 | 0 | } \ |
38 | 52.3k | } while(0) |
39 | | |
40 | | /* Error domains for use with g_set_error */ |
41 | | |
42 | | GQuark pcmk__rc_error_quark(void); |
43 | | GQuark pcmk__exitc_error_quark(void); |
44 | | |
45 | | #define PCMK__RC_ERROR pcmk__rc_error_quark() |
46 | | #define PCMK__EXITC_ERROR pcmk__exitc_error_quark() |
47 | | |
48 | | /* Action results */ |
49 | | |
50 | | typedef struct { |
51 | | int exit_status; // Child exit status |
52 | | enum pcmk_exec_status execution_status; // Execution status |
53 | | char *exit_reason; // Brief, human-friendly explanation |
54 | | char *action_stdout; // Action output |
55 | | char *action_stderr; // Action error output |
56 | | } pcmk__action_result_t; |
57 | | |
58 | | /*! |
59 | | * \internal |
60 | | * \brief Static initialization for an action result |
61 | | * |
62 | | * \note Importantly, this ensures pcmk__reset_result() won't try to free |
63 | | * garbage. |
64 | | */ |
65 | | #define PCMK__UNKNOWN_RESULT { \ |
66 | | .exit_status = CRM_EX_OK, \ |
67 | | .execution_status = PCMK_EXEC_UNKNOWN, \ |
68 | | .exit_reason = NULL, \ |
69 | | .action_stdout = NULL, \ |
70 | | .action_stderr = NULL, \ |
71 | | } |
72 | | |
73 | | void pcmk__set_result(pcmk__action_result_t *result, int exit_status, |
74 | | enum pcmk_exec_status exec_status, |
75 | | const char *exit_reason); |
76 | | |
77 | | void pcmk__format_result(pcmk__action_result_t *result, int exit_status, |
78 | | enum pcmk_exec_status exec_status, |
79 | | const char *format, ...) G_GNUC_PRINTF(4, 5); |
80 | | |
81 | | void pcmk__reset_result(pcmk__action_result_t *result); |
82 | | |
83 | | void pcmk__copy_result(const pcmk__action_result_t *src, |
84 | | pcmk__action_result_t *dst); |
85 | | |
86 | | int pcmk__gaierror2rc(int gai); |
87 | | int pcmk__bzlib2rc(int bz2); |
88 | | int pcmk__corosync2rc(int cs); |
89 | | |
90 | | /*! |
91 | | * \internal |
92 | | * \brief Check whether a result is OK |
93 | | * |
94 | | * \param[in] result |
95 | | * |
96 | | * \return true if the result's exit status is CRM_EX_OK and its |
97 | | * execution status is PCMK_EXEC_DONE, otherwise false |
98 | | */ |
99 | | static inline bool |
100 | | pcmk__result_ok(const pcmk__action_result_t *result) |
101 | 0 | { |
102 | 0 | return (result != NULL) && (result->exit_status == CRM_EX_OK) |
103 | 0 | && (result->execution_status == PCMK_EXEC_DONE); |
104 | 0 | } Unexecuted instantiation: scores_fuzzer.c:pcmk__result_ok Unexecuted instantiation: results.c:pcmk__result_ok Unexecuted instantiation: scores.c:pcmk__result_ok Unexecuted instantiation: strings.c:pcmk__result_ok Unexecuted instantiation: utils.c:pcmk__result_ok Unexecuted instantiation: iso8601.c:pcmk__result_ok Unexecuted instantiation: logging.c:pcmk__result_ok Unexecuted instantiation: mainloop.c:pcmk__result_ok Unexecuted instantiation: options.c:pcmk__result_ok Unexecuted instantiation: output.c:pcmk__result_ok Unexecuted instantiation: output_log.c:pcmk__result_ok Unexecuted instantiation: output_text.c:pcmk__result_ok Unexecuted instantiation: output_xml.c:pcmk__result_ok Unexecuted instantiation: patchset_display.c:pcmk__result_ok Unexecuted instantiation: schemas.c:pcmk__result_ok Unexecuted instantiation: xml.c:pcmk__result_ok Unexecuted instantiation: xml_display.c:pcmk__result_ok Unexecuted instantiation: xml_element.c:pcmk__result_ok Unexecuted instantiation: xml_idref.c:pcmk__result_ok Unexecuted instantiation: xml_io.c:pcmk__result_ok Unexecuted instantiation: xml_tracking.c:pcmk__result_ok Unexecuted instantiation: xpath.c:pcmk__result_ok Unexecuted instantiation: acl.c:pcmk__result_ok Unexecuted instantiation: actions.c:pcmk__result_ok Unexecuted instantiation: agents.c:pcmk__result_ok Unexecuted instantiation: cmdline.c:pcmk__result_ok Unexecuted instantiation: digest.c:pcmk__result_ok Unexecuted instantiation: health.c:pcmk__result_ok Unexecuted instantiation: io.c:pcmk__result_ok Unexecuted instantiation: ipc_client.c:pcmk__result_ok Unexecuted instantiation: ipc_common.c:pcmk__result_ok Unexecuted instantiation: ipc_controld.c:pcmk__result_ok Unexecuted instantiation: ipc_pacemakerd.c:pcmk__result_ok Unexecuted instantiation: ipc_schedulerd.c:pcmk__result_ok Unexecuted instantiation: ipc_server.c:pcmk__result_ok Unexecuted instantiation: messages.c:pcmk__result_ok Unexecuted instantiation: nodes.c:pcmk__result_ok Unexecuted instantiation: nvpair.c:pcmk__result_ok Unexecuted instantiation: options_display.c:pcmk__result_ok Unexecuted instantiation: patchset.c:pcmk__result_ok Unexecuted instantiation: procfs.c:pcmk__result_ok Unexecuted instantiation: rules.c:pcmk__result_ok Unexecuted instantiation: servers.c:pcmk__result_ok Unexecuted instantiation: xml_attr.c:pcmk__result_ok Unexecuted instantiation: xml_comment.c:pcmk__result_ok Unexecuted instantiation: cib.c:pcmk__result_ok Unexecuted instantiation: ipc_attrd.c:pcmk__result_ok Unexecuted instantiation: pid.c:pcmk__result_ok Unexecuted instantiation: attrs.c:pcmk__result_ok Unexecuted instantiation: strings_fuzzer.c:pcmk__result_ok Unexecuted instantiation: cib_file_fuzzer.c:pcmk__result_ok Unexecuted instantiation: cib_client.c:pcmk__result_ok Unexecuted instantiation: cib_file.c:pcmk__result_ok Unexecuted instantiation: cib_native.c:pcmk__result_ok Unexecuted instantiation: cib_ops.c:pcmk__result_ok Unexecuted instantiation: cib_remote.c:pcmk__result_ok Unexecuted instantiation: cib_utils.c:pcmk__result_ok Unexecuted instantiation: remote.c:pcmk__result_ok Unexecuted instantiation: tls.c:pcmk__result_ok Unexecuted instantiation: watchdog.c:pcmk__result_ok Unexecuted instantiation: iso8601_fuzzer.c:pcmk__result_ok |
105 | | |
106 | | #ifdef __cplusplus |
107 | | } |
108 | | #endif |
109 | | |
110 | | #endif // PCMK__COMMON_RESULTS_INTERNAL__H |