telemetryd_CFLAGS = \
$(AM_CFLAGS) \
$(RRD_CFLAGS) \
- $(SYSTEMD_CFLAGS)
+ $(SYSTEMD_CFLAGS) \
+ $(UDEV_CFLAGS)
telemetryd_LDFLAGS = \
$(AM_LDFLAGS) \
$(RRD_LDFLAGS) \
- $(SYSTEMD_LDFLAGS)
+ $(SYSTEMD_LDFLAGS) \
+ $(UDEV_LDFLAGS)
telemetryd_LDADD = \
$(RRD_LIBS) \
- $(SYSTEMD_LIBS)
+ $(SYSTEMD_LIBS) \
+ $(UDEV_LIBS)
# ------------------------------------------------------------------------------
# Check for core dependencies
PKG_CHECK_MODULES([RRD], [librrd])
PKG_CHECK_MODULES([SYSTEMD], [libsystemd])
+PKG_CHECK_MODULES([UDEV], [libudev])
# libatasmart
PKG_CHECK_MODULES([LIBATASMART], [libatasmart >= 0.19],
#include <stdlib.h>
#include <string.h>
+#include <libudev.h>
#include <systemd/sd-daemon.h>
#include <systemd/sd-event.h>
// Graphs
td_graphs* graphs;
+
+ // udev
+ struct udev* udev;
};
static int td_daemon_init(sd_event_source* source, void* data) {
return 0;
}
+static int td_daemon_setup_udev(td_daemon* self) {
+ // Connect to udev
+ self->udev = udev_new();
+ if (!self->udev) {
+ ERROR(self->ctx, "Failed to setup udev context: %m\n");
+ return -errno;
+ }
+
+ // Log success
+ DEBUG(self->ctx, "Connected to udev\n");
+
+ return 0;
+}
+
static void td_daemon_free(td_daemon* self) {
if (self->events.sigchld)
sd_event_source_unref(self->events.sigchld);
td_graphs_unref(self->graphs);
if (self->queue)
td_queue_unref(self->queue);
+ if (self->udev)
+ udev_unref(self->udev);
if (self->ctx)
td_ctx_unref(self->ctx);
if (self->loop)
if (r < 0)
goto ERROR;
+ // Connect to udev
+ r = td_daemon_setup_udev(self);
+ if (r < 0)
+ goto ERROR;
+
// Return the pointer
*daemon = self;
return 0;
return sd_event_ref(self->loop);
}
+struct udev* td_daemon_get_udev(td_daemon* self) {
+ return udev_ref(self->udev);
+}
+
td_sources* td_daemon_get_sources(td_daemon* self) {
if (self->sources)
return td_sources_ref(self->sources);
#ifndef TELEMETRY_DAEMON_H
#define TELEMETRY_DAEMON_H
+#include <libudev.h>
#include <systemd/sd-event.h>
typedef struct td_daemon td_daemon;
td_daemon* td_daemon_unref(td_daemon* daemon);
sd_event* td_daemon_loop(td_daemon* self);
+struct udev* td_daemon_get_udev(td_daemon* self);
td_sources* td_daemon_get_sources(td_daemon* self);
td_graphs* td_daemon_get_graphs(td_daemon* self);
return __r; \
} while(0)
+#define GRAPH_TITLE(args, format, ...) SCRIPT(args, "--title=" format, __VA_ARGS__)
+
#define EMPTY_LINE "COMMENT: \\n"
// Labels are 30 characters wide
#include <rrd.h>
+#include <libudev.h>
#include <systemd/sd-event.h>
#include "args.h"
return self->impl->name;
}
+struct udev* td_source_get_udev(td_source* self) {
+ return td_daemon_get_udev(self->daemon);
+}
+
int td_source_create_command(td_source* self, td_command** command) {
return td_command_create(command, self->ctx, self->daemon);
}
#ifndef TELEMETRY_SOURCE_H
#define TELEMETRY_SOURCE_H
+#include <libudev.h>
+
typedef struct td_source td_source;
#include "args.h"
const char* td_source_name(td_source* self);
+struct udev* td_source_get_udev(td_source* self);
+
int td_source_create_command(td_source* self, td_command** command);
int td_source_submit(td_source* self, const char* object,