X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/814765d31c7cf9bf8753cdb2c908f516608c72ee..012652d39b74a464154c8c4d1d73b81a37a341ef:/util.c diff --git a/util.c b/util.c index 326eae49..e8515f18 100644 --- a/util.c +++ b/util.c @@ -21,39 +21,29 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.61 1999-11-22 07:25:27 fenner Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.78 2002-08-02 04:22:11 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include -#include +#include + #include -#include #include #ifdef HAVE_FCNTL_H #include #endif -#ifdef HAVE_MALLOC_H -#include -#endif #include #include -#if __STDC__ #include -#else -#include -#endif #include #include #ifdef TIME_WITH_SYS_TIME #include #endif -#include #include "interface.h" @@ -129,37 +119,51 @@ void ts_print(register const struct timeval *tvp) { register int s; + struct tm *tm; + time_t Time; + static unsigned b_sec; + static unsigned b_usec; - if (tflag > 0) { - /* Default */ + switch(tflag) { + case 1: /* Default */ s = (tvp->tv_sec + thiszone) % 86400; (void)printf("%02d:%02d:%02d.%06u ", - s / 3600, (s % 3600) / 60, s % 60, (u_int32_t)tvp->tv_usec); - } else if (tflag < 0) { - 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; + s / 3600, (s % 3600) / 60, s % 60, + (unsigned)tvp->tv_usec); + break; + case -1: /* Unix timeval style */ + (void)printf("%u.%06u ", + (unsigned)tvp->tv_sec, + (unsigned)tvp->tv_usec); + break; + case -2: + if (b_sec == 0) { + printf("000000 "); } else { - /* Unix timeval style */ - (void)printf("%u.%06u ", - (u_int32_t)tvp->tv_sec, (u_int32_t)tvp->tv_usec); + 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; + break; + case -3: /* Default + Date*/ + s = (tvp->tv_sec + thiszone) % 86400; + Time = (tvp->tv_sec + thiszone) - s; + tm = gmtime (&Time); + (void)printf("%02d/%02d/%04d %02d:%02d:%02d.%06u ", + tm->tm_mon+1, tm->tm_mday, + tm->tm_year+1900, + s / 3600, (s % 3600) / 60, + s % 60, (unsigned)tvp->tv_usec); + break; } } @@ -171,24 +175,55 @@ ts_print(register const struct timeval *tvp) 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; - int len; - int i; - - if (secs == 0) { - (void)printf("0s"); - return; - } - while (secs) { - if (secs >= *s) { - (void)printf("%d%s", secs / *s, *l); - secs -= (secs / *s) * *s; + static const char *lengths[] = {"y", "w", "d", "h", "m", "s"}; + static const int seconds[] = {31536000, 604800, 86400, 3600, 60, 1}; + const char **l = lengths; + const int *s = seconds; + + if (secs == 0) { + (void)printf("0s"); + return; + } + if (secs < 0) { + (void)printf("-"); + secs = -secs; + } + while (secs > 0) { + if (secs >= *s) { + (void)printf("%d%s", secs / *s, *l); + secs -= (secs / *s) * *s; + } + s++; + l++; + } +} + +/* + * this is a generic routine for printing unknown data; + * we pass on the linefeed plus indentation string to + * get a proper output - returns 0 on error + */ + +int +print_unknown_data(const u_char *cp,const char *lf,int len) +{ + int i; + + printf("%s0x0000: ",lf); + for(i=0;i is the public interface to + * this function and ensures that the second argument is + * correct for bounds-checking. + */ +const char * +tok2strary_internal(register const char **lp, int n, register const char *fmt, + register int v) +{ + static char buf[128]; + + if (v >= 0 && v < n && lp[v] != NULL) + return lp[v]; + if (fmt == NULL) + fmt = "#%d"; + (void)snprintf(buf, sizeof(buf), fmt, v); + return (buf); +} /* VARARGS */ -__dead void -#if __STDC__ +void error(const char *fmt, ...) -#else -error(fmt, va_alist) - const char *fmt; - va_dcl -#endif { va_list ap; (void)fprintf(stderr, "%s: ", program_name); -#if __STDC__ va_start(ap, fmt); -#else - va_start(ap); -#endif (void)vfprintf(stderr, fmt, ap); va_end(ap); if (*fmt) { @@ -243,22 +287,12 @@ error(fmt, va_alist) /* VARARGS */ void -#if __STDC__ warning(const char *fmt, ...) -#else -warning(fmt, va_alist) - const char *fmt; - va_dcl -#endif { va_list ap; (void)fprintf(stderr, "%s: WARNING: ", program_name); -#if __STDC__ va_start(ap, fmt); -#else - va_start(ap); -#endif (void)vfprintf(stderr, fmt, ap); va_end(ap); if (*fmt) { @@ -317,12 +351,45 @@ read_infile(char *fname) error("can't stat %s: %s", fname, pcap_strerror(errno)); cp = malloc((u_int)buf.st_size + 1); - cc = read(fd, cp, (int)buf.st_size); + if (cp == NULL) + error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1, + fname, pcap_strerror(errno)); + cc = read(fd, cp, (u_int)buf.st_size); if (cc < 0) error("read %s: %s", fname, pcap_strerror(errno)); if (cc != buf.st_size) +#ifndef WIN32 error("short read %s (%d != %d)", fname, cc, (int)buf.st_size); +#else +/* Windows seems not to like the final \xa character */ + { + char *pdest; + pdest=strchr( cp, '\xa'); + *pdest=0; + } +#endif /* WIN32 */ cp[(int)buf.st_size] = '\0'; return (cp); } + +void +safeputs(const char *s) +{ + while (*s) { + safeputchar(*s); + s++; + } +} + +void +safeputchar(int c) +{ + unsigned char ch; + + ch = (unsigned char)(c & 0xff); + if (ch < 0x80 && isprint(ch)) + printf("%c", ch); + else + printf("\\%03o", ch); +}