Make the prettyping output work with and without colors.
[liboping.git] / src / liboping.c
index 58b51d9..74122a8 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Object oriented C module to send ICMP and ICMPv6 `echo's.
- * Copyright (C) 2006-2010  Florian octo Forster <octo at verplant.org>
+ * Copyright (C) 2006-2011  Florian octo Forster <ff at octo.it>
  *
  * This library is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as published by the
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#ifdef __APPLE__
+#define __APPLE_USE_RFC_3542
+#endif
+
 #if HAVE_CONFIG_H
 # include <config.h>
 #endif
@@ -545,6 +549,7 @@ static int ping_receive_one (pingobj_t *obj, const pinghost_t *ph,
                                                sizeof (recv_qos));
                                dprintf ("TOSv6 = 0x%02"PRIx8";\n", recv_qos);
                        } else
+#ifdef IPV6_HOPLIMIT
                        if (cmsg->cmsg_type == IPV6_HOPLIMIT)
                        {
                                memcpy (&recv_ttl, CMSG_DATA (cmsg),
@@ -552,6 +557,25 @@ static int ping_receive_one (pingobj_t *obj, const pinghost_t *ph,
                                dprintf ("TTLv6 = %i;\n", recv_ttl);
                        }
                        else
+#endif
+#ifdef IPV6_UNICAST_HOPS
+                       if (cmsg->cmsg_type == IPV6_UNICAST_HOPS)
+                       {
+                               memcpy (&recv_ttl, CMSG_DATA (cmsg),
+                                               sizeof (recv_ttl));
+                               dprintf ("TTLv6 = %i;\n", recv_ttl);
+                       }
+                       else
+#endif
+#ifdef IPV6_MULTICAST_HOPS
+                       if (cmsg->cmsg_type == IPV6_MULTICAST_HOPS)
+                       {
+                               memcpy (&recv_ttl, CMSG_DATA (cmsg),
+                                               sizeof (recv_ttl));
+                               dprintf ("TTLv6 = %i;\n", recv_ttl);
+                       }
+                       else
+#endif
                        {
                                dprintf ("Not handling option %i.\n",
                                                cmsg->cmsg_type);
@@ -1429,7 +1453,7 @@ int ping_host_add (pingobj_t *obj, const char *host)
                        snprintf (errmsg, PING_ERRMSG_LEN, "Unknown `ai_family': %i", ai_ptr->ai_family);
                        errmsg[PING_ERRMSG_LEN - 1] = '\0';
 
-                       dprintf (errmsg);
+                       dprintf ("%s", errmsg);
                        ping_set_error (obj, "getaddrinfo", errmsg);
                        continue;
                }
@@ -1540,10 +1564,12 @@ int ping_host_add (pingobj_t *obj, const char *host)
                {
                        int opt;
 
+#ifdef IP_RECVTOS
                        /* Enable receiving the TOS field */
                        opt = 1;
                        setsockopt (ph->fd, IPPROTO_IP, IP_RECVTOS,
                                        &opt, sizeof (opt));
+#endif /* IP_RECVTOS */
 
                        /* Enable receiving the TTL field */
                        opt = 1;