pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk_result_code.c
Go to the documentation of this file.
1/*
2 * Copyright 2022 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
12#include <crm/cib/internal.h>
13#include <crm/crm.h>
14
15#include <pacemaker.h>
16#include <pacemaker-internal.h>
17
18#include <inttypes.h> // PRIx32
19#include <stdint.h> // uint32_t
20
34int
36 enum pcmk_result_type type, uint32_t flags)
37{
38 int rc = pcmk_rc_ok;
39 bool quiet_orig = out->quiet;
40 const char *name = NULL;
41 const char *desc = NULL;
42
43 rc = pcmk_result_get_strings(code, type, &name, &desc);
44 if (rc != pcmk_rc_ok) {
45 out->err(out, "Error looking up result code %d", code);
46 return rc;
47 }
48
49 // out->quiet controls whether the code is shown (if quiet is supported)
51
52 out->message(out, "result-code", code,
54 pcmk_is_set(flags, pcmk_rc_disp_desc)? desc : NULL);
55 out->quiet = quiet_orig;
56
57 return rc;
58}
59
60// Documented in header
61int
62pcmk_show_result_code(xmlNodePtr *xml, int code, enum pcmk_result_type type,
63 uint32_t flags)
64{
65 pcmk__output_t *out = NULL;
66 int rc = pcmk_rc_ok;
67
68 rc = pcmk__xml_output_new(&out, xml);
69 if (rc != pcmk_rc_ok) {
70 return rc;
71 }
72
74
75 rc = pcmk__show_result_code(out, code, type, flags);
77 return rc;
78}
79
92int
94 uint32_t flags)
95{
96 int rc = pcmk_rc_ok;
97 int start = 0;
98 int end = 0;
99 int code = 0;
100
101 bool quiet_orig = out->quiet;
102 const char *name = NULL;
103 const char *desc = NULL;
104
105 rc = pcmk__result_bounds(type, &start, &end);
106 if (rc != pcmk_rc_ok) {
107 out->err(out,
108 "Failed to get result code bounds for result code type "
109 "%#010x" PRIx32, (uint32_t) type);
110 return rc;
111 }
112
113 code = start;
114 while (code <= end) {
115 int local_rc = pcmk_rc_ok;
116
117 if (code == (pcmk_rc_error + 1)) {
118 /* Values between pcmk_rc_error and pcmk_rc_ok are reserved for
119 * callers, so skip them
120 */
121 code = pcmk_rc_ok;
122 continue;
123 }
124
125 // Shouldn't affect the return code of the whole list operation
126 local_rc = pcmk_result_get_strings(code, type, &name, &desc);
127
128 if ((local_rc != pcmk_rc_ok) || (name == NULL)
129 || pcmk__str_any_of(name, "Unknown", "CRM_EX_UNKNOWN", NULL)) {
130
131 code++;
132 continue;
133 }
134
135 // out->quiet controls whether the code is shown (if quiet is supported)
137
138 out->message(out, "result-code", code,
140 pcmk_is_set(flags, pcmk_rc_disp_desc)? desc : NULL);
141 out->quiet = quiet_orig;
142
143 code++;
144 }
145
146 return rc;
147}
148
149// Documented in header
150int
152 uint32_t flags)
153{
154 pcmk__output_t *out = NULL;
155 int rc = pcmk_rc_ok;
156
157 rc = pcmk__xml_output_new(&out, xml);
158 if (rc != pcmk_rc_ok) {
159 return rc;
160 }
161
163
166 return rc;
167}
const char * name
Definition cib.c:26
uint64_t flags
Definition remote.c:3
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
Definition util.h:80
enum pcmk_ipc_server type
Definition cpg.c:3
A dumping ground.
void pcmk__xml_output_finish(pcmk__output_t *out, crm_exit_t exit_status, xmlNodePtr *xml)
Definition output.c:273
int pcmk__xml_output_new(pcmk__output_t **out, xmlNodePtr *xml)
Definition output.c:246
High Level API.
@ pcmk_rc_disp_code
Display result code number.
Definition pacemaker.h:331
@ pcmk_rc_disp_name
Display result code name.
Definition pacemaker.h:332
@ pcmk_rc_disp_desc
Display result code description.
Definition pacemaker.h:333
int pcmk__list_result_codes(pcmk__output_t *out, enum pcmk_result_type type, uint32_t flags)
int pcmk_list_result_codes(xmlNodePtr *xml, enum pcmk_result_type type, uint32_t flags)
List all valid result codes in a particular family.
int pcmk_show_result_code(xmlNodePtr *xml, int code, enum pcmk_result_type type, uint32_t flags)
Display the name and/or description of a result code.
int pcmk__show_result_code(pcmk__output_t *out, int code, enum pcmk_result_type type, uint32_t flags)
void pcmk__register_lib_messages(pcmk__output_t *out)
int pcmk_result_get_strings(int code, enum pcmk_result_type type, const char **name, const char **desc)
Get the name and description of a given result code.
Definition results.c:42
@ pcmk_rc_ok
Definition results.h:159
@ pcmk_rc_error
Definition results.h:154
pcmk_result_type
Types of Pacemaker result codes.
Definition results.h:341
crm_exit_t pcmk_rc2exitc(int rc)
Map a function return code to the most similar exit code.
Definition results.c:820
int pcmk__result_bounds(enum pcmk_result_type, int *lower, int *upper)
Definition results.c:92
bool pcmk__str_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
Definition strings.c:1053
This structure contains everything that makes up a single output formatter.
int(* message)(pcmk__output_t *out, const char *message_id,...)
int int void(* err)(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
bool quiet
Should this formatter supress most output?