automotive-dlt
dlt_env_ll.c
Go to the documentation of this file.
1 /*
2  * @licence app begin@
3  * SPDX license identifier: MPL-2.0
4  *
5  * Copyright (C) 2015 Intel Corporation
6  *
7  * This file is part of GENIVI Project DLT - Diagnostic Log and Trace.
8  *
9  * This Source Code Form is subject to the terms of the
10  * Mozilla Public License (MPL), v. 2.0.
11  * If a copy of the MPL was not distributed with this file,
12  * You can obtain one at http://mozilla.org/MPL/2.0/.
13  *
14  * For further information see http://www.genivi.org/.
15  * @licence end@
16  */
17 
27 #include "dlt_user.h"
28 #include <string.h>
29 #include <stdlib.h>
30 
31 #define DLT_ENV_LL_SET_INCREASE 10
32 
33 
34 /* a generic entry looks like:
35  * ll_item ::= apid:ctid:ll
36  * ll_set ::= ll_item |
37  * ll_set;ll_item
38  */
39 
58 int dlt_env_extract_id(char ** const env, char * id)
59 {
60  int i;
61  if (!env || !id)
62  {
63  return -1;
64  }
65 
66  if (!(*env))
67  {
68  return -1;
69  }
70 
71  memset(id, 0, 4);
72 
73  for (i = 0; (i<4) && (**env != ':') && (**env != 0); ++i)
74  {
75  *id++ = *((*env)++);
76  }
77 
78  /* the next/last character must be ':' */
79  if ((0 != **env) && (':' == **env))
80  {
81  return 0;
82  }
83 
84  return -1;
85 }
86 
87 
93 int dlt_env_helper_to_lower(char ** const env, char *result, int const res_len)
94 {
95  int count = 0;
96  char ch = *(*env);
97 
98  if (!env || !result)
99  {
100  return -1;
101  }
102 
103  if (!(*env))
104  {
105  return -1;
106  }
107 
108  count = 0;
109  ch = *(*env);
110  while (ch && (count < res_len-1) && (ch != ';'))
111  {
112  if (ch >= 'A' && ch <= 'Z')
113  {
114  result[count] = ch + 'a' - 'A';
115  }
116  else
117  {
118  result[count] = ch;
119  }
120  ch = *(++(*env));
121  ++count;
122  }
123 
124  result[count] = 0;
125  if (!ch || (ch == ';')) /* full input was parsed */
126  {
127  return 0;
128  }
129  else
130  {
131  return -1;
132  }
133 }
134 
135 
136 int dlt_env_extract_symbolic_ll(char ** const env, int8_t * ll)
137 {
138  char result[strlen("verbose")+1];
139  if (!env || !ll)
140  {
141  return -1;
142  }
143 
144  if (!(*env))
145  {
146  return -1;
147  }
148 
149  if (dlt_env_helper_to_lower(env, &result[0], sizeof(result)) == 0)
150  {
151  if (strncmp("default", result, sizeof(result)) == 0)
152  {
153  *ll = -1;
154  }
155  else if (strncmp("off", result, sizeof(result)) == 0)
156  {
157  *ll = 0;
158  }
159  else if (strncmp("fatal", result, sizeof(result)) == 0)
160  {
161  *ll = 1;
162  }
163  else if (strncmp("error", result, sizeof(result)) == 0)
164  {
165  *ll = 2;
166  }
167  else if (strncmp("warning", result, sizeof(result)) == 0)
168  {
169  *ll = 3;
170  }
171  else if (strncmp("info", result, sizeof(result)) == 0)
172  {
173  *ll = 4;
174  }
175  else if (strncmp("debug", result, sizeof(result)) == 0)
176  {
177  *ll = 5;
178  }
179  else if (strncmp("verbose", result, sizeof(result)) == 0)
180  {
181  *ll = 6;
182  }
183  else
184  {
185  return -1;
186  }
187 
188  if (**env != 0)
189  {
190  (*env)++;
191  }
192  return 0;
193  }
194  else
195  {
196  return -1;
197  }
198 
199 }
200 
201 
228 int dlt_env_extract_ll(char ** const env, int8_t * ll)
229 {
230  if (!env || !ll)
231  {
232  return -1;
233  }
234 
235  if (!(*env))
236  {
237  return -1;
238  }
239 
240  /* extract number */
241  if (**env == '-')
242  {
243  (*env)++;
244  if (**env == '1')
245  {
246  *ll = -1;
247  (*env)++;
248  }
249  }
250  else
251  {
252  if ((**env >= '0') && (**env < '7'))
253  {
254  *ll = **env - '0';
255  (*env)++;
256  }
257  else
258  {
259  if (dlt_env_extract_symbolic_ll(env, ll) != 0)
260  {
261  return -1;
262  }
263  }
264  }
265 
266  /* check end, either next char is NULL or ';' */
267  if ((**env == ';') || (**env == 0))
268  {
269  return 0;
270  }
271 
272  return -1;
273 }
274 
275 
281 int dlt_env_extract_ll_item(char ** const env, dlt_env_ll_item * const item)
282 {
283  int ret = -1;
284  if (!env || !item)
285  {
286  return -1;
287  }
288 
289  if (!(*env))
290  {
291  return -1;
292  }
293 
294  memset(item, 0, sizeof(dlt_env_ll_item));
295  ret = dlt_env_extract_id(env, item->appId);
296  if (ret == -1)
297  {
298  return -1;
299  }
300 
301  (*env)++;
302  ret = dlt_env_extract_id(env, item->ctxId);
303  if (ret == -1)
304  {
305  return -1;
306  }
307 
308  (*env)++;
309  ret = dlt_env_extract_ll(env, &item->ll);
310  if (ret == -1)
311  {
312  return -1;
313  }
314 
315  return 0;
316 }
317 
318 
328 {
329  if (!ll_set)
330  {
331  return -1;
332  }
333 
335  ll_set->item = (dlt_env_ll_item *)malloc(sizeof(dlt_env_ll_item) * ll_set->array_size);
336  if (!ll_set->item)
337  {
338  /* should trigger a warning: no memory left */
339  ll_set->array_size = 0;
340  return -1;
341  }
342  ll_set->num_elem = 0u;
343  return 0;
344 }
345 
346 
351 {
352  if (!ll_set)
353  {
354  return;
355  }
356 
357  free(ll_set->item);
358  ll_set->item = NULL;
359  ll_set->array_size = 0u;
360  ll_set->num_elem = 0u;
361 }
362 
363 
371 {
372  dlt_env_ll_item * old_set;
373  size_t old_size;
374 
375  if (!ll_set)
376  {
377  return -1;
378  }
379 
380  old_set = ll_set->item;
381  old_size = ll_set->array_size;
382 
384  ll_set->item = (dlt_env_ll_item *)malloc(sizeof(dlt_env_ll_item) * ll_set->array_size);
385  if (!ll_set->item)
386  {
387  /* should trigger a warning: no memory left */
389  return -1;
390  }
391  else
392  {
393  memcpy(ll_set->item, old_set, sizeof(dlt_env_ll_item)*old_size);
394  free(old_set);
395  return 0;
396  }
397 }
398 
399 
408 int dlt_env_extract_ll_set(char ** const env, dlt_env_ll_set * const ll_set)
409 {
410  if (!env || !ll_set)
411  {
412  return -1;
413  }
414 
415  if (!(*env))
416  {
417  return -1;
418  }
419 
420  if (dlt_env_init_ll_set(ll_set) == -1)
421  {
422  return -1;
423  }
424 
425  do
426  {
427  if (ll_set->num_elem == ll_set->array_size)
428  {
429  if (dlt_env_increase_ll_set(ll_set) == -1)
430  {
431  return -1;
432  }
433  }
434 
435  if (dlt_env_extract_ll_item(env, &ll_set->item[ll_set->num_elem++]) == -1)
436  {
437  return -1;
438  }
439  if (**env == ';')
440  {
441  (*env)++;
442  }
443  } while (**env != 0);
444 
445  return 0;
446 }
447 
448 
454 int dlt_env_ids_match(char const * const a, char const * const b)
455 {
456  if (a[0] != b[0])
457  {
458  return 0;
459  }
460  if (a[1] != b[1])
461  {
462  return 0;
463  }
464  if (a[2] != b[2])
465  {
466  return 0;
467  }
468  if (a[3] != b[3])
469  {
470  return 0;
471  }
472 
473  return 1;
474 }
475 
476 
488 int dlt_env_ll_item_get_matching_prio(dlt_env_ll_item const * const item, char const * const apid, char const * const ctid)
489 {
490  if ((!item) || (!apid) || (!ctid))
491  {
492  return -1;
493  }
494 
495  if (item->appId[0] == 0)
496  {
497  if (item->ctxId[0] == 0)
498  {
499  return 1;
500  }
501  else
502  {
503  if (dlt_env_ids_match(item->ctxId, ctid))
504  {
505  return 2;
506  }
507  }
508  }
509  else
510  {
511  if (dlt_env_ids_match(item->appId, apid))
512  {
513  if (item->ctxId[0] == 0)
514  {
515  return 3;
516  }
517  else if (dlt_env_ids_match(item->ctxId, ctid))
518  {
519  return 4;
520  }
521  }
522  }
523 
524  return 0;
525 }
526 
527 
537 int dlt_env_adjust_ll_from_env(dlt_env_ll_set const * const ll_set, char const * const apid, char const * const ctid, int const ll)
538 {
539  if ((!ll_set) || (!apid) || (!ctid))
540  {
541  return ll;
542  }
543 
544  int res = ll;
545  int prio = 0; /* no match so far */
546  size_t i;
547  for (i = 0; i<ll_set->num_elem; ++i)
548  {
549  int p = dlt_env_ll_item_get_matching_prio(&ll_set->item[i], apid, ctid);
550  if (p > prio)
551  {
552  prio = p;
553  res = ll_set->item[i].ll;
554  if (p == 4) /* maximum reached, immediate return */
555  {
556  return res;
557  }
558  }
559  }
560 
561  return res;
562 }
563 
564 
int dlt_env_adjust_ll_from_env(dlt_env_ll_set const *const ll_set, char const *const apid, char const *const ctid, int const ll)
adjust log-level based on values given through environment
Definition: dlt_env_ll.c:537
int dlt_env_extract_ll_set(char **const env, dlt_env_ll_set *const ll_set)
extract all items out of string
Definition: dlt_env_ll.c:408
int dlt_env_extract_ll_item(char **const env, dlt_env_ll_item *const item)
extract one item out of string
Definition: dlt_env_ll.c:281
char appId[DLT_ID_SIZE]
Definition: dlt_user.h:164
int dlt_env_extract_symbolic_ll(char **const env, int8_t *ll)
Definition: dlt_env_ll.c:136
int dlt_env_ids_match(char const *const a, char const *const b)
check if two ids match
Definition: dlt_env_ll.c:454
int dlt_env_extract_id(char **const env, char *id)
extract id out of given string
Definition: dlt_env_ll.c:58
int dlt_env_init_ll_set(dlt_env_ll_set *const ll_set)
initialize ll_set
Definition: dlt_env_ll.c:327
int dlt_env_ll_item_get_matching_prio(dlt_env_ll_item const *const item, char const *const apid, char const *const ctid)
check if (and how) apid and ctid match with given item
Definition: dlt_env_ll.c:488
dlt_env_ll_item * item
Definition: dlt_user.h:175
int dlt_env_increase_ll_set(dlt_env_ll_set *const ll_set)
increase size of ll_set by LL_SET_INCREASE elements
Definition: dlt_env_ll.c:370
int dlt_env_helper_to_lower(char **const env, char *result, int const res_len)
convert a given string to lower-case
Definition: dlt_env_ll.c:93
char ctxId[DLT_ID_SIZE]
Definition: dlt_user.h:165
size_t array_size
Definition: dlt_user.h:176
void dlt_env_free_ll_set(dlt_env_ll_set *const ll_set)
release ll_set
Definition: dlt_env_ll.c:350
holds all initial log-levels given via environment variable DLT_INITIAL_LOG_LEVEL ...
Definition: dlt_user.h:173
size_t num_elem
Definition: dlt_user.h:177
holds initial log-level for given appId:ctxId pair
Definition: dlt_user.h:162
#define DLT_ENV_LL_SET_INCREASE
Definition: dlt_env_ll.c:31
int dlt_env_extract_ll(char **const env, int8_t *ll)
extract log-level out of given string
Definition: dlt_env_ll.c:228
#define NULL
Definition: dlt_common.h:232