Expose meta_data_toc function in utils_cache.
packages:
- curl
- glib
- - grpc
- hiredis
- libdbi
- libmemcached
if test $? -ne 0; then
with_libpython="no"
fi
- LIBPYTHON_LDFLAGS="`${PYTHON_CONFIG} --ldflags`"
+ LIBPYTHON_LDFLAGS="`${PYTHON_CONFIG} --ldflags --embed`" || LIBPYTHON_LDFLAGS="`${PYTHON_CONFIG} --ldflags`"
if test $? -ne 0; then
with_libpython="no"
fi
sstrncpy(tmp_plugin_instance, agg->ident.plugin_instance,
sizeof(tmp_plugin_instance));
+ // Both tmp_plugin and tmp_plugin_instance are empty.
if ((strcmp("", tmp_plugin) == 0) && (strcmp("", tmp_plugin_instance) == 0))
sstrncpy(inst->ident.plugin_instance, AGG_FUNC_PLACEHOLDER,
sizeof(inst->ident.plugin_instance));
- else if (strcmp("", tmp_plugin) != 0)
+ // tmp_plugin is non-empty, and tmp_plugin_instance is empty.
+ else if (strcmp("", tmp_plugin_instance) == 0)
ssnprintf(inst->ident.plugin_instance,
sizeof(inst->ident.plugin_instance), "%s-%s", tmp_plugin,
AGG_FUNC_PLACEHOLDER);
- else if (strcmp("", tmp_plugin_instance) != 0)
+ // tmp_plugin is empty, and tmp_plugin_instance is non-empty.
+ else if (strcmp("", tmp_plugin) == 0)
ssnprintf(inst->ident.plugin_instance,
sizeof(inst->ident.plugin_instance), "%s-%s",
tmp_plugin_instance, AGG_FUNC_PLACEHOLDER);
+ // Both tmp_plugin and tmp_plugin_instance are non-empty.
else
ssnprintf(inst->ident.plugin_instance,
sizeof(inst->ident.plugin_instance), "%s-%s-%s", tmp_plugin,
else if (strcasecmp("Format", child->key) == 0) {
char *key = NULL;
status = cf_util_get_string(child, &key);
- if (status != 0)
+ if (status != 0) {
+ amqp1_config_instance_free(instance);
return status;
+ }
assert(key != NULL);
if (strcasecmp(key, "Command") == 0) {
instance->format = AMQP1_FORMAT_COMMAND;
status = ssnprintf(tpname, sizeof(tpname), "amqp1/%s", instance->name);
if ((status < 0) || (size_t)status >= sizeof(tpname)) {
ERROR("amqp1 plugin: Instance name would have been truncated.");
+ amqp1_config_instance_free(instance);
return -1;
}
status = ssnprintf(instance->send_to, sizeof(instance->send_to), "/%s/%s",
transport->address, instance->name);
if ((status < 0) || (size_t)status >= sizeof(instance->send_to)) {
ERROR("amqp1 plugin: send_to address would have been truncated.");
+ amqp1_config_instance_free(instance);
return -1;
}
if (instance->notify) {
snprintf(filename, sizeof(filename), "%s/%s/%s", dir, power_supply, basename);
- status = (int)read_file_contents(filename, buffer, buffer_size - 1);
+ status = (int)read_text_file_contents(filename, buffer, buffer_size);
if (status < 0)
return status;
- buffer[status] = '\0';
-
strstripnewline(buffer);
return 0;
} /* }}} int sysfs_file_to_buffer */
#include <sys/sysinfo.h>
#endif /* HAVE_LIBKSTAT */
-#if (defined(HAVE_SYSCTL) && HAVE_SYSCTL) || \
- (defined(HAVE_SYSCTLBYNAME) && HAVE_SYSCTLBYNAME)
-#ifdef HAVE_SYS_SYSCTL_H
+#if (defined(HAVE_SYSCTL) && defined(HAVE_SYSCTLBYNAME)) || defined(__OpenBSD__)
+/* Implies BSD variant */
#include <sys/sysctl.h>
#endif
#ifdef HAVE_SYS_DKSTAT_H
+/* implies BSD variant */
#include <sys/dkstat.h>
-#endif
#if !defined(CP_USER) || !defined(CP_NICE) || !defined(CP_SYS) || \
!defined(CP_INTR) || !defined(CP_IDLE) || !defined(CPUSTATES)
#define CP_IDLE 4
#define CPUSTATES 5
#endif
-#endif /* HAVE_SYSCTL || HAVE_SYSCTLBYNAME */
+#endif /* HAVE_SYS_DKSTAT_H */
-#if HAVE_SYSCTL
+#define CAN_USE_SYSCTL 0
+#if (defined(HAVE_SYSCTL) && defined(HAVE_SYSCTLBYNAME)) || defined(__OpenBSD__)
+/* Implies BSD variant */
#if defined(CTL_HW) && defined(HW_NCPU) && defined(CTL_KERN) && \
defined(KERN_CPTIME) && defined(CPUSTATES)
#define CAN_USE_SYSCTL 1
-#else
-#define CAN_USE_SYSCTL 0
-#endif
-#else
-#define CAN_USE_SYSCTL 0
#endif
+#endif /* HAVE_SYSCTL_H && HAVE_SYSCTLBYNAME || __OpenBSD__ */
#define COLLECTD_CPU_STATE_USER 0
#define COLLECTD_CPU_STATE_SYSTEM 1
/* #endif HAVE_LIBKSTAT */
#elif CAN_USE_SYSCTL
+/* Only possible for (Open) BSD variant */
static int numcpu;
/* #endif CAN_USE_SYSCTL */
#elif defined(HAVE_SYSCTLBYNAME)
+/* Implies BSD variant */
static int numcpu;
#ifdef HAVE_SYSCTL_KERN_CP_TIMES
static int maxcpu;
/* #endif HAVE_LIBKSTAT */
#elif CAN_USE_SYSCTL
+ /* Only on (Open) BSD variant */
size_t numcpu_size;
int mib[2] = {CTL_HW, HW_NCPU};
int status;
/* #endif CAN_USE_SYSCTL */
#elif defined(HAVE_SYSCTLBYNAME)
+ /* Only on BSD varient */
size_t numcpu_size;
numcpu_size = sizeof(numcpu);
/* }}} #endif defined(HAVE_LIBKSTAT) */
#elif CAN_USE_SYSCTL /* {{{ */
+ /* Only on (Open) BSD variant */
uint64_t cpuinfo[numcpu][CPUSTATES];
size_t cpuinfo_size;
int status;
#elif defined(HAVE_SYSCTLBYNAME) && defined(HAVE_SYSCTL_KERN_CP_TIMES) /* {{{ \
*/
+ /* Only on BSD variant */
long cpuinfo[maxcpu][CPUSTATES];
size_t cpuinfo_size;
/* }}} #endif HAVE_SYSCTL_KERN_CP_TIMES */
#elif defined(HAVE_SYSCTLBYNAME) /* {{{ */
+ /* Only on BSD variant */
long cpuinfo[CPUSTATES];
size_t cpuinfo_size;
}
}
+ /* Try to be backward-compatible with previous versions */
+ if (ci->children_num == 0)
+ return 0;
+
/* Hm, no complex plugin found. Dispatch the values one by one */
cf_callback_t *cf_cb = cf_search(plugin_name);
if (cf_cb == NULL) {
#include "plugin.h"
#include "utils/common/common.h"
-#ifdef HAVE_SYS_SYSCTL_H
+#if (defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME)) || \
+ defined(__OpenBSD__)
+/* Implies BSD variant */
#include <sys/sysctl.h>
#endif
#ifdef HAVE_SYS_VMMETER_H
static kstat_t *ksz;
/* #endif HAVE_LIBKSTAT */
-#elif HAVE_SYSCTL
+#elif HAVE_SYSCTL && __OpenBSD__
+/* OpenBSD variant does not have sysctlbyname */
static int pagesize;
-/* #endif HAVE_SYSCTL */
+/* #endif HAVE_SYSCTL && __OpenBSD__ */
#elif HAVE_LIBSTATGRAB
/* no global variables */
/* #endif HAVE_LIBKSTAT */
-#elif HAVE_SYSCTL
+#elif HAVE_SYSCTL && __OpenBSD__
+ /* OpenBSD variant does not have sysctlbyname */
pagesize = getpagesize();
if (pagesize <= 0) {
ERROR("memory plugin: Invalid pagesize: %i", pagesize);
return -1;
}
- /* #endif HAVE_SYSCTL */
+ /* #endif HAVE_SYSCTL && __OpenBSD__ */
#elif HAVE_LIBSTATGRAB
/* no init stuff */
(gauge_t)arcsize, "unusable", (gauge_t)mem_unus);
/* #endif HAVE_LIBKSTAT */
-#elif HAVE_SYSCTL
+#elif HAVE_SYSCTL && __OpenBSD__
+ /* OpenBSD variant does not have HAVE_SYSCTLBYNAME */
int mib[] = {CTL_VM, VM_METER};
struct vmtotal vmtotal = {0};
gauge_t mem_active;
MEMORY_SUBMIT("active", mem_active, "inactive", mem_inactive, "free",
mem_free);
- /* #endif HAVE_SYSCTL */
+ /* #endif HAVE_SYSCTL && __OpenBSD__ */
#elif HAVE_LIBSTATGRAB
sg_mem_stats *ios;
*bind_address = malloc(sizeof(**bind_address));
if (*bind_address == NULL) {
ERROR("network plugin: network_config_set_bind_address: malloc failed.");
+ freeaddrinfo(res);
return -1;
}
(*bind_address)->ss_family = res->ai_family;
snprintf(filename, sizeof(filename), "/proc/%li/stat", pid);
- status = read_file_contents(filename, buffer, sizeof(buffer) - 1);
+ status = read_text_file_contents(filename, buffer, sizeof(buffer));
if (status <= 0)
return -1;
buffer_len = (size_t)status;
- buffer[buffer_len] = 0;
/* The name of the process is enclosed in parens. Since the name can
* contain parens itself, spaces, numbers and pretty much everything
snprintf(path, sizeof(path), "/proc/%li/psinfo", pid);
- status = read_file_contents(path, (void *)&info, sizeof(info));
+ status = read_file_contents(path, &info, sizeof(info));
if ((status < 0) || (((size_t)status) != sizeof(info))) {
ERROR("processes plugin: Unexpected return value "
"while reading \"%s\": "
#if HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
-#if HAVE_SYS_SYSCTL_H
+#if (defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME)) || \
+ defined(__OpenBSD__)
+/* implies BSD variant */
#include <sys/sysctl.h>
#endif
#if HAVE_SYS_DKSTAT_H
if ((len < 0) || ((size_t)len >= sizeof(filename)))
return -1;
- len = (ssize_t)read_file_contents(filename, data, sizeof(data));
+ len = (ssize_t)read_text_file_contents(filename, data, sizeof(data));
if ((len > 0) && ((size_t)len > sizeof(str_temp)) && (data[--len] == '\n') &&
(!strncmp(data, str_temp, sizeof(str_temp) - 1))) {
char *endptr = NULL;
parse_int_file(const char *fmt, ...) {
va_list args;
char path[PATH_MAX];
+ char buf[256];
int len;
+ value_t v;
+ char *c;
+ FILE *fp;
va_start(args, fmt);
len = vsnprintf(path, sizeof(path), fmt, args);
return -1;
}
- value_t v;
- if (parse_value_file(path, &v, DS_TYPE_DERIVE) != 0) {
+ fp = fopen(path, "r");
+ if (fp == NULL) {
+ ERROR("turbostat plugin: unable to open: '%s': %s", path, strerror(errno));
+ return -1;
+ }
+
+ if (fgets(buf, sizeof(buf), fp) == NULL) {
+ ERROR("turbostat plugin: unable to read: '%s': %s", path, strerror(errno));
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
+
+ /* We only care about the first integer in the range */
+ c = strchr(buf, '-');
+ if (c != NULL)
+ *c = '\0';
+ c = strchr(buf, ',');
+ if (c != NULL)
+ *c = '\0';
+ strstripnewline(buf);
+
+ if (parse_value(buf, &v, DS_TYPE_DERIVE) != 0) {
ERROR("turbostat plugin: Parsing \"%s\" failed.", path);
return -1;
}
return 0;
}
-ssize_t read_file_contents(const char *filename, char *buf, size_t bufsize) {
+ssize_t read_file_contents(const char *filename, void *buf, size_t bufsize) {
FILE *fh;
ssize_t ret;
return ret;
}
+ssize_t read_text_file_contents(const char *filename, char *buf,
+ size_t bufsize) {
+ ssize_t ret = read_file_contents(filename, buf, bufsize - 1);
+ if (ret < 0)
+ return ret;
+
+ buf[ret] = '\0';
+ return ret + 1;
+}
+
counter_t counter_diff(counter_t old_value, counter_t new_value) {
counter_t diff;
int walk_directory(const char *dir, dirwalk_callback_f callback,
void *user_data, int hidden);
/* Returns the number of bytes read or negative on error. */
-ssize_t read_file_contents(char const *filename, char *buf, size_t bufsize);
+ssize_t read_file_contents(char const *filename, void *buf, size_t bufsize);
+/* Writes the contents of the file into the buffer with a trailing NUL.
+ * Returns the number of bytes written to the buffer or negative on error. */
+ssize_t read_text_file_contents(char const *filename, char *buf,
+ size_t bufsize);
counter_t counter_diff(counter_t old_value, counter_t new_value);
#include "plugin.h"
#include "utils/common/common.h"
-#if HAVE_SYS_SYSCTL_H
+#if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) || \
+ defined(__OpenBSD__)
+/* Implies have BSD variant */
#include <sys/sysctl.h>
#endif