Handling SPDLOG_PREVENT_CHILD_FD in tcp_sink

Adding SOCK_CLOEXEC to socket

Fixing bug in sink_it_ (bytes_sent not added to buffer)
This commit is contained in:
dominicpoeschko 2020-02-10 17:52:54 +01:00 committed by GitHub
parent 9f24f4bc69
commit eef981e05f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -47,7 +47,7 @@ protected:
size_t bytes_sent = 0; size_t bytes_sent = 0;
while (bytes_sent < formatted.size()) while (bytes_sent < formatted.size())
{ {
auto write_result = ::write(sock_, formatted.data(), formatted.size() - bytes_sent); auto write_result = ::write(sock_, formatted.data() + bytes_sent, formatted.size() - bytes_sent);
if (write_result < 0) if (write_result < 0)
{ {
SPDLOG_THROW(spdlog::spdlog_ex("write(2) failed", errno)); SPDLOG_THROW(spdlog::spdlog_ex("write(2) failed", errno));
@ -88,7 +88,12 @@ private:
int last_errno = 0; int last_errno = 0;
for (auto *rp = addrinfo_result; rp != nullptr; rp = rp->ai_next) for (auto *rp = addrinfo_result; rp != nullptr; rp = rp->ai_next)
{ {
socket_rv = ::socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); #ifdef SPDLOG_PREVENT_CHILD_FD
int const flags = SOCK_CLOEXEC;
#else
int const flags = 0;
#endif
socket_rv = ::socket(rp->ai_family, rp->ai_socktype | flags, rp->ai_protocol);
if (socket_rv == -1) if (socket_rv == -1)
{ {
last_errno = errno; last_errno = errno;