X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/4217d3321a8a0830fed7e55ecf2dd89ffea210b9..a5370b71fe0fdecac8a10ad2e0e5545f01f95f6e:/util.c diff --git a/util.c b/util.c index 06820a35..4e04b0a9 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.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) {