1ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
2ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *
3ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * Redistribution and use in source and binary forms, with or without
4ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * modification, are permitted provided that the following conditions are
5ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * met:
6ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *     * Redistributions of source code must retain the above copyright
7ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       notice, this list of conditions and the following disclaimer.
8ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *     * Redistributions in binary form must reproduce the above
9ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       copyright notice, this list of conditions and the following
10ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       disclaimer in the documentation and/or other materials provided
11ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       with the distribution.
12ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *     * Neither the name of The Linux Foundation, nor the names of its
13ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       contributors may be used to endorse or promote products derived
14ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       from this software without specific prior written permission.
15ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *
16ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *
28ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo */
29ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
30ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#define LOG_NDDEBUG 0
31ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
32ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <stdio.h>
33ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <stdlib.h>
34ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <sys/time.h>
35ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include "loc_log.h"
36ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include "msg_q.h"
37ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#ifdef USE_GLIB
38ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <time.h>
39ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#endif /* USE_GLIB  */
40ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include "log_util.h"
41ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include "platform_lib_includes.h"
42ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
43ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#define  BUFFER_SIZE  120
44ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
45ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// Logging Improvements
46ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char *loc_logger_boolStr[]={"False","True"};
47ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char VOID_RET[]   = "None";
48ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char FROM_AFW[]   = "===>";
49ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char TO_MODEM[]   = "--->";
50ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char FROM_MODEM[] = "<---";
51ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char TO_AFW[]     = "<===";
52ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char EXIT_TAG[]   = "Exiting";
53ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char ENTRY_TAG[]  = "Entering";
54ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
55ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/* Logging Mechanism */
56ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoloc_logger_s_type loc_logger;
57ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
58ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/* Get names from value */
59ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char* loc_get_name_from_mask(loc_name_val_s_type table[], int table_size, long mask)
60ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
61ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   int i;
62ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   for (i = 0; i < table_size; i++)
63ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   {
64ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo      if (table[i].val & (long) mask)
65ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo      {
66ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo         return table[i].name;
67ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo      }
68ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   }
69ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   return UNKNOWN_STR;
70ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
71ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
72ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/* Get names from value */
73ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char* loc_get_name_from_val(loc_name_val_s_type table[], int table_size, long value)
74ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
75ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   int i;
76ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   for (i = 0; i < table_size; i++)
77ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   {
78ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo      if (table[i].val == (long) value)
79ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo      {
80ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo         return table[i].name;
81ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo      }
82ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   }
83ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   return UNKNOWN_STR;
84ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
85ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
86ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostatic loc_name_val_s_type loc_msg_q_status[] =
87ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
88ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL( eMSG_Q_SUCCESS ),
89ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL( eMSG_Q_FAILURE_GENERAL ),
90ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL( eMSG_Q_INVALID_PARAMETER ),
91ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL( eMSG_Q_INVALID_HANDLE ),
92ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL( eMSG_Q_UNAVAILABLE_RESOURCE ),
93ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL( eMSG_Q_INSUFFICIENT_BUFFER )
94ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo};
95ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostatic int loc_msg_q_status_num = sizeof(loc_msg_q_status) / sizeof(loc_name_val_s_type);
96ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
97ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/* Find msg_q status name */
98ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char* loc_get_msg_q_status(int status)
99ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
100ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   return loc_get_name_from_val(loc_msg_q_status, loc_msg_q_status_num, (long) status);
101ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
102ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
103ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char* log_succ_fail_string(int is_succ)
104ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
105ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   return is_succ? "successful" : "failed";
106ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
107ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
108ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo//Target names
109ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoloc_name_val_s_type target_name[] =
110ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
111ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL(GNSS_NONE),
112ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL(GNSS_MSM),
113ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL(GNSS_GSS),
114ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL(GNSS_MDM),
115ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL(GNSS_GRIFFON),
116ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    NAME_VAL(GNSS_UNKNOWN)
117ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo};
118ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
119ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russostatic int target_name_num = sizeof(target_name)/sizeof(loc_name_val_s_type);
120ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
121ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/*===========================================================================
122ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
123ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoFUNCTION loc_get_target_name
124ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
125ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoDESCRIPTION
126ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   Returns pointer to a string that contains name of the target
127ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
128ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   XX:XX:XX.000\0
129ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
130ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoRETURN VALUE
131ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   The target name string
132ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
133ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo===========================================================================*/
134ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char *loc_get_target_name(unsigned int target)
135ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
136ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    int index = 0;
137ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    char ret[BUFFER_SIZE];
138ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
139ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    index =  getTargetGnssType(target);
140ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if( index >= target_name_num || index < 0)
141ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        index = target_name_num - 1;
142ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
143ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if( (target & HAS_SSC) == HAS_SSC ) {
144ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        sprintf(ret, " %s with SSC",
145ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo           loc_get_name_from_val(target_name, target_name_num, (long)index) );
146ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
147ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    else {
148ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo       sprintf(ret, " %s  without SSC",
149ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo           loc_get_name_from_val(target_name, target_name_num, (long)index) );
150ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
151ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    return ret;
152ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
153ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
154ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
155ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/*===========================================================================
156ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
157ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoFUNCTION loc_get_time
158ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
159ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoDESCRIPTION
160ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   Logs a callback event header.
161ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   The pointer time_string should point to a buffer of at least 13 bytes:
162ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
163ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   XX:XX:XX.000\0
164ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
165ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoRETURN VALUE
166ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   The time string
167ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
168ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo===========================================================================*/
169ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russochar *loc_get_time(char *time_string, unsigned long buf_size)
170ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
171ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   struct timeval now;     /* sec and usec     */
172ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   struct tm now_tm;       /* broken-down time */
173ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   char hms_string[80];    /* HH:MM:SS         */
174ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
175ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   gettimeofday(&now, NULL);
176ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   localtime_r(&now.tv_sec, &now_tm);
177ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
178ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   strftime(hms_string, sizeof hms_string, "%H:%M:%S", &now_tm);
179ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   snprintf(time_string, buf_size, "%s.%03d", hms_string, (int) (now.tv_usec / 1000));
180ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
181ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   return time_string;
182ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
183ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
184ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
185ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/*===========================================================================
186ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoFUNCTION loc_logger_init
187ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
188ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoDESCRIPTION
189ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   Initializes the state of DEBUG_LEVEL and TIMESTAMP
190ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
191ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoDEPENDENCIES
192ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   N/A
193ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
194ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoRETURN VALUE
195ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   None
196ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
197ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoSIDE EFFECTS
198ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   N/A
199ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo===========================================================================*/
200ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russovoid loc_logger_init(unsigned long debug, unsigned long timestamp)
201ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
202ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   loc_logger.DEBUG_LEVEL = debug;
203ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   loc_logger.TIMESTAMP   = timestamp;
204ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
205ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
206ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
207ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/*===========================================================================
208ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoFUNCTION get_timestamp
209ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
210ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoDESCRIPTION
211ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   Generates a timestamp using the current system time
212ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
213ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoDEPENDENCIES
214ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   N/A
215ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
216ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoRETURN VALUE
217ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   Char pointer to the parameter str
218ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
219ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoSIDE EFFECTS
220ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo   N/A
221ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo===========================================================================*/
222ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russochar * get_timestamp(char *str, unsigned long buf_size)
223ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
224ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  struct timeval tv;
225ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  struct timezone tz;
226ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  int hh, mm, ss;
227ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  gettimeofday(&tv, &tz);
228ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  hh = tv.tv_sec/3600%24;
229ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  mm = (tv.tv_sec%3600)/60;
230ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  ss = tv.tv_sec%60;
231ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  snprintf(str, buf_size, "%02d:%02d:%02d.%06ld", hh, mm, ss, tv.tv_usec);
232ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo  return str;
233ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
234ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
235