diff options
-rw-r--r-- | infrastructure/m4/boxbackup_tests.m4 | 14 | ||||
-rw-r--r-- | lib/server/TcpNice.cpp | 26 |
2 files changed, 33 insertions, 7 deletions
diff --git a/infrastructure/m4/boxbackup_tests.m4 b/infrastructure/m4/boxbackup_tests.m4 index dce061af..c745b4be 100644 --- a/infrastructure/m4/boxbackup_tests.m4 +++ b/infrastructure/m4/boxbackup_tests.m4 @@ -135,7 +135,8 @@ AC_CHECK_HEADERS([netinet/in.h netinet/tcp.h]) AC_CHECK_HEADERS([sys/file.h sys/param.h sys/socket.h sys/time.h sys/types.h sys/wait.h]) AC_CHECK_HEADERS([sys/uio.h sys/xattr.h]) AC_CHECK_HEADERS([bsd/unistd.h]) - +AC_CHECK_HEADERS([sys/socket.h], [have_sys_socket_h=yes]) +AC_CHECK_HEADERS([winsock2.h], [have_winsock2_h=yes]) AC_CHECK_HEADERS([execinfo.h], [have_execinfo_h=yes]) if test "$have_execinfo_h" = "yes"; then @@ -197,11 +198,20 @@ AC_CHECK_MEMBERS([struct tcp_info.tcpi_rtt],,, [[#include <netinet/tcp.h>]]) AC_CHECK_DECLS([INFTIM],,, [[#include <poll.h>]]) AC_CHECK_DECLS([SO_PEERCRED],,, [[#include <sys/socket.h>]]) -AC_CHECK_DECLS([SO_SNDBUF],,, [[#include <asm/socket.h>]]) AC_CHECK_DECLS([O_BINARY],,,) AC_CHECK_DECLS([SOL_TCP],,, [[#include <netinet/tcp.h>]]) AC_CHECK_DECLS([TCP_INFO],,, [[#include <netinet/tcp.h>]]) +if test -n "$have_sys_socket_h"; then + AC_CHECK_DECLS([SO_SNDBUF],,, [[#include <sys/socket.h>]]) +elif test -n "$have_winsock2_h"; then + AC_CHECK_DECLS([SO_SNDBUF],,, [[#include <winsock2.h>]]) +else + # unlikely to succeed, but defined HAVE_DECL_SO_SNDBUF to 0 instead + # of leaving it undefined, which makes cpp #ifdefs simpler. + AC_CHECK_DECLS([SO_SNDBUF]) +fi + # Solaris provides getpeerucred() instead of getpeereid() or SO_PEERCRED AC_CHECK_HEADERS([ucred.h]) AC_CHECK_FUNCS([getpeerucred]) diff --git a/lib/server/TcpNice.cpp b/lib/server/TcpNice.cpp index 7cd2df24..20619e49 100644 --- a/lib/server/TcpNice.cpp +++ b/lib/server/TcpNice.cpp @@ -20,6 +20,14 @@ # include <netinet/tcp.h> #endif +#ifdef HAVE_WINSOCK2_H +# include <winsock2.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif + #include "MemLeakFindOn.h" // -------------------------------------------------------------------------- @@ -130,16 +138,16 @@ NiceSocketStream::NiceSocketStream(std::auto_ptr<SocketStream> apSocket) // -------------------------------------------------------------------------- void NiceSocketStream::Write(const void *pBuffer, int NBytes) { -#ifdef HAVE_DECL_SO_SNDBUF +#if HAVE_DECL_SO_SNDBUF && HAVE_DECL_TCP_INFO if(mEnabled && mapTimer.get() && mapTimer->HasExpired()) { box_time_t newPeriodStart = GetCurrentBoxTime(); box_time_t elapsed = newPeriodStart - mPeriodStartTime; - struct tcp_info info; int socket = mapSocket->GetSocketHandle(); int rtt = 50; // WAG -# if defined HAVE_DECL_SOL_TCP && defined HAVE_DECL_TCP_INFO && defined HAVE_STRUCT_TCP_INFO_TCPI_RTT +# if HAVE_DECL_SOL_TCP && HAVE_DECL_TCP_INFO && HAVE_STRUCT_TCP_INFO_TCPI_RTT + struct tcp_info info; socklen_t optlen = sizeof(info); if(getsockopt(socket, SOL_TCP, TCP_INFO, &info, &optlen) == -1) { @@ -205,10 +213,18 @@ void NiceSocketStream::SetEnabled(bool enabled) if(!enabled) { StopTimer(); -#ifdef HAVE_DECL_SO_SNDBUF +#if HAVE_DECL_SO_SNDBUF int socket = mapSocket->GetSocketHandle(); int newWindow = 1<<17; - if(setsockopt(socket, SOL_SOCKET, SO_SNDBUF, &newWindow, + if(setsockopt(socket, SOL_SOCKET, SO_SNDBUF, +# ifdef WIN32 + // optval is a const char * on Windows, even + // though the argument is a boolean or integer, + // for reasons best known to Microsoft! + (const char *)&newWindow, +# else + &newWindow, +# endif sizeof(newWindow)) == -1) { BOX_LOG_SYS_WARNING("getsockopt(" << socket << ", SOL_SOCKET, " |