]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util.c
add a maxlen boundary check to safeputs, print unprintable chars as hex in safeputchar
[tcpdump] / util.c
diff --git a/util.c b/util.c
index 2faebcd15757f039580f50860d80678e32872ba1..cb4f2aaa768ce16a5fd07261f14c6d0ee4b1e9cd 100644 (file)
--- 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