This source file includes following definitions.
- G_DEFINE_QUARK
- pcmk__result_bounds
- pcmk_errorname
- pcmk_strerror
- pcmk_rc_name
- pcmk_rc_str
- pcmk_rc2legacy
- pcmk_legacy2rc
- crm_exit_name
- crm_exit_str
- pcmk_rc2exitc
- pcmk_rc2ocf
- bz2_strerror
- crm_exit
- pcmk__set_result
- G_GNUC_PRINTF
- pcmk__set_result_output
- pcmk__reset_result
- pcmk__copy_result
- crm_errno2exit
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   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 
  25 G_DEFINE_QUARK(pcmk-rc-error-quark, pcmk__rc_error)
     
  26 G_DEFINE_QUARK(pcmk-exitc-error-quark, pcmk__exitc_error)
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 int
  43 pcmk_result_get_strings(int code, enum pcmk_result_type type, const char **name,
  44                         const char **desc)
  45 {
  46     const char *code_name = NULL;
  47     const char *code_desc = NULL;
  48 
  49     switch (type) {
  50         case pcmk_result_legacy:
  51             code_name = pcmk_errorname(code);
  52             code_desc = pcmk_strerror(code);
  53             break;
  54         case pcmk_result_rc:
  55             code_name = pcmk_rc_name(code);
  56             code_desc = pcmk_rc_str(code);
  57             break;
  58         case pcmk_result_exitcode:
  59             code_name = crm_exit_name(code);
  60             code_desc = crm_exit_str((crm_exit_t) code);
  61             break;
  62         default:
  63             return pcmk_rc_undetermined;
  64     }
  65 
  66     if (name != NULL) {
  67         *name = code_name;
  68     }
  69     
  70     if (desc != NULL) {
  71         *desc = code_desc;
  72     }
  73     return pcmk_rc_ok;
  74 }
  75 
  76 
  77 
  78 
  79 
  80 
  81 
  82 
  83 
  84 
  85 
  86 
  87 
  88 
  89 
  90 
  91 
  92 int
  93 pcmk__result_bounds(enum pcmk_result_type type, int *lower, int *upper)
     
  94 {
  95     CRM_ASSERT((lower != NULL) && (upper != NULL));
  96 
  97     switch (type) {
  98         case pcmk_result_legacy:
  99             *lower = pcmk_ok;
 100             *upper = 256;   
 101             break;
 102         case pcmk_result_rc:
 103             *lower = pcmk_rc_error - pcmk__n_rc + 1;
 104             *upper = 256;
 105             break;
 106         case pcmk_result_exitcode:
 107             *lower = CRM_EX_OK;
 108             *upper = CRM_EX_MAX;
 109             break;
 110         default:
 111             *lower = 0;
 112             *upper = -1;
 113             return pcmk_rc_undetermined;
 114     }
 115     return pcmk_rc_ok;
 116 }
 117 
 118 
 119 
 120 
 121 const char *
 122 pcmk_errorname(int rc)
     
 123 {
 124     rc = abs(rc);
 125     switch (rc) {
 126         case pcmk_err_generic: return "pcmk_err_generic";
 127         case pcmk_err_no_quorum: return "pcmk_err_no_quorum";
 128         case pcmk_err_schema_validation: return "pcmk_err_schema_validation";
 129         case pcmk_err_transform_failed: return "pcmk_err_transform_failed";
 130         case pcmk_err_old_data: return "pcmk_err_old_data";
 131         case pcmk_err_diff_failed: return "pcmk_err_diff_failed";
 132         case pcmk_err_diff_resync: return "pcmk_err_diff_resync";
 133         case pcmk_err_cib_modified: return "pcmk_err_cib_modified";
 134         case pcmk_err_cib_backup: return "pcmk_err_cib_backup";
 135         case pcmk_err_cib_save: return "pcmk_err_cib_save";
 136         case pcmk_err_cib_corrupt: return "pcmk_err_cib_corrupt";
 137         case pcmk_err_multiple: return "pcmk_err_multiple";
 138         case pcmk_err_node_unknown: return "pcmk_err_node_unknown";
 139         case pcmk_err_already: return "pcmk_err_already";
 140         case pcmk_err_bad_nvpair: return "pcmk_err_bad_nvpair";
 141         case pcmk_err_unknown_format: return "pcmk_err_unknown_format";
 142         default: return pcmk_rc_name(rc); 
 143     }
 144 }
 145 
 146 
 147 const char *
 148 pcmk_strerror(int rc)
     
 149 {
 150     return pcmk_rc_str(pcmk_legacy2rc(rc));
 151 }
 152 
 153 
 154 
 155 
 156 
 157 
 158 
 159 static const struct pcmk__rc_info {
 160     const char *name;
 161     const char *desc;
 162     int legacy_rc;
 163 } pcmk__rcs[] = {
 164     { "pcmk_rc_error",
 165       "Error",
 166       -pcmk_err_generic,
 167     },
 168     { "pcmk_rc_unknown_format",
 169       "Unknown output format",
 170       -pcmk_err_unknown_format,
 171     },
 172     { "pcmk_rc_bad_nvpair",
 173       "Bad name/value pair given",
 174       -pcmk_err_bad_nvpair,
 175     },
 176     { "pcmk_rc_already",
 177       "Already in requested state",
 178       -pcmk_err_already,
 179     },
 180     { "pcmk_rc_node_unknown",
 181       "Node not found",
 182       -pcmk_err_node_unknown,
 183     },
 184     { "pcmk_rc_multiple",
 185       "Resource active on multiple nodes",
 186       -pcmk_err_multiple,
 187     },
 188     { "pcmk_rc_cib_corrupt",
 189       "Could not parse on-disk configuration",
 190       -pcmk_err_cib_corrupt,
 191     },
 192     { "pcmk_rc_cib_save",
 193       "Could not save new configuration to disk",
 194       -pcmk_err_cib_save,
 195     },
 196     { "pcmk_rc_cib_backup",
 197       "Could not archive previous configuration",
 198       -pcmk_err_cib_backup,
 199     },
 200     { "pcmk_rc_cib_modified",
 201       "On-disk configuration was manually modified",
 202       -pcmk_err_cib_modified,
 203     },
 204     { "pcmk_rc_diff_resync",
 205       "Application of update diff failed, requesting full refresh",
 206       -pcmk_err_diff_resync,
 207     },
 208     { "pcmk_rc_diff_failed",
 209       "Application of update diff failed",
 210       -pcmk_err_diff_failed,
 211     },
 212     { "pcmk_rc_old_data",
 213       "Update was older than existing configuration",
 214       -pcmk_err_old_data,
 215     },
 216     { "pcmk_rc_transform_failed",
 217       "Schema transform failed",
 218       -pcmk_err_transform_failed,
 219     },
 220     { "pcmk_rc_schema_unchanged",
 221       "Schema is already the latest available",
 222       -pcmk_err_schema_unchanged,
 223     },
 224     { "pcmk_rc_schema_validation",
 225       "Update does not conform to the configured schema",
 226       -pcmk_err_schema_validation,
 227     },
 228     { "pcmk_rc_no_quorum",
 229       "Operation requires quorum",
 230       -pcmk_err_no_quorum,
 231     },
 232     { "pcmk_rc_ipc_unauthorized",
 233       "IPC server is blocked by unauthorized process",
 234       -pcmk_err_generic,
 235     },
 236     { "pcmk_rc_ipc_unresponsive",
 237       "IPC server is unresponsive",
 238       -pcmk_err_generic,
 239     },
 240     { "pcmk_rc_ipc_pid_only",
 241       "IPC server process is active but not accepting connections",
 242       -pcmk_err_generic,
 243     },
 244     { "pcmk_rc_op_unsatisfied",
 245       "Not applicable under current conditions",
 246       -pcmk_err_generic,
 247     },
 248     { "pcmk_rc_undetermined",
 249       "Result undetermined",
 250       -pcmk_err_generic,
 251     },
 252     { "pcmk_rc_before_range",
 253       "Result occurs before given range",
 254       -pcmk_err_generic,
 255     },
 256     { "pcmk_rc_within_range",
 257       "Result occurs within given range",
 258       -pcmk_err_generic,
 259     },
 260     { "pcmk_rc_after_range",
 261       "Result occurs after given range",
 262       -pcmk_err_generic,
 263     },
 264     { "pcmk_rc_no_output",
 265       "Output message produced no output",
 266       -pcmk_err_generic,
 267     },
 268     { "pcmk_rc_no_input",
 269       "Input file not available",
 270       -pcmk_err_generic,
 271     },
 272     { "pcmk_rc_underflow",
 273       "Value too small to be stored in data type",
 274       -pcmk_err_generic,
 275     },
 276     { "pcmk_rc_dot_error",
 277       "Error writing dot(1) file",
 278       -pcmk_err_generic,
 279     },
 280     { "pcmk_rc_graph_error",
 281       "Error writing graph file",
 282       -pcmk_err_generic,
 283     },
 284     { "pcmk_rc_invalid_transition",
 285       "Cluster simulation produced invalid transition",
 286       -pcmk_err_generic,
 287     },
 288     { "pcmk_rc_unpack_error",
 289       "Unable to parse CIB XML",
 290       -pcmk_err_generic,
 291     },
 292     { "pcmk_rc_duplicate_id",
 293       "Two or more XML elements have the same ID",
 294       -pcmk_err_generic,
 295     },
 296 };
 297 
 298 
 299 
 300 
 301 
 302 
 303 
 304 
 305 
 306 const size_t pcmk__n_rc = PCMK__NELEM(pcmk__rcs);
 307 
 308 
 309 
 310 
 311 
 312 
 313 
 314 
 315 const char *
 316 pcmk_rc_name(int rc)
     
 317 {
 318     if ((rc <= pcmk_rc_error) && ((pcmk_rc_error - rc) < pcmk__n_rc)) {
 319         return pcmk__rcs[pcmk_rc_error - rc].name;
 320     }
 321     switch (rc) {
 322         case pcmk_rc_ok:        return "pcmk_rc_ok";
 323         case E2BIG:             return "E2BIG";
 324         case EACCES:            return "EACCES";
 325         case EADDRINUSE:        return "EADDRINUSE";
 326         case EADDRNOTAVAIL:     return "EADDRNOTAVAIL";
 327         case EAFNOSUPPORT:      return "EAFNOSUPPORT";
 328         case EAGAIN:            return "EAGAIN";
 329         case EALREADY:          return "EALREADY";
 330         case EBADF:             return "EBADF";
 331         case EBADMSG:           return "EBADMSG";
 332         case EBUSY:             return "EBUSY";
 333         case ECANCELED:         return "ECANCELED";
 334         case ECHILD:            return "ECHILD";
 335         case ECOMM:             return "ECOMM";
 336         case ECONNABORTED:      return "ECONNABORTED";
 337         case ECONNREFUSED:      return "ECONNREFUSED";
 338         case ECONNRESET:        return "ECONNRESET";
 339         
 340         case EDESTADDRREQ:      return "EDESTADDRREQ";
 341         case EDOM:              return "EDOM";
 342         case EDQUOT:            return "EDQUOT";
 343         case EEXIST:            return "EEXIST";
 344         case EFAULT:            return "EFAULT";
 345         case EFBIG:             return "EFBIG";
 346         case EHOSTDOWN:         return "EHOSTDOWN";
 347         case EHOSTUNREACH:      return "EHOSTUNREACH";
 348         case EIDRM:             return "EIDRM";
 349         case EILSEQ:            return "EILSEQ";
 350         case EINPROGRESS:       return "EINPROGRESS";
 351         case EINTR:             return "EINTR";
 352         case EINVAL:            return "EINVAL";
 353         case EIO:               return "EIO";
 354         case EISCONN:           return "EISCONN";
 355         case EISDIR:            return "EISDIR";
 356         case ELIBACC:           return "ELIBACC";
 357         case ELOOP:             return "ELOOP";
 358         case EMFILE:            return "EMFILE";
 359         case EMLINK:            return "EMLINK";
 360         case EMSGSIZE:          return "EMSGSIZE";
 361 #ifdef EMULTIHOP 
 362         case EMULTIHOP:         return "EMULTIHOP";
 363 #endif
 364         case ENAMETOOLONG:      return "ENAMETOOLONG";
 365         case ENETDOWN:          return "ENETDOWN";
 366         case ENETRESET:         return "ENETRESET";
 367         case ENETUNREACH:       return "ENETUNREACH";
 368         case ENFILE:            return "ENFILE";
 369         case ENOBUFS:           return "ENOBUFS";
 370         case ENODATA:           return "ENODATA";
 371         case ENODEV:            return "ENODEV";
 372         case ENOENT:            return "ENOENT";
 373         case ENOEXEC:           return "ENOEXEC";
 374         case ENOKEY:            return "ENOKEY";
 375         case ENOLCK:            return "ENOLCK";
 376 #ifdef ENOLINK 
 377         case ENOLINK:           return "ENOLINK";
 378 #endif
 379         case ENOMEM:            return "ENOMEM";
 380         case ENOMSG:            return "ENOMSG";
 381         case ENOPROTOOPT:       return "ENOPROTOOPT";
 382         case ENOSPC:            return "ENOSPC";
 383 #ifdef ENOSR
 384         case ENOSR:             return "ENOSR";
 385 #endif
 386 #ifdef ENOSTR
 387         case ENOSTR:            return "ENOSTR";
 388 #endif
 389         case ENOSYS:            return "ENOSYS";
 390         case ENOTBLK:           return "ENOTBLK";
 391         case ENOTCONN:          return "ENOTCONN";
 392         case ENOTDIR:           return "ENOTDIR";
 393         case ENOTEMPTY:         return "ENOTEMPTY";
 394         case ENOTSOCK:          return "ENOTSOCK";
 395 #if ENOTSUP != EOPNOTSUPP
 396         case ENOTSUP:           return "ENOTSUP";
 397 #endif
 398         case ENOTTY:            return "ENOTTY";
 399         case ENOTUNIQ:          return "ENOTUNIQ";
 400         case ENXIO:             return "ENXIO";
 401         case EOPNOTSUPP:        return "EOPNOTSUPP";
 402         case EOVERFLOW:         return "EOVERFLOW";
 403         case EPERM:             return "EPERM";
 404         case EPFNOSUPPORT:      return "EPFNOSUPPORT";
 405         case EPIPE:             return "EPIPE";
 406         case EPROTO:            return "EPROTO";
 407         case EPROTONOSUPPORT:   return "EPROTONOSUPPORT";
 408         case EPROTOTYPE:        return "EPROTOTYPE";
 409         case ERANGE:            return "ERANGE";
 410         case EREMOTE:           return "EREMOTE";
 411         case EREMOTEIO:         return "EREMOTEIO";
 412         case EROFS:             return "EROFS";
 413         case ESHUTDOWN:         return "ESHUTDOWN";
 414         case ESPIPE:            return "ESPIPE";
 415         case ESOCKTNOSUPPORT:   return "ESOCKTNOSUPPORT";
 416         case ESRCH:             return "ESRCH";
 417         case ESTALE:            return "ESTALE";
 418         case ETIME:             return "ETIME";
 419         case ETIMEDOUT:         return "ETIMEDOUT";
 420         case ETXTBSY:           return "ETXTBSY";
 421 #ifdef EUNATCH
 422         case EUNATCH:           return "EUNATCH";
 423 #endif
 424         case EUSERS:            return "EUSERS";
 425         
 426         case EXDEV:             return "EXDEV";
 427 
 428 #ifdef EBADE 
 429         case EBADE:             return "EBADE";
 430         case EBADFD:            return "EBADFD";
 431         case EBADSLT:           return "EBADSLT";
 432         case EDEADLOCK:         return "EDEADLOCK";
 433         case EBADR:             return "EBADR";
 434         case EBADRQC:           return "EBADRQC";
 435         case ECHRNG:            return "ECHRNG";
 436 #ifdef EISNAM 
 437         case EISNAM:            return "EISNAM";
 438         case EKEYEXPIRED:       return "EKEYEXPIRED";
 439         case EKEYREVOKED:       return "EKEYREVOKED";
 440 #endif
 441         case EKEYREJECTED:      return "EKEYREJECTED";
 442         case EL2HLT:            return "EL2HLT";
 443         case EL2NSYNC:          return "EL2NSYNC";
 444         case EL3HLT:            return "EL3HLT";
 445         case EL3RST:            return "EL3RST";
 446         case ELIBBAD:           return "ELIBBAD";
 447         case ELIBMAX:           return "ELIBMAX";
 448         case ELIBSCN:           return "ELIBSCN";
 449         case ELIBEXEC:          return "ELIBEXEC";
 450 #ifdef ENOMEDIUM 
 451         case ENOMEDIUM:         return "ENOMEDIUM";
 452         case EMEDIUMTYPE:       return "EMEDIUMTYPE";
 453 #endif
 454         case ENONET:            return "ENONET";
 455         case ENOPKG:            return "ENOPKG";
 456         case EREMCHG:           return "EREMCHG";
 457         case ERESTART:          return "ERESTART";
 458         case ESTRPIPE:          return "ESTRPIPE";
 459 #ifdef EUCLEAN 
 460         case EUCLEAN:           return "EUCLEAN";
 461 #endif
 462         case EXFULL:            return "EXFULL";
 463 #endif 
 464         default:                return "Unknown";
 465     }
 466 }
 467 
 468 
 469 
 470 
 471 
 472 
 473 
 474 
 475 const char *
 476 pcmk_rc_str(int rc)
     
 477 {
 478     if (rc == pcmk_rc_ok) {
 479         return "OK";
 480     }
 481     if ((rc <= pcmk_rc_error) && ((pcmk_rc_error - rc) < pcmk__n_rc)) {
 482         return pcmk__rcs[pcmk_rc_error - rc].desc;
 483     }
 484     if (rc < 0) {
 485         return "Error";
 486     }
 487 
 488     
 489     switch (rc) {
 490 #ifdef PCMK__ENOTUNIQ
 491         case ENOTUNIQ:      return "Name not unique on network";
 492 #endif
 493 #ifdef PCMK__ECOMM
 494         case ECOMM:         return "Communication error on send";
 495 #endif
 496 #ifdef PCMK__ELIBACC
 497         case ELIBACC:       return "Can not access a needed shared library";
 498 #endif
 499 #ifdef PCMK__EREMOTEIO
 500         case EREMOTEIO:     return "Remote I/O error";
 501 #endif
 502 #ifdef PCMK__ENOKEY
 503         case ENOKEY:        return "Required key not available";
 504 #endif
 505 #ifdef PCMK__ENODATA
 506         case ENODATA:       return "No data available";
 507 #endif
 508 #ifdef PCMK__ETIME
 509         case ETIME:         return "Timer expired";
 510 #endif
 511 #ifdef PCMK__EKEYREJECTED
 512         case EKEYREJECTED:  return "Key was rejected by service";
 513 #endif
 514         default:            return strerror(rc);
 515     }
 516 }
 517 
 518 
 519 
 520 int
 521 pcmk_rc2legacy(int rc)
     
 522 {
 523     if (rc >= 0) {
 524         return -rc; 
 525     }
 526     if ((rc <= pcmk_rc_error) && ((pcmk_rc_error - rc) < pcmk__n_rc)) {
 527         return pcmk__rcs[pcmk_rc_error - rc].legacy_rc;
 528     }
 529     return -pcmk_err_generic;
 530 }
 531 
 532 
 533 int
 534 pcmk_legacy2rc(int legacy_rc)
     
 535 {
 536     legacy_rc = abs(legacy_rc);
 537     switch (legacy_rc) {
 538         case pcmk_err_no_quorum:            return pcmk_rc_no_quorum;
 539         case pcmk_err_schema_validation:    return pcmk_rc_schema_validation;
 540         case pcmk_err_schema_unchanged:     return pcmk_rc_schema_unchanged;
 541         case pcmk_err_transform_failed:     return pcmk_rc_transform_failed;
 542         case pcmk_err_old_data:             return pcmk_rc_old_data;
 543         case pcmk_err_diff_failed:          return pcmk_rc_diff_failed;
 544         case pcmk_err_diff_resync:          return pcmk_rc_diff_resync;
 545         case pcmk_err_cib_modified:         return pcmk_rc_cib_modified;
 546         case pcmk_err_cib_backup:           return pcmk_rc_cib_backup;
 547         case pcmk_err_cib_save:             return pcmk_rc_cib_save;
 548         case pcmk_err_cib_corrupt:          return pcmk_rc_cib_corrupt;
 549         case pcmk_err_multiple:             return pcmk_rc_multiple;
 550         case pcmk_err_node_unknown:         return pcmk_rc_node_unknown;
 551         case pcmk_err_already:              return pcmk_rc_already;
 552         case pcmk_err_bad_nvpair:           return pcmk_rc_bad_nvpair;
 553         case pcmk_err_unknown_format:       return pcmk_rc_unknown_format;
 554         case pcmk_err_generic:              return pcmk_rc_error;
 555         case pcmk_ok:                       return pcmk_rc_ok;
 556         default:                            return legacy_rc; 
 557     }
 558 }
 559 
 560 
 561 
 562 const char *
 563 crm_exit_name(crm_exit_t exit_code)
     
 564 {
 565     switch (exit_code) {
 566         case CRM_EX_OK: return "CRM_EX_OK";
 567         case CRM_EX_ERROR: return "CRM_EX_ERROR";
 568         case CRM_EX_INVALID_PARAM: return "CRM_EX_INVALID_PARAM";
 569         case CRM_EX_UNIMPLEMENT_FEATURE: return "CRM_EX_UNIMPLEMENT_FEATURE";
 570         case CRM_EX_INSUFFICIENT_PRIV: return "CRM_EX_INSUFFICIENT_PRIV";
 571         case CRM_EX_NOT_INSTALLED: return "CRM_EX_NOT_INSTALLED";
 572         case CRM_EX_NOT_CONFIGURED: return "CRM_EX_NOT_CONFIGURED";
 573         case CRM_EX_NOT_RUNNING: return "CRM_EX_NOT_RUNNING";
 574         case CRM_EX_PROMOTED: return "CRM_EX_PROMOTED";
 575         case CRM_EX_FAILED_PROMOTED: return "CRM_EX_FAILED_PROMOTED";
 576         case CRM_EX_USAGE: return "CRM_EX_USAGE";
 577         case CRM_EX_DATAERR: return "CRM_EX_DATAERR";
 578         case CRM_EX_NOINPUT: return "CRM_EX_NOINPUT";
 579         case CRM_EX_NOUSER: return "CRM_EX_NOUSER";
 580         case CRM_EX_NOHOST: return "CRM_EX_NOHOST";
 581         case CRM_EX_UNAVAILABLE: return "CRM_EX_UNAVAILABLE";
 582         case CRM_EX_SOFTWARE: return "CRM_EX_SOFTWARE";
 583         case CRM_EX_OSERR: return "CRM_EX_OSERR";
 584         case CRM_EX_OSFILE: return "CRM_EX_OSFILE";
 585         case CRM_EX_CANTCREAT: return "CRM_EX_CANTCREAT";
 586         case CRM_EX_IOERR: return "CRM_EX_IOERR";
 587         case CRM_EX_TEMPFAIL: return "CRM_EX_TEMPFAIL";
 588         case CRM_EX_PROTOCOL: return "CRM_EX_PROTOCOL";
 589         case CRM_EX_NOPERM: return "CRM_EX_NOPERM";
 590         case CRM_EX_CONFIG: return "CRM_EX_CONFIG";
 591         case CRM_EX_FATAL: return "CRM_EX_FATAL";
 592         case CRM_EX_PANIC: return "CRM_EX_PANIC";
 593         case CRM_EX_DISCONNECT: return "CRM_EX_DISCONNECT";
 594         case CRM_EX_DIGEST: return "CRM_EX_DIGEST";
 595         case CRM_EX_NOSUCH: return "CRM_EX_NOSUCH";
 596         case CRM_EX_QUORUM: return "CRM_EX_QUORUM";
 597         case CRM_EX_UNSAFE: return "CRM_EX_UNSAFE";
 598         case CRM_EX_EXISTS: return "CRM_EX_EXISTS";
 599         case CRM_EX_MULTIPLE: return "CRM_EX_MULTIPLE";
 600         case CRM_EX_EXPIRED: return "CRM_EX_EXPIRED";
 601         case CRM_EX_NOT_YET_IN_EFFECT: return "CRM_EX_NOT_YET_IN_EFFECT";
 602         case CRM_EX_INDETERMINATE: return "CRM_EX_INDETERMINATE";
 603         case CRM_EX_UNSATISFIED: return "CRM_EX_UNSATISFIED";
 604         case CRM_EX_OLD: return "CRM_EX_OLD";
 605         case CRM_EX_TIMEOUT: return "CRM_EX_TIMEOUT";
 606         case CRM_EX_DEGRADED: return "CRM_EX_DEGRADED";
 607         case CRM_EX_DEGRADED_PROMOTED: return "CRM_EX_DEGRADED_PROMOTED";
 608         case CRM_EX_NONE: return "CRM_EX_NONE";
 609         case CRM_EX_MAX: return "CRM_EX_UNKNOWN";
 610     }
 611     return "CRM_EX_UNKNOWN";
 612 }
 613 
 614 const char *
 615 crm_exit_str(crm_exit_t exit_code)
     
 616 {
 617     switch (exit_code) {
 618         case CRM_EX_OK: return "OK";
 619         case CRM_EX_ERROR: return "Error occurred";
 620         case CRM_EX_INVALID_PARAM: return "Invalid parameter";
 621         case CRM_EX_UNIMPLEMENT_FEATURE: return "Unimplemented";
 622         case CRM_EX_INSUFFICIENT_PRIV: return "Insufficient privileges";
 623         case CRM_EX_NOT_INSTALLED: return "Not installed";
 624         case CRM_EX_NOT_CONFIGURED: return "Not configured";
 625         case CRM_EX_NOT_RUNNING: return "Not running";
 626         case CRM_EX_PROMOTED: return "Promoted";
 627         case CRM_EX_FAILED_PROMOTED: return "Failed in promoted role";
 628         case CRM_EX_USAGE: return "Incorrect usage";
 629         case CRM_EX_DATAERR: return "Invalid data given";
 630         case CRM_EX_NOINPUT: return "Input file not available";
 631         case CRM_EX_NOUSER: return "User does not exist";
 632         case CRM_EX_NOHOST: return "Host does not exist";
 633         case CRM_EX_UNAVAILABLE: return "Necessary service unavailable";
 634         case CRM_EX_SOFTWARE: return "Internal software bug";
 635         case CRM_EX_OSERR: return "Operating system error occurred";
 636         case CRM_EX_OSFILE: return "System file not available";
 637         case CRM_EX_CANTCREAT: return "Cannot create output file";
 638         case CRM_EX_IOERR: return "I/O error occurred";
 639         case CRM_EX_TEMPFAIL: return "Temporary failure, try again";
 640         case CRM_EX_PROTOCOL: return "Protocol violated";
 641         case CRM_EX_NOPERM: return "Insufficient privileges";
 642         case CRM_EX_CONFIG: return "Invalid configuration";
 643         case CRM_EX_FATAL: return "Fatal error occurred, will not respawn";
 644         case CRM_EX_PANIC: return "System panic required";
 645         case CRM_EX_DISCONNECT: return "Not connected";
 646         case CRM_EX_DIGEST: return "Digest mismatch";
 647         case CRM_EX_NOSUCH: return "No such object";
 648         case CRM_EX_QUORUM: return "Quorum required";
 649         case CRM_EX_UNSAFE: return "Operation not safe";
 650         case CRM_EX_EXISTS: return "Requested item already exists";
 651         case CRM_EX_MULTIPLE: return "Multiple items match request";
 652         case CRM_EX_EXPIRED: return "Requested item has expired";
 653         case CRM_EX_NOT_YET_IN_EFFECT: return "Requested item is not yet in effect";
 654         case CRM_EX_INDETERMINATE: return "Could not determine status";
 655         case CRM_EX_UNSATISFIED: return "Not applicable under current conditions";
 656         case CRM_EX_OLD: return "Update was older than existing configuration";
 657         case CRM_EX_TIMEOUT: return "Timeout occurred";
 658         case CRM_EX_DEGRADED: return "Service is active but might fail soon";
 659         case CRM_EX_DEGRADED_PROMOTED: return "Service is promoted but might fail soon";
 660         case CRM_EX_NONE: return "No exit status available";
 661         case CRM_EX_MAX: return "Error occurred";
 662     }
 663     if ((exit_code > 128) && (exit_code < CRM_EX_MAX)) {
 664         return "Interrupted by signal";
 665     }
 666     return "Unknown exit status";
 667 }
 668 
 669 
 670 
 671 
 672 
 673 
 674 
 675 
 676 crm_exit_t
 677 pcmk_rc2exitc(int rc)
     
 678 {
 679     switch (rc) {
 680         case pcmk_rc_ok:
 681             return CRM_EX_OK;
 682 
 683         case pcmk_rc_no_quorum:
 684             return CRM_EX_QUORUM;
 685 
 686         case pcmk_rc_old_data:
 687             return CRM_EX_OLD;
 688 
 689         case pcmk_rc_schema_validation:
 690         case pcmk_rc_transform_failed:
 691         case pcmk_rc_unpack_error:
 692             return CRM_EX_CONFIG;
 693 
 694         case pcmk_rc_bad_nvpair:
 695             return CRM_EX_INVALID_PARAM;
 696 
 697         case EACCES:
 698             return CRM_EX_INSUFFICIENT_PRIV;
 699 
 700         case EBADF:
 701         case EINVAL:
 702         case EFAULT:
 703         case ENOSYS:
 704         case EOVERFLOW:
 705         case pcmk_rc_underflow:
 706             return CRM_EX_SOFTWARE;
 707 
 708         case EBADMSG:
 709         case EMSGSIZE:
 710         case ENOMSG:
 711         case ENOPROTOOPT:
 712         case EPROTO:
 713         case EPROTONOSUPPORT:
 714         case EPROTOTYPE:
 715             return CRM_EX_PROTOCOL;
 716 
 717         case ECOMM:
 718         case ENOMEM:
 719             return CRM_EX_OSERR;
 720 
 721         case ECONNABORTED:
 722         case ECONNREFUSED:
 723         case ECONNRESET:
 724         case ENOTCONN:
 725             return CRM_EX_DISCONNECT;
 726 
 727         case EEXIST:
 728         case pcmk_rc_already:
 729             return CRM_EX_EXISTS;
 730 
 731         case EIO:
 732         case pcmk_rc_no_output:
 733         case pcmk_rc_dot_error:
 734         case pcmk_rc_graph_error:
 735             return CRM_EX_IOERR;
 736 
 737         case ENOTSUP:
 738 #if EOPNOTSUPP != ENOTSUP
 739         case EOPNOTSUPP:
 740 #endif
 741             return CRM_EX_UNIMPLEMENT_FEATURE;
 742 
 743         case ENOTUNIQ:
 744         case pcmk_rc_multiple:
 745             return CRM_EX_MULTIPLE;
 746 
 747         case ENODEV:
 748         case ENOENT:
 749         case ENXIO:
 750         case pcmk_rc_node_unknown:
 751         case pcmk_rc_unknown_format:
 752             return CRM_EX_NOSUCH;
 753 
 754         case ETIME:
 755         case ETIMEDOUT:
 756             return CRM_EX_TIMEOUT;
 757 
 758         case EAGAIN:
 759         case EBUSY:
 760             return CRM_EX_UNSATISFIED;
 761 
 762         case pcmk_rc_before_range:
 763             return CRM_EX_NOT_YET_IN_EFFECT;
 764 
 765         case pcmk_rc_after_range:
 766             return CRM_EX_EXPIRED;
 767 
 768         case pcmk_rc_undetermined:
 769             return CRM_EX_INDETERMINATE;
 770 
 771         case pcmk_rc_op_unsatisfied:
 772             return CRM_EX_UNSATISFIED;
 773 
 774         case pcmk_rc_within_range:
 775             return CRM_EX_OK;
 776 
 777         case pcmk_rc_no_input:
 778             return CRM_EX_NOINPUT;
 779 
 780         case pcmk_rc_duplicate_id:
 781             return CRM_EX_MULTIPLE;
 782 
 783         default:
 784             return CRM_EX_ERROR;
 785     }
 786 }
 787 
 788 
 789 
 790 
 791 
 792 
 793 
 794 
 795 enum ocf_exitcode
 796 pcmk_rc2ocf(int rc)
     
 797 {
 798     switch (rc) {
 799         case pcmk_rc_ok:
 800             return PCMK_OCF_OK;
 801 
 802         case pcmk_rc_bad_nvpair:
 803             return PCMK_OCF_INVALID_PARAM;
 804 
 805         case EACCES:
 806             return PCMK_OCF_INSUFFICIENT_PRIV;
 807 
 808         case ENOTSUP:
 809 #if EOPNOTSUPP != ENOTSUP
 810         case EOPNOTSUPP:
 811 #endif
 812             return PCMK_OCF_UNIMPLEMENT_FEATURE;
 813 
 814         default:
 815             return PCMK_OCF_UNKNOWN_ERROR;
 816     }
 817 }
 818 
 819 
 820 
 821 
 822 const char *
 823 bz2_strerror(int rc)
     
 824 {
 825     
 826     switch (rc) {
 827         case BZ_OK:
 828         case BZ_RUN_OK:
 829         case BZ_FLUSH_OK:
 830         case BZ_FINISH_OK:
 831         case BZ_STREAM_END:
 832             return "Ok";
 833         case BZ_CONFIG_ERROR:
 834             return "libbz2 has been improperly compiled on your platform";
 835         case BZ_SEQUENCE_ERROR:
 836             return "library functions called in the wrong order";
 837         case BZ_PARAM_ERROR:
 838             return "parameter is out of range or otherwise incorrect";
 839         case BZ_MEM_ERROR:
 840             return "memory allocation failed";
 841         case BZ_DATA_ERROR:
 842             return "data integrity error is detected during decompression";
 843         case BZ_DATA_ERROR_MAGIC:
 844             return "the compressed stream does not start with the correct magic bytes";
 845         case BZ_IO_ERROR:
 846             return "error reading or writing in the compressed file";
 847         case BZ_UNEXPECTED_EOF:
 848             return "compressed file finishes before the logical end of stream is detected";
 849         case BZ_OUTBUFF_FULL:
 850             return "output data will not fit into the buffer provided";
 851     }
 852     return "Data compression error";
 853 }
 854 
 855 crm_exit_t
 856 crm_exit(crm_exit_t rc)
     
 857 {
 858     
 859 
 860 
 861     if ((((int) rc) < 0) || (((int) rc) > CRM_EX_MAX)) {
 862         rc = CRM_EX_ERROR;
 863     }
 864 
 865     mainloop_cleanup();
 866     crm_xml_cleanup();
 867 
 868     pcmk__cli_option_cleanup();
 869 
 870     if (crm_system_name) {
 871         crm_info("Exiting %s " CRM_XS " with status %d", crm_system_name, rc);
 872         free(crm_system_name);
 873     } else {
 874         crm_trace("Exiting with status %d", rc);
 875     }
 876     qb_log_fini(); 
 877 
 878     exit(rc);
 879 }
 880 
 881 
 882 
 883 
 884 
 885 
 886 
 887 
 888 
 889 
 890 
 891 
 892 
 893 
 894 void
 895 pcmk__set_result(pcmk__action_result_t *result, int exit_status,
     
 896                  enum pcmk_exec_status exec_status, const char *exit_reason)
 897 {
 898     if (result == NULL) {
 899         return;
 900     }
 901 
 902     result->exit_status = exit_status;
 903     result->execution_status = exec_status;
 904 
 905     if (!pcmk__str_eq(result->exit_reason, exit_reason, pcmk__str_none)) {
 906         free(result->exit_reason);
 907         result->exit_reason = (exit_reason == NULL)? NULL : strdup(exit_reason);
 908     }
 909 }
 910 
 911 
 912 
 913 
 914 
 915 
 916 
 917 
 918 
 919 
 920 
 921 
 922 
 923 G_GNUC_PRINTF(4, 5)
     
 924 void
 925 pcmk__format_result(pcmk__action_result_t *result, int exit_status,
 926                     enum pcmk_exec_status exec_status,
 927                     const char *format, ...)
 928 {
 929     va_list ap;
 930     int len = 0;
 931     char *reason = NULL;
 932 
 933     if (result == NULL) {
 934         return;
 935     }
 936 
 937     result->exit_status = exit_status;
 938     result->execution_status = exec_status;
 939 
 940     if (format != NULL) {
 941         va_start(ap, format);
 942         len = vasprintf(&reason, format, ap);
 943         CRM_ASSERT(len > 0);
 944         va_end(ap);
 945     }
 946     free(result->exit_reason);
 947     result->exit_reason = reason;
 948 }
 949 
 950 
 951 
 952 
 953 
 954 
 955 
 956 
 957 
 958 
 959 
 960 
 961 
 962 
 963 void
 964 pcmk__set_result_output(pcmk__action_result_t *result, char *out, char *err)
     
 965 {
 966     if (result == NULL) {
 967         return;
 968     }
 969 
 970     free(result->action_stdout);
 971     result->action_stdout = out;
 972 
 973     free(result->action_stderr);
 974     result->action_stderr = err;
 975 }
 976 
 977 
 978 
 979 
 980 
 981 
 982 
 983 void
 984 pcmk__reset_result(pcmk__action_result_t *result)
     
 985 {
 986     if (result == NULL) {
 987         return;
 988     }
 989 
 990     free(result->exit_reason);
 991     result->exit_reason = NULL;
 992 
 993     free(result->action_stdout);
 994     result->action_stdout = NULL;
 995 
 996     free(result->action_stderr);
 997     result->action_stderr = NULL;
 998 }
 999 
1000 
1001 
1002 
1003 
1004 
1005 
1006 
1007 void
1008 pcmk__copy_result(const pcmk__action_result_t *src, pcmk__action_result_t *dst)
     
1009 {
1010     CRM_CHECK((src != NULL) && (dst != NULL), return);
1011     dst->exit_status = src->exit_status;
1012     dst->execution_status = src->execution_status;
1013     pcmk__str_update(&dst->exit_reason, src->exit_reason);
1014     pcmk__str_update(&dst->action_stdout, src->action_stdout);
1015     pcmk__str_update(&dst->action_stderr, src->action_stderr);
1016 }
1017 
1018 
1019 
1020 
1021 #include <crm/common/results_compat.h>
1022 
1023 crm_exit_t
1024 crm_errno2exit(int rc)
     
1025 {
1026     return pcmk_rc2exitc(pcmk_legacy2rc(rc));
1027 }
1028 
1029 
1030