*/
#include <stdio.h>
+#include <poll.h>
#include <systemd/sd-bus.h>
+ #include <systemd/sd-event.h>
+ #include <signal.h>
+ #include "audit.h"
+
+ static int terminate = 0;
+
+ int sigint_handler(sd_event_source *s,
+ const struct signalfd_siginfo *si,
+ void *userdata)
+ {
+ terminate = 1;
+ return 0;
+ }
+#if 0
+#include <stdbool.h>
+typedef uint64_t usec_t;
+/* The pointers in the linked list's items. Use this in the item structure */
+#define LIST_FIELDS(t,name) \
+ t *name##_next, *name##_prev
+
+typedef enum WakeupType {
+ WAKEUP_NONE,
+ WAKEUP_EVENT_SOURCE,
+ WAKEUP_CLOCK_DATA,
+ WAKEUP_SIGNAL_DATA,
+ _WAKEUP_TYPE_MAX,
+ _WAKEUP_TYPE_INVALID = -1,
+} WakeupType;
+
+typedef enum EventSourceType {
+ SOURCE_IO,
+ SOURCE_TIME_REALTIME,
+ SOURCE_TIME_BOOTTIME,
+ SOURCE_TIME_MONOTONIC,
+ SOURCE_TIME_REALTIME_ALARM,
+ SOURCE_TIME_BOOTTIME_ALARM,
+ SOURCE_SIGNAL,
+ SOURCE_CHILD,
+ SOURCE_DEFER,
+ SOURCE_POST,
+ SOURCE_EXIT,
+ SOURCE_WATCHDOG,
+ _SOURCE_EVENT_SOURCE_TYPE_MAX,
+ _SOURCE_EVENT_SOURCE_TYPE_INVALID = -1
+} EventSourceType;
+
+struct sd_event_source {
+ WakeupType wakeup;
+
+ unsigned n_ref;
+
+ sd_event *event;
+ void *userdata;
+ sd_event_handler_t prepare;
+
+ char *description;
+
+ EventSourceType type:5;
+ int enabled:3;
+ bool pending:1;
+ bool dispatching:1;
+ bool floating:1;
+
+ int64_t priority;
+ unsigned pending_index;
+ unsigned prepare_index;
+ uint64_t pending_iteration;
+ uint64_t prepare_iteration;
+
+ LIST_FIELDS(sd_event_source, sources);
+
+ union {
+ struct {
+ sd_event_io_handler_t callback;
+ int fd;
+ uint32_t events;
+ uint32_t revents;
+ bool registered:1;
+ } io;
+ struct {
+ sd_event_time_handler_t callback;
+ usec_t next, accuracy;
+ unsigned earliest_index;
+ unsigned latest_index;
+ } time;
+ struct {
+ sd_event_signal_handler_t callback;
+ struct signalfd_siginfo siginfo;
+ int sig;
+ } signal;
+ struct {
+ sd_event_child_handler_t callback;
+ siginfo_t siginfo;
+ pid_t pid;
+ int options;
+ } child;
+ struct {
+ sd_event_handler_t callback;
+ } defer;
+ struct {
+ sd_event_handler_t callback;
+ } post;
+ struct {
+ sd_event_handler_t callback;
+ unsigned prioq_index;
+ } exit;
+ };
+};
+#endif
int dbus_handler(sd_event_source *s, int fd, uint32_t revents, void *userdata);
int dbus_handler(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
return -1;
}
+#if 1
+ rc = sd_event_add_io(loop,
+ &source,
+ sd_bus_get_fd(bus),
+ POLLIN,
+ dbus_handler, (void*)bus);
+ if (rc < 0) {
+ fprintf(stderr, "Cannot add bus event source.\n");
+ }
+#else
+ /* If there is way to register a catch-all handler */
+ sd_bus_attach_event(bus, loop, SD_EVENT_PRIORITY_NORMAL);
+#endif
+ sigemptyset(&ss);
+ sigaddset(&ss, SIGINT);
+ rc = sigprocmask(SIG_BLOCK, &ss, NULL);
+ rc = sd_event_add_signal(loop, NULL, SIGINT, sigint_handler, NULL);
+
+
+ // sd_event_add_io(loop, NULL, sd_bus_get_fd(bus), EPOLLIN | EPOLLOUT, dbus_handler, (void*)bus);
+ aufd = faultd_audit_init(loop);
printf("Hello world!\n");
+
+#if 0
for (;;) {
+ rc = sd_event_get_state(loop);
+ if (rc < 0)
+ return rc;
+ if (rc == SD_EVENT_FINISHED)
+ return 0;
+
rc = sd_event_run(loop, (uint64_t) -1);
if (rc < 0) {
fprintf(stderr, "Failed to wait on the bus.\n");
break;
}
+ fprintf(stdout, ",");
+ fflush(stdout);
+
+ if (terminate) {
+ printf("Closing...\n");
+ break;
+ }
}
+#else
+ sd_event_loop(loop);
+#endif
sd_bus_close(bus);
+ faultd_audit_close(aufd);
return 0;
}