summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--infrastructure/m4/boxbackup_tests.m414
-rw-r--r--lib/server/TcpNice.cpp26
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, "