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