/**
* 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
cmsg != NULL;
cmsg = CMSG_NXTHDR (&msghdr, cmsg))
{
+ if (cmsg->cmsg_level == SOL_SOCKET)
+ {
#ifdef SO_TIMESTAMP
- if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SO_TIMESTAMP)
- memcpy(&pkt_now, CMSG_DATA(cmsg), sizeof(pkt_now));
+ if (cmsg->cmsg_type == SO_TIMESTAMP)
+ memcpy (&pkt_now, CMSG_DATA (cmsg), sizeof (pkt_now));
#endif /* SO_TIMESTAMP */
-
- if (ph->addrfamily == AF_INET) /* {{{ */
+ }
+ else if (ph->addrfamily == AF_INET) /* {{{ */
{
if (cmsg->cmsg_level != IPPROTO_IP)
continue;
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;
}
{
#if WITH_DEBUG
char errbuf[PING_ERRMSG_LEN];
- dprintf ("setsockopt: %s\n",
+ dprintf ("setsockopt (SO_BINDTODEVICE): %s\n",
sstrerror (errno, errbuf, sizeof (errbuf)));
#endif
ping_set_errno (obj, errno);
}
#endif /* SO_BINDTODEVICE */
#ifdef SO_TIMESTAMP
- if (1)
+ if (1) /* {{{ */
{
- int c = 1;
- setsockopt(ph->fd, SOL_SOCKET, SO_TIMESTAMP, &c, sizeof(c));
- }
+ int status;
+ int opt = 1;
+
+ status = setsockopt (ph->fd,
+ SOL_SOCKET, SO_TIMESTAMP,
+ &opt, sizeof (opt));
+ if (status != 0)
+ {
+#if WITH_DEBUG
+ char errbuf[PING_ERRMSG_LEN];
+ dprintf ("setsockopt (SO_TIMESTAMP): %s\n",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+#endif
+ ping_set_errno (obj, errno);
+ close (ph->fd);
+ ph->fd = -1;
+ continue;
+ }
+ } /* }}} if (1) */
#endif /* SO_TIMESTAMP */
assert (sizeof (struct sockaddr_storage) >= ai_ptr->ai_addrlen);
memset (ph->addr, '\0', sizeof (struct sockaddr_storage));
{
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;