pacemaker 2.1.8-2.1.8
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
scores.c
Go to the documentation of this file.
1/*
2 * Copyright 2004-2024 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 <stdio.h> // snprintf(), NULL
17#include <string.h> // strcpy(), strdup()
18#include <sys/types.h> // size_t
19
23
35int
36char2score(const char *score)
37{
38 if (score == NULL) {
39 return 0;
40
41 } else if (pcmk_str_is_minus_infinity(score)) {
42 return -PCMK_SCORE_INFINITY;
43
44 } else if (pcmk_str_is_infinity(score)) {
46
47 } else if (pcmk__str_eq(score, PCMK_VALUE_RED, pcmk__str_casei)) {
48 return pcmk__score_red;
49
50 } else if (pcmk__str_eq(score, PCMK_VALUE_YELLOW, pcmk__str_casei)) {
51 return pcmk__score_yellow;
52
53 } else if (pcmk__str_eq(score, PCMK_VALUE_GREEN, pcmk__str_casei)) {
54 return pcmk__score_green;
55
56 } else {
57 long long score_ll;
58
59 pcmk__scan_ll(score, &score_ll, 0LL);
60 if (score_ll > PCMK_SCORE_INFINITY) {
62
63 } else if (score_ll < -PCMK_SCORE_INFINITY) {
64 return -PCMK_SCORE_INFINITY;
65
66 } else {
67 return (int) score_ll;
68 }
69 }
70}
71
85const char *
87{
88 // The longest possible result is "-INFINITY"
89 static char score_s[sizeof(PCMK_VALUE_MINUS_INFINITY)];
90
91 if (score >= PCMK_SCORE_INFINITY) {
92 strcpy(score_s, PCMK_VALUE_INFINITY);
93
94 } else if (score <= -PCMK_SCORE_INFINITY) {
95 strcpy(score_s, PCMK_VALUE_MINUS_INFINITY);
96
97 } else {
98 // Range is limited to +/-1000000, so no chance of overflow
99 snprintf(score_s, sizeof(score_s), "%d", score);
100 }
101
102 return score_s;
103}
104
115int
116pcmk__add_scores(int score1, int score2)
117{
118 /* As long as PCMK_SCORE_INFINITY is less than half of the maximum integer,
119 * we can ignore the possibility of integer overflow.
120 */
121 int result = score1 + score2;
122
123 // First handle the cases where one or both is infinite
124 if ((score1 <= -PCMK_SCORE_INFINITY) || (score2 <= -PCMK_SCORE_INFINITY)) {
125 return -PCMK_SCORE_INFINITY;
126 }
127 if ((score1 >= PCMK_SCORE_INFINITY) || (score2 >= PCMK_SCORE_INFINITY)) {
128 return PCMK_SCORE_INFINITY;
129 }
130
131 // Bound result to infinity.
133 return PCMK_SCORE_INFINITY;
134 }
135 if (result <= -PCMK_SCORE_INFINITY) {
136 return -PCMK_SCORE_INFINITY;
137 }
138
139 return result;
140}
141
142// Deprecated functions kept only for backward API compatibility
143// LCOV_EXCL_START
144
146
147char *
148score2char(int score)
149{
150 return pcmk__str_copy(pcmk_readable_score(score));
151}
152
153char *
154score2char_stack(int score, char *buf, size_t len)
155{
156 CRM_CHECK((buf != NULL) && (len >= sizeof(PCMK_VALUE_MINUS_INFINITY)),
157 return NULL);
158 strcpy(buf, pcmk_readable_score(score));
159 return buf;
160}
161
162// LCOV_EXCL_STOP
163// End deprecated API
bool pcmk_str_is_infinity(const char *s)
Definition utils.c:452
bool pcmk_str_is_minus_infinity(const char *s)
Definition utils.c:458
#define CRM_CHECK(expr, failure_action)
Definition logging.h:245
#define PCMK_VALUE_MINUS_INFINITY
Definition options.h:173
#define PCMK_VALUE_YELLOW
Definition options.h:221
#define PCMK_VALUE_GREEN
Definition options.h:157
#define PCMK_VALUE_RED
Definition options.h:197
#define PCMK_VALUE_INFINITY
Definition options.h:163
pcmk__action_result_t result
Definition pcmk_fence.c:35
int pcmk__score_yellow
Definition scores.c:22
char * score2char_stack(int score, char *buf, size_t len)
Definition scores.c:154
int pcmk__add_scores(int score1, int score2)
Definition scores.c:116
const char * pcmk_readable_score(int score)
Return a displayable static string for a score value.
Definition scores.c:86
char * score2char(int score)
Definition scores.c:148
int char2score(const char *score)
Get the integer value of a score string.
Definition scores.c:36
int pcmk__score_green
Definition scores.c:21
int pcmk__score_red
Definition scores.c:20
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
Definition scores.h:24
Deprecated Pacemaker score APIs.
int pcmk__scan_ll(const char *text, long long *result, long long default_value)
Definition strings.c:97
@ pcmk__str_casei
#define pcmk__str_copy(str)