/* ELAPI Implementation for the ELAPI async processing interface. Copyright (C) Dmitri Pal 2009 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define _GNU_SOURCE #include /* for errors */ #include "elapi_async.h" /* Private headers that deal with fd and tm structure definitions */ #include "elapi_fd.h" #include "elapi_tm.h" #include "trace.h" #include "config.h" /* Functions to set and get data from file descriptor data. */ /* Functions return EINVAL if passed in argument is invalid. */ int elapi_set_fd_priv(struct elapi_fd_data *fd_data, void *priv_data_to_set) { int error = EOK; TRACE_FLOW_STRING("elapi_set_fd_priv", "Entry"); /* Check arguments */ if (fd_data == NULL) { TRACE_ERROR_NUMBER("Invalid argument. Error", EINVAL); return EINVAL; } fd_data->ext_data = priv_data_to_set; TRACE_FLOW_STRING("elapi_set_fd_priv", "Exit"); return error; } int elapi_get_fd_priv(struct elapi_fd_data *fd_data, void **priv_data_to_get) { int error = EOK; TRACE_FLOW_STRING("elapi_get_fd_priv", "Entry"); /* Check arguments */ if ((fd_data == NULL) || (priv_data_to_get == NULL)) { TRACE_ERROR_NUMBER("Invalid argument. Error", EINVAL); return EINVAL; } *priv_data_to_get = fd_data->ext_data; TRACE_FLOW_STRING("elapi_get_fd_priv", "Exit"); return error; } /* Cleanup function */ void elapi_destroy_fd_data(struct elapi_fd_data *fd_data) { TRACE_FLOW_STRING("elapi_destroy_fd_data", "Entry"); TRACE_FLOW_STRING("elapi_destroy_fd_data", "Exit"); } /* Functions to set and get custom data from timer data. */ /* Functions return EINVAL if passed in argument is invalid. */ int elapi_set_tm_priv(struct elapi_tm_data *tm_data, void *priv_data_to_set) { int error = EOK; TRACE_FLOW_STRING("elapi_set_tm_priv", "Entry"); /* Check arguments */ if (tm_data == NULL) { TRACE_ERROR_NUMBER("Invalid argument. Error", EINVAL); return EINVAL; } tm_data->ext_data = priv_data_to_set; TRACE_FLOW_STRING("elapi_set_tm_priv", "Exit"); return error; } int elapi_get_tm_priv(struct elapi_tm_data *tm_data, void **priv_data_to_get) { int error = EOK; TRACE_FLOW_STRING("elapi_get_tm_priv", "Entry"); /* Check arguments */ if ((tm_data == NULL) || (priv_data_to_get == NULL)) { TRACE_ERROR_NUMBER("Invalid argument. Error", EINVAL); return EINVAL; } *priv_data_to_get = tm_data->ext_data; TRACE_FLOW_STRING("elapi_get_tm_priv", "Exit"); return error; } /* Cleanup function */ void elapi_destroy_tm_data(struct elapi_tm_data *tm_data) { TRACE_FLOW_STRING("elapi_destroy_tm_data", "Entry"); TRACE_FLOW_STRING("elapi_destroy_tm_data", "Exit"); } /* Public interfaces ELAPI exposes to handle fd or timer * events (do not confuse with log events). */ int elapi_process_fd(struct elapi_fd_data *fd_data) { int error = EOK; TRACE_FLOW_STRING("elapi_process_fd", "Entry"); TRACE_FLOW_STRING("elapi_process_fd", "Exit"); return error; } int elapi_process_tm(struct elapi_tm_data *tm_data) { int error = EOK; TRACE_FLOW_STRING("elapi_process_tm", "Entry"); TRACE_FLOW_STRING("elapi_process_tm", "Exit"); return error; }