Module: check_mk
Branch: master
Commit: 8df43b7d6973a5c22cecca054c5d1bed81fb128b
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8df43b7d6973a5…
Author: Jukka Aro <ja(a)mathias-kettner.de>
Date: Tue Feb 27 10:06:29 2018 +0100
Win-agent: refactor IP address to string conversions
* Use C++ features instead of old C snprintf's.
* Pass params as references instead of pointers.
* Remove some duplicated code.
---
agents/windows/ListenSocket.cc | 44 +++++++++++++++++++---------------------
agents/windows/ListenSocket.h | 2 +-
agents/windows/build_version | 2 +-
agents/windows/check_mk_agent.cc | 2 +-
4 files changed, 24 insertions(+), 26 deletions(-)
diff --git a/agents/windows/ListenSocket.cc b/agents/windows/ListenSocket.cc
index e5eb5de..d7686b7 100644
--- a/agents/windows/ListenSocket.cc
+++ b/agents/windows/ListenSocket.cc
@@ -30,6 +30,7 @@
#include <numeric>
#include "Logger.h"
#include "WinApiAdaptor.h"
+#include "stringutil.h"
#include "win_error.h"
namespace {
@@ -179,29 +180,28 @@ sockaddr_storage ListenSocket::address(SOCKET connection) const {
}
std::string ListenSocket::readableIP(SOCKET connection) const {
- sockaddr_storage addr;
- int addrlen = sizeof(sockaddr_storage);
- _winapi.getpeername(connection, (sockaddr *)&addr, &addrlen);
- return readableIP(&addr);
+ return readableIP(address(connection));
}
-std::string ListenSocket::readableIP(const sockaddr_storage *addr) {
- char ip_hr[INET6_ADDRSTRLEN];
-
- if (addr->ss_family == AF_INET) {
- sockaddr_in *s = (sockaddr_in *)addr;
- u_char *ip = (u_char *)&s->sin_addr;
- snprintf(ip_hr, INET6_ADDRSTRLEN, "%u.%u.%u.%u", ip[0], ip[1], ip[2],
- ip[3]);
- } else if (addr->ss_family == AF_INET6) { // AF_INET6
- sockaddr_in6 *s = (sockaddr_in6 *)addr;
- uint16_t *ip = s->sin6_addr.u.Word;
- snprintf(ip_hr, INET6_ADDRSTRLEN, "%x:%x:%x:%x:%x:%x:%x:%x", ip[0],
- ip[1], ip[2], ip[3], ip[4], ip[5], ip[6], ip[7]);
- } else {
- snprintf(ip_hr, INET6_ADDRSTRLEN, "None");
+std::string ListenSocket::readableIP(const sockaddr_storage &addr) {
+ switch (addr.ss_family) {
+ case AF_INET: {
+ const auto &s = reinterpret_cast<const sockaddr_in &>(addr);
+ auto const *ip = reinterpret_cast<u_char const *>(&s.sin_addr);
+ std::array<unsigned short, 4> uints;
+ std::transform(ip, ip + 4, uints.begin(), [](u_char u) {
+ return static_cast<unsigned short>(u);
+ });
+ return join(uints.cbegin(), uints.cend(), ".");
+ }
+ case AF_INET6: {
+ const auto &s = reinterpret_cast<const sockaddr_in6 &>(addr);
+ uint16_t const *ip = s.sin6_addr.u.Word;
+ return join(ip, ip + 8, ":", std::ios::hex);
+ }
+ default:
+ return "None";
}
- return ip_hr;
}
SocketHandle ListenSocket::acceptConnection() const {
@@ -209,9 +209,7 @@ SocketHandle ListenSocket::acceptConnection() const {
fd_set fds;
FD_ZERO(&fds);
FD_SET(_socket.get(), &fds);
- struct timeval timeout{0};
- timeout.tv_sec = 0;
- timeout.tv_usec = 500000;
+ TIMEVAL timeout = {0, 500000};
// FIXME: every failed connect resets the timeout so technically this may
// never return
diff --git a/agents/windows/ListenSocket.h b/agents/windows/ListenSocket.h
index 17dfc49..584c6b5 100644
--- a/agents/windows/ListenSocket.h
+++ b/agents/windows/ListenSocket.h
@@ -55,7 +55,7 @@ public:
sockaddr_storage address(SOCKET connection) const;
std::string readableIP(SOCKET connection) const;
- static std::string readableIP(const sockaddr_storage *address);
+ static std::string readableIP(const sockaddr_storage &address);
private:
SOCKET init_listen_socket(int port);
diff --git a/agents/windows/build_version b/agents/windows/build_version
index e4bcd8c..b345efa 100644
--- a/agents/windows/build_version
+++ b/agents/windows/build_version
@@ -1 +1 @@
-3123
+3124
diff --git a/agents/windows/check_mk_agent.cc b/agents/windows/check_mk_agent.cc
index 86096bb..63699c9 100644
--- a/agents/windows/check_mk_agent.cc
+++ b/agents/windows/check_mk_agent.cc
@@ -648,7 +648,7 @@ DWORD WINAPI realtime_check_func(void *data_in) {
sockaddr_size = sizeof(sockaddr_in6);
}
}
- current_ip = ListenSocket::readableIP(¤t_address);
+ current_ip = ListenSocket::readableIP(current_address);
current_socket.reset(
s_winapi.socket(current_address.ss_family,