X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/76c5a0bdc1039e9c65b7e14bc33c20a5f61832a3..012652d39b74a464154c8c4d1d73b81a37a341ef:/util.c?ds=inline diff --git a/util.c b/util.c index 7806a9f0..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.67 2000-06-21 09:08:34 itojun 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" @@ -152,7 +142,7 @@ ts_print(register const struct timeval *tvp) } 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--; @@ -185,15 +175,19 @@ 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; + 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) { + 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); @@ -204,6 +198,34 @@ relts_print(int secs) } } +/* + * 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) { @@ -256,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) { @@ -330,11 +351,23 @@ 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); @@ -355,8 +388,8 @@ safeputchar(int c) unsigned char ch; ch = (unsigned char)(c & 0xff); - if (c < 0x80 && isprint(c)) - printf("%c", c & 0xff); + if (ch < 0x80 && isprint(ch)) + printf("%c", ch); else - printf("\\%03o", c & 0xff); + printf("\\%03o", ch); }