diff options
author | Łukasz Stelmach <l.stelmach@samsung.com> | 2017-06-08 14:59:50 +0200 |
---|---|---|
committer | Łukasz Stelmach <l.stelmach@samsung.com> | 2017-06-09 17:41:06 +0200 |
commit | 663d6a2d0c421ef2c972a7dd1c52074d71f51c2f (patch) | |
tree | f306acc46924d9f775dc132e98fa3682223eada7 | |
parent | e184afd4d34907a7473709dcbf6edbb62b71b75d (diff) | |
download | faultd-663d6a2d0c421ef2c972a7dd1c52074d71f51c2f.tar.gz faultd-663d6a2d0c421ef2c972a7dd1c52074d71f51c2f.tar.bz2 faultd-663d6a2d0c421ef2c972a7dd1c52074d71f51c2f.zip |
Implement deserialisation of resource_violation_event
Change-Id: Iac3cee29e78a1099443e29481a603ef624e5159f
-rw-r--r-- | src/event_types/resource_violation_event.c | 63 | ||||
-rw-r--r-- | src/event_types/resource_violation_event.h | 1 |
2 files changed, 64 insertions, 0 deletions
diff --git a/src/event_types/resource_violation_event.c b/src/event_types/resource_violation_event.c index c09f542..f7c305d 100644 --- a/src/event_types/resource_violation_event.c +++ b/src/event_types/resource_violation_event.c @@ -50,6 +50,67 @@ free_rv_ev: return ret; } +static int deserialize_rv_event(struct faultd_event_type *type, + bson *data, struct faultd_event **ev) +{ + int ret = -EINVAL; + struct rv_event_data rv_ev_data; + bson_type bt; + bson_iterator it; + + memset(&rv_ev_data, 0, sizeof(rv_ev_data)); + BSON_ITERATOR_INIT(&it, data); + + while ((bt = bson_iterator_next(&it)) != BSON_EOO) { + + if ((bt == BSON_OBJECT) && + (strcmp(SYSD_SERVICE, bson_iterator_key(&it)) == 0)) { + bson svc; + + bson_init_finished_data(&svc, bson_iterator_value(&it)); + ret = systemd_service_deserialize(&svc, &rv_ev_data.service); + if (ret < 0) + goto finish; + + } else if ((bt == BSON_TIMESTAMP) && + (strcmp(RV_EV_DTIME, bson_iterator_key(&it)))) { + + rv_ev_data.detection_time = bson_iterator_time_t(&it); + + } else if ((bt == BSON_INT) && + (strcmp(RV_EV_RES_TYPE, bson_iterator_key(&it)))) { + + rv_ev_data.resource_type = bson_iterator_int(&it); + + } else if ((bt == BSON_INT) && + (strcmp(RV_EV_PID, bson_iterator_key(&it)))) { + + rv_ev_data.pid = bson_iterator_int(&it); + + } + } + + ret = allocate_rv_event(type, &rv_ev_data, ev); + if (ret < 0) { + free(rv_ev_data.service.dbus_path); + goto finish; + } + + ret = faultd_event_deserialize_internal(data, *ev); + if (ret < 0) { + struct resource_violation_event *rv_ev = + to_resource_violation_event(*ev); + free(rv_ev_data.service.dbus_path); + rv_ev_data.service.dbus_path = NULL; + free(rv_ev); + goto finish; + } + + ret = 0; +finish: + return ret; +} + static void rv_event_release(struct faultd_event *ev) { struct resource_violation_event *rv_ev = @@ -89,6 +150,7 @@ static void rv_event_serialize(struct faultd_event *ev, bson *out) systemd_service_serialize(&rv_ev->service, out); bson_append_time_t(out, RV_EV_DTIME, rv_ev->detection_time); bson_append_int(out, RV_EV_PID, rv_ev->pid); + bson_append_int(out, RV_EV_RES_TYPE, rv_ev->resource_type); } static struct faultd_event_type resource_violation_event_type = { @@ -99,6 +161,7 @@ static struct faultd_event_type resource_violation_event_type = { .to_string = rv_event_to_string, }, .allocate_event = allocate_rv_event, + .deserialize_event = deserialize_rv_event, .node = LIST_HEAD_INIT(resource_violation_event_type.node), }; diff --git a/src/event_types/resource_violation_event.h b/src/event_types/resource_violation_event.h index 870f486..b19d316 100644 --- a/src/event_types/resource_violation_event.h +++ b/src/event_types/resource_violation_event.h @@ -28,6 +28,7 @@ #define RESOURCE_VIOLATION_EVENT_ID "resource_violation" #define RV_EV_DTIME "dt" #define RV_EV_PID "pid" +#define RV_EV_RES_TYPE "rt" enum resource_type { FAULTD_RESOURCE_FD, |