pacemaker  2.1.8-3980678f03
Scalable High-Availability cluster resource manager
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 
35 int
36 char2score(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)) {
45  return PCMK_SCORE_INFINITY;
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) {
61  return 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 
85 const 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 
115 int
116 pcmk__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.
132  if (result >= PCMK_SCORE_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 
147 char *
148 score2char(int score)
149 {
150  return pcmk__str_copy(pcmk_readable_score(score));
151 }
152 
153 char *
154 score2char_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
#define CRM_CHECK(expr, failure_action)
Definition: logging.h:245
#define PCMK_VALUE_GREEN
Definition: options.h:157
#define PCMK_VALUE_MINUS_INFINITY
Definition: options.h:173
#define PCMK_VALUE_INFINITY
Definition: options.h:163
int pcmk__add_scores(int score1, int score2)
Definition: scores.c:116
int pcmk__score_yellow
Definition: scores.c:22
int char2score(const char *score)
Get the integer value of a score string.
Definition: scores.c:36
int pcmk__scan_ll(const char *text, long long *result, long long default_value)
Definition: strings.c:97
#define PCMK_VALUE_RED
Definition: options.h:197
int pcmk__score_red
Definition: scores.c:20
int pcmk__score_green
Definition: scores.c:21
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
bool pcmk_str_is_infinity(const char *s)
Definition: utils.c:452
#define pcmk__str_copy(str)
pcmk__action_result_t result
Definition: pcmk_fence.c:35
bool pcmk_str_is_minus_infinity(const char *s)
Definition: utils.c:458
Deprecated Pacemaker score APIs.
#define PCMK_VALUE_YELLOW
Definition: options.h:221
char * score2char_stack(int score, char *buf, size_t len)
Definition: scores.c:154
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
Definition: scores.h:24