X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/e36afc3163c00c4a159d16d262c9ae990de6667a..0fb8e69adbc9711a7fdbebf95b9f700fb52d2dd0:/util.c diff --git a/util.c b/util.c index 920de6dc..a6f520e2 100644 --- a/util.c +++ b/util.c @@ -19,228 +19,40 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.75 2002-07-16 04:03:16 guy Exp $ (LBL)"; -#endif +/* + * txtproto_print() derived from original code by Hannes Gredler + * (hannes@juniper.net): + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code + * distributions retain the above copyright notice and this paragraph + * in its entirety, and (2) distributions including binary code include + * the above copyright notice and this paragraph in its entirety in + * the documentation or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND + * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include -#include +#include + #include -#include -#include #ifdef HAVE_FCNTL_H #include #endif -#include #include #include #include #include -#ifdef TIME_WITH_SYS_TIME -#include -#endif -#include #include "interface.h" -/* - * Print out a filename (or other ascii string). - * If ep is NULL, assume no truncation check is needed. - * Return true if truncated. - */ -int -fn_print(register const u_char *s, register const u_char *ep) -{ - register int ret; - register u_char c; - - ret = 1; /* assume truncated */ - while (ep == NULL || s < ep) { - 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(ret); -} - -/* - * Print out a counted filename (or other ascii string). - * If ep is NULL, assume no truncation check is needed. - * Return true if truncated. - */ -int -fn_printn(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 (ep == NULL || s < ep) { - if (n-- <= 0) { - ret = 0; - break; - } - c = *s++; - if (!isascii(c)) { - c = toascii(c); - putchar('M'); - putchar('-'); - } - if (!isprint(c)) { - c ^= 0x40; /* DEL to ?, others to alpha */ - putchar('^'); - } - putchar(c); - } - return(ret); -} - -/* - * Print the timestamp - */ -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; - - switch(tflag) { - case 1: /* 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 */ - (void)printf("%u.%06u ", - (unsigned)tvp->tv_sec, - (unsigned)tvp->tv_usec); - break; - case -2: - 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; - 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; - } -} - -/* - * Print a relative number of seconds (e.g. hold time, prune timer) - * in the form 5m1s. This does no truncation, so 32230861 seconds - * is represented as 1y1w1d1h1m1s. - */ -void -relts_print(int secs) -{ - 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++; - } -} - -/* - * Convert a token value to a string; use "fmt" if not found. - */ -const char * -tok2str(register const struct tok *lp, register const char *fmt, - register int v) -{ - static char buf[128]; - - while (lp->s != NULL) { - if (lp->v == v) - return (lp->s); - ++lp; - } - if (fmt == NULL) - fmt = "#%d"; - (void)snprintf(buf, sizeof(buf), fmt, v); - return (buf); -} - -/* - * Convert a value to a string using an array; the macro - * tok2strary() in 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 */ void error(const char *fmt, ...) @@ -311,14 +123,24 @@ copy_argv(register char **argv) return buf; } +/* + * On Windows, we need to open the file in binary mode, so that + * we get all the bytes specified by the size we get from "fstat()". + * On UNIX, that's not necessary. O_BINARY is defined on Windows; + * we define it as 0 if it's not defined, so it does nothing. + */ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + char * read_infile(char *fname) { - register int fd, cc; + register int i, fd, cc; register char *cp; struct stat buf; - fd = open(fname, O_RDONLY); + fd = open(fname, O_RDONLY|O_BINARY); if (fd < 0) error("can't open %s: %s", fname, pcap_strerror(errno)); @@ -334,28 +156,14 @@ read_infile(char *fname) error("read %s: %s", fname, pcap_strerror(errno)); if (cc != buf.st_size) error("short read %s (%d != %d)", fname, cc, (int)buf.st_size); - cp[(int)buf.st_size] = '\0'; - - return (cp); -} -void -safeputs(const char *s) -{ - while (*s) { - safeputchar(*s); - s++; + close(fd); + /* replace "# comment" with spaces */ + for (i = 0; i < cc; i++) { + if (cp[i] == '#') + while (i < cc && cp[i] != '\n') + cp[i++] = ' '; } -} - -void -safeputchar(int c) -{ - unsigned char ch; - - ch = (unsigned char)(c & 0xff); - if (ch < 0x80 && isprint(ch)) - printf("%c", ch); - else - printf("\\%03o", ch); + cp[cc] = '\0'; + return (cp); }