]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util.c
print-fr.c
[tcpdump] / util.c
diff --git a/util.c b/util.c
index 06820a353d1bf807ed34fcce56a0b038cece37e8..4e04b0a99ba156cea401f3bff0dc60c7f7a851ee 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.93 2004-04-29 02:15:16 mcr Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.99 2005-05-06 08:26:45 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -45,7 +45,7 @@ static const char rcsid[] _U_ =
 #include "interface.h"
 
 /*
- * Print out a filename (or other ascii string).
+ * Print out a null-terminated filename (or other ascii string).
  * If ep is NULL, assume no truncation check is needed.
  * Return true if truncated.
  */
@@ -104,6 +104,40 @@ fn_printn(register const u_char *s, register u_int n,
        return (n == 0) ? 0 : 1;
 }
 
+/*
+ * Print out a null-padded filename (or other ascii string).
+ * If ep is NULL, assume no truncation check is needed.
+ * Return true if truncated.
+ */
+int
+fn_printzp(register const u_char *s, register u_int n,
+         register const u_char *ep)
+{
+       register int ret;
+       register u_char c;
+
+       ret = 1;                        /* assume truncated */
+       while (n > 0 && (ep == NULL || s < ep)) {
+               n--;
+               c = *s++;
+               if (c == '\0') {
+                       ret = 0;
+                       break;
+               }
+               if (!isascii(c)) {
+                       c = toascii(c);
+                       putchar('M');
+                       putchar('-');
+               }
+               if (!isprint(c)) {
+                       c ^= 0x40;      /* DEL to ?, others to alpha */
+                       putchar('^');
+               }
+               putchar(c);
+       }
+       return (n == 0) ? 0 : ret;
+}
+
 /*
  * Print the timestamp
  */
@@ -116,19 +150,25 @@ ts_print(register const struct timeval *tvp)
        static unsigned b_sec;
        static unsigned b_usec;
 
-       switch(tflag) {
-       case 1: /* Default */
+       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);
                break;
-       case -1: /* Unix timeval style */
+
+       case 1: /* No time stamp */
+               break;
+
+       case 2: /* Unix timeval style */
                (void)printf("%u.%06u ",
                             (unsigned)tvp->tv_sec,
                             (unsigned)tvp->tv_usec);
                break;
-       case -2:
+
+       case 3: /* Microseconds since previous packet */
                if (b_sec == 0) {
                        printf("000000 ");
                } else {
@@ -146,7 +186,8 @@ ts_print(register const struct timeval *tvp)
                b_sec = tvp->tv_sec;
                b_usec = tvp->tv_usec;
                break;
-       case -3: /* Default + Date*/
+
+       case 4: /* Default + Date*/
                s = (tvp->tv_sec + thiszone) % 86400;
                Time = (tvp->tv_sec + thiszone) - s;
                tm = gmtime (&Time);
@@ -201,6 +242,8 @@ relts_print(int secs)
 int
 print_unknown_data(const u_char *cp,const char *ident,int len)
 {
+       if (snapend - cp < len)
+               len = snapend - cp;
         hex_print(ident,cp,len);
        return(1); /* everything is ok */
 }
@@ -212,10 +255,12 @@ const char *
 tok2strbuf(register const struct tok *lp, register const char *fmt,
           register int v, char *buf, size_t bufsize)
 {
-       while (lp->s != NULL) {
-               if (lp->v == v)
-                       return (lp->s);
-               ++lp;
+       if (lp != NULL) {
+               while (lp->s != NULL) {
+                       if (lp->v == v)
+                               return (lp->s);
+                       ++lp;
+               }
        }
        if (fmt == NULL)
                fmt = "#%d";
@@ -253,7 +298,7 @@ bittok2str(register const struct tok *lp, register const char *fmt,
         register int rotbit; /* this is the bit we rotate through all bitpositions */
         register int tokval;
 
-       while (lp->s != NULL) {
+       while (lp->s != NULL && lp != NULL) {
             tokval=lp->v;   /* load our first value */
             rotbit=1;
             while (rotbit != 0) {