/* * This file is part of faultd. * * Copyright © 2017 Samsung Electronics * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "common.h" #include "decision_made_event.h" static int allocate_dm_event(struct faultd_event_type *type, void *data, struct faultd_event **ev) { struct decision_made_event *dm_ev; struct dm_event_data *dm_ev_data = data; int ret; dm_ev = calloc(1, sizeof(*dm_ev)); if (!dm_ev) return -ENOMEM; ret = faultd_event_init_internal(type, &dm_ev->event); if (ret) goto free_dm_ev; dm_ev->who_made = strdup(dm_ev_data->who_made); dm_ev->action = strdup(dm_ev_data->action); if (!dm_ev->who_made || !dm_ev->action) { ret = -ENOMEM; goto cleanup_strs; } dm_ev->action_data = faultd_object_ref(dm_ev_data->action_data); dm_ev->reason = dm_ev_data->reason; faultd_event_ref(dm_ev->reason); *ev = &dm_ev->event; return 0; cleanup_strs: free(dm_ev->who_made); free(dm_ev->action); faultd_event_cleanup_internal(&dm_ev->event); free_dm_ev: free(dm_ev); return ret; } static void dm_event_release(struct faultd_event *ev) { struct decision_made_event *dm_ev = to_decision_made_event(ev); free(dm_ev->who_made); free(dm_ev->action); faultd_object_unref(dm_ev->action_data); faultd_event_unref(dm_ev->reason); faultd_event_cleanup_internal(&dm_ev->event); free(dm_ev); } static char *dm_event_to_string(struct faultd_event *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", dm_ev->who_made, dm_ev->action); return ret > 0 ? str : NULL; } static void dm_event_serialize(struct faultd_event *ev, struct faultd_object *out) { struct decision_made_event *dm_ev = to_decision_made_event(ev); faultd_event_serialize_internal(ev, out); faultd_object_append_oid(out, DM_EV_REASON, &dm_ev->reason->oid); faultd_object_append_string(out, DM_EV_WHO, dm_ev->who_made); faultd_object_append_string(out, DM_EV_ACTION, dm_ev->action); faultd_object_append_object(out, DM_EV_ACTION_DATA, dm_ev->action_data); } TEST_ENTRY_POINT(dm_event_serialize); static struct faultd_event_type decision_made_event_type = { .name = DECISION_MADE_EVENT_ID, .default_ops = { .release = dm_event_release, .serialize = dm_event_serialize, .to_string = dm_event_to_string, }, .allocate_event = allocate_dm_event, .node = LIST_HEAD_INIT(decision_made_event_type.node), }; FAULTD_EVENT_TYPE_REGISTER(decision_made_event_type, decision_made_et)