pacemaker 2.1.4-dc6eb4362e
Scalable High-Availability cluster resource manager
results.c
Go to the documentation of this file.
1/*
2 * Copyright 2004-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#ifndef _GNU_SOURCE
13# define _GNU_SOURCE
14#endif
15
16#include <bzlib.h>
17#include <errno.h>
18#include <stdlib.h>
19#include <string.h>
20#include <qb/qbdefs.h>
21
22#include <crm/common/mainloop.h>
23#include <crm/common/xml.h>
24
25G_DEFINE_QUARK(pcmk-rc-error-quark, pcmk__rc_error)
26G_DEFINE_QUARK(pcmk-exitc-error-quark, pcmk__exitc_error)
27
28// @COMPAT Legacy function return codes
29
30
31const char *
33{
34 rc = abs(rc);
35 switch (rc) {
36 case pcmk_err_generic: return "pcmk_err_generic";
37 case pcmk_err_no_quorum: return "pcmk_err_no_quorum";
38 case pcmk_err_schema_validation: return "pcmk_err_schema_validation";
39 case pcmk_err_transform_failed: return "pcmk_err_transform_failed";
40 case pcmk_err_old_data: return "pcmk_err_old_data";
41 case pcmk_err_diff_failed: return "pcmk_err_diff_failed";
42 case pcmk_err_diff_resync: return "pcmk_err_diff_resync";
43 case pcmk_err_cib_modified: return "pcmk_err_cib_modified";
44 case pcmk_err_cib_backup: return "pcmk_err_cib_backup";
45 case pcmk_err_cib_save: return "pcmk_err_cib_save";
46 case pcmk_err_cib_corrupt: return "pcmk_err_cib_corrupt";
47 case pcmk_err_multiple: return "pcmk_err_multiple";
48 case pcmk_err_node_unknown: return "pcmk_err_node_unknown";
49 case pcmk_err_already: return "pcmk_err_already";
50 case pcmk_err_bad_nvpair: return "pcmk_err_bad_nvpair";
51 case pcmk_err_unknown_format: return "pcmk_err_unknown_format";
52 default: return pcmk_rc_name(rc); // system errno
53 }
54}
55
57const char *
59{
60 return pcmk_rc_str(pcmk_legacy2rc(rc));
61}
62
63// Standard Pacemaker API return codes
64
65/* This array is used only for nonzero values of pcmk_rc_e. Its values must be
66 * kept in the exact reverse order of the enum value numbering (i.e. add new
67 * values to the end of the array).
68 */
69static struct pcmk__rc_info {
70 const char *name;
71 const char *desc;
72 int legacy_rc;
73} pcmk__rcs[] = {
74 { "pcmk_rc_error",
75 "Error",
77 },
78 { "pcmk_rc_unknown_format",
79 "Unknown output format",
81 },
82 { "pcmk_rc_bad_nvpair",
83 "Bad name/value pair given",
85 },
86 { "pcmk_rc_already",
87 "Already in requested state",
89 },
90 { "pcmk_rc_node_unknown",
91 "Node not found",
93 },
94 { "pcmk_rc_multiple",
95 "Resource active on multiple nodes",
97 },
98 { "pcmk_rc_cib_corrupt",
99 "Could not parse on-disk configuration",
101 },
102 { "pcmk_rc_cib_save",
103 "Could not save new configuration to disk",
105 },
106 { "pcmk_rc_cib_backup",
107 "Could not archive previous configuration",
109 },
110 { "pcmk_rc_cib_modified",
111 "On-disk configuration was manually modified",
113 },
114 { "pcmk_rc_diff_resync",
115 "Application of update diff failed, requesting full refresh",
117 },
118 { "pcmk_rc_diff_failed",
119 "Application of update diff failed",
121 },
122 { "pcmk_rc_old_data",
123 "Update was older than existing configuration",
125 },
126 { "pcmk_rc_transform_failed",
127 "Schema transform failed",
129 },
130 { "pcmk_rc_schema_unchanged",
131 "Schema is already the latest available",
133 },
134 { "pcmk_rc_schema_validation",
135 "Update does not conform to the configured schema",
137 },
138 { "pcmk_rc_no_quorum",
139 "Operation requires quorum",
141 },
142 { "pcmk_rc_ipc_pid_only",
143 "IPC server process is active but not accepting connections",
145 },
146 { "pcmk_rc_ipc_unresponsive",
147 "IPC server is unresponsive",
149 },
150 { "pcmk_rc_ipc_unauthorized",
151 "IPC server is blocked by unauthorized process",
153 },
154 { "pcmk_rc_op_unsatisifed",
155 "Not applicable under current conditions",
157 },
158 { "pcmk_rc_undetermined",
159 "Result undetermined",
161 },
162 { "pcmk_rc_before_range",
163 "Result occurs before given range",
165 },
166 { "pcmk_rc_within_range",
167 "Result occurs within given range",
169 },
170 { "pcmk_rc_after_range",
171 "Result occurs after given range",
173 },
174 { "pcmk_rc_no_output",
175 "Output message produced no output",
177 },
178 { "pcmk_rc_no_input",
179 "Input file not available",
181 },
182 { "pcmk_rc_underflow",
183 "Value too small to be stored in data type",
185 },
186 { "pcmk_rc_dot_error",
187 "Error writing dot(1) file",
189 },
190 { "pcmk_rc_graph_error",
191 "Error writing graph file",
193 },
194 { "pcmk_rc_invalid_transition",
195 "Cluster simulation produced invalid transition",
197 },
198};
199
200#define PCMK__N_RC (sizeof(pcmk__rcs) / sizeof(struct pcmk__rc_info))
201
209const char *
211{
212 if ((rc <= pcmk_rc_error) && ((pcmk_rc_error - rc) < PCMK__N_RC)) {
213 return pcmk__rcs[pcmk_rc_error - rc].name;
214 }
215 switch (rc) {
216 case pcmk_rc_ok: return "pcmk_rc_ok";
217 case E2BIG: return "E2BIG";
218 case EACCES: return "EACCES";
219 case EADDRINUSE: return "EADDRINUSE";
220 case EADDRNOTAVAIL: return "EADDRNOTAVAIL";
221 case EAFNOSUPPORT: return "EAFNOSUPPORT";
222 case EAGAIN: return "EAGAIN";
223 case EALREADY: return "EALREADY";
224 case EBADF: return "EBADF";
225 case EBADMSG: return "EBADMSG";
226 case EBUSY: return "EBUSY";
227 case ECANCELED: return "ECANCELED";
228 case ECHILD: return "ECHILD";
229 case ECOMM: return "ECOMM";
230 case ECONNABORTED: return "ECONNABORTED";
231 case ECONNREFUSED: return "ECONNREFUSED";
232 case ECONNRESET: return "ECONNRESET";
233 /* case EDEADLK: return "EDEADLK"; */
234 case EDESTADDRREQ: return "EDESTADDRREQ";
235 case EDOM: return "EDOM";
236 case EDQUOT: return "EDQUOT";
237 case EEXIST: return "EEXIST";
238 case EFAULT: return "EFAULT";
239 case EFBIG: return "EFBIG";
240 case EHOSTDOWN: return "EHOSTDOWN";
241 case EHOSTUNREACH: return "EHOSTUNREACH";
242 case EIDRM: return "EIDRM";
243 case EILSEQ: return "EILSEQ";
244 case EINPROGRESS: return "EINPROGRESS";
245 case EINTR: return "EINTR";
246 case EINVAL: return "EINVAL";
247 case EIO: return "EIO";
248 case EISCONN: return "EISCONN";
249 case EISDIR: return "EISDIR";
250 case ELIBACC: return "ELIBACC";
251 case ELOOP: return "ELOOP";
252 case EMFILE: return "EMFILE";
253 case EMLINK: return "EMLINK";
254 case EMSGSIZE: return "EMSGSIZE";
255#ifdef EMULTIHOP // Not available on OpenBSD
256 case EMULTIHOP: return "EMULTIHOP";
257#endif
258 case ENAMETOOLONG: return "ENAMETOOLONG";
259 case ENETDOWN: return "ENETDOWN";
260 case ENETRESET: return "ENETRESET";
261 case ENETUNREACH: return "ENETUNREACH";
262 case ENFILE: return "ENFILE";
263 case ENOBUFS: return "ENOBUFS";
264 case ENODATA: return "ENODATA";
265 case ENODEV: return "ENODEV";
266 case ENOENT: return "ENOENT";
267 case ENOEXEC: return "ENOEXEC";
268 case ENOKEY: return "ENOKEY";
269 case ENOLCK: return "ENOLCK";
270#ifdef ENOLINK // Not available on OpenBSD
271 case ENOLINK: return "ENOLINK";
272#endif
273 case ENOMEM: return "ENOMEM";
274 case ENOMSG: return "ENOMSG";
275 case ENOPROTOOPT: return "ENOPROTOOPT";
276 case ENOSPC: return "ENOSPC";
277#ifdef ENOSR
278 case ENOSR: return "ENOSR";
279#endif
280#ifdef ENOSTR
281 case ENOSTR: return "ENOSTR";
282#endif
283 case ENOSYS: return "ENOSYS";
284 case ENOTBLK: return "ENOTBLK";
285 case ENOTCONN: return "ENOTCONN";
286 case ENOTDIR: return "ENOTDIR";
287 case ENOTEMPTY: return "ENOTEMPTY";
288 case ENOTSOCK: return "ENOTSOCK";
289#if ENOTSUP != EOPNOTSUPP
290 case ENOTSUP: return "ENOTSUP";
291#endif
292 case ENOTTY: return "ENOTTY";
293 case ENOTUNIQ: return "ENOTUNIQ";
294 case ENXIO: return "ENXIO";
295 case EOPNOTSUPP: return "EOPNOTSUPP";
296 case EOVERFLOW: return "EOVERFLOW";
297 case EPERM: return "EPERM";
298 case EPFNOSUPPORT: return "EPFNOSUPPORT";
299 case EPIPE: return "EPIPE";
300 case EPROTO: return "EPROTO";
301 case EPROTONOSUPPORT: return "EPROTONOSUPPORT";
302 case EPROTOTYPE: return "EPROTOTYPE";
303 case ERANGE: return "ERANGE";
304 case EREMOTE: return "EREMOTE";
305 case EREMOTEIO: return "EREMOTEIO";
306 case EROFS: return "EROFS";
307 case ESHUTDOWN: return "ESHUTDOWN";
308 case ESPIPE: return "ESPIPE";
309 case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
310 case ESRCH: return "ESRCH";
311 case ESTALE: return "ESTALE";
312 case ETIME: return "ETIME";
313 case ETIMEDOUT: return "ETIMEDOUT";
314 case ETXTBSY: return "ETXTBSY";
315#ifdef EUNATCH
316 case EUNATCH: return "EUNATCH";
317#endif
318 case EUSERS: return "EUSERS";
319 /* case EWOULDBLOCK: return "EWOULDBLOCK"; */
320 case EXDEV: return "EXDEV";
321
322#ifdef EBADE // Not available on OS X
323 case EBADE: return "EBADE";
324 case EBADFD: return "EBADFD";
325 case EBADSLT: return "EBADSLT";
326 case EDEADLOCK: return "EDEADLOCK";
327 case EBADR: return "EBADR";
328 case EBADRQC: return "EBADRQC";
329 case ECHRNG: return "ECHRNG";
330#ifdef EISNAM // Not available on OS X, Illumos, Solaris
331 case EISNAM: return "EISNAM";
332 case EKEYEXPIRED: return "EKEYEXPIRED";
333 case EKEYREVOKED: return "EKEYREVOKED";
334#endif
335 case EKEYREJECTED: return "EKEYREJECTED";
336 case EL2HLT: return "EL2HLT";
337 case EL2NSYNC: return "EL2NSYNC";
338 case EL3HLT: return "EL3HLT";
339 case EL3RST: return "EL3RST";
340 case ELIBBAD: return "ELIBBAD";
341 case ELIBMAX: return "ELIBMAX";
342 case ELIBSCN: return "ELIBSCN";
343 case ELIBEXEC: return "ELIBEXEC";
344#ifdef ENOMEDIUM // Not available on OS X, Illumos, Solaris
345 case ENOMEDIUM: return "ENOMEDIUM";
346 case EMEDIUMTYPE: return "EMEDIUMTYPE";
347#endif
348 case ENONET: return "ENONET";
349 case ENOPKG: return "ENOPKG";
350 case EREMCHG: return "EREMCHG";
351 case ERESTART: return "ERESTART";
352 case ESTRPIPE: return "ESTRPIPE";
353#ifdef EUCLEAN // Not available on OS X, Illumos, Solaris
354 case EUCLEAN: return "EUCLEAN";
355#endif
356 case EXFULL: return "EXFULL";
357#endif // EBADE
358 default: return "Unknown";
359 }
360}
361
369const char *
371{
372 if (rc == pcmk_rc_ok) {
373 return "OK";
374 }
375 if ((rc <= pcmk_rc_error) && ((pcmk_rc_error - rc) < PCMK__N_RC)) {
376 return pcmk__rcs[pcmk_rc_error - rc].desc;
377 }
378 if (rc < 0) {
379 return "Error";
380 }
381
382 // Handle values that could be defined by system or by portability.h
383 switch (rc) {
384#ifdef PCMK__ENOTUNIQ
385 case ENOTUNIQ: return "Name not unique on network";
386#endif
387#ifdef PCMK__ECOMM
388 case ECOMM: return "Communication error on send";
389#endif
390#ifdef PCMK__ELIBACC
391 case ELIBACC: return "Can not access a needed shared library";
392#endif
393#ifdef PCMK__EREMOTEIO
394 case EREMOTEIO: return "Remote I/O error";
395#endif
396#ifdef PCMK__ENOKEY
397 case ENOKEY: return "Required key not available";
398#endif
399#ifdef PCMK__ENODATA
400 case ENODATA: return "No data available";
401#endif
402#ifdef PCMK__ETIME
403 case ETIME: return "Timer expired";
404#endif
405#ifdef PCMK__EKEYREJECTED
406 case EKEYREJECTED: return "Key was rejected by service";
407#endif
408 default: return strerror(rc);
409 }
410}
411
412// This returns negative values for errors
414int
416{
417 if (rc >= 0) {
418 return -rc; // OK or system errno
419 }
420 if ((rc <= pcmk_rc_error) && ((pcmk_rc_error - rc) < PCMK__N_RC)) {
421 return pcmk__rcs[pcmk_rc_error - rc].legacy_rc;
422 }
423 return -pcmk_err_generic;
424}
425
427int
428pcmk_legacy2rc(int legacy_rc)
429{
430 legacy_rc = abs(legacy_rc);
431 switch (legacy_rc) {
448 case pcmk_err_generic: return pcmk_rc_error;
449 case pcmk_ok: return pcmk_rc_ok;
450 default: return legacy_rc; // system errno
451 }
452}
453
454// Exit status codes
455
456const char *
458{
459 switch (exit_code) {
460 case CRM_EX_OK: return "CRM_EX_OK";
461 case CRM_EX_ERROR: return "CRM_EX_ERROR";
462 case CRM_EX_INVALID_PARAM: return "CRM_EX_INVALID_PARAM";
463 case CRM_EX_UNIMPLEMENT_FEATURE: return "CRM_EX_UNIMPLEMENT_FEATURE";
464 case CRM_EX_INSUFFICIENT_PRIV: return "CRM_EX_INSUFFICIENT_PRIV";
465 case CRM_EX_NOT_INSTALLED: return "CRM_EX_NOT_INSTALLED";
466 case CRM_EX_NOT_CONFIGURED: return "CRM_EX_NOT_CONFIGURED";
467 case CRM_EX_NOT_RUNNING: return "CRM_EX_NOT_RUNNING";
468 case CRM_EX_USAGE: return "CRM_EX_USAGE";
469 case CRM_EX_DATAERR: return "CRM_EX_DATAERR";
470 case CRM_EX_NOINPUT: return "CRM_EX_NOINPUT";
471 case CRM_EX_NOUSER: return "CRM_EX_NOUSER";
472 case CRM_EX_NOHOST: return "CRM_EX_NOHOST";
473 case CRM_EX_UNAVAILABLE: return "CRM_EX_UNAVAILABLE";
474 case CRM_EX_SOFTWARE: return "CRM_EX_SOFTWARE";
475 case CRM_EX_OSERR: return "CRM_EX_OSERR";
476 case CRM_EX_OSFILE: return "CRM_EX_OSFILE";
477 case CRM_EX_CANTCREAT: return "CRM_EX_CANTCREAT";
478 case CRM_EX_IOERR: return "CRM_EX_IOERR";
479 case CRM_EX_TEMPFAIL: return "CRM_EX_TEMPFAIL";
480 case CRM_EX_PROTOCOL: return "CRM_EX_PROTOCOL";
481 case CRM_EX_NOPERM: return "CRM_EX_NOPERM";
482 case CRM_EX_CONFIG: return "CRM_EX_CONFIG";
483 case CRM_EX_FATAL: return "CRM_EX_FATAL";
484 case CRM_EX_PANIC: return "CRM_EX_PANIC";
485 case CRM_EX_DISCONNECT: return "CRM_EX_DISCONNECT";
486 case CRM_EX_DIGEST: return "CRM_EX_DIGEST";
487 case CRM_EX_NOSUCH: return "CRM_EX_NOSUCH";
488 case CRM_EX_QUORUM: return "CRM_EX_QUORUM";
489 case CRM_EX_UNSAFE: return "CRM_EX_UNSAFE";
490 case CRM_EX_EXISTS: return "CRM_EX_EXISTS";
491 case CRM_EX_MULTIPLE: return "CRM_EX_MULTIPLE";
492 case CRM_EX_EXPIRED: return "CRM_EX_EXPIRED";
493 case CRM_EX_NOT_YET_IN_EFFECT: return "CRM_EX_NOT_YET_IN_EFFECT";
494 case CRM_EX_INDETERMINATE: return "CRM_EX_INDETERMINATE";
495 case CRM_EX_UNSATISFIED: return "CRM_EX_UNSATISFIED";
496 case CRM_EX_OLD: return "CRM_EX_OLD";
497 case CRM_EX_TIMEOUT: return "CRM_EX_TIMEOUT";
498 case CRM_EX_DEGRADED: return "CRM_EX_DEGRADED";
499 case CRM_EX_DEGRADED_PROMOTED: return "CRM_EX_DEGRADED_PROMOTED";
500 case CRM_EX_MAX: return "CRM_EX_UNKNOWN";
501 }
502 return "CRM_EX_UNKNOWN";
503}
504
505const char *
507{
508 switch (exit_code) {
509 case CRM_EX_OK: return "OK";
510 case CRM_EX_ERROR: return "Error occurred";
511 case CRM_EX_INVALID_PARAM: return "Invalid parameter";
512 case CRM_EX_UNIMPLEMENT_FEATURE: return "Unimplemented";
513 case CRM_EX_INSUFFICIENT_PRIV: return "Insufficient privileges";
514 case CRM_EX_NOT_INSTALLED: return "Not installed";
515 case CRM_EX_NOT_CONFIGURED: return "Not configured";
516 case CRM_EX_NOT_RUNNING: return "Not running";
517 case CRM_EX_USAGE: return "Incorrect usage";
518 case CRM_EX_DATAERR: return "Invalid data given";
519 case CRM_EX_NOINPUT: return "Input file not available";
520 case CRM_EX_NOUSER: return "User does not exist";
521 case CRM_EX_NOHOST: return "Host does not exist";
522 case CRM_EX_UNAVAILABLE: return "Necessary service unavailable";
523 case CRM_EX_SOFTWARE: return "Internal software bug";
524 case CRM_EX_OSERR: return "Operating system error occurred";
525 case CRM_EX_OSFILE: return "System file not available";
526 case CRM_EX_CANTCREAT: return "Cannot create output file";
527 case CRM_EX_IOERR: return "I/O error occurred";
528 case CRM_EX_TEMPFAIL: return "Temporary failure, try again";
529 case CRM_EX_PROTOCOL: return "Protocol violated";
530 case CRM_EX_NOPERM: return "Insufficient privileges";
531 case CRM_EX_CONFIG: return "Invalid configuration";
532 case CRM_EX_FATAL: return "Fatal error occurred, will not respawn";
533 case CRM_EX_PANIC: return "System panic required";
534 case CRM_EX_DISCONNECT: return "Not connected";
535 case CRM_EX_DIGEST: return "Digest mismatch";
536 case CRM_EX_NOSUCH: return "No such object";
537 case CRM_EX_QUORUM: return "Quorum required";
538 case CRM_EX_UNSAFE: return "Operation not safe";
539 case CRM_EX_EXISTS: return "Requested item already exists";
540 case CRM_EX_MULTIPLE: return "Multiple items match request";
541 case CRM_EX_EXPIRED: return "Requested item has expired";
542 case CRM_EX_NOT_YET_IN_EFFECT: return "Requested item is not yet in effect";
543 case CRM_EX_INDETERMINATE: return "Could not determine status";
544 case CRM_EX_UNSATISFIED: return "Not applicable under current conditions";
545 case CRM_EX_OLD: return "Update was older than existing configuration";
546 case CRM_EX_TIMEOUT: return "Timeout occurred";
547 case CRM_EX_DEGRADED: return "Service is active but might fail soon";
548 case CRM_EX_DEGRADED_PROMOTED: return "Service is promoted but might fail soon";
549 case CRM_EX_MAX: return "Error occurred";
550 }
551 if ((exit_code > 128) && (exit_code < CRM_EX_MAX)) {
552 return "Interrupted by signal";
553 }
554 return "Unknown exit status";
555}
556
560{
561 rc = abs(rc); // Convenience for functions that return -errno
562 switch (rc) {
563 case pcmk_ok:
564 return CRM_EX_OK;
565
567 return CRM_EX_QUORUM;
568
570 return CRM_EX_OLD;
571
574 return CRM_EX_CONFIG;
575
578
579 case pcmk_err_already:
580 return CRM_EX_EXISTS;
581
583 return CRM_EX_MULTIPLE;
584
587 return CRM_EX_NOSUCH;
588
589 default:
590 return pcmk_rc2exitc(rc); // system errno
591 }
592}
593
603{
604 switch (rc) {
605 case pcmk_rc_ok:
606 return CRM_EX_OK;
607
609 return CRM_EX_QUORUM;
610
611 case pcmk_rc_old_data:
612 return CRM_EX_OLD;
613
616 return CRM_EX_CONFIG;
617
620
621 case EACCES:
623
624 case EBADF:
625 case EINVAL:
626 case EFAULT:
627 case ENOSYS:
628 case EOVERFLOW:
630 return CRM_EX_SOFTWARE;
631
632 case EBADMSG:
633 case EMSGSIZE:
634 case ENOMSG:
635 case ENOPROTOOPT:
636 case EPROTO:
637 case EPROTONOSUPPORT:
638 case EPROTOTYPE:
639 return CRM_EX_PROTOCOL;
640
641 case ECOMM:
642 case ENOMEM:
643 return CRM_EX_OSERR;
644
645 case ECONNABORTED:
646 case ECONNREFUSED:
647 case ECONNRESET:
648 case ENOTCONN:
649 return CRM_EX_DISCONNECT;
650
651 case EEXIST:
652 case pcmk_rc_already:
653 return CRM_EX_EXISTS;
654
655 case EIO:
659 return CRM_EX_IOERR;
660
661 case ENOTSUP:
662#if EOPNOTSUPP != ENOTSUP
663 case EOPNOTSUPP:
664#endif
666
667 case ENOTUNIQ:
668 case pcmk_rc_multiple:
669 return CRM_EX_MULTIPLE;
670
671 case ENXIO:
674 return CRM_EX_NOSUCH;
675
676 case ETIME:
677 case ETIMEDOUT:
678 return CRM_EX_TIMEOUT;
679
680 case EAGAIN:
681 case EBUSY:
682 return CRM_EX_UNSATISFIED;
683
686
688 return CRM_EX_EXPIRED;
689
692
694 return CRM_EX_UNSATISFIED;
695
697 return CRM_EX_OK;
698
699 case pcmk_rc_no_input:
700 return CRM_EX_NOINPUT;
701
702 default:
703 return CRM_EX_ERROR;
704 }
705}
706
714enum ocf_exitcode
716{
717 switch (rc) {
718 case pcmk_rc_ok:
719 return PCMK_OCF_OK;
720
723
724 case EACCES:
726
727 case ENOTSUP:
728#if EOPNOTSUPP != ENOTSUP
729 case EOPNOTSUPP:
730#endif
732
733 default:
735 }
736}
737
738
739// Other functions
740
741const char *
743{
744 // See ftp://sources.redhat.com/pub/bzip2/docs/manual_3.html#SEC17
745 switch (rc) {
746 case BZ_OK:
747 case BZ_RUN_OK:
748 case BZ_FLUSH_OK:
749 case BZ_FINISH_OK:
750 case BZ_STREAM_END:
751 return "Ok";
752 case BZ_CONFIG_ERROR:
753 return "libbz2 has been improperly compiled on your platform";
754 case BZ_SEQUENCE_ERROR:
755 return "library functions called in the wrong order";
756 case BZ_PARAM_ERROR:
757 return "parameter is out of range or otherwise incorrect";
758 case BZ_MEM_ERROR:
759 return "memory allocation failed";
760 case BZ_DATA_ERROR:
761 return "data integrity error is detected during decompression";
762 case BZ_DATA_ERROR_MAGIC:
763 return "the compressed stream does not start with the correct magic bytes";
764 case BZ_IO_ERROR:
765 return "error reading or writing in the compressed file";
766 case BZ_UNEXPECTED_EOF:
767 return "compressed file finishes before the logical end of stream is detected";
768 case BZ_OUTBUFF_FULL:
769 return "output data will not fit into the buffer provided";
770 }
771 return "Data compression error";
772}
773
776{
777 /* A compiler could theoretically use any type for crm_exit_t, but an int
778 * should always hold it, so cast to int to keep static analysis happy.
779 */
780 if ((((int) rc) < 0) || (((int) rc) > CRM_EX_MAX)) {
781 rc = CRM_EX_ERROR;
782 }
783
786
788
789 if (crm_system_name) {
790 crm_info("Exiting %s " CRM_XS " with status %d", crm_system_name, rc);
791 free(crm_system_name);
792 } else {
793 crm_trace("Exiting with status %d", rc);
794 }
795 qb_log_fini(); // Don't log anything after this point
796
797 exit(rc);
798}
799
800/*
801 * External action results
802 */
803
813void
815 enum pcmk_exec_status exec_status, const char *exit_reason)
816{
817 if (result == NULL) {
818 return;
819 }
820
821 result->exit_status = exit_status;
822 result->execution_status = exec_status;
823
824 if (!pcmk__str_eq(result->exit_reason, exit_reason, pcmk__str_none)) {
825 free(result->exit_reason);
826 result->exit_reason = (exit_reason == NULL)? NULL : strdup(exit_reason);
827 }
828}
829
830
842G_GNUC_PRINTF(4, 5)
843void
845 enum pcmk_exec_status exec_status,
846 const char *format, ...)
847{
848 va_list ap;
849 int len = 0;
850 char *reason = NULL;
851
852 if (result == NULL) {
853 return;
854 }
855
856 result->exit_status = exit_status;
857 result->execution_status = exec_status;
858
859 if (format != NULL) {
860 va_start(ap, format);
861 len = vasprintf(&reason, format, ap);
862 CRM_ASSERT(len > 0);
863 va_end(ap);
864 }
865 free(result->exit_reason);
866 result->exit_reason = reason;
867}
868
882void
884{
885 if (result == NULL) {
886 return;
887 }
888
889 free(result->action_stdout);
890 result->action_stdout = out;
891
892 free(result->action_stderr);
893 result->action_stderr = err;
894}
895
902void
904{
905 if (result == NULL) {
906 return;
907 }
908
909 free(result->exit_reason);
910 result->exit_reason = NULL;
911
912 free(result->action_stdout);
913 result->action_stdout = NULL;
914
915 free(result->action_stderr);
916 result->action_stderr = NULL;
917}
918
926void
928{
929 CRM_CHECK((src != NULL) && (dst != NULL), return);
930 dst->exit_status = src->exit_status;
935}
const char * name
Definition: cib.c:24
char * crm_system_name
Definition: utils.c:54
#define crm_info(fmt, args...)
Definition: logging.h:361
#define CRM_XS
Definition: logging.h:55
#define CRM_CHECK(expr, failure_action)
Definition: logging.h:226
#define crm_trace(fmt, args...)
Definition: logging.h:364
Wrappers for and extensions to glib mainloop.
void mainloop_cleanup(void)
Definition: mainloop.c:429
void pcmk__cli_option_cleanup(void)
Definition: options.c:39
pcmk__action_result_t result
Definition: pcmk_fence.c:34
#define ENODATA
Definition: portability.h:145
#define ENOKEY
Definition: portability.h:140
#define ELIBACC
Definition: portability.h:130
char * strerror(int errnum)
#define EREMOTEIO
Definition: portability.h:135
#define ETIME
Definition: portability.h:150
#define ECOMM
Definition: portability.h:125
#define EKEYREJECTED
Definition: portability.h:155
#define ENOTUNIQ
Definition: portability.h:120
const char * pcmk_rc_name(int rc)
Get a return code constant name as a string.
Definition: results.c:210
const char * bz2_strerror(int rc)
Definition: results.c:742
const char * pcmk_strerror(int rc)
Definition: results.c:58
void pcmk__set_result(pcmk__action_result_t *result, int exit_status, enum pcmk_exec_status exec_status, const char *exit_reason)
Definition: results.c:814
const char * pcmk_rc_str(int rc)
Get a user-friendly description of a return code.
Definition: results.c:370
enum ocf_exitcode pcmk_rc2ocf(int rc)
Map a function return code to the most similar OCF exit code.
Definition: results.c:715
crm_exit_t crm_errno2exit(int rc)
Definition: results.c:559
void pcmk__format_result(pcmk__action_result_t *result, int exit_status, enum pcmk_exec_status exec_status, const char *format,...)
Definition: results.c:844
const char * crm_exit_name(crm_exit_t exit_code)
Definition: results.c:457
#define PCMK__N_RC
Definition: results.c:200
int pcmk_rc2legacy(int rc)
Definition: results.c:415
const char * pcmk_errorname(int rc)
Definition: results.c:32
const char * crm_exit_str(crm_exit_t exit_code)
Definition: results.c:506
void pcmk__reset_result(pcmk__action_result_t *result)
Definition: results.c:903
int pcmk_legacy2rc(int legacy_rc)
Definition: results.c:428
crm_exit_t crm_exit(crm_exit_t rc)
Definition: results.c:775
void pcmk__set_result_output(pcmk__action_result_t *result, char *out, char *err)
Definition: results.c:883
crm_exit_t pcmk_rc2exitc(int rc)
Map a function return code to the most similar exit code.
Definition: results.c:602
void pcmk__copy_result(pcmk__action_result_t *src, pcmk__action_result_t *dst)
Definition: results.c:927
#define pcmk_err_cib_corrupt
Definition: results.h:82
#define pcmk_err_old_data
Definition: results.h:75
#define pcmk_err_node_unknown
Definition: results.h:84
#define pcmk_err_unknown_format
Definition: results.h:92
#define pcmk_err_generic
Definition: results.h:71
#define CRM_ASSERT(expr)
Definition: results.h:42
#define pcmk_err_cib_modified
Definition: results.h:78
#define pcmk_err_schema_unchanged
Definition: results.h:81
@ CRM_EX_IOERR
File I/O error.
Definition: results.h:261
@ CRM_EX_PANIC
Panic the local host.
Definition: results.h:269
@ CRM_EX_PROTOCOL
Protocol violated.
Definition: results.h:263
@ CRM_EX_NOSUCH
Requested item does not exist.
Definition: results.h:273
@ CRM_EX_DATAERR
User-supplied data incorrect.
Definition: results.h:252
@ CRM_EX_UNSATISFIED
Requested item does not satisfy constraints.
Definition: results.h:281
@ CRM_EX_UNSAFE
Requires –force or new conditions.
Definition: results.h:275
@ CRM_EX_EXISTS
Requested item already exists.
Definition: results.h:276
@ CRM_EX_TIMEOUT
Convention from timeout(1)
Definition: results.h:284
@ CRM_EX_NOT_RUNNING
Service safely stopped.
Definition: results.h:248
@ CRM_EX_MULTIPLE
Requested item has multiple matches.
Definition: results.h:277
@ CRM_EX_UNIMPLEMENT_FEATURE
Requested action not implemented.
Definition: results.h:244
@ CRM_EX_ERROR
Unspecified error.
Definition: results.h:240
@ CRM_EX_NOT_YET_IN_EFFECT
Requested item is not in effect.
Definition: results.h:279
@ CRM_EX_DEGRADED
Service active but more likely to fail soon.
Definition: results.h:292
@ CRM_EX_CANTCREAT
File couldn't be created.
Definition: results.h:260
@ CRM_EX_OLD
Update older than existing config.
Definition: results.h:271
@ CRM_EX_SOFTWARE
Internal software bug.
Definition: results.h:257
@ CRM_EX_OSFILE
System file not usable.
Definition: results.h:259
@ CRM_EX_NOHOST
Host unknown.
Definition: results.h:255
@ CRM_EX_CONFIG
Misconfiguration.
Definition: results.h:265
@ CRM_EX_NOPERM
Non-file permission issue.
Definition: results.h:264
@ CRM_EX_NOT_CONFIGURED
Parameter invalid (inherently)
Definition: results.h:247
@ CRM_EX_NOINPUT
Input file not available.
Definition: results.h:253
@ CRM_EX_UNAVAILABLE
Needed service unavailable.
Definition: results.h:256
@ CRM_EX_OSERR
External (OS/environmental) problem.
Definition: results.h:258
@ CRM_EX_DISCONNECT
Lost connection to something.
Definition: results.h:270
@ CRM_EX_FATAL
Do not respawn.
Definition: results.h:268
@ CRM_EX_DIGEST
Digest comparison failed.
Definition: results.h:272
@ CRM_EX_EXPIRED
Requested item has expired.
Definition: results.h:278
@ CRM_EX_NOUSER
User does not exist.
Definition: results.h:254
@ CRM_EX_OK
Success.
Definition: results.h:239
@ CRM_EX_DEGRADED_PROMOTED
Service promoted but more likely to fail soon.
Definition: results.h:293
@ CRM_EX_USAGE
Command line usage error.
Definition: results.h:251
@ CRM_EX_MAX
Ensure crm_exit_t can hold this.
Definition: results.h:295
@ CRM_EX_QUORUM
Local partition does not have quorum.
Definition: results.h:274
@ CRM_EX_NOT_INSTALLED
Dependencies not available locally.
Definition: results.h:246
@ CRM_EX_INVALID_PARAM
Parameter invalid (in local context)
Definition: results.h:243
@ CRM_EX_INSUFFICIENT_PRIV
Insufficient privileges.
Definition: results.h:245
@ CRM_EX_TEMPFAIL
Try again.
Definition: results.h:262
@ CRM_EX_INDETERMINATE
Could not determine status.
Definition: results.h:280
ocf_exitcode
Exit status codes for resource agents.
Definition: results.h:161
@ PCMK_OCF_INSUFFICIENT_PRIV
Insufficient privileges.
Definition: results.h:166
@ PCMK_OCF_UNIMPLEMENT_FEATURE
Requested action not implemented.
Definition: results.h:165
@ PCMK_OCF_UNKNOWN_ERROR
Unspecified error.
Definition: results.h:163
@ PCMK_OCF_INVALID_PARAM
Parameter invalid (in local context)
Definition: results.h:164
@ PCMK_OCF_OK
Success.
Definition: results.h:162
#define pcmk_err_schema_validation
Definition: results.h:73
@ pcmk_rc_no_input
Definition: results.h:115
@ pcmk_rc_before_range
Definition: results.h:119
@ pcmk_rc_cib_backup
Definition: results.h:133
@ pcmk_rc_op_unsatisfied
Definition: results.h:121
@ pcmk_rc_node_unknown
Definition: results.h:137
@ pcmk_rc_transform_failed
Definition: results.h:128
@ pcmk_rc_no_output
Definition: results.h:116
@ pcmk_rc_multiple
Definition: results.h:136
@ pcmk_rc_bad_nvpair
Definition: results.h:139
@ pcmk_rc_old_data
Definition: results.h:129
@ pcmk_rc_ok
Definition: results.h:146
@ pcmk_rc_no_quorum
Definition: results.h:125
@ pcmk_rc_schema_validation
Definition: results.h:126
@ pcmk_rc_undetermined
Definition: results.h:120
@ pcmk_rc_cib_save
Definition: results.h:134
@ pcmk_rc_unknown_format
Definition: results.h:140
@ pcmk_rc_within_range
Definition: results.h:118
@ pcmk_rc_after_range
Definition: results.h:117
@ pcmk_rc_schema_unchanged
Definition: results.h:127
@ pcmk_rc_error
Definition: results.h:142
@ pcmk_rc_already
Definition: results.h:138
@ pcmk_rc_dot_error
Definition: results.h:113
@ pcmk_rc_diff_resync
Definition: results.h:131
@ pcmk_rc_underflow
Definition: results.h:114
@ pcmk_rc_diff_failed
Definition: results.h:130
@ pcmk_rc_graph_error
Definition: results.h:112
@ pcmk_rc_cib_modified
Definition: results.h:132
@ pcmk_rc_cib_corrupt
Definition: results.h:135
#define pcmk_err_bad_nvpair
Definition: results.h:91
#define pcmk_err_multiple
Definition: results.h:83
#define pcmk_err_no_quorum
Definition: results.h:72
#define pcmk_err_cib_save
Definition: results.h:80
#define pcmk_ok
Definition: results.h:68
#define pcmk_err_diff_failed
Definition: results.h:76
pcmk_exec_status
Execution status.
Definition: results.h:305
#define pcmk_err_diff_resync
Definition: results.h:77
#define pcmk_err_transform_failed
Definition: results.h:74
enum crm_exit_e crm_exit_t
#define pcmk_err_cib_backup
Definition: results.h:79
#define pcmk_err_already
Definition: results.h:85
void pcmk__str_update(char **str, const char *value)
Definition: strings.c:1188
@ pcmk__str_none
enum pcmk_exec_status execution_status
Wrappers for and extensions to libxml2.
void crm_xml_cleanup(void)
Definition: xml.c:2857