diff options
Diffstat (limited to 'src/console/logstorage/dlt-logstorage-common.c')
-rw-r--r-- | src/console/logstorage/dlt-logstorage-common.c | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/src/console/logstorage/dlt-logstorage-common.c b/src/console/logstorage/dlt-logstorage-common.c new file mode 100644 index 0000000..a2f60a0 --- /dev/null +++ b/src/console/logstorage/dlt-logstorage-common.c @@ -0,0 +1,318 @@ +/** + * @licence app begin@ + * Copyright (C) 2013 - 2015 Advanced Driver Information Technology. + * This code is developed by Advanced Driver Information Technology. + * Copyright of Advanced Driver Information Technology, Bosch and DENSO. + * + * This file is part of GENIVI Project Dlt - Diagnostic Log and Trace console apps. + * + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * + * \author Syed Hameed <shameed@jp.adit-jv.com> ADIT 2013 - 2015 + * \author Christoph Lipka <clipka@jp.adit-jv.com> ADIT 2015 + * \author Frederic Berat <fberat@de.adit-jv.com> ADIT 2015 + * + * \file dlt-logstorage-common.c + * For further information see http://www.genivi.org/. + * @licence end@ + */ + +/******************************************************************************* +** ** +** SRC-MODULE: dlt-logstorage-common.c ** +** ** +** TARGET : linux ** +** ** +** PROJECT : DLT ** +** ** +** AUTHOR : Christoph Lipka clipka@jp.adit-jv.com ** +** Frederic Berat fberat@de.adit-jv.com ** +** PURPOSE : ** +** ** +** REMARKS : Code extracted from dlt-control-common.c and reworked. ** +** ** +** PLATFORM DEPENDANT [yes/no]: yes ** +** ** +** TO BE CHANGED BY USER [yes/no]: no ** +** ** +*******************************************************************************/ + +/******************************************************************************* +** Author Identity ** +******************************************************************************** +** ** +** Initials Name Company ** +** -------- ------------------------- ---------------------------------- ** +** cl Christoph Lipka ADIT ** +** fb Frederic Berat ADIT ** +*******************************************************************************/ +#define pr_fmt(fmt) "Logstorage common: "fmt + +#include <errno.h> +#include <dirent.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <pthread.h> +#include <sys/types.h> +#include <sys/socket.h> + +#include "dlt_common.h" +#include "dlt_protocol.h" +#include "dlt_client.h" + +#include "dlt-control-common.h" +#include "dlt-logstorage-common.h" + +#ifdef DLT_LOGSTORAGE_CTRL_UDEV_ENABLE +#include "dlt-logstorage-udev.h" +#endif + +#include "dlt-logstorage-prop.h" + +static struct LogstorageOptions { + int event_type; /**< EVENT_UNMOUNTING/EVENT_MOUNTED */ + char device_path[DLT_MOUNT_PATH_MAX]; /**< Default Mount path */ + DltLogstorageHandler handler_type; /**< be controlled by udev or prop */ + long timeout; /**< Default timeout */ +} g_options = { + .event_type = EVENT_MOUNTED, + .handler_type = CTRL_NOHANDLER, +}; + +DltLogstorageHandler get_handler_type(void) +{ + return g_options.handler_type; +} + +void set_handler_type(char *type) +{ + g_options.handler_type = CTRL_UDEV; + + if (type && check_proprietary_handling(type)) + { + g_options.handler_type = CTRL_PROPRIETARY; + } +} + +int get_default_event_type(void) +{ + return g_options.event_type; +} + +void set_default_event_type(long type) +{ + g_options.event_type = !!type; +} + +char *get_default_path(void) +{ + return g_options.device_path; +} + +void set_default_path(char *path) +{ + memset(g_options.device_path, 0, DLT_MOUNT_PATH_MAX); + strncpy(g_options.device_path, path, DLT_MOUNT_PATH_MAX - 1); +} + +/* Used by the handlers */ +static DltLogstorageCtrl lctrl; + +DltLogstorageCtrl *get_logstorage_control(void) +{ + return &lctrl; +} + +void *dlt_logstorage_get_handler_cb(void) +{ + return lctrl.callback; +} + +int dlt_logstorage_get_handler_fd(void) +{ + return lctrl.fd; +} + +/** @brief Initialized the handler based on configuration + * + * @return 0 on success, -1 otherwise. + */ +int dlt_logstorage_init_handler(void) +{ + switch (get_handler_type()) + { + case CTRL_PROPRIETARY: + return dlt_logstorage_prop_init(); + case CTRL_UDEV: + default: +#ifdef DLT_LOGSTORAGE_CTRL_UDEV_ENABLE + return dlt_logstorage_udev_init(); +#else + return -1; +#endif + } +} + +/** @brief Clean-up the handler based on configuration + * + * @return 0 on success, -1 otherwise. + */ +int dlt_logstorage_deinit_handler(void) +{ + switch (get_handler_type()) + { + case CTRL_PROPRIETARY: + return dlt_logstorage_prop_deinit(); + case CTRL_UDEV: + default: +#ifdef DLT_LOGSTORAGE_CTRL_UDEV_ENABLE + return dlt_logstorage_udev_deinit(); +#else + return -1; +#endif + } +} + +/** @brief Search for config file in given mount point + * + * The file is searched at the top directory. The function exits once it + * founds it. + * + * @param mnt_point The mount point to check + * + * @return 1 if the file is found, 0 otherwise. + */ +int dlt_logstorage_check_config_file(char *mnt_point) +{ + struct dirent **files; + int n; + int i = 0; + int ret = 0; + + if ((mnt_point == NULL) || (mnt_point[0] == '\0')) + { + pr_error("Mount point missing.\n"); + return ret; + } + + pr_verbose("Now scanning %s\n", mnt_point); + + n = scandir(mnt_point, &files, NULL, alphasort); + + if (n <= 0) + { + pr_error("Cannot read mounted directory\n"); + return ret; + } + + do + { + pr_verbose("Checking %s.\n", files[i]->d_name); + + if (strncmp(files[i]->d_name, CONF_NAME, strlen(CONF_NAME)) == 0) + { + /* We found it ! */ + pr_verbose("File found.\n"); + ret = 1; + break; + } + } + while (++i < n); + + for (i = 0 ; i < n ; i++) + { + free(files[i]); + } + + free(files); + return ret; +} + +/** @brief Prepares the body of the message to be send to DLT + * + * @param body A pointer to the MsgBody structure pointer + * @param conn_type The type of the event (Mounted/Unmounting) + * @param path The mount point path. + * + * @return The body once built or NULL. + */ +static DltControlMsgBody *prepare_message_body(DltControlMsgBody **body, + int conn_type, + char *path) +{ + DltServiceOfflineLogstorage *serv = NULL; + + if (path == NULL) + { + pr_error("Mount path is uninitialized: %s\n", path); + return NULL; + } + + pr_verbose("Sending event %d for %s.\n", conn_type, path); + + *body = calloc(1, sizeof(DltControlMsgBody)); + + if (!*body) + { + pr_error("Not able to allocate memory for body.\n"); + return *body; + } + + (*body)->data = calloc(1, sizeof(DltServiceOfflineLogstorage)); + + if (!(*body)->data) + { + free(*body); + *body = NULL; + pr_error("Not able to allocate memory for body data.\n"); + return NULL; + } + + (*body)->size = sizeof(DltServiceOfflineLogstorage); + + serv = (DltServiceOfflineLogstorage *) (*body)->data; + + serv->service_id = DLT_SERVICE_ID_OFFLINE_LOGSTORAGE; + serv->connection_type = conn_type; + /* mount_point is DLT_MOUNT_PATH_MAX + 1 long, + * and the memory is already zeroed. + */ + strncpy(serv->mount_point, path, DLT_MOUNT_PATH_MAX); + + pr_verbose("Body is now ready.\n"); + + return *body; +} + +/** @brief Send a logstorage event to DLT + * + * @param type The type of the event (Mounted/Unmounting) + * @param mount_point The mount point for this event + * + * @return 0 On success, -1 otherwise. + */ +int dlt_logstorage_send_event(int type, char *mount_point) +{ + int ret = 0; + DltControlMsgBody *msg_body = NULL; + + /* mount_point is checked against NULL in the preparation */ + if (!prepare_message_body(&msg_body, type, mount_point)) + { + pr_error("Data for Dlt Message body is NULL\n"); + return -1; + } + + ret = dlt_control_send_message(msg_body, get_timeout()); + + free(msg_body->data); + free(msg_body); + + return ret; +} |