29 #include <sys/types.h>
32 crm_concat(
const char *prefix,
const char *suffix,
char join)
39 len = strlen(prefix) + strlen(suffix) + 2;
41 new_str = malloc(len);
43 sprintf(new_str,
"%s%c%s", prefix, join, suffix);
53 snprintf(buffer, len,
"%d", an_int);
65 buffer = malloc(len + 1);
67 snprintf(buffer, len,
"%d", an_int);
82 long long result = -1;
83 char *local_end_text = NULL;
90 if (end_text != NULL) {
91 result = strtol(text, end_text, 10);
93 result = strtol(text, &local_end_text, 10);
96 if (end_text != NULL) {
97 result = strtoll(text, end_text, 10);
99 result = strtoll(text, &local_end_text, 10);
104 if (errno == EINVAL) {
105 crm_err(
"Conversion of %s failed", text);
108 }
else if (errno == ERANGE) {
109 crm_err(
"Conversion of %s was clipped: %lld", text, result);
111 }
else if (errno != 0) {
112 crm_perror(LOG_ERR,
"Conversion of %s failed", text);
115 if (local_end_text != NULL && local_end_text[0] !=
'\0') {
116 crm_err(
"Characters left over after parsing '%s': '%s'", text, local_end_text);
127 int atoi_result = -1;
136 if (default_text != NULL) {
143 crm_err(
"No default conversion value supplied");
155 }
else if (a == NULL || b == NULL) {
158 }
else if (strcasecmp(a, b) == 0) {
167 gboolean ret = FALSE;
181 }
else if (strcasecmp(s,
"true") == 0
182 || strcasecmp(s,
"on") == 0
183 || strcasecmp(s,
"yes") == 0 || strcasecmp(s,
"y") == 0 || strcasecmp(s,
"1") == 0) {
187 }
else if (strcasecmp(s,
"false") == 0
188 || strcasecmp(s,
"off") == 0
189 || strcasecmp(s,
"no") == 0 || strcasecmp(s,
"n") == 0 || strcasecmp(s,
"0") == 0) {
205 for (len = strlen(str) - 1; len >= 0 && str[len] ==
'\n'; len--) {
216 return g_strcmp0(a, b) == 0;
222 }
else if (a == NULL || b == NULL) {
226 }
else if (strcasecmp(a, b) == 0) {
244 if ((s == NULL) || (match == NULL)) {
247 size_t slen = strlen(s);
248 size_t mlen = strlen(match);
250 return ((slen >= mlen) && !strcmp(s + slen - mlen, match));
270 const signed char *p;
273 for (p = v; *p !=
'\0'; p++)
274 h = (h << 5) - h + *p;
282 const signed char *p;
285 for (p = v; *p !=
'\0'; p++)
286 h = (h << 5) - h + g_ascii_tolower(*p);
304 len += strlen(value);
305 list = realloc_safe(list, len);
306 sprintf(list + last,
" %s", value);
314 char *compressed = NULL;
315 char *uncompressed = strdup(data);
316 struct timespec after_t;
317 struct timespec before_t;
320 max = (length * 1.1) + 600;
323 #ifdef CLOCK_MONOTONIC
324 clock_gettime(CLOCK_MONOTONIC, &before_t);
328 compressed = malloc(max);
331 rc = BZ2_bzBuffToBuffCompress(compressed, result_len, uncompressed, length,
CRM_BZ2_BLOCKS, 0,
342 #ifdef CLOCK_MONOTONIC
343 clock_gettime(CLOCK_MONOTONIC, &after_t);
345 crm_info(
"Compressed %d bytes into %d (ratio %d:1) in %dms",
346 length, *result_len, length / (*result_len),
347 (after_t.tv_sec - before_t.tv_sec) * 1000 + (after_t.tv_nsec -
348 before_t.tv_nsec) / 1000000);
350 crm_info(
"Compressed %d bytes into %d (ratio %d:1)",
351 length, *result_len, length / (*result_len));
354 *result = compressed;
bool crm_compress_string(const char *data, int length, int max, char **result, unsigned int *result_len)
long long crm_int_helper(const char *text, char **end_text)
gboolean crm_ends_with(const char *s, const char *match)
guint g_str_hash_traditional(gconstpointer v)
char * add_list_element(char *list, const char *value)
void g_hash_destroy_str(gpointer data)
char * crm_itoa_stack(int an_int, char *buffer, size_t len)
int crm_str_to_boolean(const char *s, int *ret)
char * crm_strip_trailing_newline(char *str)
gboolean crm_is_true(const char *s)
gboolean crm_str_eq(const char *a, const char *b, gboolean use_case)
int crm_parse_int(const char *text, const char *default_text)
#define crm_perror(level, fmt, args...)
Log a system error message.
#define crm_err(fmt, args...)
const char * bz2_strerror(int rc)
char * crm_itoa(int an_int)
gboolean safe_str_neq(const char *a, const char *b)
guint crm_strcase_hash(gconstpointer v)
char * crm_concat(const char *prefix, const char *suffix, char join)
#define crm_info(fmt, args...)