diff --git a/llarp/ev.cpp b/llarp/ev.cpp index 208c1e069..d046a9d60 100644 --- a/llarp/ev.cpp +++ b/llarp/ev.cpp @@ -111,11 +111,27 @@ llarp_ev_udp_sendto(struct llarp_udp_io *udp, const sockaddr *to, const void *buf, size_t sz) { auto ret = static_cast< llarp::ev_io * >(udp->impl)->sendto(to, buf, sz); +#ifndef _WIN32 if(ret == -1 && errno != 0) { +#else + if(ret == -1 && WSAGetLastError()) + { +#endif + +#ifndef _WIN32 llarp::LogWarn("sendto failed ", strerror(errno)); errno = 0; } +#else + char ebuf[1024]; + int err = WSAGetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, LANG_NEUTRAL, ebuf, + 1024, nullptr); + llarp::LogWarn("sendto failed: ", buf, ":", err); + WSASetLastError(0); + } +#endif return ret; } diff --git a/llarp/ev.hpp b/llarp/ev.hpp index cd9ee162d..98a44140b 100644 --- a/llarp/ev.hpp +++ b/llarp/ev.hpp @@ -248,17 +248,21 @@ namespace llarp return; } m_BlockingWriteQueue->pop_front(); - if(errno == EAGAIN || errno == EWOULDBLOCK) + int wsaerr = WSAGetLastError(); + int syserr = GetLastError(); + if(wsaerr == WSA_IO_PENDING || wsaerr == WSAEWOULDBLOCK + || syserr == 997 || syserr == 21) { - errno = 0; + SetLastError(0); + WSASetLastError(0); return; } } } } /// reset errno - errno = 0; SetLastError(0); + WSASetLastError(0); } std::unique_ptr< LossyWriteQueue_t > m_LossyWriteQueue; @@ -586,7 +590,15 @@ namespace llarp { if(_conn) { +#ifndef _WIN32 llarp::LogError("tcp_conn error: ", strerror(errno)); +#else + char ebuf[1024]; + int err = WSAGetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, LANG_NEUTRAL, + ebuf, 1024, nullptr); + llarp::LogError("tcp_conn error: ", ebuf); +#endif if(_conn->error) _conn->error(_conn); } @@ -632,7 +644,7 @@ namespace llarp struct llarp_ev_loop { byte_t readbuf[EV_READ_BUF_SZ] = {0}; - llarp_time_t _now = 0; + llarp_time_t _now = 0; virtual bool init() = 0; virtual int diff --git a/llarp/ev_win32.hpp b/llarp/ev_win32.hpp index 172a282c3..1dda401cb 100644 --- a/llarp/ev_win32.hpp +++ b/llarp/ev_win32.hpp @@ -65,17 +65,21 @@ namespace llarp llarp::LogDebug("connected immedidately"); connected(); } - else if(errno == EINPROGRESS) + else if(WSAGetLastError() == WSAEINPROGRESS) { // in progress llarp::LogDebug("connect in progress"); - errno = 0; + WSASetLastError(0); return; } else if(_conn->error) { // wtf? - llarp::LogError("error connecting ", strerror(errno)); + char ebuf[1024]; + int err = WSAGetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, LANG_NEUTRAL, + ebuf, 1024, nullptr); + llarp::LogError("error connecting: ", ebuf); _conn->error(_conn); } } @@ -86,7 +90,11 @@ namespace llarp int new_fd = ::accept(fd.socket, nullptr, nullptr); if(new_fd == -1) { - llarp::LogError("failed to accept on ", fd.socket, ":", strerror(errno)); + char ebuf[1024]; + int err = WSAGetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, LANG_NEUTRAL, + ebuf, 1024, nullptr); + llarp::LogError("failed to accept on ", fd.socket, ":", ebuf); return -1; } // build handler @@ -170,7 +178,11 @@ namespace llarp } if(tuntap_up(tunif) == -1) { - llarp::LogWarn("failed to put interface up: ", strerror(errno)); + char ebuf[1024]; + int err = GetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, LANG_NEUTRAL, + ebuf, 1024, nullptr); + llarp::LogWarn("failed to put interface up: ", ebuf); return false; } @@ -238,7 +250,11 @@ namespace llarp ssize_t sent = ::sendto(fd.socket, (char*)data, sz, 0, to, slen); if(sent == -1) { - llarp::LogWarn(strerror(errno)); + char ebuf[1024]; + int err = WSAGetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, LANG_NEUTRAL, + ebuf, 1024, nullptr); + llarp::LogWarn(ebuf); } return sent; } diff --git a/llarp/link/utp.cpp b/llarp/link/utp.cpp index 50fbf7972..ff4e4438c 100644 --- a/llarp/link/utp.cpp +++ b/llarp/link/utp.cpp @@ -330,12 +330,24 @@ namespace llarp static_cast< LinkLayer* >(utp_context_get_userdata(arg->context)); llarp::LogDebug("utp_sendto ", Addr(*arg->address), " ", arg->len, " bytes"); +#ifndef _WIN32 if(::sendto(l->m_udp.fd, (char*)arg->buf, arg->len, arg->flags, arg->address, arg->address_len) == -1 && errno) +#else + WSASetLastError(0); + if(::sendto(l->m_udp.fd, (char*)arg->buf, arg->len, arg->flags, + arg->address, arg->address_len) + == -1) +#endif { - llarp::LogError("sendto failed: ", strerror(errno)); + char buf[1024]; + int err = WSAGetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, err, LANG_NEUTRAL, + buf, 1024, nullptr); + llarp::LogError("sendto failed: ", buf); + llarp::LogInfo("flags: ", arg->flags); } return 0; }