X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/3cd171317f54bc968808d49e3ca87b6c49ccdcdd..012652d39b74a464154c8c4d1d73b81a37a341ef:/util.c diff --git a/util.c b/util.c index c205615a..e8515f18 100644 --- a/util.c +++ b/util.c @@ -21,19 +21,17 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.68 2000-07-01 03:39:12 assar 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 @@ -46,7 +44,6 @@ static const char rcsid[] = #ifdef TIME_WITH_SYS_TIME #include #endif -#include #include "interface.h" @@ -145,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--; @@ -178,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); @@ -197,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 +void error(const char *fmt, ...) { va_list ap; @@ -303,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); @@ -328,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); }