Fix BSD socket binds
authorScott Cantor <cantor.2@osu.edu>
Thu, 3 May 2012 21:36:17 +0000 (21:36 +0000)
committerScott Cantor <cantor.2@osu.edu>
Thu, 3 May 2012 21:36:17 +0000 (21:36 +0000)
configure.ac
shibsp/remoting/impl/TCPListener.cpp

index 04487cc..c6e3922 100644 (file)
@@ -79,6 +79,8 @@ AC_CHECK_HEADERS([sys/utsname.h grp.h pwd.h])
 AC_CHECK_HEADERS([sys/socket.h], [AC_DEFINE([SHIBSP_HAVE_SYS_SOCKET_H],[1],[Define to 1 if you have the <sys/socket> header file.])], [])
 AC_CHECK_FUNCS([strchr strdup strstr timegm gmtime_r strtok_r strcasecmp getpwnam getgrnam])
 AC_CHECK_TYPES([struct sockaddr_storage], [], [], [[#include <sys/socket.h>]])
+AC_CHECK_MEMBERS([struct sockaddr.sa_len], [], [], [[#include <sys/socket.h>]])
+
 
 # checks for pthreads
 ACX_PTHREAD([enable_threads="pthread"],[enable_threads="no"])
index 0cd15fd..c498163 100644 (file)
@@ -206,7 +206,17 @@ bool TCPListener::bind(ShibSocket& s, bool force) const
         return false;
     }
 #else
+    // Newer BSDs require the struct length be passed based on the socket address.
+    // Others have no field for that and take the whole struct size like Windows does.
+# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+#  ifdef HAVE_STRUCT_SOCKADDR_STORAGE
+    if (::bind(s, (const struct sockaddr*)&m_sockaddr, m_sockaddr.ss_len) < 0) {
+#  else
+    if (::bind(s, (const struct sockaddr*)&m_sockaddr, m_sockaddr.sin_len) < 0) {
+#  endif
+# else
     if (::bind(s, (const struct sockaddr*)&m_sockaddr, sizeof(m_sockaddr)) < 0) {
+# endif
         log_error("bind");
         close(s);
         return false;