X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b2bf371ad575eb030cf35f5997bf3e040b53fcb1..ddb7009f906c69c5f7bddbd21c735a117f9a1e49:/util.c?ds=sidebyside diff --git a/util.c b/util.c index 2faebcd1..cb4f2aaa 100644 --- a/util.c +++ b/util.c @@ -21,7 +21,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.101 2005-12-05 08:57:30 hannes Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.106 2006-02-08 01:38:16 hannes Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -44,6 +44,8 @@ static const char rcsid[] _U_ = #include "interface.h" +char * ts_format(register int, register int); + /* * Print out a null-terminated filename (or other ascii string). * If ep is NULL, assume no truncation check is needed. @@ -138,6 +140,19 @@ fn_printzp(register const u_char *s, register u_int n, return (n == 0) ? 0 : ret; } +/* + * Format the timestamp + */ +char * +ts_format(register int sec, register int usec) +{ + static char buf[sizeof("00:00:00.000000")]; + (void)snprintf(buf, sizeof(buf), "%02d:%02d:%02d.%06u", + sec / 3600, (sec % 3600) / 60, sec % 60, usec); + + return buf; +} + /* * Print the timestamp */ @@ -149,14 +164,14 @@ ts_print(register const struct timeval *tvp) time_t Time; static unsigned b_sec; static unsigned b_usec; + int d_usec; + int d_sec; switch (tflag) { case 0: /* Default */ s = (tvp->tv_sec + thiszone) % 86400; - (void)printf("%02d:%02d:%02d.%06u ", - s / 3600, (s % 3600) / 60, s % 60, - (unsigned)tvp->tv_usec); + (void)printf("%s ", ts_format(s, tvp->tv_usec)); break; case 1: /* No time stamp */ @@ -169,22 +184,27 @@ ts_print(register const struct timeval *tvp) break; case 3: /* Microseconds since previous packet */ + case 5: /* Microseconds since first packet */ if (b_sec == 0) { - printf("000000 "); - } else { - int d_usec = tvp->tv_usec - b_usec; - int d_sec = tvp->tv_sec - b_sec; - - while (d_usec < 0) { - d_usec += 1000000; - d_sec--; - } - if (d_sec) - printf("%d. ", d_sec); - printf("%06d ", d_usec); - } - b_sec = tvp->tv_sec; - b_usec = tvp->tv_usec; + /* init timestamp for first packet */ + b_usec = tvp->tv_usec; + b_sec = tvp->tv_sec; + } + + d_usec = tvp->tv_usec - b_usec; + d_sec = tvp->tv_sec - b_sec; + + while (d_usec < 0) { + d_usec += 1000000; + d_sec--; + } + + (void)printf("%s ", ts_format(d_sec, d_usec)); + + if (tflag == 3) { /* set timestamp for last packet */ + b_sec = tvp->tv_sec; + b_usec = tvp->tv_usec; + } break; case 4: /* Default + Date*/ @@ -194,10 +214,9 @@ ts_print(register const struct timeval *tvp) if (!tm) printf("Date fail "); else - printf("%04d-%02d-%02d ", - tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday); - printf("%02d:%02d:%02d.%06u ", - s / 3600, (s % 3600) / 60, s % 60, (unsigned)tvp->tv_usec); + printf("%04d-%02d-%02d %s ", + tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, + ts_format(s, tvp->tv_usec)); break; } } @@ -507,10 +526,12 @@ read_infile(char *fname) } void -safeputs(const char *s) +safeputs(const char *s, int maxlen) { - while (*s) { + int idx = 0; + while (*s && idx < maxlen) { safeputchar(*s); + idx++; s++; } } @@ -524,45 +545,5 @@ safeputchar(int c) if (ch < 0x80 && isprint(ch)) printf("%c", ch); else - printf("\\%03o", ch); -} - -#ifdef WIN32 -/* - * Number of micro-seconds between the beginning of the Windows epoch - * (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970). - * - * This assumes all Win32 compilers have 64-bit support. - */ -#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) || defined(__WATCOMC__) - #define DELTA_EPOCH_IN_USEC 11644473600000000Ui64 -#else - #define DELTA_EPOCH_IN_USEC 11644473600000000ULL -#endif - -static u_int64_t filetime_to_unix_epoch (const FILETIME *ft) -{ - u_int64_t res = (u_int64_t) ft->dwHighDateTime << 32; - - res |= ft->dwLowDateTime; - res /= 10; /* from 100 nano-sec periods to usec */ - res -= DELTA_EPOCH_IN_USEC; /* from Win epoch to Unix epoch */ - return (res); + printf("\\0x%02x ", ch); } - -int gettimeofday (struct timeval *tv, void *tz _U_) -{ - FILETIME ft; - u_int64_t tim; - - if (!tv) { - errno = EINVAL; - return (-1); - } - GetSystemTimeAsFileTime (&ft); - tim = filetime_to_unix_epoch (&ft); - tv->tv_sec = (long) (tim / 1000000L); - tv->tv_usec = (long) (tim % 1000000L); - return (0); -} -#endif