-include $(top_builddir)/config.h \
-DSYSCONFDIR=\""$(sysconfdir)"\" \
-I${top_srcdir}/src \
- -I${top_srcdir}/src/core
+ -I${top_srcdir}/src/core \
+ -I${top_srcdir}/src/event_types \
+ -I${top_srcdir}/src/listeners \
+ -I${top_srcdir}/src/decision_makers
AM_CFLAGS = ${my_CFLAGS}
ssize_t ret__; \
uint64_t buf__; \
ret__ = read((head)->fd, &buf__, sizeof(buf__)); \
- return ret__ > 0 && buf__ > 0 ? queue_pop(&(head)->qhead) : NULL; \
+ ret__ > 0 && buf__ > 0 ? \
+ queue_pop(&(head)->qhead, type, member) : NULL; \
})
#define nqueue_empty(head) queue_empty(&(head)->qhead)
#ifndef FAULTD_UREF_H
#define FAULTD_UREF_H
+#include <assert.h>
+
/* This is not thread safe! */
struct uref {
unsigned refcnt;
* limitations under the License.
*/
#include <malloc.h>
+#include <errno.h>
#include "resource_violation_event.h"
#include "decision_made_event.h"
#include "action.h"
+#include "event_processor.h"
+#include "log.h"
#define MODULE_NAME "resource_violation_decision_maker"
static int rv_make_decision(struct faultd_event_handler *handler)
{
- struct faultd_event *ev = nqueue_pop(handler->evnet_queue,
+ struct faultd_event *ev = nqueue_pop(&handler->event_queue,
struct faultd_event,
nq_node);
struct resource_violation_event *rv_ev = to_resource_violation_event(ev);
struct faultd_event *new_ev;
/* For now this is just hardcoded to restart the service */
- struct dm_ev_data ev_data = {
+ struct dm_event_data ev_data = {
.reason = ev,
.who_made = MODULE_NAME,
.action = FAULTD_ACTION_SERVICE_RESTART_ID,
faultd_event_put(new_ev);
if (!ev_data.action_data) {
log_error("Unable to duplicate service name");
- goto cleanup;
+ return -ENOMEM;
}
ret = faultd_event_create(DECISION_MADE_EVENT_ID, &ev_data, &new_ev);
.event_match = rv_event_match,
.handle_event = rv_make_decision,
- .node = LIST_HEAD_INIT(resource_violation_event_type.node),
+ .node = LIST_HEAD_INIT(resource_violation_event_handler.node),
};
FAULTD_EVENT_HANDLER_REGISTER(resource_violation_event_handler,
- FAULTD_MODULE_TYPE_DECISION_MAKER)
+ resource_violation_eh,
+ FAULTD_MODULE_TYPE_DECISION_MAKER)
* limitations under the License.
*/
+#include <errno.h>
+
#include "event.h"
#include "module.h"
#include "common.h"
{
struct event_factory *efactory = to_event_factory(module);
- assert(list_is_empty(&efactory->types));
+ assert(list_empty(&efactory->types));
}
static struct event_factory event_factory = {
return -EINVAL;
list_add_tail(&new->node, &event_factory.types);
+
+ return 0;
}
void faultd_event_type_unregister(struct faultd_event_type *type)
{
- if (list_is_empty(&type->node))
+ if (list_empty(&type->node))
return;
- list_del_init(type->node);
+ list_del_init(&type->node);
}
int faultd_event_create(const char *type, void *data, struct faultd_event **ev)
{
struct faultd_event_type *ev_type;
- struct faultd_event *ev;
int ret;
if (!type)
return -EINVAL;
list_for_each_entry(ev_type, &event_factory.types, node)
- if (strcmp(ev_type, type) == 0)
+ if (strcmp(ev_type->name, type) == 0)
break;
if (&ev_type->node == &event_factory.types)
return -ENOENT;
{
struct faultd_event *ev = container_of(uref, struct faultd_event, uref);
- if (ev->ops->release)
- ev->ops->release(ev);
+ if (ev->ops.release)
+ ev->ops.release(ev);
}
-int faultd_event_init(struct faultd_event_type *ev_type, pid_t pid,
- char *service_name, struct faultd_event *ev)
+int faultd_event_init(struct faultd_event_type *ev_type,
+ struct faultd_event *ev)
{
int ret;
if (ret)
return ret;
- ev->type = type;
- ev->ops = type->default_ops;
+ ev->type = ev_type;
+ ev->ops = ev_type->default_ops;
uref_init(&ev->uref, release_faultd_event);
INIT_LIST_HEAD(&ev->node);
#define FAULTD_EVENT_H
#include <time.h>
+#include <string.h>
#include "uref.h"
#include "list.h"
+#include "notify_queue.h"
#include "module.h"
struct faultd_event;
struct faultd_event_ops {
char *(*to_string)(struct faultd_event *);
- void release(struct faultd_event *);
+ void (*release)(struct faultd_event *);
};
struct faultd_event_type {
void *data, struct faultd_event **);
/* To be used by event factory */
- struct list_node node;
+ struct list_head node;
};
struct faultd_event {
int faultd_event_type_register(struct faultd_event_type *type);
void faultd_event_type_unregister(struct faultd_event_type *type);
-#define FAULTD_EVENT_TYPE_REGISTER(EVENT_TYPE) \
-static int event_type_init(struct faultd_module *module, sd_event *event_loop) \
+#define FAULTD_EVENT_TYPE_REGISTER(EVENT_TYPE, NAME) \
+static int event_type_ ##NAME## _init(struct faultd_module *module, \
+ sd_event *event_loop) \
{ \
return faultd_event_type_register(&EVENT_TYPE); \
} \
\
-static void event_type_cleanup(struct faultd_module *module) \
+static void event_type_ ##NAME## _cleanup(struct faultd_module *module) \
{ \
faultd_event_type_unregister(&EVENT_TYPE); \
} \
\
-static struct faultd_module event_type_module = { \
- .name = EVENT_TYPE.name, \
+static struct faultd_module event_type_ ##NAME## _module = { \
+ .name = #NAME, \
.type = FAULTD_MODULE_TYPE_EVENT, \
- .init = event_type_init, \
- .cleanup = event_type_cleanup, \
- .node = LIST_HEAD_INIT(event_type_module.node), \
+ .init = event_type_ ##NAME## _init, \
+ .cleanup = event_type_ ##NAME## _cleanup, \
+ .node = LIST_HEAD_INIT(event_type_ ##NAME## _module.node), \
}; \
\
-FAULTD_MODULE_REGISTER(&event_type_module)
+FAULTD_MODULE_REGISTER(&event_type_ ##NAME## _module)
int faultd_event_create(const char *type, void *data, struct faultd_event **ev);
return strcmp(ev->type->name, type) == 0;
}
+static inline char *faultd_event_to_string(struct faultd_event *ev)
+{
+ return ev->ops.to_string(ev);
+}
+
int faultd_event_init(struct faultd_event_type *ev_type,
struct faultd_event *ev);
-void faultd_event_cleanup(struct faultd_event *ev) {}
+static inline void faultd_event_cleanup(struct faultd_event *ev) {}
#endif /* FAULTD_EVENT_H */
int fd, uint32_t revents, void *userdata)
{
struct event_processor *eprocessor = userdata;
- struct faultd_event *ev = nqueue_pop(eprocessor->pending_events,
+ struct faultd_event *ev = nqueue_pop(&eprocessor->pending_events,
struct faultd_event, nq_node);
struct faultd_event_handler *handler;
return ret;
ret = sd_event_add_io(event, &eprocessor->pending_events_sd_source,
- eprocessor->pending_events->fd, EPOLLIN,
+ eprocessor->pending_events.fd, EPOLLIN,
event_processor_callback, eprocessor);
if (ret)
goto cleanup_queue;
static void event_processor_cleanup(struct faultd_module *module)
{
struct event_processor *eprocessor = to_event_processor(module);
+ int ret;
/* We log errors but go forward to cleanup everything we can */
ret = sd_event_source_set_enabled(eprocessor->pending_events_sd_source,
sd_event_source_unref(eprocessor->pending_events_sd_source);
/* TODO: What to do with unhandled events? */
- while (!nqueue_empty(eprocessor->pending_events)) {
- struct faultd_event *ev = nqueue_pop(eprocessor->pending_events,
+ while (!nqueue_empty(&eprocessor->pending_events)) {
+ struct faultd_event *ev = nqueue_pop(&eprocessor->pending_events,
struct faultd_event,
nq_node);
char *str = faultd_event_to_string(ev);
int event_processor_report_event(struct faultd_event *ev)
{
- return nqueue_append(&event_processor->pending_events,
- ev->nq_node);
+ return nqueue_append(&event_processor.pending_events,
+ &ev->nq_node);
}
static int event_processor_handler_callback(sd_event_source *s, int fd,
int event_processor_handler_register(struct faultd_event_handler *handler)
{
+ int ret;
+
if (!handler->event_match || handler->handle_event)
return -EINVAL;
if (ret)
return ret;
- ret = sd_event_add_io(event_processor->loop,
+ ret = sd_event_add_io(event_processor.loop,
&handler->event_queue_sd_source,
- handler->event_queue->fd, EPOLLIN,
+ handler->event_queue.fd, EPOLLIN,
event_processor_handler_callback, handler);
if (ret)
goto cleanup_queue;
- list_add_tail(&handler->node, &event_processor->event_handlers);
+ list_add_tail(&handler->node, &event_processor.event_handlers);
return 0;
return ret;
}
-int event_processor_handler_unregister(struct faultd_event_handler *handler)
+void event_processor_handler_unregister(struct faultd_event_handler *handler)
{
int ret;
sd_event_source_unref(handler->event_queue_sd_source);
/* TODO: What to do with unhandled events? */
- while (!nqueue_empty(handler->event_queue)) {
- struct faultd_event *ev = nqueue_pop(eprocessor->pending_events,
+ while (!nqueue_empty(&handler->event_queue)) {
+ struct faultd_event *ev = nqueue_pop(&event_processor.pending_events,
struct faultd_event,
nq_node);
char *str = faultd_event_to_string(ev);
int event_processor_report_event(struct faultd_event *ev);
int event_processor_handler_register(struct faultd_event_handler *handler);
-int event_processor_handler_unregister(struct faultd_event_handler *handler);
+void event_processor_handler_unregister(struct faultd_event_handler *handler);
-#define FAULTD_EVENT_HANDLER_REGISTER(EVENT_HANDLER, TYPE) \
-static int event_handler_init(struct faultd_module *module, \
+#define FAULTD_EVENT_HANDLER_REGISTER(EVENT_HANDLER, NAME, TYPE) \
+static int event_handler_ ##NAME## _init(struct faultd_module *module, \
sd_event *event_loop) \
{ \
return event_processor_handler_register(&EVENT_HANDLER); \
} \
\
-static void event_handler_cleanup(struct faultd_module *module) \
+static void event_handler_ ##NAME## _cleanup(struct faultd_module *module) \
{ \
event_processor_handler_unregister(&EVENT_HANDLER); \
} \
\
-static struct faultd_module event_handler_module = { \
- .name = EVENT_HANDLER.name, \
+static struct faultd_module event_handler_ ##NAME## _module = { \
+ .name = #NAME, \
.type = TYPE, \
- .init = event_handler_init, \
- .cleanup = event_handler_cleanup, \
- .node = LIST_HEAD_INIT(event_handler_module.node), \
+ .init = event_handler_ ##NAME## _init, \
+ .cleanup = event_handler_ ##NAME## _cleanup, \
+ .node = LIST_HEAD_INIT(event_handler_ ##NAME## _module.node), \
}; \
\
-FAULTD_MODULE_REGISTER(&event_type_module)
+FAULTD_MODULE_REGISTER(&event_handler_ ##NAME## _module)
#endif /* FAULTD_EVENT_PROCESSOR_H */
* limitations under the License.
*/
-#define _GNU_SOURCE
+#define _GNU_SOURCE 1
#include <stdio.h>
#include <errno.h>
+#include <malloc.h>
#include "decision_made_event.h"
to_decision_made_event(ev);
free(dm_ev->who_made);
- free(action);
- if (action_data_release)
- action_data_release(dm_ev->action_data);
+ free(dm_ev->action);
+ if (dm_ev->action_data_release)
+ dm_ev->action_data_release(dm_ev->action_data);
faultd_event_put(dm_ev->reason);
- faultd_event_cleanup(dm_ev->ev);
+ faultd_event_cleanup(&dm_ev->event);
free(dm_ev);
}
struct decision_made_event *dm_ev =
to_decision_made_event(ev);
char *str;
+ int ret;
/* TODO print action data? */
ret = asprintf(&str, "Decision Made Event:"
" Who made: %s"
- " Action: %s"
+ " Action: %s",
dm_ev->who_made,
dm_ev->action);
.node = LIST_HEAD_INIT(decision_made_event_type.node),
};
-FAULTD_EVENT_TYPE_REGISTER(decision_made_event_type)
+FAULTD_EVENT_TYPE_REGISTER(decision_made_event_type, decision_made_et)
char *who_made;
char *action;
/* Action data is shallow copied */
- void *action_data
+ void *action_data;
void (*action_data_release)(void *);
};
#define to_decision_made_event(EVENT) \
- container_of(EVENT, struct resource_decision_made_event, event)
+ container_of(EVENT, struct decision_made_event, event)
#endif /* FAULTD_DECISION_MADE_EVENT_H */
* limitations under the License.
*/
-#define _GNU_SOURCE
+#define _GNU_SOURCE 1
#include <stdio.h>
#include <errno.h>
+#include <malloc.h>
#include "resource_violation_event.h"
void *data, struct faultd_event **ev)
{
struct resource_violation_event *rv_ev;
- struct rv_event_data rv_ev_data = data;
+ struct rv_event_data *rv_ev_data = data;
int ret;
rv_ev = malloc(sizeof(*rv_ev));
goto free_rv_ev;
rv_ev->service = rv_ev_data->service;
- rv_ev->detection_time = rv_ev_data->detection_type;
+ rv_ev->detection_time = rv_ev_data->detection_time;
rv_ev->resource_type = rv_ev_data->resource_type;
return 0;
return ret;
}
-void rv_event_release(struct faultd_event *ev)
+static void rv_event_release(struct faultd_event *ev)
{
struct resource_violation_event *rv_ev =
to_resource_violation_event(ev);
- system_service_cleanup(rv_ev->service);
- faultd_event_cleanup(rv_ev->ev);
+ system_service_cleanup(&rv_ev->service);
+ faultd_event_cleanup(&rv_ev->event);
free(rv_ev);
}
struct resource_violation_event *rv_ev =
to_resource_violation_event(ev);
char *str;
+ int ret;
/* TODO print other fields */
ret = asprintf(&str, "Resource Violation Event:"
" Time: %lld.%.9ld"
" Service: pid: %d, name %s"
" Resource type: %d",
- (long long)rv_ev->event->timestamp.tv_sec,
- rv_ev->event->timestamp.tv_nsec,
+ (long long)rv_ev->event.timestamp.tv_sec,
+ rv_ev->event.timestamp.tv_nsec,
rv_ev->service.pid,
rv_ev->service.name,
rv_ev->resource_type);
.node = LIST_HEAD_INIT(resource_violation_event_type.node),
};
-FAULTD_EVENT_TYPE_REGISTER(resource_violation_event_type)
+FAULTD_EVENT_TYPE_REGISTER(resource_violation_event_type, resource_violation_et)
#include "event.h"
#include "common.h"
+#include "service.h"
#define RESOURCE_VIOLATION_EVENT_ID "resource_violation"
struct resource_violation_event {
struct faultd_event event;
struct system_service service;
- struct time_t detection_time;
+ time_t detection_time;
enum resource_type resource_type;
/* TODO: what more do we need? */
};
struct rv_event_data {
struct system_service service;
- struct time_t detection_time;
+ time_t detection_time;
enum resource_type resource_type;
};
return KEY_UNKNOWN;
}
-static int parse_event(char *message, int len,
- struct resource_violation_event *event)
+static int parse_event(char *message, int len, struct rv_event_data *ev_data)
{
char *p = message;
char *e;
return -1;
++p;
- event->detection_time = strtol(p, &p, 10);
- event->service.pid = 0;
+ ev_data->detection_time = strtol(p, &p, 10);
+ ev_data->service.pid = 0;
while ((p = strchr(p, ' ')) != 0) {
++p;
switch (key) {
case KEY_PID:
- event->service.pid = strtol(p, &p, 10);
+ ev_data->service.pid = strtol(p, &p, 10);
break;
default:
break;
{
struct audit_reply reply;
int ret;
- struct rv_ev_data rv_ev_data = {
+ struct rv_event_data rv_ev_data = {
.resource_type = FAULTD_RESOURCE_FD,
};
struct faultd_event *ev;
* limitations under the License.
*/
+#include <malloc.h>
+
#include "service.h"
int system_service_init(pid_t pid, char *name, struct system_service *s)
/* TODO: Get real service name if NULL */
s->name = name;
+
+ return 0;
}
void system_service_cleanup(struct system_service *s)