]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util.c
Fix a minor bug in the ack packet printing.
[tcpdump] / util.c
diff --git a/util.c b/util.c
index f547119c9b292f894f0dc175e6a667bd052bcd62..9e611ae52ffe08970e4bbe1203c3fa75545b7df8 100644 (file)
--- a/util.c
+++ b/util.c
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.58 1999-10-07 23:47:13 mcr Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.63 2000-01-17 06:24:27 itojun Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
 #endif
 
 #include <sys/types.h>
@@ -132,10 +136,57 @@ ts_print(register const struct timeval *tvp)
                (void)printf("%02d:%02d:%02d.%06u ",
                    s / 3600, (s % 3600) / 60, s % 60, (u_int32_t)tvp->tv_usec);
        } else if (tflag < 0) {
-               /* Unix timeval style */
-               (void)printf("%u.%06u ",
-                   (u_int32_t)tvp->tv_sec, (u_int32_t)tvp->tv_usec);
+               if (tflag < -1) {
+                       static unsigned b_sec;
+                       static unsigned b_usec;
+                       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;
+               } else {
+                       /* Unix timeval style */
+                       (void)printf("%u.%06u ",
+                                    (u_int32_t)tvp->tv_sec, (u_int32_t)tvp->tv_usec);
+               }
+       }
+}
+
+/*
+ * Print a relative number of seconds (e.g. hold time, prune timer)
+ * in the form 5m1s.  This does no truncation, so 32230861 seconds
+ * is represented as 1y1w1d1h1m1s.
+ */
+void
+relts_print(int secs)
+{
+    static char *lengths[]={"y","w","d","h","m","s"};
+    static int seconds[]={31536000,604800,86400,3600,60,1};
+    char **l = lengths;
+    int *s = seconds;
+
+    if (secs == 0) {
+       (void)printf("0s");
+       return;
+    }
+    while (secs) {
+       if (secs >= *s) {
+           (void)printf("%d%s", secs / *s, *l);
+           secs -= (secs / *s) * *s;
        }
+       s++; l++;
+    }
 }
 
 /*
@@ -154,7 +205,7 @@ tok2str(register const struct tok *lp, register const char *fmt,
        }
        if (fmt == NULL)
                fmt = "#%d";
-       (void)sprintf(buf, fmt, v);
+       (void)snprintf(buf, sizeof(buf), fmt, v);
        return (buf);
 }