LCOV - code coverage report
Current view: top level - console/logstorage - dlt-logstorage-list.c (source / functions) Hit Total Coverage
Test: dlt_final_coverage.info Lines: 0 62 0.0 %
Date: 2024-11-20 10:17:27 Functions: 0 4 0.0 %

          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 Anitha.BA <anithaammaji.baggam@in.bosch.com> ADIT 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-list.c
      20             :  * For further information see http://www.covesa.org/.
      21             :  */
      22             : 
      23             : /*******************************************************************************
      24             : **                                                                            **
      25             : **  SRC-MODULE: dlt-logstorage-list.c                                         **
      26             : **                                                                            **
      27             : **  TARGET    : linux                                                         **
      28             : **                                                                            **
      29             : **  PROJECT   : DLT                                                           **
      30             : **                                                                            **
      31             : **  AUTHOR    : Christoph Lipka clipka@jp.adit-jv.com                         **
      32             : **              Anitha.B.A  anithaammaji.baggam@in.bosch.com                  **
      33             : **              Frederic Berat fberat@de.adit-jv.com                          **
      34             : **                                                                            **
      35             : **  PURPOSE   :  linked list implementation for storing the device info       **
      36             : **                                                                            **
      37             : **  REMARKS   :                                                               **
      38             : **                                                                            **
      39             : **  PLATFORM DEPENDANT [yes/no]: yes                                          **
      40             : **                                                                            **
      41             : **  TO BE CHANGED BY USER [yes/no]: no                                        **
      42             : **                                                                            **
      43             : *******************************************************************************/
      44             : 
      45             : /*******************************************************************************
      46             : **                      Author Identity                                       **
      47             : ********************************************************************************
      48             : **                                                                            **
      49             : ** Initials     Name                       Company                            **
      50             : ** --------     -------------------------  ---------------------------------- **
      51             : **  BA          Anitha                     ADIT                               **
      52             : **  cl          Christoph Lipka            ADIT                               **
      53             : **  fb          Frederic Berat             ADIT                               **
      54             : *******************************************************************************/
      55             : #define pr_fmt(fmt) "Log storage list: "fmt
      56             : 
      57             : #include <stdio.h>
      58             : #include <stdlib.h>
      59             : #include <string.h>
      60             : #include <unistd.h>
      61             : 
      62             : #include "dlt_common.h"
      63             : #include "dlt-control-common.h"
      64             : #include "dlt-logstorage-common.h"
      65             : 
      66             : static struct LogstorageDeviceInfo
      67             : {
      68             :     char *dev_node; /**< The device node */
      69             :     char *mnt_point; /**< Mount point for this device */
      70             :     struct LogstorageDeviceInfo *prev; /**< Previous element of the list */
      71             :     struct LogstorageDeviceInfo *next; /**< Next element of the list */
      72             : } *g_info;
      73             : 
      74             : /** @brief Prints the device list in verbose mode
      75             :  *
      76             :  * This can be used to debug the behavior.
      77             :  * Therefore, it's only available in verbose mode.
      78             :  */
      79           0 : void print_list()
      80             : {
      81           0 :     struct LogstorageDeviceInfo *ptr = g_info;
      82           0 :     pr_verbose(" -------Device list-------\n");
      83             : 
      84           0 :     while (ptr != NULL) {
      85           0 :         pr_verbose("%p:\t[%s][%s] \n", ptr, ptr->dev_node, ptr->mnt_point);
      86           0 :         ptr = ptr->next;
      87             :     }
      88             : 
      89           0 :     pr_verbose(" -------Device list end-------\n\n");
      90             : 
      91           0 :     return;
      92             : }
      93             : 
      94             : /** @brief Find element in the list based on device node
      95             :  *
      96             :  * Allows to check whether a device is already in the list or
      97             :  * to find out the one to be removed.
      98             :  *
      99             :  * @param node The device node to look for
     100             :  *
     101             :  * @return The element of the list found, NULL either.
     102             :  */
     103           0 : static struct LogstorageDeviceInfo *logstorage_find_dev_info(const char *node)
     104             : {
     105           0 :     struct LogstorageDeviceInfo *ptr = g_info;
     106             : 
     107           0 :     if (!node)
     108             :         return NULL;
     109             : 
     110           0 :     pr_verbose("Looking for %s.\n", node);
     111             : 
     112           0 :     while (ptr != NULL) {
     113           0 :         if (strncmp(ptr->dev_node, node, DLT_MOUNT_PATH_MAX) == 0) {
     114           0 :             pr_verbose("%s found in %p.\n", node, ptr);
     115             :             break;
     116             :         }
     117             :         else {
     118           0 :             ptr = ptr->next;
     119             :         }
     120             :     }
     121             : 
     122             :     return ptr;
     123             : }
     124             : 
     125             : /** @brief Add new device in the list
     126             :  *
     127             :  * The device is only added if a configuration file has been found and
     128             :  * if it's not already in the list.
     129             :  *
     130             :  * @param node The device node to add
     131             :  * @param path The corresponding mount point path
     132             :  *
     133             :  * @return 0 on success, -1 in case of error.
     134             :  */
     135           0 : int logstorage_store_dev_info(const char *node, const char *path)
     136             : {
     137             :     struct LogstorageDeviceInfo *ptr = NULL;
     138             :     size_t path_len = 0;
     139             : 
     140           0 :     if ((node == NULL) || (path == NULL)) {
     141           0 :         pr_error("Invalid input\n");
     142           0 :         return -1;
     143             :     }
     144             : 
     145           0 :     if (logstorage_find_dev_info(node)) {
     146           0 :         pr_verbose("%s already in list.\n", node);
     147           0 :         print_list();
     148           0 :         return 0;
     149             :     }
     150             : 
     151           0 :     ptr = calloc(1, sizeof(struct LogstorageDeviceInfo));
     152             : 
     153           0 :     if (ptr == NULL) {
     154           0 :         pr_error("Node creation failed\n");
     155           0 :         return -1;
     156             :     }
     157             : 
     158           0 :     ptr->dev_node = strdup(node);
     159           0 :     path_len = strlen(path);
     160             : 
     161             :     if (path_len > DLT_MOUNT_PATH_MAX)
     162             :         path_len = (size_t)DLT_MOUNT_PATH_MAX;
     163             : 
     164           0 :     ptr->mnt_point = (char *)calloc(1, path_len + 1);
     165             : 
     166           0 :     if (ptr->mnt_point == NULL) {
     167           0 :         pr_error("memory allocation failed for mnt_point\n");
     168           0 :         free(ptr);
     169             :         ptr = NULL;
     170           0 :         return -1;
     171             :     }
     172             : 
     173           0 :     ptr->mnt_point[path_len] = '\0';
     174           0 :     memcpy(ptr->mnt_point, path, path_len);
     175             : 
     176             :     /* Put it on head */
     177           0 :     ptr->next = g_info;
     178             : 
     179           0 :     if (g_info)
     180           0 :         g_info->prev = ptr;
     181             : 
     182           0 :     g_info = ptr;
     183             : 
     184           0 :     pr_verbose("%s added to list.\n", node);
     185           0 :     print_list();
     186             : 
     187           0 :     return 0;
     188             : }
     189             : 
     190             : /** @brief Remove a device from the list
     191             :  *
     192             :  * If the device is removed from the list, the mount point
     193             :  * pointer is given back to the caller. That means that
     194             :  * he has to free it.
     195             :  *
     196             :  * @param node The device node to be removed
     197             :  *
     198             :  * @return the mount point if the node is found, NULL either.
     199             :  */
     200           0 : char *logstorage_delete_dev_info(const char *node)
     201             : {
     202             :     struct LogstorageDeviceInfo *del = NULL;
     203             :     char *ret = NULL;
     204             : 
     205           0 :     del = logstorage_find_dev_info(node);
     206             : 
     207           0 :     if (del == NULL) {
     208           0 :         pr_verbose("%s not found in list.\n", node);
     209           0 :         print_list();
     210           0 :         return ret;
     211             :     }
     212             : 
     213             :     /* Has to be freed by the caller */
     214           0 :     ret = del->mnt_point;
     215             : 
     216           0 :     if (del->prev)
     217           0 :         del->prev->next = del->next;
     218             : 
     219           0 :     if (del->next)
     220           0 :         del->next->prev = del->prev;
     221             : 
     222           0 :     if (del == g_info)
     223           0 :         g_info = g_info->next;
     224             : 
     225           0 :     free(del->dev_node);
     226           0 :     free(del);
     227             : 
     228           0 :     pr_verbose("%s removed from list.\n", node);
     229           0 :     print_list();
     230             : 
     231           0 :     return ret;
     232             : }

Generated by: LCOV version 1.14