X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=client.cpp;h=04518c8c2f58a97e9afcd877b77c91863d319bcc;hp=3a2552172d6a924ad41d68db874edbf4f1db17b7;hb=ef7f588a9b7a63ba2153cd06ce5322db4453fa16;hpb=a0949bd6af9a604e7073354fc530353bbdb7871c diff --git a/client.cpp b/client.cpp index 3a25521..04518c8 100644 --- a/client.cpp +++ b/client.cpp @@ -1,9 +1,10 @@ #include #include -#include +#include #include #include "client.h" +#include "log.h" #include "markpool.h" #include "state.pb.h" #include "stream.h" @@ -29,12 +30,23 @@ Client::Client(int sock) socklen_t addr_len = sizeof(addr); if (getpeername(sock, reinterpret_cast(&addr), &addr_len) == -1) { - perror("getpeername"); + log_perror("getpeername"); remote_addr = ""; + return; + } + + char buf[INET6_ADDRSTRLEN]; + if (IN6_IS_ADDR_V4MAPPED(&addr.sin6_addr)) { + // IPv4 address, really. + if (inet_ntop(AF_INET, &addr.sin6_addr.s6_addr32[3], buf, sizeof(buf)) == NULL) { + log_perror("inet_ntop"); + remote_addr = ""; + } else { + remote_addr = buf; + } } else { - char buf[INET6_ADDRSTRLEN]; if (inet_ntop(addr.sin6_family, &addr.sin6_addr, buf, sizeof(buf)) == NULL) { - perror("inet_ntop"); + log_perror("inet_ntop"); remote_addr = ""; } else { remote_addr = buf; @@ -64,8 +76,9 @@ Client::Client(const ClientProto &serialized, Stream *stream) } if (setsockopt(sock, SOL_SOCKET, SO_MARK, &fwmark, sizeof(fwmark)) == -1) { if (fwmark != 0) { - perror("setsockopt(SO_MARK)"); + log_perror("setsockopt(SO_MARK)"); } + fwmark = 0; } } @@ -90,7 +103,13 @@ ClientProto Client::serialize() const ClientStats Client::get_stats() const { ClientStats stats; - stats.stream_id = stream_id; + if (stream_id.empty()) { + stats.stream_id = "-"; + } else { + stats.stream_id = stream_id; + } + stats.sock = sock; + stats.fwmark = fwmark; stats.remote_addr = remote_addr; stats.connect_time = connect_time; stats.bytes_sent = bytes_sent;