LCOV - code coverage report
Current view: top level - lib - dlt_client.c (source / functions) Coverage Total Hit
Test: dlt_final_coverage.info Lines: 25.2 % 958 241
Test Date: 2026-02-03 07:35:37 Functions: 29.4 % 51 15

            Line data    Source code
       1              : /*
       2              :  * SPDX license identifier: MPL-2.0
       3              :  *
       4              :  * Copyright (C) 2011-2015, BMW AG
       5              :  *
       6              :  * This file is part of COVESA Project DLT - Diagnostic Log and Trace.
       7              :  *
       8              :  * This Source Code Form is subject to the terms of the
       9              :  * Mozilla Public License (MPL), v. 2.0.
      10              :  * If a copy of the MPL was not distributed with this file,
      11              :  * You can obtain one at http://mozilla.org/MPL/2.0/.
      12              :  *
      13              :  * For further information see http://www.covesa.org/.
      14              :  */
      15              : 
      16              : /*!
      17              :  * \author Alexander Wenzel <alexander.aw.wenzel@bmw.de>
      18              :  *
      19              :  * \copyright Copyright © 2011-2015 BMW AG. \n
      20              :  * License MPL-2.0: Mozilla Public License version 2.0 http://mozilla.org/MPL/2.0/.
      21              :  *
      22              :  * \file dlt_client.c
      23              :  */
      24              : 
      25              : /*******************************************************************************
      26              : **                                                                            **
      27              : **  SRC-MODULE: dlt_client.c                                                  **
      28              : **                                                                            **
      29              : **  TARGET    : linux                                                         **
      30              : **                                                                            **
      31              : **  PROJECT   : DLT                                                           **
      32              : **                                                                            **
      33              : **  AUTHOR    : Alexander Wenzel Alexander.AW.Wenzel@bmw.de                   **
      34              : **              Markus Klein                                                  **
      35              : **                                                                            **
      36              : **  PURPOSE   :                                                               **
      37              : **                                                                            **
      38              : **  REMARKS   :                                                               **
      39              : **                                                                            **
      40              : **  PLATFORM DEPENDANT [yes/no]: yes                                          **
      41              : **                                                                            **
      42              : **  TO BE CHANGED BY USER [yes/no]: no                                        **
      43              : **                                                                            **
      44              : *******************************************************************************/
      45              : 
      46              : /*******************************************************************************
      47              : **                      Author Identity                                       **
      48              : ********************************************************************************
      49              : **                                                                            **
      50              : ** Initials     Name                       Company                            **
      51              : ** --------     -------------------------  ---------------------------------- **
      52              : **  aw          Alexander Wenzel           BMW                                **
      53              : **  mk          Markus Klein               Fraunhofer ESK                     **
      54              : *******************************************************************************/
      55              : 
      56              : /*******************************************************************************
      57              : **                      Revision Control History                              **
      58              : *******************************************************************************/
      59              : 
      60              : /*
      61              :  * $LastChangedRevision$
      62              :  * $LastChangedDate$
      63              :  * $LastChangedBy$
      64              :  * Initials    Date         Comment
      65              :  * aw          12.07.2010   initial
      66              :  */
      67              : 
      68              : #include <stdio.h>
      69              : 
      70              : #if defined (__WIN32__) || defined (_MSC_VER)
      71              : #   pragma warning(disable : 4996) /* Switch off C4996 warnings */
      72              : #   include <winsock2.h> /* for socket(), connect(), send(), and recv() */
      73              : #else
      74              : #   include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
      75              : 
      76              : #pragma GCC diagnostic ignored "-Wconversion"
      77              : #   include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
      78              : #pragma GCC diagnostic push
      79              : #pragma GCC diagnostic pop
      80              : 
      81              : #   include <netdb.h>
      82              : #   include <sys/stat.h>
      83              : #   include <sys/un.h>
      84              : #endif
      85              : 
      86              : #if defined(_MSC_VER)
      87              : #   include <io.h>
      88              : #else
      89              : #   include <unistd.h>
      90              : #   include <syslog.h>
      91              : #endif
      92              : 
      93              : #include <fcntl.h>
      94              : 
      95              : #include <stdlib.h> /* for malloc(), free() */
      96              : #include <string.h> /* for strlen(), memcmp(), memmove() */
      97              : #include <errno.h>
      98              : #include <limits.h>
      99              : #include <poll.h>
     100              : 
     101              : #include "dlt_types.h"
     102              : #include "dlt_log.h"
     103              : #include "dlt_client.h"
     104              : #include "dlt_client_cfg.h"
     105              : 
     106              : // DLTv2 - DLT Version flag for multiplexing v1 and v2 messages
     107              : uint8_t dlt_client_dlt_version = DLTProtocolV1;
     108              : 
     109              : static int (*message_callback_function)(DltMessage *message, void *data) = NULL;
     110              : static int (*message_callback_function_v2)(DltMessageV2 *message, void *data) = NULL;
     111              : static bool (*fetch_next_message_callback_function)(void *data) = NULL;
     112              : 
     113            2 : void dlt_client_register_message_callback(int (*registerd_callback)(DltMessage *message, void *data))
     114              : {
     115            2 :     message_callback_function = registerd_callback;
     116            2 : }
     117              : 
     118            0 : void dlt_client_register_message_callback_v2(int (*registerd_callback)(DltMessageV2 *message, void *data))
     119              : {
     120            0 :     message_callback_function_v2 = registerd_callback;
     121            0 : }
     122              : 
     123            0 : void dlt_client_register_fetch_next_message_callback(bool (*registerd_callback)(void *data))
     124              : {
     125            0 :     fetch_next_message_callback_function = registerd_callback;
     126            0 : }
     127              : 
     128            6 : DltReturnValue dlt_client_init_port(DltClient *client, int port, int verbose)
     129              : {
     130            6 :     if (verbose && (port != DLT_DAEMON_TCP_PORT))
     131            1 :         dlt_vlog(LOG_INFO,
     132              :                  "%s: Init dlt client struct with port %d\n",
     133              :                  __func__,
     134              :                  port);
     135              : 
     136            6 :     if (client == NULL)
     137              :         return DLT_RETURN_ERROR;
     138              : 
     139            6 :     client->sock = -1;
     140            6 :     client->servIP = NULL;
     141            6 :     client->serialDevice = NULL;
     142            6 :     client->baudrate = DLT_CLIENT_INITIAL_BAUDRATE;
     143            6 :     client->port = (uint16_t)port;
     144            6 :     client->socketPath = NULL;
     145            6 :     client->mode = DLT_CLIENT_MODE_TCP;
     146            6 :     client->receiver.buffer = NULL;
     147            6 :     client->receiver.buf = NULL;
     148            6 :     client->receiver.backup_buf = NULL;
     149            6 :     client->hostip = NULL;
     150              : 
     151            6 :     return DLT_RETURN_OK;
     152              : }
     153              : 
     154            2 : DltReturnValue dlt_client_init(DltClient *client, int verbose)
     155              : {
     156              :     char *env_daemon_port;
     157              :     int tmp_port;
     158            2 :     client->ecuid2 = NULL;
     159              :     /* the port may be specified by an environment variable, defaults to DLT_DAEMON_TCP_PORT */
     160              :     unsigned short servPort = DLT_DAEMON_TCP_PORT;
     161              : 
     162              :     /* the port may be specified by an environment variable */
     163            2 :     env_daemon_port = getenv(DLT_CLIENT_ENV_DAEMON_TCP_PORT);
     164              : 
     165            2 :     if (env_daemon_port != NULL) {
     166              :         tmp_port = atoi(env_daemon_port);
     167              : 
     168            0 :         if ((tmp_port < IPPORT_RESERVED) || ((unsigned)tmp_port > USHRT_MAX)) {
     169            0 :             dlt_vlog(LOG_ERR,
     170              :                      "%s: Specified port is out of possible range: %d.\n",
     171              :                      __func__,
     172              :                      tmp_port);
     173            0 :             return DLT_RETURN_ERROR;
     174              :         }
     175              :         else {
     176            0 :             servPort = (unsigned short)tmp_port;
     177              :         }
     178              :     }
     179              : 
     180            2 :     if (verbose)
     181            0 :         dlt_vlog(LOG_INFO,
     182              :                  "%s: Init dlt client struct with default port: %hu.\n",
     183              :                  __func__,
     184              :                  servPort);
     185            2 :     return dlt_client_init_port(client, servPort, verbose);
     186              : }
     187              : 
     188            7 : DltReturnValue dlt_client_connect(DltClient *client, int verbose)
     189              : {
     190            7 :     const int yes = 1;
     191            7 :     char portnumbuffer[33] = {0};
     192              :     struct addrinfo hints, *servinfo, *p;
     193              :     struct sockaddr_un addr;
     194              :     int rv;
     195              :     struct ip_mreq mreq;
     196              :     DltReceiverType receiver_type = DLT_RECEIVE_FD;
     197              : 
     198              :     struct pollfd pfds[1];
     199              :     int ret;
     200              :     int n;
     201            7 :     socklen_t m = sizeof(n);
     202              :     int connect_errno = 0;
     203              : 
     204              :     memset(&hints, 0, sizeof(hints));
     205            7 :     hints.ai_socktype = SOCK_STREAM;
     206              : 
     207            7 :     if (client == 0)
     208              :         return DLT_RETURN_ERROR;
     209              : 
     210            7 :     switch (client->mode) {
     211            6 :     case DLT_CLIENT_MODE_TCP:
     212            6 :         snprintf(portnumbuffer, 32, "%d", client->port);
     213              : 
     214            6 :         if ((rv = getaddrinfo(client->servIP, portnumbuffer, &hints, &servinfo)) != 0) {
     215            0 :             dlt_vlog(LOG_ERR,
     216              :                     "%s: getaddrinfo: %s\n",
     217              :                      __func__,
     218              :                      gai_strerror(rv));
     219            3 :             return DLT_RETURN_ERROR;
     220              :         }
     221              : 
     222           10 :         for (p = servinfo; p != NULL; p = p->ai_next) {
     223            7 :             if ((client->sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
     224            0 :                 dlt_vlog(LOG_WARNING,
     225              :                          "%s: socket() failed! %s\n",
     226              :                          __func__,
     227            0 :                          strerror(errno));
     228            0 :                 continue;
     229              :             }
     230              : 
     231              :             /* Set socket to Non-blocking mode */
     232            7 :             if(fcntl(client->sock, F_SETFL, fcntl(client->sock,F_GETFL,0) | O_NONBLOCK) < 0)
     233              :             {
     234            0 :                 dlt_vlog(LOG_WARNING,
     235              :                  "%s: Socket cannot be changed to NON BLOCK: %s\n",
     236            0 :                  __func__, strerror(errno));
     237            0 :                 close(client->sock);
     238            0 :                 continue;
     239              :             }
     240              : 
     241            7 :             if (connect(client->sock, p->ai_addr, p->ai_addrlen) < 0) {
     242            7 :                 if (errno == EINPROGRESS) {
     243            7 :                     pfds[0].fd = client->sock;
     244            7 :                     pfds[0].events = POLLOUT;
     245              :                     ret = poll(pfds, 1, 500);
     246            7 :                     if (ret < 0) {
     247            0 :                         dlt_vlog(LOG_ERR, "%s: Failed to poll with err [%s]\n",
     248              :                         __func__, strerror(errno));
     249            0 :                         close(client->sock);
     250            0 :                         continue;
     251              :                     }
     252           14 :                     else if ((pfds[0].revents & POLLOUT) &&
     253            7 :                             getsockopt(client->sock, SOL_SOCKET,
     254              :                                     SO_ERROR, (void*)&n, &m) == 0) {
     255            7 :                         if (n == 0) {
     256            3 :                             dlt_vlog(LOG_DEBUG, "%s: Already connect\n", __func__);
     257            3 :                             if(fcntl(client->sock, F_SETFL,
     258            3 :                                     fcntl(client->sock,F_GETFL,0) & ~O_NONBLOCK) < 0) {
     259            0 :                                 dlt_vlog(LOG_WARNING,
     260              :                                 "%s: Socket cannot be changed to BLOCK with err [%s]\n",
     261              :                                 __func__, strerror(errno));
     262            0 :                                 close(client->sock);
     263            0 :                                 continue;
     264              :                             }
     265              :                         }
     266              :                         else {
     267              :                             connect_errno = n;
     268            4 :                             close(client->sock);
     269            4 :                             continue;
     270              :                         }
     271              :                     }
     272              :                     else {
     273            0 :                         connect_errno = errno;
     274            0 :                         close(client->sock);
     275            0 :                         continue;
     276              :                     }
     277              :                 }
     278              :                 else {
     279              :                     connect_errno = errno;
     280            0 :                     close(client->sock);
     281            0 :                     continue;
     282              :                 }
     283              :             }
     284              : 
     285              :             break;
     286              :         }
     287              : 
     288            6 :         freeaddrinfo(servinfo);
     289              : 
     290            6 :         if (p == NULL) {
     291            3 :             dlt_vlog(LOG_ERR,
     292              :                      "%s: ERROR: failed to connect! %s\n",
     293              :                      __func__,
     294              :                      strerror(connect_errno));
     295            3 :             return DLT_RETURN_ERROR;
     296              :         }
     297              : 
     298            3 :         if (verbose) {
     299            1 :             dlt_vlog(LOG_INFO,
     300              :                      "%s: Connected to DLT daemon (%s)\n",
     301              :                      __func__,
     302              :                      client->servIP);
     303              :         }
     304              : 
     305              :         receiver_type = DLT_RECEIVE_SOCKET;
     306              : 
     307            4 :         break;
     308            0 :     case DLT_CLIENT_MODE_SERIAL:
     309              :         /* open serial connection */
     310            0 :         client->sock = open(client->serialDevice, O_RDWR);
     311              : 
     312            0 :         if (client->sock < 0) {
     313            0 :             dlt_vlog(LOG_ERR,
     314              :                      "%s: ERROR: Failed to open device %s\n",
     315              :                      __func__,
     316              :                      client->serialDevice);
     317            0 :             return DLT_RETURN_ERROR;
     318              :         }
     319              : 
     320            0 :         if (isatty(client->sock)) {
     321              :             #if !defined (__WIN32__)
     322              : 
     323            0 :             if (dlt_setup_serial(client->sock, client->baudrate) < DLT_RETURN_OK) {
     324            0 :                 dlt_vlog(LOG_ERR,
     325              :                          "%s: ERROR: Failed to configure serial device %s (%s) \n",
     326              :                          __func__,
     327              :                          client->serialDevice,
     328            0 :                          strerror(errno));
     329            0 :                 return DLT_RETURN_ERROR;
     330              :             }
     331              : 
     332              :             #else
     333              :             return DLT_RETURN_ERROR;
     334              :             #endif
     335              :         }
     336              :         else {
     337            0 :             if (verbose)
     338            0 :                 dlt_vlog(LOG_ERR,
     339              :                          "%s: ERROR: Device is not a serial device, device = %s (%s) \n",
     340              :                          __func__,
     341              :                          client->serialDevice,
     342            0 :                          strerror(errno));
     343              : 
     344            0 :             return DLT_RETURN_ERROR;
     345              :         }
     346              : 
     347            0 :         if (verbose)
     348            0 :             dlt_vlog(LOG_INFO,
     349              :                          "%s: Connected to %s\n",
     350              :                          __func__,
     351              :                          client->serialDevice);
     352              : 
     353              :         receiver_type = DLT_RECEIVE_FD;
     354              : 
     355              :         break;
     356            1 :     case DLT_CLIENT_MODE_UNIX:
     357              : 
     358            1 :         if ((client->sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
     359            0 :             dlt_vlog(LOG_ERR,
     360              :                      "%s: ERROR: (unix) socket error: %s\n",
     361              :                      __func__,
     362            0 :                      strerror(errno));
     363              : 
     364            0 :             return DLT_RETURN_ERROR;
     365              :         }
     366              : 
     367              :         memset(&addr, 0, sizeof(addr));
     368            1 :         addr.sun_family = AF_UNIX;
     369            1 :         strncpy(addr.sun_path, client->socketPath, sizeof(addr.sun_path) - 1);
     370              : 
     371            1 :         if (connect(client->sock,
     372              :                     (struct sockaddr *) &addr,
     373              :                     sizeof(addr)) == -1) {
     374            0 :             dlt_vlog(LOG_ERR,
     375              :                      "%s: ERROR: (unix) connect error: %s\n",
     376              :                      __func__,
     377            0 :                      strerror(errno));
     378              : 
     379            0 :             return DLT_RETURN_ERROR;
     380              :         }
     381              : 
     382            1 :         if (client->sock < 0) {
     383            0 :             dlt_vlog(LOG_ERR,
     384              :                      "%s: ERROR: Failed to open device %s\n",
     385              :                      __func__,
     386              :                      client->socketPath);
     387              : 
     388            0 :             return DLT_RETURN_ERROR;
     389              :         }
     390              : 
     391              :         receiver_type = DLT_RECEIVE_SOCKET;
     392              : 
     393              :         break;
     394            0 :     case DLT_CLIENT_MODE_UDP_MULTICAST:
     395              : 
     396            0 :         if ((client->sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
     397              :         {
     398            0 :             dlt_vlog(LOG_ERR,
     399              :                      "%s: ERROR: socket error: %s\n",
     400              :                      __func__,
     401            0 :                      strerror(errno));
     402              : 
     403            0 :             return DLT_RETURN_ERROR;
     404              :         }
     405              : 
     406              :         /* allow multiple sockets to use the same PORT number */
     407            0 :         if (setsockopt(client->sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0)
     408              :         {
     409            0 :             dlt_vlog(LOG_ERR,
     410              :                      "%s: ERROR: Reusing address failed: %s\n",
     411              :                      __func__,
     412            0 :                      strerror(errno));
     413              : 
     414            0 :             return DLT_RETURN_ERROR;
     415              :         }
     416              : 
     417            0 :         memset(&client->receiver.addr, 0, sizeof(client->receiver.addr));
     418            0 :         client->receiver.addr.sin_family = AF_INET;
     419              :         client->receiver.addr.sin_addr.s_addr = htonl(INADDR_ANY);
     420            0 :         client->receiver.addr.sin_port = htons(client->port);
     421              : 
     422              :         /* bind to receive address */
     423            0 :         if (bind(client->sock, (struct sockaddr*) &client->receiver.addr, sizeof(client->receiver.addr)) < 0)
     424              :         {
     425            0 :             dlt_vlog(LOG_ERR,
     426              :                      "%s: ERROR: bind failed: %s\n",
     427              :                      __func__,
     428            0 :                      strerror(errno));
     429              : 
     430            0 :             return DLT_RETURN_ERROR;
     431              :         }
     432              : 
     433            0 :         mreq.imr_interface.s_addr = htonl(INADDR_ANY);
     434            0 :         if (client->hostip)
     435              :         {
     436            0 :             mreq.imr_interface.s_addr = inet_addr(client->hostip);
     437              :         }
     438            0 :         if (client->servIP == NULL)
     439              :         {
     440            0 :             dlt_vlog(LOG_ERR,
     441              :                      "%s: ERROR: server address not set\n",
     442              :                      __func__);
     443              : 
     444            0 :             return DLT_RETURN_ERROR;
     445              :         }
     446              : 
     447            0 :         char delimiter[] = ",";
     448            0 :         char* servIP = strtok(client->servIP, delimiter);
     449              : 
     450            0 :         while(servIP != NULL) {
     451            0 :             mreq.imr_multiaddr.s_addr = inet_addr(servIP);
     452            0 :             if (mreq.imr_multiaddr.s_addr == (in_addr_t)-1)
     453              :             {
     454            0 :                 dlt_vlog(LOG_ERR,
     455              :                          "%s: ERROR: server address not not valid %s\n",
     456              :                          __func__,
     457              :                          servIP);
     458              : 
     459            0 :                 return DLT_RETURN_ERROR;
     460              :             }
     461              : 
     462            0 :             if (setsockopt(client->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0)
     463              :             {
     464            0 :                 dlt_vlog(LOG_ERR,
     465              :                          "%s: ERROR: setsockopt add membership failed: %s\n",
     466              :                          __func__,
     467            0 :                          strerror(errno));
     468              : 
     469            0 :                 return DLT_RETURN_ERROR;
     470              :             }
     471            0 :             servIP = strtok(NULL, delimiter);
     472              :         }
     473              :         receiver_type = DLT_RECEIVE_UDP_SOCKET;
     474              : 
     475              :         break;
     476            0 :     default:
     477            0 :         dlt_vlog(LOG_ERR,
     478              :                  "%s: ERROR: Mode not supported: %d\n",
     479              :                  __func__,
     480              :                  client->mode);
     481              : 
     482            0 :         return DLT_RETURN_ERROR;
     483              :     }
     484              : 
     485            4 :     if (dlt_receiver_init(&(client->receiver), client->sock, receiver_type, DLT_RECEIVE_BUFSIZE) != DLT_RETURN_OK) {
     486            0 :         dlt_vlog(LOG_ERR, "%s: ERROR initializing receiver\n", __func__);
     487            0 :         return DLT_RETURN_ERROR;
     488              :     }
     489              : 
     490              :     return DLT_RETURN_OK;
     491              : }
     492              : 
     493            3 : DltReturnValue dlt_client_cleanup(DltClient *client, int verbose)
     494              : {
     495              :     int ret = DLT_RETURN_OK;
     496              : 
     497            3 :     if (verbose)
     498            0 :         dlt_vlog(LOG_INFO, "%s: Cleanup dlt client\n", __func__);
     499              : 
     500            3 :     if (client == NULL)
     501              :         return DLT_RETURN_WRONG_PARAMETER;
     502              : 
     503            3 :     if (client->sock != -1)
     504            3 :         close(client->sock);
     505              : 
     506            3 :     if (dlt_receiver_free(&(client->receiver)) != DLT_RETURN_OK) {
     507            0 :         dlt_vlog(LOG_WARNING, "%s: Failed to free receiver\n", __func__);
     508              :                 ret = DLT_RETURN_ERROR;
     509              :     }
     510              : 
     511            3 :     if (client->serialDevice) {
     512            0 :         free(client->serialDevice);
     513            0 :         client->serialDevice = NULL;
     514              :     }
     515              : 
     516            3 :     if (client->servIP) {
     517            2 :         free(client->servIP);
     518            2 :         client->servIP = NULL;
     519              :     }
     520              : 
     521            3 :     if (client->socketPath) {
     522            1 :         free(client->socketPath);
     523            1 :         client->socketPath = NULL;
     524              :     }
     525              : 
     526            3 :     if (client->hostip) {
     527            0 :         free(client->hostip);
     528            0 :         client->hostip = NULL;
     529              :     }
     530              : 
     531            3 :     if (client->ecuid2 != NULL) {
     532            0 :         free(client->ecuid2);
     533            0 :         client->ecuid2 = NULL;
     534              :     }
     535              :     return ret;
     536              : }
     537              : 
     538            2 : DltReturnValue dlt_client_main_loop(DltClient *client, void *data, int verbose)
     539              : {
     540              :     DltMessage msg;
     541              :     int ret;
     542              : 
     543            2 :     if (client == 0)
     544              :         return DLT_RETURN_ERROR;
     545              : 
     546            2 :     if (dlt_message_init(&msg, verbose) == DLT_RETURN_ERROR)
     547              :         return DLT_RETURN_ERROR;
     548              : 
     549              :     bool fetch_next_message = true;
     550          345 :     while (fetch_next_message) {
     551              :         /* wait for data from socket or serial connection */
     552          345 :         ret = dlt_receiver_receive(&(client->receiver));
     553              : 
     554          345 :         if (ret <= 0) {
     555              :             /* No more data to be received */
     556            2 :             if (dlt_message_free(&msg, verbose) == DLT_RETURN_ERROR)
     557              :                 return DLT_RETURN_ERROR;
     558              : 
     559              :             return DLT_RETURN_TRUE;
     560              :         }
     561              : 
     562          518 :         while (dlt_message_read(&msg, (unsigned char *)(client->receiver.buf),
     563          518 :                                 (unsigned int)client->receiver.bytesRcvd,
     564              :                                 client->resync_serial_header,
     565          518 :                                 verbose) == DLT_MESSAGE_ERROR_OK)
     566              :         {
     567              :             /* Call callback function */
     568          175 :             if (message_callback_function)
     569          175 :                 (*message_callback_function)(&msg, data);
     570              : 
     571          175 :             int total_size = (int)((size_t)msg.headersize
     572          175 :                             + (size_t)msg.datasize
     573          175 :                             - sizeof(DltStorageHeader));
     574              : 
     575          175 :             if (msg.found_serialheader) {
     576              :                 total_size += (int)sizeof(dltSerialHeader);
     577              :             }
     578              : 
     579          175 :             if (dlt_receiver_remove(&(client->receiver),
     580              :                                     total_size) == DLT_RETURN_ERROR) {
     581              :                 /* Return value ignored */
     582            0 :                 dlt_message_free(&msg, verbose);
     583            0 :                 return DLT_RETURN_ERROR;
     584              :             }
     585              :         }
     586              : 
     587          343 :         if (dlt_receiver_move_to_begin(&(client->receiver)) == DLT_RETURN_ERROR) {
     588              :             /* Return value ignored */
     589            0 :             dlt_message_free(&msg, verbose);
     590            0 :             return DLT_RETURN_ERROR;
     591              :         }
     592          343 :         if (fetch_next_message_callback_function)
     593            0 :           fetch_next_message = (*fetch_next_message_callback_function)(data);
     594              :     }
     595              : 
     596            0 :     if (dlt_message_free(&msg, verbose) == DLT_RETURN_ERROR)
     597              :         return DLT_RETURN_ERROR;
     598              : 
     599              :     return DLT_RETURN_OK;
     600              : }
     601              : 
     602            0 : DltReturnValue dlt_client_main_loop_v2(DltClient *client, void *data, int verbose)
     603              : {
     604              :     DltMessageV2 msg;
     605              :     int ret;
     606            0 :     if (client == 0)
     607              :         return DLT_RETURN_ERROR;
     608            0 :     if (dlt_message_init_v2(&msg, verbose) == DLT_RETURN_ERROR)
     609              :         return DLT_RETURN_ERROR;
     610              : 
     611              :     bool fetch_next_message = true;
     612            0 :     while (fetch_next_message) {
     613              : 
     614              :         /* wait for data from socket or serial connection */
     615            0 :         ret = dlt_receiver_receive(&(client->receiver));
     616              : 
     617            0 :         if (ret <= 0) {
     618              :             /* No more data to be received */
     619            0 :             if (dlt_message_free_v2(&msg, verbose) == DLT_RETURN_ERROR)
     620              :                 return DLT_RETURN_ERROR;
     621              : 
     622              :             return DLT_RETURN_TRUE;
     623              :         }
     624              : 
     625            0 :         while (dlt_message_read_v2(&msg, (unsigned char *)(client->receiver.buf),
     626            0 :                                 (unsigned int)client->receiver.bytesRcvd,
     627              :                                 client->resync_serial_header,
     628            0 :                                 verbose) == DLT_MESSAGE_ERROR_OK)
     629              :         {
     630              :             /* Call callback function */
     631            0 :             if (message_callback_function_v2) {
     632            0 :                 (*message_callback_function_v2)(&msg, data);
     633              :             }
     634              : 
     635            0 :             if (msg.found_serialheader) {
     636            0 :                 int64_t temp_remove_size = (int64_t)msg.headersizev2 + (int64_t)msg.datasize - (int64_t)msg.storageheadersizev2 + (int64_t)sizeof(dltSerialHeader);
     637            0 :                 if (temp_remove_size < 0 || temp_remove_size > UINT32_MAX) {
     638            0 :                     dlt_message_free_v2(&msg, verbose);
     639            0 :                     return DLT_RETURN_ERROR;
     640              :                 }
     641              :                 uint32_t remove_size = (uint32_t)temp_remove_size;
     642            0 :                 if (dlt_receiver_remove(&(client->receiver), (int)remove_size) == DLT_RETURN_ERROR) {
     643              :                     /* Return value ignored */
     644            0 :                     dlt_message_free_v2(&msg, verbose);
     645            0 :                     return DLT_RETURN_ERROR;
     646              :                 }
     647              :             }
     648            0 :             else if (dlt_receiver_remove(&(client->receiver),
     649            0 :                                          (int) ((uint32_t)msg.headersizev2 + (uint32_t)msg.datasize - msg.storageheadersizev2)) ==
     650              :                      DLT_RETURN_ERROR) {
     651              :                 /* Return value ignored */
     652            0 :                 dlt_message_free_v2(&msg, verbose);
     653            0 :                 return DLT_RETURN_ERROR;
     654              :             }
     655            0 :             dlt_message_free_v2(&msg, verbose);
     656              :         }
     657              : 
     658            0 :         if (dlt_receiver_move_to_begin(&(client->receiver)) == DLT_RETURN_ERROR) {
     659              :             /* Return value ignored */
     660            0 :             dlt_message_free_v2(&msg, verbose);
     661            0 :             return DLT_RETURN_ERROR;
     662              :         }
     663            0 :         if (fetch_next_message_callback_function)
     664            0 :           fetch_next_message = (*fetch_next_message_callback_function)(data);
     665              :     }
     666              : 
     667            0 :     if (dlt_message_free_v2(&msg, verbose) == DLT_RETURN_ERROR)
     668              :         return DLT_RETURN_ERROR;
     669              : 
     670              :     return DLT_RETURN_OK;
     671              : }
     672              : 
     673            1 : DltReturnValue dlt_client_send_message_to_socket(DltClient *client, DltMessage *msg)
     674              : {
     675              :     int ret = 0;
     676              : 
     677            1 :     if ((client == NULL) || (client->sock < 0)
     678            1 :         || (msg == NULL) || (msg->databuffer == NULL))
     679              :     {
     680            0 :         dlt_log(LOG_ERR, "Invalid parameters\n");
     681            0 :         return DLT_RETURN_ERROR;
     682              :     }
     683              : 
     684            1 :     if (client->send_serial_header)
     685              :     {
     686            0 :         ret = (int)send(client->sock, (const char *)dltSerialHeader,
     687              :                    sizeof(dltSerialHeader), 0);
     688            0 :         if (ret < 0)
     689              :         {
     690            0 :             dlt_vlog(LOG_ERR, "Sending serial header failed: %s\n",
     691            0 :                         strerror(errno));
     692            0 :             return DLT_RETURN_ERROR;
     693              :         }
     694              :     }
     695              : 
     696            2 :     ret = (int)send(client->sock,
     697              :                (const char *)(msg->headerbuffer + sizeof(DltStorageHeader)),
     698            1 :                (size_t)((int32_t)msg->headersize - (int32_t)sizeof(DltStorageHeader)), 0);
     699            1 :     if (ret < 0)
     700              :     {
     701            0 :         dlt_vlog(LOG_ERR, "Sending message header failed: %s\n", strerror(errno));
     702            0 :         return DLT_RETURN_ERROR;
     703              :     }
     704              : 
     705            1 :     ret = (int)send(client->sock, (const char *)msg->databuffer, (size_t)msg->datasize, 0);
     706            1 :     if ( ret < 0)
     707              :     {
     708            0 :         dlt_vlog(LOG_ERR, "Sending message failed: %s\n", strerror(errno));
     709            0 :         return DLT_RETURN_ERROR;
     710              :     }
     711              : 
     712              :     return DLT_RETURN_OK;
     713              : }
     714              : 
     715            0 : DltReturnValue dlt_client_send_message_to_socket_v2(DltClient *client, DltMessageV2 *msg)
     716              : {
     717              :     int ret = 0;
     718              : 
     719            0 :     if ((client == NULL) || (client->sock < 0)
     720            0 :         || (msg == NULL) || (msg->databuffer == NULL))
     721              :     {
     722            0 :         dlt_log(LOG_ERR, "Invalid parameters\n");
     723            0 :         return DLT_RETURN_ERROR;
     724              :     }
     725              : 
     726            0 :     if (client->send_serial_header)
     727              :     {
     728            0 :         ret = send(client->sock, (const char *)dltSerialHeader,
     729              :                    sizeof(dltSerialHeader), 0);
     730            0 :         if (ret < 0)
     731              :         {
     732            0 :             dlt_vlog(LOG_ERR, "Sending serial header failed: %s\n",
     733            0 :                         strerror(errno));
     734            0 :             return DLT_RETURN_ERROR;
     735              :         }
     736              :     }
     737              : 
     738            0 :     ret = send(client->sock,
     739            0 :                (const char *)(msg->headerbufferv2 + msg->storageheadersizev2),
     740            0 :                (uint32_t)msg->headersizev2 - msg->storageheadersizev2, 0);
     741            0 :     if (ret < 0)
     742              :     {
     743            0 :         dlt_vlog(LOG_ERR, "Sending message header failed: %s\n", strerror(errno));
     744            0 :         return DLT_RETURN_ERROR;
     745              :     }
     746              : 
     747            0 :     ret = send(client->sock, (const char *)msg->databuffer, (size_t)msg->datasize, 0);
     748            0 :     if ( ret < 0)
     749              :     {
     750            0 :         dlt_vlog(LOG_ERR, "Sending message failed: %s\n", strerror(errno));
     751            0 :         return DLT_RETURN_ERROR;
     752              :     }
     753              : 
     754              :     return DLT_RETURN_OK;
     755              : }
     756              : 
     757            8 : DltReturnValue dlt_client_send_ctrl_msg(DltClient *client, char *apid, char *ctid, uint8_t *payload, uint32_t size)
     758              : {
     759              :     DltMessage msg;
     760              :     int ret;
     761              : 
     762              :     int32_t len;
     763              :     uint32_t id_tmp;
     764              :     uint32_t id;
     765              : 
     766            8 :     if ((client == 0) || (client->sock < 0) || (apid == 0) || (ctid == 0))
     767              :         return DLT_RETURN_ERROR;
     768              : 
     769              :     /* initialise new message */
     770            8 :     if (dlt_message_init(&msg, 0) == DLT_RETURN_ERROR)
     771              :         return DLT_RETURN_ERROR;
     772              : 
     773              :     /* prepare payload of data */
     774            8 :     msg.datasize = (int32_t)size;
     775              : 
     776            8 :     if (msg.databuffer && (msg.databuffersize < msg.datasize)) {
     777            0 :         free(msg.databuffer);
     778            0 :         msg.databuffer = 0;
     779              :     }
     780              : 
     781            8 :     if (msg.databuffer == 0) {
     782            8 :         msg.databuffer = (uint8_t *)malloc((size_t)msg.datasize);
     783            8 :         msg.databuffersize = msg.datasize;
     784              :     }
     785              : 
     786            8 :     if (msg.databuffer == 0) {
     787            0 :         dlt_message_free(&msg, 0);
     788            0 :         return DLT_RETURN_ERROR;
     789              :     }
     790              : 
     791              :     /* copy data */
     792            8 :     memcpy(msg.databuffer, payload, size);
     793              : 
     794              :     /* prepare storage header */
     795            8 :     msg.storageheader = (DltStorageHeader *)msg.headerbuffer;
     796              : 
     797            8 :     if (dlt_set_storageheader(msg.storageheader, "") == DLT_RETURN_ERROR) {
     798            0 :         dlt_message_free(&msg, 0);
     799            0 :         return DLT_RETURN_ERROR;
     800              :     }
     801              : 
     802              :     /* prepare standard header */
     803            8 :     msg.standardheader = (DltStandardHeader *)(msg.headerbuffer + sizeof(DltStorageHeader));
     804            8 :     msg.standardheader->htyp = DLT_HTYP_WEID | DLT_HTYP_WTMS | DLT_HTYP_UEH | DLT_HTYP_PROTOCOL_VERSION1;
     805              : 
     806              :     #if (BYTE_ORDER == BIG_ENDIAN)
     807              :     msg.standardheader->htyp = (msg.standardheader->htyp | DLT_HTYP_MSBF);
     808              :     #endif
     809              : 
     810            8 :     msg.standardheader->mcnt = 0;
     811              : 
     812              :     /* Set header extra parameters */
     813            8 :     dlt_set_id(msg.headerextra.ecu, client->ecuid);
     814              :     /*msg.headerextra.seid = 0; */
     815            8 :     msg.headerextra.tmsp = dlt_uptime();
     816              : 
     817              :     /* Copy header extra parameters to headerbuffer */
     818            8 :     if (dlt_message_set_extraparameters(&msg, 0) == DLT_RETURN_ERROR) {
     819            0 :         dlt_message_free(&msg, 0);
     820            0 :         return DLT_RETURN_ERROR;
     821              :     }
     822              : 
     823              :     /* prepare extended header */
     824            8 :     msg.extendedheader = (DltExtendedHeader *)(msg.headerbuffer +
     825              :                                                sizeof(DltStorageHeader) +
     826            8 :                                                sizeof(DltStandardHeader) +
     827            8 :                                                DLT_STANDARD_HEADER_EXTRA_SIZE(msg.standardheader->htyp));
     828              : 
     829            8 :     msg.extendedheader->msin = DLT_MSIN_CONTROL_REQUEST;
     830              : 
     831            8 :     msg.extendedheader->noar = 1; /* number of arguments */
     832              : 
     833           15 :     dlt_set_id(msg.extendedheader->apid, (apid[0] == '\0') ? DLT_CLIENT_DUMMY_APP_ID : apid);
     834           15 :     dlt_set_id(msg.extendedheader->ctid, (ctid[0] == '\0') ? DLT_CLIENT_DUMMY_CON_ID : ctid);
     835              : 
     836              :     /* prepare length information */
     837            8 :     msg.headersize = (int32_t)(sizeof(DltStorageHeader) +
     838              :         sizeof(DltStandardHeader) +
     839            8 :         sizeof(DltExtendedHeader) +
     840            8 :         DLT_STANDARD_HEADER_EXTRA_SIZE(msg.standardheader->htyp));
     841              : 
     842            8 :     len = (int32_t)((size_t)msg.headersize - sizeof(DltStorageHeader) + (size_t)msg.datasize);
     843              : 
     844              : 
     845            8 :     if (len > UINT16_MAX) {
     846            0 :         dlt_vlog(LOG_ERR,
     847              :                  "%s: Critical: Huge injection message discarded!\n",
     848              :                  __func__);
     849              : 
     850            0 :         dlt_message_free(&msg, 0);
     851              : 
     852            0 :         return DLT_RETURN_ERROR;
     853              :     }
     854              : 
     855            8 :     msg.standardheader->len = (uint16_t)DLT_HTOBE_16((uint16_t)len);
     856              : 
     857              :     /* Send data (without storage header) */
     858            8 :     if ((client->mode == DLT_CLIENT_MODE_TCP) || (client->mode == DLT_CLIENT_MODE_SERIAL)) {
     859              :         /* via FileDescriptor */
     860            8 :         if (client->send_serial_header)
     861              :         {
     862            0 :             ret = write(client->sock, dltSerialHeader, sizeof(dltSerialHeader));
     863            0 :             if (ret < 0)
     864              :             {
     865            0 :                 dlt_log(LOG_ERR, "Sending message failed\n");
     866            0 :                 dlt_message_free(&msg, 0);
     867            0 :                 return DLT_RETURN_ERROR;
     868              :             }
     869              :         }
     870              : 
     871           16 :         ret = (int) write(client->sock,
     872              :                           msg.headerbuffer + sizeof(DltStorageHeader),
     873            8 :                           (size_t)((int32_t)msg.headersize - (int32_t)sizeof(DltStorageHeader)));
     874              : 
     875            8 :         if (0 > ret) {
     876            0 :             dlt_vlog(LOG_ERR, "%s: Sending message failed\n", __func__);
     877            0 :             dlt_message_free(&msg, 0);
     878            0 :             return DLT_RETURN_ERROR;
     879              :         }
     880              : 
     881           16 :         ret = (int) write(client->sock,
     882            8 :                           msg.databuffer,
     883            8 :                           (size_t)msg.datasize);
     884              : 
     885            8 :         if (0 > ret) {
     886            0 :             dlt_vlog(LOG_ERR, "%s: Sending message failed\n", __func__);
     887            0 :             dlt_message_free(&msg, 0);
     888            0 :             return DLT_RETURN_ERROR;
     889              :         }
     890              : 
     891            8 :         id_tmp = *((uint32_t *)(msg.databuffer));
     892            8 :         id = DLT_ENDIAN_GET_32(msg.standardheader->htyp, id_tmp);
     893              : 
     894            8 :         dlt_vlog(LOG_INFO,
     895              :                  "%s: Control message forwarded : %s\n",
     896              :                  __func__,
     897              :                  dlt_get_service_name(id));
     898              :     }
     899              :     else {
     900              :         /* via Socket */
     901            0 :         if (dlt_client_send_message_to_socket(client, &msg) == DLT_RETURN_ERROR)
     902              :         {
     903            0 :             dlt_log(LOG_ERR, "Sending message to socket failed\n");
     904            0 :             dlt_message_free(&msg, 0);
     905            0 :             return DLT_RETURN_ERROR;
     906              :         }
     907              :     }
     908              : 
     909              :     /* free message */
     910            8 :     if (dlt_message_free(&msg, 0) == DLT_RETURN_ERROR)
     911              :         return DLT_RETURN_ERROR;
     912              : 
     913              :     return DLT_RETURN_OK;
     914              : }
     915              : 
     916            0 : DltReturnValue dlt_client_send_ctrl_msg_v2(DltClient *client, char *apid, char *ctid, uint8_t *payload, uint32_t size)
     917              : {
     918              :     DltMessageV2 msg;
     919              :     int ret;
     920              :     int32_t len;
     921              :     uint32_t id_tmp;
     922              :     uint32_t id;
     923              :     uint8_t appidlen;
     924              :     uint8_t ctxidlen;
     925              :     char ecid_buf[DLT_V2_ID_SIZE];
     926              :     char apid_buf[DLT_V2_ID_SIZE];
     927              :     char ctid_buf[DLT_V2_ID_SIZE];
     928              : 
     929            0 :     if ((client == 0) || (client->sock < 0) || (apid == NULL) || (ctid == NULL))
     930              :         return DLT_RETURN_ERROR;
     931              : 
     932              :     /* initialise new message */
     933            0 :     if (dlt_message_init_v2(&msg, 0) == DLT_RETURN_ERROR)
     934              :         return DLT_RETURN_ERROR;
     935              : 
     936              :     /* prepare payload of data */
     937            0 :     msg.datasize = (int32_t)size;
     938              : 
     939            0 :     if (msg.databuffer && (msg.databuffersize < msg.datasize)) {
     940            0 :         free(msg.databuffer);
     941            0 :         msg.databuffer = 0;
     942              :     }
     943              : 
     944            0 :     if (msg.databuffer == 0) {
     945            0 :         msg.databuffer = (uint8_t *)malloc((size_t)msg.datasize);
     946            0 :         msg.databuffersize = msg.datasize;
     947              :     }
     948              : 
     949            0 :     if (msg.databuffer == 0) {
     950            0 :         dlt_message_free_v2(&msg, 0);
     951            0 :         return DLT_RETURN_ERROR;
     952              :     }
     953              : 
     954              :     /* copy data */
     955            0 :     memcpy(msg.databuffer, payload, size);
     956              : 
     957            0 :     if (strcmp(apid, "") == 0){
     958              :         appidlen = strlen(DLT_CLIENT_DUMMY_APP_ID);
     959              :     }else {
     960            0 :         appidlen = strlen(apid);
     961              :     }
     962              : 
     963            0 :     if (strcmp(ctid, "") == 0){
     964              :         ctxidlen = strlen(DLT_CLIENT_DUMMY_CON_ID);
     965              :     }else {
     966            0 :         ctxidlen = strlen(ctid);
     967              :     }
     968              : 
     969            0 :     msg.storageheadersizev2 = STORAGE_HEADER_V2_FIXED_SIZE;
     970            0 :     msg.baseheadersizev2 = BASE_HEADER_V2_FIXED_SIZE;
     971            0 :     msg.baseheaderextrasizev2 = (int32_t)dlt_message_get_extraparameters_size_v2(DLT_CONTROL_MSG);
     972            0 :     msg.extendedheadersizev2 = (uint32_t)(client->ecuid2len) + 1 + appidlen + 1 + ctxidlen + 1;
     973              : 
     974            0 :     msg.headersizev2 = (int32_t) (msg.storageheadersizev2 + msg.baseheadersizev2 +
     975            0 :                        msg.baseheaderextrasizev2 + msg.extendedheadersizev2);
     976              : 
     977            0 :     if (msg.headerbufferv2 != NULL) {
     978            0 :         free(msg.headerbufferv2);
     979              :         msg.headerbufferv2 = NULL;
     980              :     }
     981              : 
     982            0 :     msg.headerbufferv2 = (uint8_t*)malloc((size_t)msg.headersizev2);
     983              : 
     984            0 :     if (dlt_set_storageheader_v2(&(msg.storageheaderv2), 0, NULL) == DLT_RETURN_ERROR) {
     985            0 :         dlt_message_free_v2(&msg, 0);
     986            0 :         return DLT_RETURN_ERROR;
     987              :     }
     988              : 
     989            0 :     if (dlt_message_set_storageparameters_v2(&msg, 0) != DLT_RETURN_OK) {
     990            0 :         dlt_message_free_v2(&msg, 0);
     991            0 :         return DLT_RETURN_ERROR;
     992              :     }
     993              : 
     994              :     /* prepare base header */
     995            0 :     msg.baseheaderv2 = (DltBaseHeaderV2 *)(msg.headerbufferv2 + msg.storageheadersizev2);
     996              : 
     997              :     msg.baseheaderv2->htyp2 = DLT_HTYP2_PROTOCOL_VERSION2;
     998              :     msg.baseheaderv2->htyp2 |= DLT_CONTROL_MSG;
     999              :     msg.baseheaderv2->htyp2 |= DLT_HTYP2_WEID;
    1000            0 :     msg.baseheaderv2->htyp2 |= DLT_HTYP2_WACID;
    1001            0 :     msg.baseheaderv2->mcnt = 0;
    1002              : 
    1003              :     /* Fill base header conditional parameters */
    1004            0 :     msg.headerextrav2.msin = DLT_MSIN_CONTROL_REQUEST;
    1005            0 :     msg.headerextrav2.noar = 1; /* number of arguments */
    1006              :     memset(msg.headerextrav2.seconds, 0, 5);
    1007            0 :     msg.headerextrav2.nanoseconds = 0;
    1008              :     #if defined (__WIN32__) || defined(_MSC_VER)
    1009              :     time_t t = time(NULL);
    1010              :     if (t==-1){
    1011              :         uint32_t tcnt = (uint32_t)(GetTickCount()); /* GetTickCount() in 10 ms resolution */
    1012              :         tcnt_seconds = tcnt / 100;
    1013              :         tcnt_ns = (tcnt - (tcnt*100)) * 10000;
    1014              :         msg.headerextrav2.seconds[0]=(tcnt_seconds >> 32) & 0xFF;
    1015              :         msg.headerextrav2.seconds[1]=(tcnt_seconds >> 24) & 0xFF;
    1016              :         msg.headerextrav2.seconds[2]=(tcnt_seconds >> 16) & 0xFF;
    1017              :         msg.headerextrav2.seconds[3]=(tcnt_seconds >> 8) & 0xFF;
    1018              :         msg.headerextrav2.seconds[4]= tcnt_seconds & 0xFF;
    1019              :         if (ts.tv_nsec < 0x3B9ACA00) {
    1020              :             msg.headerextrav2.nanoseconds = tcnt_ns;
    1021              :         }
    1022              :     }else{
    1023              :         msg.headerextrav2.seconds[0]=(t >> 32) & 0xFF;
    1024              :         msg.headerextrav2.seconds[1]=(t >> 24) & 0xFF;
    1025              :         msg.headerextrav2.seconds[2]=(t >> 16) & 0xFF;
    1026              :         msg.headerextrav2.seconds[3]=(t >> 8) & 0xFF;
    1027              :         msg.headerextrav2.seconds[4]= t & 0xFF;
    1028              :         msg.headerextrav2.nanoseconds |= 0x8000;
    1029              :     }
    1030              :     #else
    1031              :     struct timespec ts;
    1032            0 :     if(clock_gettime(CLOCK_REALTIME, &ts) == 0) {
    1033            0 :         msg.headerextrav2.seconds[0]=(ts.tv_sec >> 32) & 0xFF;
    1034            0 :         msg.headerextrav2.seconds[1]=(ts.tv_sec >> 24) & 0xFF;
    1035            0 :         msg.headerextrav2.seconds[2]=(ts.tv_sec >> 16) & 0xFF;
    1036            0 :         msg.headerextrav2.seconds[3]=(ts.tv_sec >> 8) & 0xFF;
    1037            0 :         msg.headerextrav2.seconds[4]= ts.tv_sec & 0xFF;
    1038            0 :         if (ts.tv_nsec < 0x3B9ACA00) {
    1039            0 :             msg.headerextrav2.nanoseconds = (uint32_t) ts.tv_nsec; /* value is long */
    1040              :         }
    1041            0 :     }else if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
    1042            0 :         msg.headerextrav2.seconds[0]=(ts.tv_sec >> 32) & 0xFF;
    1043            0 :         msg.headerextrav2.seconds[1]=(ts.tv_sec >> 24) & 0xFF;
    1044            0 :         msg.headerextrav2.seconds[2]=(ts.tv_sec >> 16) & 0xFF;
    1045            0 :         msg.headerextrav2.seconds[3]=(ts.tv_sec >> 8) & 0xFF;
    1046            0 :         msg.headerextrav2.seconds[4]= ts.tv_sec & 0xFF;
    1047            0 :         if (ts.tv_nsec < 0x3B9ACA00) {
    1048            0 :             msg.headerextrav2.nanoseconds = (uint32_t) ts.tv_nsec; /* value is long */
    1049              :         }
    1050            0 :         msg.headerextrav2.nanoseconds |= 0x8000;
    1051              :     }
    1052              :     #endif
    1053              : 
    1054              :     /* Copy header extra parameters to headerbuffer */
    1055            0 :     if (dlt_message_set_extraparameters_v2(&msg, 0) == DLT_RETURN_ERROR) {
    1056            0 :         dlt_message_free_v2(&msg, 0);
    1057            0 :         return DLT_RETURN_ERROR;
    1058              :     }
    1059              : 
    1060              :     /* Fill out extended header */
    1061            0 :     if (DLT_IS_HTYP2_WEID(msg.baseheaderv2->htyp2)) {
    1062            0 :         msg.extendedheaderv2.ecidlen = client->ecuid2len;
    1063            0 :         if (msg.extendedheaderv2.ecidlen > 0) {
    1064            0 :             dlt_set_id_v2(ecid_buf, client->ecuid2, msg.extendedheaderv2.ecidlen);
    1065            0 :             msg.extendedheaderv2.ecid = ecid_buf;
    1066              :         } else {
    1067            0 :             msg.extendedheaderv2.ecid = NULL;
    1068              :         }
    1069              :     }
    1070              : 
    1071            0 :     if (DLT_IS_HTYP2_WACID(msg.baseheaderv2->htyp2)) {
    1072            0 :         msg.extendedheaderv2.apidlen = appidlen;
    1073            0 :         if (msg.extendedheaderv2.apidlen > 0) {
    1074            0 :             if (strcmp(apid, "") == 0) {
    1075            0 :                 dlt_set_id_v2(apid_buf, DLT_CLIENT_DUMMY_APP_ID, msg.extendedheaderv2.apidlen);
    1076              :             } else {
    1077            0 :                 dlt_set_id_v2(apid_buf, apid, msg.extendedheaderv2.apidlen);
    1078              :             }
    1079            0 :             msg.extendedheaderv2.apid = apid_buf;
    1080              :         } else {
    1081            0 :             msg.extendedheaderv2.apid = NULL;
    1082              :         }
    1083            0 :         msg.extendedheaderv2.apidlen = appidlen;
    1084            0 :         msg.extendedheaderv2.ctidlen = ctxidlen;
    1085            0 :         if (msg.extendedheaderv2.ctidlen > 0) {
    1086            0 :             if (strcmp(ctid, "") == 0) {
    1087            0 :                 dlt_set_id_v2(ctid_buf, DLT_CLIENT_DUMMY_CON_ID, msg.extendedheaderv2.ctidlen);
    1088              :             } else {
    1089            0 :                 dlt_set_id_v2(ctid_buf, ctid, msg.extendedheaderv2.ctidlen);
    1090              :             }
    1091            0 :             msg.extendedheaderv2.ctid = ctid_buf;
    1092              :         } else {
    1093            0 :             msg.extendedheaderv2.ctid = NULL;
    1094              :         }
    1095              :     }
    1096              : 
    1097            0 :     if (dlt_message_set_extendedparameters_v2(&msg) != DLT_RETURN_OK) {
    1098            0 :         dlt_message_free_v2(&msg, 0);
    1099            0 :         return DLT_RETURN_ERROR;
    1100              :     }
    1101              : 
    1102            0 :     len = msg.headersizev2 - (int32_t) msg.storageheadersizev2 + msg.datasize;
    1103              : 
    1104            0 :     if (len > UINT16_MAX) {
    1105            0 :         dlt_vlog(LOG_ERR,
    1106              :                 "%s: Critical: Huge injection message discarded!\n",
    1107              :                 __func__);
    1108            0 :         dlt_message_free_v2(&msg, 0);
    1109            0 :         return DLT_RETURN_ERROR;
    1110              :     }
    1111            0 :     msg.baseheaderv2->len = (uint16_t)len;
    1112              : 
    1113              :     /* Send data (without storage header) */
    1114            0 :     if ((client->mode == DLT_CLIENT_MODE_TCP) || (client->mode == DLT_CLIENT_MODE_SERIAL)) {
    1115              :         /* via FileDescriptor */
    1116            0 :         if (client->send_serial_header)
    1117              :         {
    1118            0 :             ret = write(client->sock, dltSerialHeader, sizeof(dltSerialHeader));
    1119            0 :             if (ret < 0)
    1120              :             {
    1121            0 :                 dlt_log(LOG_ERR, "Sending message failed\n");
    1122            0 :                 dlt_message_free_v2(&msg, 0);
    1123            0 :                 return DLT_RETURN_ERROR;
    1124              :             }
    1125              :         }
    1126            0 :         ret =
    1127            0 :             (int) write(client->sock, msg.headerbufferv2 + msg.storageheadersizev2 , (uint32_t)msg.headersizev2 - msg.storageheadersizev2);
    1128              : 
    1129            0 :         if (0 > ret) {
    1130            0 :             dlt_vlog(LOG_ERR, "%s: Sending message failed\n", __func__);
    1131            0 :             dlt_message_free_v2(&msg, 0);
    1132            0 :             return DLT_RETURN_ERROR;
    1133              :         }
    1134              : 
    1135            0 :         ret = (int) write(client->sock, msg.databuffer, (uint32_t)msg.datasize);
    1136              : 
    1137            0 :         if (0 > ret) {
    1138            0 :             dlt_vlog(LOG_ERR, "%s: Sending message failed\n", __func__);
    1139            0 :             dlt_message_free_v2(&msg, 0);
    1140            0 :             return DLT_RETURN_ERROR;
    1141              :         }
    1142              : 
    1143            0 :         id_tmp = *((uint32_t *)(msg.databuffer));
    1144              :         id = DLT_LETOH_32(id_tmp);
    1145              : 
    1146            0 :         dlt_vlog(LOG_INFO,
    1147              :                 "%s: Control message forwarded : %s\n",
    1148              :                 __func__,
    1149              :                 dlt_get_service_name(id));
    1150              :     }
    1151              :     else {
    1152              :         /* via Socket */
    1153            0 :         if (dlt_client_send_message_to_socket_v2(client, &msg) == DLT_RETURN_ERROR)
    1154              :         {
    1155            0 :             dlt_log(LOG_ERR, "Sending message to socket failed\n");
    1156            0 :             dlt_message_free_v2(&msg, 0);
    1157            0 :             return DLT_RETURN_ERROR;
    1158              :         }
    1159              :     }
    1160              : 
    1161              :     /* free message */
    1162            0 :     if (dlt_message_free_v2(&msg, 0) == DLT_RETURN_ERROR)
    1163              :         return DLT_RETURN_ERROR;
    1164              : 
    1165              : 
    1166              :     return DLT_RETURN_OK;
    1167              : }
    1168              : 
    1169            0 : DltReturnValue dlt_client_send_inject_msg(DltClient *client,
    1170              :                                           char *apid,
    1171              :                                           char *ctid,
    1172              :                                           uint32_t serviceID,
    1173              :                                           uint8_t *buffer,
    1174              :                                           uint32_t size)
    1175              : {
    1176              :     uint8_t *payload;
    1177              :     int offset;
    1178              : 
    1179            0 :     payload = (uint8_t *)malloc(sizeof(uint32_t) + sizeof(uint32_t) + size);
    1180              : 
    1181            0 :     if (payload == 0)
    1182              :         return DLT_RETURN_ERROR;
    1183              : 
    1184              :     offset = 0;
    1185              :     memcpy(payload, &serviceID, sizeof(serviceID));
    1186              :     offset += (int) sizeof(uint32_t);
    1187            0 :     memcpy(payload + offset, &size, sizeof(size));
    1188              :     offset += (int) sizeof(uint32_t);
    1189            0 :     memcpy(payload + offset, buffer, size);
    1190              : 
    1191              :     /* free message */
    1192            0 :     if (dlt_client_send_ctrl_msg(client, apid, ctid, payload,
    1193              :                                  (uint32_t) (sizeof(uint32_t) + sizeof(uint32_t) + size)) == DLT_RETURN_ERROR) {
    1194            0 :         free(payload);
    1195            0 :         return DLT_RETURN_ERROR;
    1196              :     }
    1197              : 
    1198            0 :     free(payload);
    1199              : 
    1200            0 :     return DLT_RETURN_OK;
    1201              : 
    1202              : }
    1203              : 
    1204            0 : DltReturnValue dlt_client_send_inject_msg_v2(DltClient *client,
    1205              :                                              char *apid,
    1206              :                                              char *ctid,
    1207              :                                              uint32_t serviceID,
    1208              :                                              uint8_t *buffer,
    1209              :                                              uint32_t size)
    1210              : {
    1211              :     uint8_t *payload;
    1212              :     int offset;
    1213              : 
    1214            0 :     payload = (uint8_t *)malloc(sizeof(uint32_t) + sizeof(uint32_t) + size);
    1215              : 
    1216            0 :     if (payload == 0)
    1217              :         return DLT_RETURN_ERROR;
    1218              : 
    1219              :     offset = 0;
    1220              :     memcpy(payload, &serviceID, sizeof(serviceID));
    1221              :     offset += (int) sizeof(uint32_t);
    1222            0 :     memcpy(payload + offset, &size, sizeof(size));
    1223              :     offset += (int) sizeof(uint32_t);
    1224            0 :     memcpy(payload + offset, buffer, size);
    1225              : 
    1226              :     /* free message */
    1227            0 :     if (dlt_client_send_ctrl_msg_v2(client, apid, ctid, payload,
    1228              :                                  (uint32_t) (sizeof(uint32_t) + sizeof(uint32_t) + size)) == DLT_RETURN_ERROR) {
    1229            0 :         free(payload);
    1230            0 :         return DLT_RETURN_ERROR;
    1231              :     }
    1232              : 
    1233            0 :     free(payload);
    1234              : 
    1235            0 :     return DLT_RETURN_OK;
    1236              : 
    1237              : }
    1238              : 
    1239            1 : DltReturnValue dlt_client_send_log_level(DltClient *client, char *apid, char *ctid, uint8_t logLevel)
    1240              : {
    1241              :     DltServiceSetLogLevel *req;
    1242              :     int ret = DLT_RETURN_ERROR;
    1243              : 
    1244            1 :     if (client == NULL)
    1245              :         return ret;
    1246              : 
    1247            1 :     req = calloc(1, sizeof(DltServiceSetLogLevel));
    1248              : 
    1249            1 :     if (req == NULL)
    1250              :         return ret;
    1251              : 
    1252            1 :     req->service_id = DLT_SERVICE_ID_SET_LOG_LEVEL;
    1253            1 :     dlt_set_id(req->apid, apid);
    1254            1 :     dlt_set_id(req->ctid, ctid);
    1255            1 :     req->log_level = logLevel;
    1256            1 :     dlt_set_id(req->com, "remo");
    1257              : 
    1258              :     /* free message */
    1259            1 :     ret = dlt_client_send_ctrl_msg(client,
    1260              :                                    "APP",
    1261              :                                    "CON",
    1262              :                                    (uint8_t *)req,
    1263              :                                    sizeof(DltServiceSetLogLevel));
    1264              : 
    1265              : 
    1266            1 :     free(req);
    1267              : 
    1268            1 :     return ret;
    1269              : }
    1270              : 
    1271            0 : DltReturnValue dlt_client_send_log_level_v2(DltClient *client, char *apid, char *ctid, uint8_t logLevel)
    1272              : {
    1273              :     DltServiceSetLogLevelV2 req;
    1274              :     int ret = DLT_RETURN_ERROR;
    1275              :     uint8_t *buffer;
    1276              :     uint16_t buffersize;
    1277              :     uint16_t offset = 0;
    1278              : 
    1279            0 :     if (client == NULL)
    1280              :         return ret;
    1281              : 
    1282            0 :     req.service_id = DLT_SERVICE_ID_SET_LOG_LEVEL;
    1283            0 :     req.apidlen = strlen(apid);
    1284            0 :     req.apid = apid;
    1285            0 :     req.ctidlen = strlen(ctid);
    1286            0 :     req.ctid = ctid;
    1287            0 :     req.log_level = logLevel;
    1288            0 :     dlt_set_id(req.com, "remo");
    1289              : 
    1290            0 :     buffersize = DLT_SERVICE_SET_LOG_LEVEL_FIXED_SIZE_V2 + req.apidlen + req.ctidlen;
    1291              : 
    1292            0 :     buffer = (uint8_t *)malloc(buffersize);
    1293            0 :     if (buffer == NULL)
    1294              :         return ret;
    1295              : 
    1296              :     memcpy(buffer + offset, &(req.service_id), 4);
    1297              :     offset = offset + 4;
    1298            0 :     memcpy(buffer + offset, &(req.apidlen), 1);
    1299              :     offset = offset + 1;
    1300            0 :     memcpy(buffer + offset, req.apid, req.apidlen);
    1301            0 :     offset = offset + req.apidlen;
    1302            0 :     memcpy(buffer + offset, &(req.ctidlen), 1);
    1303            0 :     offset = offset + 1;
    1304            0 :     memcpy(buffer + offset, req.ctid, req.ctidlen);
    1305            0 :     offset = offset + req.ctidlen;
    1306            0 :     memcpy(buffer + offset, &(req.log_level), 1);
    1307            0 :     offset = offset + 1;
    1308            0 :     memcpy(buffer + offset, req.com, 4);
    1309              : 
    1310            0 :     ret = dlt_client_send_ctrl_msg_v2(client,
    1311              :                                       "APP",
    1312              :                                       "CON",
    1313              :                                       (uint8_t *)buffer,
    1314              :                                       buffersize);
    1315              : 
    1316              : 
    1317            0 :     free(buffer);
    1318              : 
    1319            0 :     return ret;
    1320              : }
    1321              : 
    1322            3 : DltReturnValue dlt_client_get_log_info(DltClient *client)
    1323              : {
    1324              :     DltServiceGetLogInfoRequest *req;
    1325              :     int ret = DLT_RETURN_ERROR;
    1326              : 
    1327            3 :     if (client == NULL)
    1328              :         return ret;
    1329              : 
    1330            3 :     req = (DltServiceGetLogInfoRequest *)malloc(sizeof(DltServiceGetLogInfoRequest));
    1331              : 
    1332            3 :     if (req == NULL)
    1333              :         return ret;
    1334              : 
    1335            3 :     req->service_id = DLT_SERVICE_ID_GET_LOG_INFO;
    1336            3 :     req->options = 7;
    1337            3 :     dlt_set_id(req->apid, "");
    1338            3 :     dlt_set_id(req->ctid, "");
    1339            3 :     dlt_set_id(req->com, "remo");
    1340              : 
    1341              :     /* send control message to daemon*/
    1342            3 :     ret = dlt_client_send_ctrl_msg(client,
    1343              :                                    "",
    1344              :                                    "",
    1345              :                                    (uint8_t *)req,
    1346              :                                    sizeof(DltServiceGetLogInfoRequest));
    1347              : 
    1348            3 :     free(req);
    1349              : 
    1350            3 :     return ret;
    1351              : }
    1352              : 
    1353            0 : int dlt_client_get_log_info_v2(DltClient *client)
    1354              : {
    1355              :     DltServiceGetLogInfoRequestV2 req;
    1356              :     int ret = DLT_RETURN_ERROR;
    1357              :     uint8_t *buffer;
    1358              :     uint16_t buffersize;
    1359              :     uint16_t offset = 0;
    1360              : 
    1361            0 :     if (client == NULL)
    1362              :         return ret;
    1363              : 
    1364            0 :     req.service_id = DLT_SERVICE_ID_GET_LOG_INFO;
    1365            0 :     req.options = 7;
    1366            0 :     req.apidlen = 0;
    1367            0 :     req.apid = NULL;
    1368            0 :     req.ctidlen = 0;
    1369            0 :     req.ctid = NULL;
    1370            0 :     dlt_set_id(req.com, "remo");
    1371              : 
    1372            0 :     buffersize = DLT_SERVICE_GET_LOG_INFO_REQUEST_FIXED_SIZE_V2 + req.apidlen + req.ctidlen;
    1373              : 
    1374            0 :     buffer = (uint8_t *)malloc(buffersize);
    1375            0 :     if (buffer == NULL)
    1376              :         return ret;
    1377              : 
    1378              :     memcpy(buffer + offset, &(req.service_id), 4);
    1379              :     offset = offset + 4;
    1380            0 :     memcpy(buffer + offset, &(req.options), 1);
    1381              :     offset = offset + 1;
    1382            0 :     memcpy(buffer + offset, &(req.apidlen), 1);
    1383              :     offset = offset + 1;
    1384              :     // Since App Id is null, not copying it into buffer
    1385            0 :     memcpy(buffer + offset, &(req.ctidlen), 1);
    1386              :     offset = offset + 1;
    1387              :     // Since Context Id is null, not copying it into buffer
    1388            0 :     memcpy(buffer + offset, req.com, 4);
    1389              : 
    1390              :     /* send control message to daemon*/
    1391            0 :     ret = dlt_client_send_ctrl_msg_v2(client,
    1392              :                                       "",
    1393              :                                       "",
    1394              :                                       (uint8_t *)buffer,
    1395              :                                       buffersize);
    1396              : 
    1397            0 :     free(buffer);
    1398              : 
    1399            0 :     return ret;
    1400              : }
    1401              : 
    1402            1 : DltReturnValue dlt_client_get_default_log_level(DltClient *client)
    1403              : {
    1404              :     DltServiceGetDefaultLogLevelRequest *req;
    1405              :     int ret = DLT_RETURN_ERROR;
    1406              : 
    1407            1 :     if (client == NULL)
    1408              :         return ret;
    1409              : 
    1410              :     req = (DltServiceGetDefaultLogLevelRequest *)
    1411            1 :         malloc(sizeof(DltServiceGetDefaultLogLevelRequest));
    1412              : 
    1413            1 :     if (req == NULL)
    1414              :         return ret;
    1415              : 
    1416            1 :     req->service_id = DLT_SERVICE_ID_GET_DEFAULT_LOG_LEVEL;
    1417              : 
    1418              :     /* send control message to daemon*/
    1419            1 :     ret = dlt_client_send_ctrl_msg(client,
    1420              :                                    "",
    1421              :                                    "",
    1422              :                                    (uint8_t *)req,
    1423              :                                    sizeof(DltServiceGetDefaultLogLevelRequest));
    1424              : 
    1425            1 :     free(req);
    1426              : 
    1427            1 :     return ret;
    1428              : }
    1429              : 
    1430            0 : DltReturnValue dlt_client_get_default_log_level_v2(DltClient *client)
    1431              : {
    1432              :     DltServiceGetDefaultLogLevelRequest *req;
    1433              :     int ret = DLT_RETURN_ERROR;
    1434              : 
    1435            0 :     if (client == NULL)
    1436              :         return ret;
    1437              : 
    1438              :     req = (DltServiceGetDefaultLogLevelRequest *)
    1439            0 :         malloc(sizeof(DltServiceGetDefaultLogLevelRequest));
    1440              : 
    1441            0 :     if (req == NULL)
    1442              :         return ret;
    1443              : 
    1444            0 :     req->service_id = DLT_SERVICE_ID_GET_DEFAULT_LOG_LEVEL;
    1445              : 
    1446              :     /* send control message to daemon*/
    1447            0 :     ret = dlt_client_send_ctrl_msg_v2(client,
    1448              :                                       "",
    1449              :                                       "",
    1450              :                                       (uint8_t *)req,
    1451              :                                       sizeof(DltServiceGetDefaultLogLevelRequest));
    1452              : 
    1453            0 :     free(req);
    1454              : 
    1455            0 :     return ret;
    1456              : }
    1457              : 
    1458            3 : DltReturnValue dlt_client_get_software_version(DltClient *client)
    1459              : {
    1460              :     DltServiceGetSoftwareVersion *req;
    1461              :     int ret = DLT_RETURN_ERROR;
    1462              : 
    1463            3 :     if (client == NULL)
    1464              :         return ret;
    1465              : 
    1466            3 :     req = (DltServiceGetSoftwareVersion *)malloc(sizeof(DltServiceGetSoftwareVersion));
    1467              : 
    1468            3 :     req->service_id = DLT_SERVICE_ID_GET_SOFTWARE_VERSION;
    1469              : 
    1470              :     /* send control message to daemon*/
    1471            3 :     ret = dlt_client_send_ctrl_msg(client,
    1472              :                                    "",
    1473              :                                    "",
    1474              :                                    (uint8_t *)req,
    1475              :                                    sizeof(DltServiceGetSoftwareVersion));
    1476              : 
    1477            3 :     free(req);
    1478              : 
    1479            3 :     return ret;
    1480              : }
    1481              : 
    1482            0 : int dlt_client_get_software_version_v2(DltClient *client)
    1483              : {
    1484              :     DltServiceGetSoftwareVersion *req;
    1485              :     int ret = DLT_RETURN_ERROR;
    1486              : 
    1487            0 :     if (client == NULL)
    1488              :         return ret;
    1489              : 
    1490            0 :     req = (DltServiceGetSoftwareVersion *)malloc(sizeof(DltServiceGetSoftwareVersion));
    1491              : 
    1492            0 :     req->service_id = DLT_SERVICE_ID_GET_SOFTWARE_VERSION;
    1493              : 
    1494              :     /* send control message to daemon*/
    1495            0 :     ret = dlt_client_send_ctrl_msg_v2(client,
    1496              :                                       "",
    1497              :                                       "",
    1498              :                                       (uint8_t *)req,
    1499              :                                       sizeof(DltServiceGetSoftwareVersion));
    1500              : 
    1501            0 :     free(req);
    1502              : 
    1503            0 :     return ret;
    1504              : }
    1505              : 
    1506            0 : DltReturnValue dlt_client_send_trace_status(DltClient *client, char *apid, char *ctid, uint8_t traceStatus)
    1507              : {
    1508              :     DltServiceSetLogLevel *req;
    1509              : 
    1510            0 :     req = calloc(1,sizeof(DltServiceSetLogLevel));
    1511              : 
    1512            0 :     if (req == 0)
    1513              :         return DLT_RETURN_ERROR;
    1514              : 
    1515            0 :     req->service_id = DLT_SERVICE_ID_SET_TRACE_STATUS;
    1516            0 :     dlt_set_id(req->apid, apid);
    1517            0 :     dlt_set_id(req->ctid, ctid);
    1518            0 :     req->log_level = traceStatus;
    1519            0 :     dlt_set_id(req->com, "remo");
    1520              : 
    1521              :     /* free message */
    1522            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t*) req,
    1523              :                                  sizeof(DltServiceSetLogLevel)) == DLT_RETURN_ERROR) {
    1524            0 :         free(req);
    1525            0 :         return DLT_RETURN_ERROR;
    1526              :     }
    1527              : 
    1528            0 :     free(req);
    1529              : 
    1530            0 :     return DLT_RETURN_OK;
    1531              : }
    1532              : 
    1533            0 : DltReturnValue dlt_client_send_trace_status_v2(DltClient *client, char *apid, char *ctid, uint8_t traceStatus)
    1534              : {
    1535              :     DltServiceSetLogLevelV2 req;
    1536              :     int ret = DLT_RETURN_ERROR;
    1537              :     uint8_t *buffer;
    1538              :     uint16_t buffersize;
    1539              :     uint16_t offset = 0;
    1540              : 
    1541            0 :     if (client == NULL)
    1542              :         return ret;
    1543              : 
    1544            0 :     req.service_id = DLT_SERVICE_ID_SET_TRACE_STATUS;
    1545            0 :     req.apidlen = strlen(apid);
    1546            0 :     req.apid = apid;
    1547            0 :     req.ctidlen = strlen(ctid);
    1548            0 :     req.ctid = ctid;
    1549            0 :     req.log_level = traceStatus;
    1550            0 :     dlt_set_id(req.com, "remo");
    1551              : 
    1552            0 :     buffersize = DLT_SERVICE_SET_LOG_LEVEL_FIXED_SIZE_V2 + req.apidlen + req.ctidlen;
    1553              : 
    1554            0 :     buffer = (uint8_t *)malloc(buffersize);
    1555            0 :     if (buffer == NULL)
    1556              :         return ret;
    1557              : 
    1558              :     memcpy(buffer + offset, &(req.service_id), 4);
    1559              :     offset = offset + 4;
    1560            0 :     memcpy(buffer + offset, &(req.apidlen), 1);
    1561              :     offset = offset + 1;
    1562            0 :     memcpy(buffer + offset, req.apid, req.apidlen);
    1563            0 :     offset = offset + req.apidlen;
    1564            0 :     memcpy(buffer + offset, &(req.ctidlen), 1);
    1565            0 :     offset = offset + 1;
    1566            0 :     memcpy(buffer + offset, req.ctid, req.ctidlen);
    1567            0 :     offset = offset + req.ctidlen;
    1568            0 :     memcpy(buffer + offset, &(req.log_level), 1);
    1569              :     offset = offset + 1;
    1570              :     memcpy(buffer, req.com, 4);
    1571              : 
    1572              :     /* free message */
    1573            0 :     ret = dlt_client_send_ctrl_msg_v2(client,
    1574              :                                       "APP",
    1575              :                                       "CON",
    1576              :                                       (uint8_t *)buffer,
    1577              :                                       buffersize);
    1578              : 
    1579              : 
    1580            0 :     free(buffer);
    1581              : 
    1582            0 :     return ret;
    1583              : }
    1584              : 
    1585            0 : DltReturnValue dlt_client_send_default_log_level(DltClient *client, uint8_t defaultLogLevel)
    1586              : {
    1587              :     DltServiceSetDefaultLogLevel *req;
    1588              : 
    1589            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1590              : 
    1591            0 :     if (req == 0)
    1592              :         return DLT_RETURN_ERROR;
    1593              : 
    1594            0 :     req->service_id = DLT_SERVICE_ID_SET_DEFAULT_LOG_LEVEL;
    1595            0 :     req->log_level = defaultLogLevel;
    1596            0 :     dlt_set_id(req->com, "remo");
    1597              : 
    1598              :     /* free message */
    1599            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t*) req,
    1600              :                                  sizeof(DltServiceSetDefaultLogLevel)) == DLT_RETURN_ERROR) {
    1601            0 :         free(req);
    1602            0 :         return DLT_RETURN_ERROR;
    1603              :     }
    1604              : 
    1605            0 :     free(req);
    1606              : 
    1607            0 :     return DLT_RETURN_OK;
    1608              : }
    1609              : 
    1610            0 : DltReturnValue dlt_client_send_default_log_level_v2(DltClient *client, uint8_t defaultLogLevel)
    1611              : {
    1612              :     DltServiceSetDefaultLogLevel *req;
    1613              : 
    1614            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1615              : 
    1616            0 :     if (req == 0)
    1617              :         return DLT_RETURN_ERROR;
    1618              : 
    1619            0 :     req->service_id = DLT_SERVICE_ID_SET_DEFAULT_LOG_LEVEL;
    1620            0 :     req->log_level = defaultLogLevel;
    1621            0 :     dlt_set_id(req->com, "remo");
    1622              : 
    1623              :     /* free message */
    1624            0 :     if (dlt_client_send_ctrl_msg_v2(client, "APP", "CON", (uint8_t*) req,
    1625              :                                  sizeof(DltServiceSetDefaultLogLevel)) == DLT_RETURN_ERROR) {
    1626            0 :         free(req);
    1627            0 :         return DLT_RETURN_ERROR;
    1628              :     }
    1629              : 
    1630            0 :     free(req);
    1631              : 
    1632            0 :     return DLT_RETURN_OK;
    1633              : }
    1634              : 
    1635            0 : DltReturnValue dlt_client_send_all_log_level(DltClient *client, uint8_t LogLevel)
    1636              : {
    1637              :     DltServiceSetDefaultLogLevel *req;
    1638              : 
    1639            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1640              : 
    1641            0 :     if (req == 0)
    1642              :         return DLT_RETURN_ERROR;
    1643              : 
    1644            0 :     req->service_id = DLT_SERVICE_ID_SET_ALL_LOG_LEVEL;
    1645            0 :     req->log_level = LogLevel;
    1646            0 :     dlt_set_id(req->com, "remo");
    1647              : 
    1648              :     /* free message */
    1649            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t*) req,
    1650              :                                  sizeof(DltServiceSetDefaultLogLevel)) == -1) {
    1651            0 :         free(req);
    1652            0 :         return DLT_RETURN_ERROR;
    1653              :     }
    1654              : 
    1655            0 :     free(req);
    1656              : 
    1657            0 :     return DLT_RETURN_OK;
    1658              : }
    1659              : 
    1660            0 : DltReturnValue dlt_client_send_all_log_level_v2(DltClient *client, uint8_t LogLevel)
    1661              : {
    1662              :     DltServiceSetDefaultLogLevel *req;
    1663              : 
    1664            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1665              : 
    1666            0 :     if (req == 0)
    1667              :         return DLT_RETURN_ERROR;
    1668              : 
    1669            0 :     req->service_id = DLT_SERVICE_ID_SET_ALL_LOG_LEVEL;
    1670            0 :     req->log_level = LogLevel;
    1671            0 :     dlt_set_id(req->com, "remo");
    1672              : 
    1673              :     /* free message */
    1674            0 :     if (dlt_client_send_ctrl_msg_v2(client, "APP", "CON", (uint8_t*) req,
    1675              :                                  sizeof(DltServiceSetDefaultLogLevel)) == -1) {
    1676            0 :         free(req);
    1677            0 :         return DLT_RETURN_ERROR;
    1678              :     }
    1679              : 
    1680            0 :     free(req);
    1681              : 
    1682            0 :     return DLT_RETURN_OK;
    1683              : }
    1684              : 
    1685            0 : DltReturnValue dlt_client_send_default_trace_status(DltClient *client, uint8_t defaultTraceStatus)
    1686              : {
    1687              :     DltServiceSetDefaultLogLevel *req;
    1688              : 
    1689            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1690              : 
    1691            0 :     if (req == 0)
    1692              :         return DLT_RETURN_ERROR;
    1693              : 
    1694            0 :     req->service_id = DLT_SERVICE_ID_SET_DEFAULT_TRACE_STATUS;
    1695            0 :     req->log_level = defaultTraceStatus;
    1696            0 :     dlt_set_id(req->com, "remo");
    1697              : 
    1698              :     /* free message */
    1699            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t*) req,
    1700              :                                  sizeof(DltServiceSetDefaultLogLevel)) == DLT_RETURN_ERROR) {
    1701            0 :         free(req);
    1702            0 :         return DLT_RETURN_ERROR;
    1703              :     }
    1704              : 
    1705            0 :     free(req);
    1706              : 
    1707            0 :     return DLT_RETURN_OK;
    1708              : }
    1709              : 
    1710            0 : DltReturnValue dlt_client_send_default_trace_status_v2(DltClient *client, uint8_t defaultTraceStatus)
    1711              : {
    1712              :     DltServiceSetDefaultLogLevel *req;
    1713              : 
    1714            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1715              : 
    1716            0 :     if (req == 0)
    1717              :         return DLT_RETURN_ERROR;
    1718              : 
    1719            0 :     req->service_id = DLT_SERVICE_ID_SET_DEFAULT_TRACE_STATUS;
    1720            0 :     req->log_level = defaultTraceStatus;
    1721            0 :     dlt_set_id(req->com, "remo");
    1722              : 
    1723              :     /* free message */
    1724            0 :     if (dlt_client_send_ctrl_msg_v2(client, "APP", "CON", (uint8_t*) req,
    1725              :                                  sizeof(DltServiceSetDefaultLogLevel)) == DLT_RETURN_ERROR) {
    1726            0 :         free(req);
    1727            0 :         return DLT_RETURN_ERROR;
    1728              :     }
    1729              : 
    1730            0 :     free(req);
    1731              : 
    1732            0 :     return DLT_RETURN_OK;
    1733              : }
    1734              : 
    1735            0 : DltReturnValue dlt_client_send_all_trace_status(DltClient *client, uint8_t traceStatus)
    1736              : {
    1737              :     DltServiceSetDefaultLogLevel *req;
    1738              : 
    1739            0 :     if (client == NULL) {
    1740            0 :         dlt_vlog(LOG_ERR, "%s: Invalid parameters\n", __func__);
    1741            0 :         return DLT_RETURN_ERROR;
    1742              :     }
    1743              : 
    1744            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1745              : 
    1746            0 :     if (req == 0) {
    1747            0 :         dlt_vlog(LOG_ERR, "%s: Could not allocate memory %zu\n", __func__, sizeof(DltServiceSetDefaultLogLevel));
    1748            0 :         return DLT_RETURN_ERROR;
    1749              :     }
    1750              : 
    1751            0 :     req->service_id = DLT_SERVICE_ID_SET_ALL_TRACE_STATUS;
    1752            0 :     req->log_level = traceStatus;
    1753            0 :     dlt_set_id(req->com, "remo");
    1754              : 
    1755              :     /* free message */
    1756            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t*) req,
    1757              :                                  sizeof(DltServiceSetDefaultLogLevel)) == -1) {
    1758            0 :         free(req);;
    1759            0 :         return DLT_RETURN_ERROR;
    1760              :     }
    1761              : 
    1762            0 :     free(req);
    1763              : 
    1764            0 :     return DLT_RETURN_OK;
    1765              : }
    1766              : 
    1767            0 : DltReturnValue dlt_client_send_all_trace_status_v2(DltClient *client, uint8_t traceStatus)
    1768              : {
    1769              :     DltServiceSetDefaultLogLevel *req;
    1770              : 
    1771            0 :     if (client == NULL) {
    1772            0 :         dlt_vlog(LOG_ERR, "%s: Invalid parameters\n", __func__);
    1773            0 :         return DLT_RETURN_ERROR;
    1774              :     }
    1775              : 
    1776            0 :     req = calloc(1, sizeof(DltServiceSetDefaultLogLevel));
    1777              : 
    1778            0 :     if (req == 0) {
    1779            0 :         dlt_vlog(LOG_ERR, "%s: Could not allocate memory %zu\n", __func__, sizeof(DltServiceSetDefaultLogLevel));
    1780            0 :         return DLT_RETURN_ERROR;
    1781              :     }
    1782              : 
    1783            0 :     req->service_id = DLT_SERVICE_ID_SET_ALL_TRACE_STATUS;
    1784            0 :     req->log_level = traceStatus;
    1785            0 :     dlt_set_id(req->com, "remo");
    1786              : 
    1787              :     /* free message */
    1788            0 :     if (dlt_client_send_ctrl_msg_v2(client, "APP", "CON", (uint8_t*) req,
    1789              :                                  sizeof(DltServiceSetDefaultLogLevel)) == -1) {
    1790            0 :         free(req);;
    1791            0 :         return DLT_RETURN_ERROR;
    1792              :     }
    1793              : 
    1794            0 :     free(req);
    1795              : 
    1796            0 :     return DLT_RETURN_OK;
    1797              : }
    1798              : 
    1799            0 : DltReturnValue dlt_client_send_timing_pakets(DltClient *client, uint8_t timingPakets)
    1800              : {
    1801              :     DltServiceSetVerboseMode *req;
    1802              : 
    1803            0 :     req = calloc(1, sizeof(DltServiceSetVerboseMode));
    1804              : 
    1805            0 :     if (req == 0)
    1806              :         return DLT_RETURN_ERROR;
    1807              : 
    1808            0 :     req->service_id = DLT_SERVICE_ID_SET_TIMING_PACKETS;
    1809            0 :     req->new_status = timingPakets;
    1810              : 
    1811              :     /* free message */
    1812            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t*) req,
    1813              :                                  sizeof(DltServiceSetVerboseMode)) == DLT_RETURN_ERROR) {
    1814            0 :         free(req);
    1815            0 :         return DLT_RETURN_ERROR;
    1816              :     }
    1817              : 
    1818            0 :     free(req);
    1819              : 
    1820            0 :     return DLT_RETURN_OK;
    1821              : }
    1822              : 
    1823            0 : DltReturnValue dlt_client_send_timing_pakets_v2(DltClient *client, uint8_t timingPakets)
    1824              : {
    1825              :     DltServiceSetVerboseMode *req;
    1826              : 
    1827            0 :     req = calloc(1, sizeof(DltServiceSetVerboseMode));
    1828              : 
    1829            0 :     if (req == 0)
    1830              :         return DLT_RETURN_ERROR;
    1831              : 
    1832            0 :     req->service_id = DLT_SERVICE_ID_SET_TIMING_PACKETS;
    1833            0 :     req->new_status = timingPakets;
    1834              : 
    1835              :     /* free message */
    1836            0 :     if (dlt_client_send_ctrl_msg_v2(client, "APP", "CON", (uint8_t*) req,
    1837              :                                  sizeof(DltServiceSetVerboseMode)) == DLT_RETURN_ERROR) {
    1838            0 :         free(req);
    1839            0 :         return DLT_RETURN_ERROR;
    1840              :     }
    1841              : 
    1842            0 :     free(req);
    1843              : 
    1844            0 :     return DLT_RETURN_OK;
    1845              : }
    1846              : 
    1847            0 : DltReturnValue dlt_client_send_store_config(DltClient *client)
    1848              : {
    1849              :     uint32_t service_id;
    1850              : 
    1851            0 :     service_id = DLT_SERVICE_ID_STORE_CONFIG;
    1852              : 
    1853              :     /* free message */
    1854            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t *)&service_id, sizeof(uint32_t)) == DLT_RETURN_ERROR)
    1855            0 :         return DLT_RETURN_ERROR;
    1856              : 
    1857              :     return DLT_RETURN_OK;
    1858              : }
    1859              : 
    1860            0 : DltReturnValue dlt_client_send_store_config_v2(DltClient *client)
    1861              : {
    1862              :     uint32_t service_id;
    1863              : 
    1864            0 :     service_id = DLT_SERVICE_ID_STORE_CONFIG;
    1865              : 
    1866              :     /* free message */
    1867            0 :     if (dlt_client_send_ctrl_msg_v2(client, "APP", "CON", (uint8_t *)&service_id, sizeof(uint32_t)) == DLT_RETURN_ERROR)
    1868            0 :         return DLT_RETURN_ERROR;
    1869              : 
    1870              :     return DLT_RETURN_OK;
    1871              : }
    1872              : 
    1873            0 : DltReturnValue dlt_client_send_reset_to_factory_default(DltClient *client)
    1874              : {
    1875              :     uint32_t service_id;
    1876              : 
    1877            0 :     service_id = DLT_SERVICE_ID_RESET_TO_FACTORY_DEFAULT;
    1878              : 
    1879              :     /* free message */
    1880            0 :     if (dlt_client_send_ctrl_msg(client, "APP", "CON", (uint8_t *)&service_id, sizeof(uint32_t)) == DLT_RETURN_ERROR)
    1881            0 :         return DLT_RETURN_ERROR;
    1882              : 
    1883              :     return DLT_RETURN_OK;
    1884              : }
    1885              : 
    1886            0 : DltReturnValue dlt_client_send_reset_to_factory_default_v2(DltClient *client)
    1887              : {
    1888              :     uint32_t service_id;
    1889              : 
    1890            0 :     service_id = DLT_SERVICE_ID_RESET_TO_FACTORY_DEFAULT;
    1891              : 
    1892              :     /* free message */
    1893            0 :     if (dlt_client_send_ctrl_msg_v2(client, "APP", "CON", (uint8_t *)&service_id, sizeof(uint32_t)) == DLT_RETURN_ERROR)
    1894            0 :         return DLT_RETURN_ERROR;
    1895              : 
    1896              :     return DLT_RETURN_OK;
    1897              : }
    1898              : 
    1899            0 : DltReturnValue dlt_client_setbaudrate(DltClient *client, int baudrate)
    1900              : {
    1901            0 :     if (client == 0)
    1902              :         return DLT_RETURN_ERROR;
    1903              : 
    1904            0 :     client->baudrate = dlt_convert_serial_speed(baudrate);
    1905              : 
    1906            0 :     return DLT_RETURN_OK;
    1907              : }
    1908              : 
    1909            0 : DltReturnValue dlt_client_set_mode(DltClient *client, DltClientMode mode)
    1910              : {
    1911            0 :     if (client == 0)
    1912              :         return DLT_RETURN_ERROR;
    1913              : 
    1914            0 :     client->mode = mode;
    1915            0 :     return DLT_RETURN_OK;
    1916              : 
    1917              : }
    1918              : 
    1919            5 : int dlt_client_set_server_ip(DltClient *client, char *ipaddr)
    1920              : {
    1921            5 :     client->servIP = strdup(ipaddr);
    1922              : 
    1923            5 :     if (client->servIP == NULL) {
    1924            0 :         dlt_vlog(LOG_ERR, "%s: ERROR: failed to duplicate server IP\n", __func__);
    1925            0 :         return DLT_RETURN_ERROR;
    1926              :     }
    1927              : 
    1928              :     return DLT_RETURN_OK;
    1929              : }
    1930              : 
    1931            0 : int dlt_client_set_host_if_address(DltClient *client, char *hostip)
    1932              : {
    1933            0 :     client->hostip = strdup(hostip);
    1934              : 
    1935            0 :     if (client->hostip == NULL) {
    1936            0 :         dlt_vlog(LOG_ERR, "%s: ERROR: failed to duplicate UDP interface address\n", __func__);
    1937            0 :         return DLT_RETURN_ERROR;
    1938              :     }
    1939              : 
    1940              :     return DLT_RETURN_OK;
    1941              : }
    1942              : 
    1943            0 : int dlt_client_set_serial_device(DltClient *client, char *serial_device)
    1944              : {
    1945            0 :     client->serialDevice = strdup(serial_device);
    1946              : 
    1947            0 :     if (client->serialDevice == NULL) {
    1948            0 :         dlt_vlog(LOG_ERR, "%s: ERROR: failed to duplicate serial device\n", __func__);
    1949            0 :         return DLT_RETURN_ERROR;
    1950              :     }
    1951              : 
    1952              :     return DLT_RETURN_OK;
    1953              : }
    1954              : 
    1955            0 : int dlt_client_set_socket_path(DltClient *client, char *socket_path)
    1956              : {
    1957            0 :     client->socketPath = strdup(socket_path);
    1958              : 
    1959            0 :     if (client->socketPath == NULL) {
    1960            0 :         dlt_vlog(LOG_ERR, "%s: ERROR: failed to duplicate socket path\n", __func__);
    1961            0 :         return DLT_RETURN_ERROR;
    1962              :     }
    1963              : 
    1964              :     return DLT_RETURN_OK;
    1965              : }
    1966              : /**
    1967              :  * free allocation when calloc failed get log info
    1968              :  *
    1969              :  * @param resp          DltServiceGetLogInfoResponse
    1970              :  * @param count_app_ids number of app_ids which needs to be freed
    1971              :  */
    1972            0 : DLT_STATIC void dlt_client_free_calloc_failed_get_log_info(DltServiceGetLogInfoResponse *resp,
    1973              :                                                            int count_app_ids)
    1974              : {
    1975              :     AppIDsType *app = NULL;
    1976              :     ContextIDsInfoType *con = NULL;
    1977              :     int i = 0;
    1978              :     int j = 0;
    1979              : 
    1980            0 :     for (i = 0; i < count_app_ids; i++) {
    1981            0 :         app = &(resp->log_info_type.app_ids[i]);
    1982              : 
    1983            0 :         for (j = 0; j < app->count_context_ids; j++) {
    1984            0 :             con = &(app->context_id_info[j]);
    1985              : 
    1986            0 :             free(con->context_description);
    1987            0 :             con->context_description = NULL;
    1988              :         }
    1989              : 
    1990            0 :         free(app->app_description);
    1991            0 :         app->app_description = NULL;
    1992              : 
    1993            0 :         free(app->context_id_info);
    1994            0 :         app->context_id_info = NULL;
    1995              :     }
    1996              : 
    1997            0 :     free(resp->log_info_type.app_ids);
    1998            0 :     resp->log_info_type.app_ids = NULL;
    1999            0 :     resp->log_info_type.count_app_ids = 0;
    2000              : 
    2001            0 :     return;
    2002              : }
    2003              : 
    2004              : /**
    2005              :  * free allocation when calloc failed get log info v2
    2006              :  *
    2007              :  * @param resp          DltServiceGetLogInfoResponse
    2008              :  * @param count_app_ids number of app_ids which needs to be freed
    2009              :  */
    2010            0 : DLT_STATIC void dlt_client_free_calloc_failed_get_log_info_v2(DltServiceGetLogInfoResponse *resp,
    2011              :                                                               int count_app_ids)
    2012              : {
    2013              :     AppIDsType *app = NULL;
    2014              :     ContextIDsInfoType *con = NULL;
    2015              :     int i = 0;
    2016              :     int j = 0;
    2017              : 
    2018            0 :     for (i = 0; i < count_app_ids; i++) {
    2019            0 :         app = &(resp->log_info_type.app_ids[i]);
    2020              : 
    2021            0 :         for (j = 0; j < app->count_context_ids; j++) {
    2022            0 :             con = &(app->context_id_info[j]);
    2023            0 :             free(con->context_id2);
    2024            0 :             free(con->context_description);
    2025            0 :             con->context_id2 = NULL;
    2026            0 :             con->context_description = NULL;
    2027              :         }
    2028              : 
    2029            0 :         free(app->app_id2);
    2030            0 :         free(app->app_description);
    2031            0 :         app->app_id2 = NULL;
    2032            0 :         app->app_description = NULL;
    2033              : 
    2034            0 :         free(app->context_id_info);
    2035            0 :         app->context_id_info = NULL;
    2036              :     }
    2037              : 
    2038            0 :     free(resp->log_info_type.app_ids);
    2039            0 :     resp->log_info_type.app_ids = NULL;
    2040            0 :     resp->log_info_type.count_app_ids = 0;
    2041              : 
    2042            0 :     return;
    2043              : }
    2044              : 
    2045            2 : DltReturnValue dlt_client_parse_get_log_info_resp_text(DltServiceGetLogInfoResponse *resp,
    2046              :                                                        char *resp_text)
    2047              : {
    2048              :     AppIDsType *app = NULL;
    2049              :     ContextIDsInfoType *con = NULL;
    2050              :     int i = 0;
    2051              :     int j = 0;
    2052              :     char *rp = NULL;
    2053            2 :     int rp_count = 0;
    2054              : 
    2055            2 :     if ((resp == NULL) || (resp_text == NULL))
    2056              :         return DLT_RETURN_WRONG_PARAMETER;
    2057              : 
    2058              :     /* ------------------------------------------------------
    2059              :     *  get_log_info data structure(all data is ascii)
    2060              :     *
    2061              :     *  get_log_info, aa, bb bb cc cc cc cc dd dd ee ee ee ee ff gg hh hh ii ii ii .. ..
    2062              :     *                ~~  ~~~~~ ~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~~~~~
    2063              :     *                          cc cc cc cc dd dd ee ee ee ee ff gg hh hh ii ii ii .. ..
    2064              :     *                    jj jj kk kk kk .. ..
    2065              :     *                          ~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~~~~~
    2066              :     *  aa         : get mode (fix value at 0x07)
    2067              :     *  bb bb      : list num of apid (little endian)
    2068              :     *  cc cc cc cc: apid
    2069              :     *  dd dd      : list num of ctid (little endian)
    2070              :     *  ee ee ee ee: ctid
    2071              :     *  ff         : log level
    2072              :     *  gg         : trace status
    2073              :     *  hh hh      : description length of ctid
    2074              :     *  ii ii ..   : description text of ctid
    2075              :     *  jj jj      : description length of apid
    2076              :     *  kk kk ..   : description text of apid
    2077              :     *  ------------------------------------------------------ */
    2078              : 
    2079            2 :     rp = resp_text + DLT_GET_LOG_INFO_HEADER;
    2080              :     rp_count = 0;
    2081              : 
    2082              :     /* check if status is acceptable */
    2083            2 :     if ((resp->status < GET_LOG_INFO_STATUS_MIN) ||
    2084              :         (resp->status > GET_LOG_INFO_STATUS_MAX)) {
    2085            0 :         if (resp->status == GET_LOG_INFO_STATUS_NO_MATCHING_CTX)
    2086            0 :             dlt_vlog(LOG_WARNING,
    2087              :                      "%s: The status(%d) is invalid: NO matching Context IDs\n",
    2088              :                      __func__,
    2089              :                      resp->status);
    2090            0 :         else if (resp->status == GET_LOG_INFO_STATUS_RESP_DATA_OVERFLOW)
    2091            0 :             dlt_vlog(LOG_WARNING,
    2092              :                      "%s: The status(%d) is invalid: Response data over flow\n",
    2093              :                      __func__,
    2094              :                      resp->status);
    2095              :         else
    2096            0 :             dlt_vlog(LOG_WARNING,
    2097              :                      "%s: The status(%d) is invalid\n",
    2098              :                      __func__,
    2099              :                      resp->status);
    2100              : 
    2101            0 :         return DLT_RETURN_ERROR;
    2102              :     }
    2103              : 
    2104              :     /* count_app_ids */
    2105            2 :     resp->log_info_type.count_app_ids = (uint16_t) dlt_getloginfo_conv_ascii_to_uint16_t(rp,
    2106              :                                                                               &rp_count);
    2107              : 
    2108            2 :     resp->log_info_type.app_ids = (AppIDsType *)calloc
    2109              :             (resp->log_info_type.count_app_ids, sizeof(AppIDsType));
    2110              : 
    2111            2 :     if (resp->log_info_type.app_ids == NULL) {
    2112            0 :         dlt_vlog(LOG_ERR, "%s: calloc failed for app_ids\n", __func__);
    2113            0 :         dlt_client_free_calloc_failed_get_log_info(resp, 0);
    2114            0 :         return DLT_RETURN_ERROR;
    2115              :     }
    2116              : 
    2117            5 :     for (i = 0; i < resp->log_info_type.count_app_ids; i++) {
    2118            3 :         app = &(resp->log_info_type.app_ids[i]);
    2119              :         /* get app id */
    2120            3 :         dlt_getloginfo_conv_ascii_to_id(rp, &rp_count, app->app_id, DLT_ID_SIZE);
    2121              : 
    2122              :         /* count_con_ids */
    2123            3 :         app->count_context_ids = (uint16_t) dlt_getloginfo_conv_ascii_to_uint16_t(rp,
    2124              :                                                                        &rp_count);
    2125              : 
    2126            3 :         app->context_id_info = (ContextIDsInfoType *)calloc
    2127              :                 (app->count_context_ids, sizeof(ContextIDsInfoType));
    2128              : 
    2129            3 :         if (app->context_id_info == NULL) {
    2130            0 :             dlt_vlog(LOG_ERR,
    2131              :                      "%s: calloc failed for context_id_info\n", __func__);
    2132            0 :             dlt_client_free_calloc_failed_get_log_info(resp, i);
    2133            0 :             return DLT_RETURN_ERROR;
    2134              :         }
    2135              : 
    2136            9 :         for (j = 0; j < app->count_context_ids; j++) {
    2137            6 :             con = &(app->context_id_info[j]);
    2138              :             /* get con id */
    2139            6 :             dlt_getloginfo_conv_ascii_to_id(rp,
    2140              :                                             &rp_count,
    2141            6 :                                             con->context_id,
    2142              :                                             DLT_ID_SIZE);
    2143              : 
    2144              :             /* log_level */
    2145            6 :             if ((resp->status == 4) || (resp->status == 6) || (resp->status == 7))
    2146            6 :                 con->log_level = dlt_getloginfo_conv_ascii_to_int16_t(rp,
    2147              :                                                                       &rp_count);
    2148              : 
    2149              :             /* trace status */
    2150            6 :             if ((resp->status == 5) || (resp->status == 6) || (resp->status == 7))
    2151            6 :                 con->trace_status = dlt_getloginfo_conv_ascii_to_int16_t(rp,
    2152              :                                                                          &rp_count);
    2153              : 
    2154              :             /* context desc */
    2155            6 :             if (resp->status == 7) {
    2156            6 :                 con->len_context_description = (uint16_t) dlt_getloginfo_conv_ascii_to_uint16_t(rp,
    2157              :                                                                                      &rp_count);
    2158            6 :                 con->context_description = (char *)calloc
    2159            6 :                         ((size_t) (con->len_context_description + 1), sizeof(char));
    2160              : 
    2161            6 :                 if (con->context_description == NULL) {
    2162            0 :                     dlt_vlog(LOG_ERR, "%s: calloc failed for context description\n", __func__);
    2163            0 :                     dlt_client_free_calloc_failed_get_log_info(resp, i);
    2164            0 :                     return DLT_RETURN_ERROR;
    2165              :                 }
    2166              : 
    2167            6 :                 dlt_getloginfo_conv_ascii_to_string(rp,
    2168              :                                                 &rp_count,
    2169              :                                                 con->context_description,
    2170              :                                                 con->len_context_description);
    2171              :             }
    2172              :         }
    2173              : 
    2174              :         /* application desc */
    2175            3 :         if (resp->status == 7) {
    2176            3 :             app->len_app_description = (uint16_t) dlt_getloginfo_conv_ascii_to_uint16_t(rp,
    2177              :                                                                              &rp_count);
    2178            3 :             app->app_description = (char *)calloc
    2179            3 :                     ((size_t) (app->len_app_description + 1), sizeof(char));
    2180              : 
    2181            3 :             if (app->app_description == NULL) {
    2182            0 :                 dlt_vlog(LOG_ERR, "%s: calloc failed for application description\n", __func__);
    2183            0 :                 dlt_client_free_calloc_failed_get_log_info(resp, i);
    2184            0 :                 return DLT_RETURN_ERROR;
    2185              :             }
    2186              : 
    2187            3 :             dlt_getloginfo_conv_ascii_to_string(rp,
    2188              :                                             &rp_count,
    2189              :                                             app->app_description,
    2190              :                                             app->len_app_description);
    2191              :         }
    2192              :     }
    2193              : 
    2194              :     return DLT_RETURN_OK;
    2195              : }
    2196              : 
    2197            0 : DltReturnValue dlt_client_parse_get_log_info_resp_text_v2(DltServiceGetLogInfoResponse *resp,
    2198              :                                                           char *resp_text)
    2199              : {
    2200              :     AppIDsType *app = NULL;
    2201              :     ContextIDsInfoType *con = NULL;
    2202              :     int i = 0;
    2203              :     int j = 0;
    2204              :     char *rp = NULL;
    2205            0 :     int rp_count = 0;
    2206              : 
    2207            0 :     if ((resp == NULL) || (resp_text == NULL))
    2208              :         return DLT_RETURN_WRONG_PARAMETER;
    2209              : 
    2210              :     /* ------------------------------------------------------
    2211              :     *  get_log_info data structure(all data is ascii)
    2212              :     *
    2213              :     *  get_log_info, aa, bb bb cc1 cc cc cc.... dd dd ee1 ee ee ee.... ff gg hh hh ii ii ii .. ..
    2214              :     *                ~~  ~~~~~ ~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~~~~~
    2215              :     *                          cc1 cc cc cc.... dd dd ee1 ee ee ee.... ff gg hh hh ii ii ii .. ..
    2216              :     *                    jj jj kk kk kk .. ..
    2217              :     *                          ~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~~~~~
    2218              :     *  aa         : get mode (fix value at 0x07)
    2219              :     *  bb bb      : list num of apid (little endian)
    2220              :     *  cc1        : length of apid
    2221              :     *  cc cc cc cc: apid
    2222              :     *  dd dd      : list num of ctid (little endian)
    2223              :     *  ee1        : length of ctid
    2224              :     *  ee ee ee ee: ctid
    2225              :     *  ff         : log level
    2226              :     *  gg         : trace status
    2227              :     *  hh hh      : description length of ctid
    2228              :     *  ii ii ..   : description text of ctid
    2229              :     *  jj jj      : description length of apid
    2230              :     *  kk kk ..   : description text of apid
    2231              :     *  ------------------------------------------------------ */
    2232              : 
    2233            0 :     rp = resp_text + DLT_GET_LOG_INFO_HEADER;
    2234              :     rp_count = 0;
    2235              : 
    2236              :     /* check if status is acceptable */
    2237            0 :     if ((resp->status < GET_LOG_INFO_STATUS_MIN) ||
    2238              :         (resp->status > GET_LOG_INFO_STATUS_MAX)) {
    2239            0 :         if (resp->status == GET_LOG_INFO_STATUS_NO_MATCHING_CTX)
    2240            0 :             dlt_vlog(LOG_WARNING,
    2241              :                      "%s: The status(%d) is invalid: NO matching Context IDs\n",
    2242              :                      __func__,
    2243              :                      resp->status);
    2244            0 :         else if (resp->status == GET_LOG_INFO_STATUS_RESP_DATA_OVERFLOW)
    2245            0 :             dlt_vlog(LOG_WARNING,
    2246              :                      "%s: The status(%d) is invalid: Response data over flow\n",
    2247              :                      __func__,
    2248              :                      resp->status);
    2249              :         else
    2250            0 :             dlt_vlog(LOG_WARNING,
    2251              :                      "%s: The status(%d) is invalid\n",
    2252              :                      __func__,
    2253              :                      resp->status);
    2254              : 
    2255            0 :         return DLT_RETURN_ERROR;
    2256              :     }
    2257              : 
    2258              :     /* count_app_ids */
    2259            0 :     uint16_t ret = dlt_getloginfo_conv_ascii_to_uint16_t(rp, &rp_count);
    2260            0 :     resp->log_info_type.count_app_ids = ret;
    2261              : 
    2262            0 :     resp->log_info_type.app_ids = (AppIDsType *)calloc
    2263              :             (resp->log_info_type.count_app_ids, sizeof(AppIDsType));
    2264              : 
    2265            0 :     if (resp->log_info_type.app_ids == NULL) {
    2266            0 :         dlt_vlog(LOG_ERR, "%s: calloc failed for app_ids\n", __func__);
    2267            0 :         dlt_client_free_calloc_failed_get_log_info_v2(resp, 0);
    2268            0 :         return DLT_RETURN_ERROR;
    2269              :     }
    2270              : 
    2271            0 :     for (i = 0; i < resp->log_info_type.count_app_ids; i++) {
    2272            0 :         app = &(resp->log_info_type.app_ids[i]);
    2273            0 :         app->app_id2len = dlt_getloginfo_conv_ascii_to_uint8_t(rp, &rp_count);
    2274              : 
    2275            0 :         app->app_id2 = (char *)calloc((size_t) (app->app_id2len + 1), sizeof(char));
    2276              : 
    2277            0 :         if (app->app_id2 == NULL) {
    2278            0 :             dlt_vlog(LOG_ERR, "%s: calloc failed for App Id\n", __func__);
    2279            0 :             dlt_client_free_calloc_failed_get_log_info_v2(resp, i);
    2280            0 :             return DLT_RETURN_ERROR;
    2281              :         }
    2282              :         /* get app id */
    2283            0 :         dlt_getloginfo_conv_ascii_to_id(rp, &rp_count, app->app_id2, app->app_id2len);
    2284              : 
    2285              :         /* count_con_ids */
    2286            0 :         ret = dlt_getloginfo_conv_ascii_to_uint16_t(rp, &rp_count);
    2287            0 :         app->count_context_ids = ret;
    2288            0 :         app->context_id_info = (ContextIDsInfoType *)calloc(app->count_context_ids, sizeof(ContextIDsInfoType));
    2289              : 
    2290            0 :         if (app->context_id_info == NULL) {
    2291            0 :             dlt_vlog(LOG_ERR,
    2292              :                      "%s: calloc failed for context_id_info\n", __func__);
    2293            0 :             dlt_client_free_calloc_failed_get_log_info_v2(resp, i);
    2294            0 :             return DLT_RETURN_ERROR;
    2295              :         }
    2296              : 
    2297            0 :         for (j = 0; j < app->count_context_ids; j++) {
    2298            0 :             con = &(app->context_id_info[j]);
    2299            0 :             con->context_id2len = dlt_getloginfo_conv_ascii_to_uint8_t(rp, &rp_count);
    2300            0 :             con->context_id2 = (char *)calloc((size_t) (con->context_id2len + 1), sizeof(char));
    2301              : 
    2302            0 :             if (con->context_id2 == NULL) {
    2303            0 :                 dlt_vlog(LOG_ERR, "%s: calloc failed for Context Id\n", __func__);
    2304            0 :                 dlt_client_free_calloc_failed_get_log_info_v2(resp, i);
    2305            0 :                 return DLT_RETURN_ERROR;
    2306              :             }
    2307              :             /* get con id */
    2308            0 :             dlt_getloginfo_conv_ascii_to_id(rp,
    2309              :                                             &rp_count,
    2310              :                                             con->context_id2,
    2311              :                                             con->context_id2len);
    2312              : 
    2313              :             /* log_level */
    2314            0 :             if ((resp->status == 4) || (resp->status == 6) || (resp->status == 7))
    2315            0 :                 con->log_level = dlt_getloginfo_conv_ascii_to_int16_t(rp,
    2316              :                                                                       &rp_count);
    2317              : 
    2318              :             /* trace status */
    2319            0 :             if ((resp->status == 5) || (resp->status == 6) || (resp->status == 7))
    2320            0 :                 con->trace_status = dlt_getloginfo_conv_ascii_to_int16_t(rp,
    2321              :                                                                          &rp_count);
    2322              : 
    2323              :             /* context desc */
    2324            0 :             if (resp->status == 7) {
    2325            0 :                 con->len_context_description = (uint16_t) dlt_getloginfo_conv_ascii_to_uint16_t(rp,
    2326              :                                                                                      &rp_count);
    2327            0 :                 con->context_description = (char *)calloc
    2328            0 :                         ((size_t) (con->len_context_description + 1), sizeof(char));
    2329              : 
    2330            0 :                 if (con->context_description == NULL) {
    2331            0 :                     dlt_vlog(LOG_ERR, "%s: calloc failed for context description\n", __func__);
    2332            0 :                     dlt_client_free_calloc_failed_get_log_info_v2(resp, i);
    2333            0 :                     return DLT_RETURN_ERROR;
    2334              :                 }
    2335              : 
    2336            0 :                 dlt_getloginfo_conv_ascii_to_string(rp,
    2337              :                                                 &rp_count,
    2338              :                                                 con->context_description,
    2339              :                                                 con->len_context_description);
    2340              :             }
    2341              :         }
    2342              : 
    2343              :         /* application desc */
    2344            0 :         if (resp->status == 7) {
    2345            0 :             app->len_app_description = (uint16_t) dlt_getloginfo_conv_ascii_to_uint16_t(rp,
    2346              :                                                                              &rp_count);
    2347            0 :             app->app_description = (char *)calloc
    2348            0 :                     ((size_t) (app->len_app_description + 1), sizeof(char));
    2349              : 
    2350            0 :             if (app->app_description == NULL) {
    2351            0 :                 dlt_vlog(LOG_ERR, "%s: calloc failed for application description\n", __func__);
    2352            0 :                 dlt_client_free_calloc_failed_get_log_info_v2(resp, i);
    2353            0 :                 return DLT_RETURN_ERROR;
    2354              :             }
    2355              : 
    2356            0 :             dlt_getloginfo_conv_ascii_to_string(rp,
    2357              :                                             &rp_count,
    2358              :                                             app->app_description,
    2359              :                                             app->len_app_description);
    2360              :         }
    2361              :     }
    2362              : 
    2363              :     return DLT_RETURN_OK;
    2364              : }
    2365              : 
    2366            2 : int dlt_client_cleanup_get_log_info(DltServiceGetLogInfoResponse *resp)
    2367              : {
    2368              :     AppIDsType app;
    2369              :     int i = 0;
    2370              :     int j = 0;
    2371              : 
    2372            2 :     if (resp == NULL)
    2373              :         return DLT_RETURN_OK;
    2374              : 
    2375            5 :     for (i = 0; i < resp->log_info_type.count_app_ids; i++) {
    2376            3 :         app = resp->log_info_type.app_ids[i];
    2377              : 
    2378            9 :         for (j = 0; j < app.count_context_ids; j++) {
    2379            6 :             free(app.context_id_info[j].context_description);
    2380            6 :             app.context_id_info[j].context_description = NULL;
    2381              :         }
    2382              : 
    2383            3 :         free(app.context_id_info);
    2384              :         app.context_id_info = NULL;
    2385            3 :         free(app.app_description);
    2386              :         app.app_description = NULL;
    2387              :     }
    2388              : 
    2389            2 :     free(resp->log_info_type.app_ids);
    2390              :     resp->log_info_type.app_ids = NULL;
    2391              : 
    2392            2 :     free(resp);
    2393              :     resp = NULL;
    2394              : 
    2395            2 :     return DLT_RETURN_OK;
    2396              : }
    2397              : 
    2398            0 : int dlt_client_cleanup_get_log_info_v2(DltServiceGetLogInfoResponse *resp)
    2399              : {
    2400              :     AppIDsType app;
    2401              :     int i = 0;
    2402              :     int j = 0;
    2403              : 
    2404            0 :     if (resp == NULL)
    2405              :         return DLT_RETURN_OK;
    2406              : 
    2407            0 :     for (i = 0; i < resp->log_info_type.count_app_ids; i++) {
    2408            0 :         app = resp->log_info_type.app_ids[i];
    2409              : 
    2410            0 :         for (j = 0; j < app.count_context_ids; j++) {
    2411            0 :             free(app.context_id_info[j].context_id2);
    2412            0 :             app.context_id_info[j].context_id2 = NULL;
    2413            0 :             free(app.context_id_info[j].context_description);
    2414            0 :             app.context_id_info[j].context_description = NULL;
    2415              :         }
    2416              : 
    2417            0 :         free(app.context_id_info);
    2418              :         app.context_id_info = NULL;
    2419            0 :         free(app.app_id2);
    2420              :         app.app_id2 = NULL;
    2421            0 :         free(app.app_description);
    2422              :         app.app_description = NULL;
    2423              :     }
    2424              : 
    2425            0 :     free(resp->log_info_type.app_ids);
    2426              :     resp->log_info_type.app_ids = NULL;
    2427              : 
    2428            0 :     free(resp);
    2429              :     resp = NULL;
    2430              : 
    2431            0 :     return DLT_RETURN_OK;
    2432              : }
        

Generated by: LCOV version 2.0-1