]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util.c
Add missing af.c and af.h files.
[tcpdump] / util.c
diff --git a/util.c b/util.c
index d4882d72cc9a7311389c721d359fc9244949c234..5746b0949c14fb778621563f38ebd1246a63577f 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.98 2005-05-06 07:56:54 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.107 2006-02-08 16:18:56 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.
@@ -135,7 +137,20 @@ fn_printzp(register const u_char *s, register u_int n,
                }
                putchar(c);
        }
-       return (n == 0) ? 0 : 1;
+       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;
 }
 
 /*
@@ -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;
        }
 }
@@ -242,8 +261,18 @@ relts_print(int secs)
 int
 print_unknown_data(const u_char *cp,const char *ident,int len)
 {
+       if (len < 0) {
+               printf("%sDissector error: print_unknown_data called with negative length",
+                   ident);
+               return(0);
+       }
        if (snapend - cp < len)
                len = snapend - cp;
+       if (len < 0) {
+               printf("%sDissector error: print_unknown_data called with pointer past end of packet",
+                   ident);
+               return(0);
+       }
         hex_print(ident,cp,len);
        return(1); /* everything is ok */
 }
@@ -497,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++;
        }
 }
@@ -514,5 +545,5 @@ safeputchar(int c)
        if (ch < 0x80 && isprint(ch))
                printf("%c", ch);
        else
-               printf("\\%03o", ch);
+               printf("\\0x%02x", ch);
 }