Line data Source code
1 : /** 2 : * Copyright (C) 2013 - 2015 Advanced Driver Information Technology. 3 : * This code is developed by Advanced Driver Information Technology. 4 : * Copyright of Advanced Driver Information Technology, Bosch and DENSO. 5 : * 6 : * This file is part of COVESA Project Dlt - Diagnostic Log and Trace console apps. 7 : * 8 : * 9 : * \copyright 10 : * This Source Code Form is subject to the terms of the 11 : * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with 12 : * this file, You can obtain one at http://mozilla.org/MPL/2.0/. 13 : * 14 : * 15 : * \author Syed Hameed <shameed@jp.adit-jv.com> ADIT 2013 - 2015 16 : * \author Christoph Lipka <clipka@jp.adit-jv.com> ADIT 2015 17 : * \author Frederic Berat <fberat@de.adit-jv.com> ADIT 2015 18 : * 19 : * \file dlt-logstorage-common.c 20 : * For further information see http://www.covesa.org/. 21 : */ 22 : 23 : /******************************************************************************* 24 : ** ** 25 : ** SRC-MODULE: dlt-logstorage-common.c ** 26 : ** ** 27 : ** TARGET : linux ** 28 : ** ** 29 : ** PROJECT : DLT ** 30 : ** ** 31 : ** AUTHOR : Christoph Lipka clipka@jp.adit-jv.com ** 32 : ** Frederic Berat fberat@de.adit-jv.com ** 33 : ** PURPOSE : ** 34 : ** ** 35 : ** REMARKS : Code extracted from dlt-control-common.c and reworked. ** 36 : ** ** 37 : ** PLATFORM DEPENDANT [yes/no]: yes ** 38 : ** ** 39 : ** TO BE CHANGED BY USER [yes/no]: no ** 40 : ** ** 41 : *******************************************************************************/ 42 : 43 : /******************************************************************************* 44 : ** Author Identity ** 45 : ******************************************************************************** 46 : ** ** 47 : ** Initials Name Company ** 48 : ** -------- ------------------------- ---------------------------------- ** 49 : ** cl Christoph Lipka ADIT ** 50 : ** fb Frederic Berat ADIT ** 51 : *******************************************************************************/ 52 : #define pr_fmt(fmt) "Logstorage common: "fmt 53 : 54 : #include <errno.h> 55 : #include <dirent.h> 56 : #include <stdio.h> 57 : #include <stdlib.h> 58 : #include <string.h> 59 : #include <unistd.h> 60 : #include <pthread.h> 61 : #include <sys/types.h> 62 : #include <sys/socket.h> 63 : 64 : #include "dlt_common.h" 65 : #include "dlt_protocol.h" 66 : #include "dlt_client.h" 67 : 68 : #include "dlt-control-common.h" 69 : #include "dlt-logstorage-common.h" 70 : 71 : #ifdef DLT_LOGSTORAGE_CTRL_UDEV_ENABLE 72 : # include "dlt-logstorage-udev.h" 73 : #endif 74 : 75 : #include "dlt-logstorage-prop.h" 76 : 77 : static struct LogstorageOptions { 78 : int event_type; /**< EVENT_UNMOUNTING/EVENT_MOUNTED */ 79 : char device_path[DLT_MOUNT_PATH_MAX]; /**< Default Mount path */ 80 : DltLogstorageHandler handler_type; /**< be controlled by udev or prop */ 81 : long timeout; /**< Default timeout */ 82 : } g_options = { 83 : .event_type = EVENT_MOUNTED, 84 : .handler_type = CTRL_NOHANDLER, 85 : }; 86 : 87 4 : DltLogstorageHandler get_handler_type(void) 88 : { 89 4 : return g_options.handler_type; 90 : } 91 : 92 0 : void set_handler_type(char *type) 93 : { 94 0 : g_options.handler_type = CTRL_UDEV; 95 : 96 : if (type && check_proprietary_handling(type)) 97 : g_options.handler_type = CTRL_PROPRIETARY; 98 0 : } 99 : 100 6 : int get_default_event_type(void) 101 : { 102 6 : return g_options.event_type; 103 : } 104 : 105 2 : void set_default_event_type(long type) 106 : { 107 2 : g_options.event_type = (int) type; 108 2 : } 109 : 110 2 : char *get_default_path(void) 111 : { 112 2 : return g_options.device_path; 113 : } 114 : 115 2 : void set_default_path(char *path) 116 : { 117 : memset(g_options.device_path, 0, DLT_MOUNT_PATH_MAX); 118 : 119 2 : if (path != NULL) 120 : strncpy(g_options.device_path, path, DLT_MOUNT_PATH_MAX - 1); 121 2 : } 122 : 123 : /* Used by the handlers */ 124 : static DltLogstorageCtrl lctrl; 125 : 126 0 : DltLogstorageCtrl *get_logstorage_control(void) 127 : { 128 0 : return &lctrl; 129 : } 130 : 131 0 : void *dlt_logstorage_get_handler_cb(void) 132 : { 133 0 : return lctrl.callback; 134 : } 135 : 136 0 : int dlt_logstorage_get_handler_fd(void) 137 : { 138 0 : return lctrl.fd; 139 : } 140 : 141 : /** @brief Initialized the handler based on configuration 142 : * 143 : * @return 0 on success, -1 otherwise. 144 : */ 145 0 : int dlt_logstorage_init_handler(void) 146 : { 147 0 : switch (get_handler_type()) { 148 : case CTRL_PROPRIETARY: 149 : return dlt_logstorage_prop_init(); 150 0 : case CTRL_UDEV: 151 : default: 152 : #ifdef DLT_LOGSTORAGE_CTRL_UDEV_ENABLE 153 : return dlt_logstorage_udev_init(); 154 : #else 155 0 : return -1; 156 : #endif 157 : } 158 : } 159 : 160 : /** @brief Clean-up the handler based on configuration 161 : * 162 : * @return 0 on success, -1 otherwise. 163 : */ 164 0 : int dlt_logstorage_deinit_handler(void) 165 : { 166 0 : switch (get_handler_type()) { 167 : case CTRL_PROPRIETARY: 168 : return dlt_logstorage_prop_deinit(); 169 0 : case CTRL_UDEV: 170 : default: 171 : #ifdef DLT_LOGSTORAGE_CTRL_UDEV_ENABLE 172 : return dlt_logstorage_udev_deinit(); 173 : #else 174 0 : return -1; 175 : #endif 176 : } 177 : } 178 : 179 : /** @brief Search for config file in given mount point 180 : * 181 : * The file is searched at the top directory. The function exits once it 182 : * founds it. 183 : * 184 : * @param mnt_point The mount point to check 185 : * 186 : * @return 1 if the file is found, 0 otherwise. 187 : */ 188 0 : int dlt_logstorage_check_config_file(char *mnt_point) 189 : { 190 : struct dirent **files; 191 : int n; 192 : int i = 0; 193 : int ret = 0; 194 : 195 0 : if ((mnt_point == NULL) || (mnt_point[0] == '\0')) { 196 0 : pr_error("Mount point missing.\n"); 197 0 : return ret; 198 : } 199 : 200 0 : pr_verbose("Now scanning %s\n", mnt_point); 201 : 202 0 : n = scandir(mnt_point, &files, NULL, alphasort); 203 : 204 0 : if (n <= 0) { 205 0 : pr_error("Cannot read mounted directory\n"); 206 0 : return ret; 207 : } 208 : 209 : do { 210 0 : pr_verbose("Checking %s.\n", files[i]->d_name); 211 : 212 0 : if (strncmp(files[i]->d_name, CONF_NAME, strlen(CONF_NAME)) == 0) { 213 : /* We found it ! */ 214 0 : pr_verbose("File found.\n"); 215 : ret = 1; 216 : break; 217 : } 218 0 : } while (++i < n); 219 : 220 0 : for (i = 0; i < n; i++) 221 0 : free(files[i]); 222 : 223 0 : free(files); 224 0 : return ret; 225 : } 226 : 227 : /** @brief Check if given mount point is writable 228 : * 229 : * @param mnt_point The mount point to check 230 : * 231 : * @return 1 if the file is writable, 0 otherwise. 232 : */ 233 0 : int dlt_logstorage_check_directory_permission(char *mnt_point) 234 : { 235 0 : if (mnt_point == NULL) { 236 0 : pr_error("Given mount point is NULL\n"); 237 0 : return 0; 238 : } 239 : 240 0 : if (access(mnt_point, W_OK) == 0) 241 0 : return 1; 242 : 243 : return 0; 244 : } 245 : 246 : /** @brief Prepares the body of the message to be send to DLT 247 : * 248 : * @param body A pointer to the MsgBody structure pointer 249 : * @param conn_type The type of the event (Mounted/Unmounting) 250 : * @param path The mount point path. 251 : * 252 : * @return The body once built or NULL. 253 : */ 254 2 : static DltControlMsgBody *prepare_message_body(DltControlMsgBody **body, 255 : int conn_type, 256 : char *path) 257 : { 258 : DltServiceOfflineLogstorage *serv = NULL; 259 : 260 2 : if (path == NULL) { 261 0 : pr_error("Mount path is uninitialized.\n"); 262 0 : return NULL; 263 : } 264 : 265 2 : pr_verbose("Sending event %d for %s.\n", conn_type, path); 266 : 267 2 : *body = calloc(1, sizeof(DltControlMsgBody)); 268 : 269 2 : if (!*body) { 270 0 : pr_error("Not able to allocate memory for body.\n"); 271 0 : return *body; 272 : } 273 : 274 2 : (*body)->data = calloc(1, sizeof(DltServiceOfflineLogstorage)); 275 : 276 2 : if (!(*body)->data) { 277 0 : free(*body); 278 0 : *body = NULL; 279 0 : pr_error("Not able to allocate memory for body data.\n"); 280 0 : return NULL; 281 : } 282 : 283 2 : (*body)->size = sizeof(DltServiceOfflineLogstorage); 284 : 285 : serv = (DltServiceOfflineLogstorage *)(*body)->data; 286 : 287 2 : serv->service_id = DLT_SERVICE_ID_OFFLINE_LOGSTORAGE; 288 2 : serv->connection_type = (uint8_t) conn_type; 289 : /* mount_point is DLT_MOUNT_PATH_MAX + 1 long, 290 : * and the memory is already zeroed. 291 : */ 292 2 : strncpy(serv->mount_point, path, DLT_MOUNT_PATH_MAX - 1); 293 : 294 2 : pr_verbose("Body is now ready.\n"); 295 : 296 2 : return *body; 297 : } 298 : 299 : /** @brief Send a logstorage event to DLT 300 : * 301 : * @param type The type of the event (Mounted/Unmounting) 302 : * @param mount_point The mount point for this event 303 : * 304 : * @return 0 On success, -1 otherwise. 305 : */ 306 2 : int dlt_logstorage_send_event(int type, char *mount_point) 307 : { 308 : int ret = 0; 309 2 : DltControlMsgBody *msg_body = NULL; 310 : 311 : /* mount_point is checked against NULL in the preparation */ 312 2 : if (!prepare_message_body(&msg_body, type, mount_point)) { 313 0 : pr_error("Data for Dlt Message body is NULL\n"); 314 0 : return -1; 315 : } 316 : 317 2 : ret = dlt_control_send_message(msg_body, get_timeout()); 318 : 319 2 : free(msg_body->data); 320 2 : free(msg_body); 321 : 322 2 : return ret; 323 : }