pkglibexec_PROGRAMS = b10-sockcreator
b10_sockcreator_SOURCES = sockcreator.cc sockcreator.h main.cc
-b10_sockcreator_LDADD = $(top_builddir)/src/lib/util/io/libutil_io.la
+b10_sockcreator_LDADD = $(top_builddir)/src/lib/util/io/libutil_io.la
+b10_sockcreator_LDADD += $(top_builddir)/src/lib/exceptions/libexceptions.la
#include "sockcreator.h"
#include <util/io/fd.h>
+#include <util/io/sockaddr_util.h>
#include <cerrno>
#include <cstring>
#include <netinet/in.h>
using namespace isc::util::io;
+using namespace isc::util::io::internal;
using namespace isc::socket_creator;
namespace {
sockaddr_in6 addr_in6;
switch (type[1]) { // The address family
- // The casting to apparently incompatible types by reinterpret_cast
- // is required by the C low-level interface.
+ // The casting to apparently incompatible types is required by the
+ // C low-level interface.
case '4':
- addr = reinterpret_cast<sockaddr*>(&addr_in);
+ addr = convertSockAddr(&addr_in);
addr_len = sizeof(addr_in);
memset(&addr_in, 0, sizeof(addr_in));
addr_in.sin_family = AF_INET;
break;
case '6':
- addr = reinterpret_cast<sockaddr*>(&addr_in6);
- addr_len = sizeof addr_in6;
+ addr = convertSockAddr(&addr_in6);
+ addr_len = sizeof(addr_in6);
memset(&addr_in6, 0, sizeof(addr_in6));
addr_in6.sin6_family = AF_INET6;
readMessage(input_fd, &addr_in6.sin6_port,
return (static_cast<const struct sockaddr*>(p));
}
+template <typename SAType>
+const SAType*
+convertSockAddr(const struct sockaddr* sa) {
+ const void* p = sa;
+ return (static_cast<const SAType*>(p));
+}
+
template <typename SAType>
struct sockaddr*
convertSockAddr(SAType* sa) {
return (static_cast<struct sockaddr*>(p));
}
+template <typename SAType>
+SAType*
+convertSockAddr(struct sockaddr* sa) {
+ void* p = sa;
+ return (static_cast<SAType*>(p));
+}
+
}
}
}