19 #include <sys/types.h>
25 snprintf(buffer, len,
"%d", an_int);
34 long long result = -1;
35 char *local_end_text = NULL;
42 if (end_text != NULL) {
43 result = strtol(text, end_text, 10);
45 result = strtol(text, &local_end_text, 10);
48 if (end_text != NULL) {
49 result = strtoll(text, end_text, 10);
51 result = strtoll(text, &local_end_text, 10);
56 if (errno == EINVAL) {
57 crm_err(
"Conversion of %s failed", text);
60 }
else if (errno == ERANGE) {
61 crm_err(
"Conversion of %s was clipped: %lld", text, result);
63 }
else if (errno != 0) {
64 crm_perror(LOG_ERR,
"Conversion of %s failed", text);
67 if (local_end_text != NULL && local_end_text[0] !=
'\0') {
68 crm_err(
"Characters left over after parsing '%s': '%s'", text, local_end_text);
90 crm_err(
"No default conversion value supplied");
111 if ((result < INT_MIN) || (result > INT_MAX)) {
132 if ((ms < 0) || (ms > G_MAXUINT)) {
135 return errno? 0 : (guint) ms;
146 }
else if (a == NULL || b == NULL) {
149 }
else if (strcasecmp(a, b) == 0) {
158 gboolean ret = FALSE;
172 }
else if (strcasecmp(s,
"true") == 0
173 || strcasecmp(s,
"on") == 0
174 || strcasecmp(s,
"yes") == 0 || strcasecmp(s,
"y") == 0 || strcasecmp(s,
"1") == 0) {
178 }
else if (strcasecmp(s,
"false") == 0
179 || strcasecmp(s,
"off") == 0
180 || strcasecmp(s,
"no") == 0 || strcasecmp(s,
"n") == 0 || strcasecmp(s,
"0") == 0) {
196 for (len = strlen(str) - 1; len >= 0 && str[len] ==
'\n'; len--) {
207 return g_strcmp0(a, b) == 0;
213 }
else if (a == NULL || b == NULL) {
217 }
else if (strcasecmp(a, b) == 0) {
223 static inline const char * null2emptystr(
const char *);
224 static inline const char *
225 null2emptystr(
const char *input)
227 return (input == NULL) ?
"" : input;
246 const char *p = prefix;
259 static inline int crm_ends_with_internal(
const char *,
const char *, gboolean);
261 crm_ends_with_internal(
const char *s,
const char *match, gboolean as_extension)
263 if ((s == NULL) || (match == NULL)) {
271 return !strcmp(null2emptystr(strrchr(s, match[0])), match);
273 if ((mlen = strlen(match)) == 0)
276 return ((slen >= mlen) && !strcmp(s + slen - mlen, match));
295 return crm_ends_with_internal(s, match, FALSE);
324 return crm_ends_with_internal(s, match, TRUE);
343 const signed char *p;
346 for (p = v; *p !=
'\0'; p++)
347 h = (h << 5) - h + *p;
356 return crm_str_eq((
const char *) a, (
const char *) b, FALSE);
362 const signed char *p;
365 for (p = v; *p !=
'\0'; p++)
366 h = (h << 5) - h + g_ascii_tolower(*p);
372 copy_str_table_entry(gpointer key, gpointer value, gpointer user_data)
374 if (key && value && user_data) {
375 g_hash_table_insert((GHashTable*)user_data, strdup(key), strdup(value));
382 GHashTable *new_table = NULL;
385 new_table = crm_str_table_new();
386 g_hash_table_foreach(old_table, copy_str_table_entry, new_table);
404 len += strlen(value);
405 list = realloc_safe(list, len);
406 sprintf(list + last,
" %s", value);
414 char *compressed = NULL;
415 char *uncompressed = strdup(
data);
416 #ifdef CLOCK_MONOTONIC
417 struct timespec after_t;
418 struct timespec before_t;
422 max = (length * 1.1) + 600;
425 #ifdef CLOCK_MONOTONIC
426 clock_gettime(CLOCK_MONOTONIC, &before_t);
429 compressed = calloc(max,
sizeof(
char));
433 rc = BZ2_bzBuffToBuffCompress(compressed, result_len, uncompressed, length,
CRM_BZ2_BLOCKS, 0,
439 crm_err(
"Compression of %d bytes failed: %s " CRM_XS " bzerror=%d",
445 #ifdef CLOCK_MONOTONIC
446 clock_gettime(CLOCK_MONOTONIC, &after_t);
448 crm_trace(
"Compressed %d bytes into %d (ratio %d:1) in %.0fms",
449 length, *result_len, length / (*result_len),
450 difftime (after_t.tv_sec, before_t.tv_sec) * 1000 +
451 (after_t.tv_nsec - before_t.tv_nsec) / 1e6);
453 crm_trace(
"Compressed %d bytes into %d (ratio %d:1)",
454 length, *result_len, length / (*result_len));
457 *result = compressed;
482 return strcasecmp(a, b);
492 va_start(ap, format);
493 len = vasprintf (&
string, format, ap);