]> The Tcpdump Group git mirrors - tcpdump/blobdiff - util.c
NDOize OpenFlow, IEEE slow and telnet decoders
[tcpdump] / util.c
diff --git a/util.c b/util.c
index 784b09b788b03f17e12dccc099321613e50a2ae3..ff406025c9929c87b3d104eb1318e548ee727883 100644 (file)
--- a/util.c
+++ b/util.c
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#ifndef lint
-static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/util.c,v 1.109 2007-01-29 09:59:42 hannes Exp $ (LBL)";
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -36,7 +31,6 @@ static const char rcsid[] _U_ =
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
-#include <pcap.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>
@@ -64,12 +58,12 @@ fn_print(register const u_char *s, register const u_char *ep)
                        ret = 0;
                        break;
                }
-               if (!isascii(c)) {
-                       c = toascii(c);
+               if (!ND_ISASCII(c)) {
+                       c = ND_TOASCII(c);
                        putchar('M');
                        putchar('-');
                }
-               if (!isprint(c)) {
+               if (!ND_ISPRINT(c)) {
                        c ^= 0x40;      /* DEL to ?, others to alpha */
                        putchar('^');
                }
@@ -92,12 +86,12 @@ fn_printn(register const u_char *s, register u_int n,
        while (n > 0 && (ep == NULL || s < ep)) {
                n--;
                c = *s++;
-               if (!isascii(c)) {
-                       c = toascii(c);
+               if (!ND_ISASCII(c)) {
+                       c = ND_TOASCII(c);
                        putchar('M');
                        putchar('-');
                }
-               if (!isprint(c)) {
+               if (!ND_ISPRINT(c)) {
                        c ^= 0x40;      /* DEL to ?, others to alpha */
                        putchar('^');
                }
@@ -126,12 +120,12 @@ fn_printzp(register const u_char *s, register u_int n,
                        ret = 0;
                        break;
                }
-               if (!isascii(c)) {
-                       c = toascii(c);
+               if (!ND_ISASCII(c)) {
+                       c = ND_TOASCII(c);
                        putchar('M');
                        putchar('-');
                }
-               if (!isprint(c)) {
+               if (!ND_ISPRINT(c)) {
                        c ^= 0x40;      /* DEL to ?, others to alpha */
                        putchar('^');
                }
@@ -188,12 +182,12 @@ ts_print(register const struct timeval *tvp)
                if (b_sec == 0) {
                         /* init timestamp for first packet */
                         b_usec = tvp->tv_usec;
-                        b_sec = tvp->tv_sec;                        
+                        b_sec = tvp->tv_sec;
                 }
 
                 d_usec = tvp->tv_usec - b_usec;
                 d_sec = tvp->tv_sec - b_sec;
-                
+
                 while (d_usec < 0) {
                     d_usec += 1000000;
                     d_sec--;
@@ -259,21 +253,21 @@ relts_print(int secs)
  */
 
 int
-print_unknown_data(const u_char *cp,const char *ident,int len)
+print_unknown_data(netdissect_options *ndo, const u_char *cp,const char *ident,int len)
 {
        if (len < 0) {
-               printf("%sDissector error: print_unknown_data called with negative length",
-                   ident);
+          ND_PRINT((ndo,"%sDissector error: print_unknown_data called with negative length",
+                   ident));
                return(0);
        }
        if (snapend - cp < len)
                len = snapend - cp;
        if (len < 0) {
-               printf("%sDissector error: print_unknown_data called with pointer past end of packet",
-                   ident);
+          ND_PRINT((ndo,"%sDissector error: print_unknown_data called with pointer past end of packet",
+                   ident));
                return(0);
        }
-        hex_print(ident,cp,len);
+        hex_print(ndo, ident,cp,len);
        return(1); /* everything is ok */
 }
 
@@ -282,7 +276,7 @@ print_unknown_data(const u_char *cp,const char *ident,int len)
  */
 const char *
 tok2strbuf(register const struct tok *lp, register const char *fmt,
-          register int v, char *buf, size_t bufsize)
+          register u_int v, char *buf, size_t bufsize)
 {
        if (lp != NULL) {
                while (lp->s != NULL) {
@@ -415,7 +409,7 @@ tok2strary_internal(register const char **lp, int n, register const char *fmt,
  */
 
 int
-mask2plen (u_int32_t mask)
+mask2plen(u_int32_t mask)
 {
        u_int32_t bitmasks[33] = {
                0x00000000,
@@ -439,6 +433,35 @@ mask2plen (u_int32_t mask)
        return (prefix_len);
 }
 
+#ifdef INET6
+int
+mask62plen(const u_char *mask)
+{
+       u_char bitmasks[9] = {
+               0x00,
+               0x80, 0xc0, 0xe0, 0xf0,
+               0xf8, 0xfc, 0xfe, 0xff
+       };
+       int byte;
+       int cidr_len = 0;
+
+       for (byte = 0; byte < 16; byte++) {
+               u_int bits;
+
+               for (bits = 0; bits < (sizeof (bitmasks) / sizeof (bitmasks[0])); bits++) {
+                       if (mask[byte] == bitmasks[bits]) {
+                               cidr_len += bits;
+                               break;
+                       }
+               }
+
+               if (mask[byte] != 0xff)
+                       break;
+       }
+       return (cidr_len);
+}
+#endif /* INET6 */
+
 /* VARARGS */
 void
 error(const char *fmt, ...)
@@ -572,8 +595,28 @@ safeputchar(int c)
        unsigned char ch;
 
        ch = (unsigned char)(c & 0xff);
-       if (ch < 0x80 && isprint(ch))
+       if (ch < 0x80 && ND_ISPRINT(ch))
                printf("%c", ch);
        else
                printf("\\0x%02x", ch);
 }
+
+#ifdef LBL_ALIGN
+/*
+ * Some compilers try to optimize memcpy(), using the alignment constraint
+ * on the argument pointer type.  by using this function, we try to avoid the
+ * optimization.
+ */
+void
+unaligned_memcpy(void *p, const void *q, size_t l)
+{
+       memcpy(p, q, l);
+}
+
+/* As with memcpy(), so with memcmp(). */
+int
+unaligned_memcmp(const void *p, const void *q, size_t l)
+{
+       return (memcmp(p, q, l));
+}
+#endif