]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-isakmp.c
s/sprintf/snprintf/.
[tcpdump] / print-isakmp.c
index ff8a066e9dd0bdec987d667e01f20bf0096e73ae..5f4abc00aa1e5dda5b2c0b4abdccf26cf73de1ec 100644 (file)
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.3 1999-10-30 05:11:17 itojun Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.10 2000-01-17 06:24:25 itojun Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
 #endif
 
 #include <string.h>
@@ -68,6 +72,10 @@ struct rtentry;
 #include "addrtoname.h"
 #include "extract.h"                    /* must come after interface.h */
 
+#ifndef HAVE_SOCKADDR_STORAGE
+#define sockaddr_storage sockaddr
+#endif
+
 static u_char *isakmp_sa_print __P((struct isakmp_gen *, u_char *, u_int32_t,
        u_int32_t, u_int32_t));
 static u_char *isakmp_p_print __P((struct isakmp_gen *, u_char *, u_int32_t,
@@ -202,11 +210,15 @@ cookie_record(cookie_t *in, const u_char *bp2)
                        sizeof(cookiecache[ninitiator].raddr));
 
                sin = (struct sockaddr_in *)&cookiecache[ninitiator].iaddr;
+#ifdef HAVE_SOCKADDR_SA_LEN
                sin->sin_len = sizeof(struct sockaddr_in);
+#endif
                sin->sin_family = AF_INET;
                memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
                sin = (struct sockaddr_in *)&cookiecache[ninitiator].raddr;
+#ifdef HAVE_SOCKADDR_SA_LEN
                sin->sin_len = sizeof(struct sockaddr_in);
+#endif
                sin->sin_family = AF_INET;
                memcpy(&sin->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst));
                break;
@@ -219,11 +231,15 @@ cookie_record(cookie_t *in, const u_char *bp2)
 
                ip6 = (struct ip6_hdr *)bp2;
                sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].iaddr;
+#ifdef HAVE_SOCKADDR_SA_LEN
                sin6->sin6_len = sizeof(struct sockaddr_in6);
+#endif
                sin6->sin6_family = AF_INET6;
                memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
                sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].raddr;
+#ifdef HAVE_SOCKADDR_SA_LEN
                sin6->sin6_len = sizeof(struct sockaddr_in6);
+#endif
                sin6->sin6_family = AF_INET6;
                memcpy(&sin6->sin6_addr, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
                break;
@@ -241,19 +257,23 @@ static int
 cookie_sidecheck(int i, const u_char *bp2, int initiator)
 {
        struct sockaddr_storage ss;
+       struct sockaddr *sa;
        struct ip *ip;
        struct sockaddr_in *sin;
 #ifdef INET6
        struct ip6_hdr *ip6;
        struct sockaddr_in6 *sin6;
 #endif
+       int salen;
 
        memset(&ss, 0, sizeof(ss));
        ip = (struct ip *)bp2;
        switch (ip->ip_v) {
        case 4:
                sin = (struct sockaddr_in *)&ss;
+#ifdef HAVE_SOCKADDR_SA_LEN
                sin->sin_len = sizeof(struct sockaddr_in);
+#endif
                sin->sin_family = AF_INET;
                memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
                break;
@@ -261,7 +281,9 @@ cookie_sidecheck(int i, const u_char *bp2, int initiator)
        case 6:
                ip6 = (struct ip6_hdr *)bp2;
                sin6 = (struct sockaddr_in6 *)&ss;
+#ifdef HAVE_SOCKADDR_SA_LEN
                sin6->sin6_len = sizeof(struct sockaddr_in6);
+#endif
                sin6->sin6_family = AF_INET6;
                memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
                break;
@@ -270,19 +292,40 @@ cookie_sidecheck(int i, const u_char *bp2, int initiator)
                return 0;
        }
 
+       sa = (struct sockaddr *)&ss;
        if (initiator) {
-               if (ss.__ss_family != cookiecache[i].iaddr.__ss_family)
-                       return 0;
-               if (ss.__ss_len != cookiecache[i].iaddr.__ss_len)
+               if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].iaddr)->sa_family)
                        return 0;
-               if (memcmp(&ss, &cookiecache[i].iaddr, ss.__ss_len) == 0)
+#ifdef HAVE_SOCKADDR_SA_LEN
+               salen = sa->sa_len;
+#else
+#ifdef INET6
+               if (sa->sa_family == AF_INET6)
+                       salen = sizeof(struct sockaddr_in6);
+               else
+                       salen = sizeof(struct sockaddr);
+#else
+               salen = sizeof(struct sockaddr);
+#endif
+#endif
+               if (memcmp(&ss, &cookiecache[i].iaddr, salen) == 0)
                        return 1;
        } else {
-               if (ss.__ss_family != cookiecache[i].raddr.__ss_family)
-                       return 0;
-               if (ss.__ss_len != cookiecache[i].raddr.__ss_len)
+               if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].raddr)->sa_family)
                        return 0;
-               if (memcmp(&ss, &cookiecache[i].raddr, ss.__ss_len) == 0)
+#ifdef HAVE_SOCKADDR_SA_LEN
+               salen = sa->sa_len;
+#else
+#ifdef INET6
+               if (sa->sa_family == AF_INET6)
+                       salen = sizeof(struct sockaddr_in6);
+               else
+                       salen = sizeof(struct sockaddr);
+#else
+               salen = sizeof(struct sockaddr);
+#endif
+#endif
+               if (memcmp(&ss, &cookiecache[i].raddr, salen) == 0)
                        return 1;
        }
        return 0;
@@ -958,6 +1001,7 @@ isakmp_print(const u_char *bp, u_int length, const u_char *bp2)
        u_char np;
        int i;
        int phase;
+       int major, minor;
 
        base = (struct isakmp *)bp;
        ep = (u_char *)snapend;
@@ -968,8 +1012,13 @@ isakmp_print(const u_char *bp, u_int length, const u_char *bp2)
        }
 
        printf("isakmp");
-       if (vflag)
-               printf(" %d.%d", base->v_maj, base->v_min);
+       if (vflag) {
+               major = (base->vers & ISAKMP_VERS_MAJOR)
+                               >> ISAKMP_VERS_MAJOR_SHIFT;
+               minor = (base->vers & ISAKMP_VERS_MINOR)
+                               >> ISAKMP_VERS_MINOR_SHIFT;
+               printf(" %d.%d", major, minor);
+       }
 
        if (vflag) {
                printf(" msgid ");