Systems that do not provide ss_family in sockaddr_storage do not compile.
This patch adds a configure test, and a new Makefile define along with
default settings for HPUX-11.00, Solaris-2.6 and others.
I've also added a configure test to set NO_SOCKADDR_STORAGE
appropriately, rather than relying on the default settings in
Makefile.
---
Makefile | 15 +++++++++++++++
config.mak.in | 1 +
configure.ac | 17 +++++++++++++++++
daemon.c | 31 ++++++++++++++++++++-----------
4 files changed, 53 insertions(+), 11 deletions(-)
Index: b/daemon.c
===================================================================
--- a/daemon.c
+++ b/daemon.c
@@ -591,19 +591,28 @@ static int execute(struct sockaddr *addr
static int addrcmp(const struct sockaddr_storage *s1,
const struct sockaddr_storage *s2)
{
- if (s1->ss_family != s2->ss_family)
- return s1->ss_family - s2->ss_family;
- if (s1->ss_family == AF_INET)
- return memcmp(&((struct sockaddr_in *)s1)->sin_addr,
- &((struct sockaddr_in *)s2)->sin_addr,
- sizeof(struct in_addr));
+#ifndef NO_SS_FAMILY_IN_SOCKADDR_X
+ sa_family_t family = s1->ss_family;
+ sa_family_t family2 = s2->ss_family;
+#else
+ sa_family_t family = ((struct sockaddr *)s1)->sa_family;
+ sa_family_t family2 = ((struct sockaddr *)s2)->sa_family;
+#endif
+
+ if (family != family2)
+ return family - family2;
+ if (family == AF_INET)
+ return memcmp(&((struct sockaddr_in *)s1)->sin_addr,
+ &((struct sockaddr_in *)s2)->sin_addr,
+ sizeof(struct in_addr));
#ifndef NO_IPV6
- if (s1->ss_family == AF_INET6)
- return memcmp(&((struct sockaddr_in6 *)s1)->sin6_addr,
- &((struct sockaddr_in6 *)s2)->sin6_addr,
- sizeof(struct in6_addr));
+ if (family == AF_INET6)
+ return memcmp(&((struct sockaddr_in6 *)s1)->sin6_addr,
+ &((struct sockaddr_in6 *)s2)->sin6_addr,
+ sizeof(struct in6_addr));
#endif
- return 0;
+
+ return 0;
}
static int max_connections = 32;
Index: b/Makefile
===================================================================
--- a/Makefile
+++ b/Makefile
@@ -122,6 +122,9 @@ all::
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
+# Define NO_SS_FAMILY_IN_SOCKADDR_X if your platform lacks ss_family
+# in sockaddr_storage, sockaddr_in and sockaddr_in6.
+#
# Define NO_ICONV if your libc does not properly support iconv.
#
# Define OLD_ICONV if your library has an old iconv(), where the second
@@ -700,6 +703,7 @@ ifeq ($(uname_S),OSF1)
BASIC_CFLAGS += -D_OSF_SOURCE
NO_STRTOULL = YesPlease
NO_NSEC = YesPlease
+ NO_SS_FAMILY_IN_SOCKADDR_X = YesPlease
endif
ifeq ($(uname_S),Linux)
NO_STRLCPY = YesPlease
@@ -777,6 +781,7 @@ ifeq ($(uname_S),SunOS)
NO_HSTRERROR = YesPlease
NO_IPV6 = YesPlease
NO_SOCKADDR_STORAGE = YesPlease
+ NO_SS_FAMILY_IN_SOCKADDR_X = YesPlease
NO_UNSETENV = YesPlease
NO_SETENV = YesPlease
NO_STRLCPY = YesPlease
@@ -788,6 +793,7 @@ ifeq ($(uname_S),SunOS)
NEEDS_RESOLV = YesPlease
NO_IPV6 = YesPlease
NO_SOCKADDR_STORAGE = YesPlease
+ NO_SS_FAMILY_IN_SOCKADDR_X = YesPlease
NO_UNSETENV = YesPlease
NO_SETENV = YesPlease
NO_STRLCPY = YesPlease
@@ -847,6 +853,9 @@ ifeq ($(uname_S),FreeBSD)
NO_UINTMAX_T = YesPlease
NO_STRTOUMAX = YesPlease
endif
+ ifeq ($(shell expr "$(uname_V).$(uname_R)" : '5\.[012]'),3)
+ NO_SS_FAMILY_IN_SOCKADDR_X = YesPlease
+ endif
endif
ifeq ($(uname_S),OpenBSD)
NO_STRCASESTR = YesPlease
@@ -895,6 +904,7 @@ ifeq ($(uname_S),IRIX)
NO_MEMMEM = YesPlease
NO_MKSTEMPS = YesPlease
NO_MKDTEMP = YesPlease
+ NO_SS_FAMILY_IN_SOCKADDR_X = YesPlease
# When compiled with the MIPSpro 7.4.4m compiler, and without pthreads
# (i.e. NO_PTHREADS is set), and _with_ MMAP (i.e. NO_MMAP is not set),
# git dies with a segmentation fault when trying to access the first
@@ -941,10 +951,12 @@ ifeq ($(uname_S),HP-UX)
NO_PREAD = YesPlease
NO_INET_NTOP = YesPlease
NO_INET_PTON = YesPlease
+ NO_SS_FAMILY_IN_SOCKADDR_X = YesPlease
endif
ifeq ($(uname_R),B.11.00)
NO_INET_NTOP = YesPlease
NO_INET_PTON = YesPlease
+ NO_SS_FAMILY_IN_SOCKADDR_X = YesPlease
endif
GIT_TEST_CMP = cmp
endif
@@ -1284,6 +1296,9 @@ else
BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6
endif
endif
+ifdef NO_SS_FAMILY_IN_SOCKADDR_X
+ BASIC_CFLAGS += -DNO_SS_FAMILY_IN_SOCKADDR_X
+endif
ifdef NO_INET_NTOP
LIB_OBJS += compat/inet_ntop.o
endif
Index: b/config.mak.in
===================================================================
--- a/config.mak.in
+++ b/config.mak.in
@@ -42,6 +42,7 @@ NO_D_INO_IN_DIRENT=@NO_D_INO_IN_DIRENT@
NO_D_TYPE_IN_DIRENT=@NO_D_TYPE_IN_DIRENT@
NO_SOCKADDR_STORAGE=@NO_SOCKADDR_STORAGE@
NO_IPV6=@NO_IPV6@
+NO_SS_FAMILY_IN_SOCKADDR_X=@NO_SS_FAMILY_IN_SOCKADDR_X@
NO_C99_FORMAT=@NO_C99_FORMAT@
NO_HSTRERROR=@NO_HSTRERROR@
NO_STRCASESTR=@NO_STRCASESTR@
Index: b/configure.ac
===================================================================
--- a/configure.ac
+++ b/configure.ac
@@ -656,6 +656,23 @@ AC_CHECK_TYPE([struct addrinfo],[
])
AC_SUBST(NO_IPV6)
#
+# Define NO_SS_FAMILY_IN_SOCKADDR_X if your platform lacks ss_family
+# in struct sockaddr_storage, sockaddr_in6 and sockaddr_in.
+save_CPPFLAGS="$CPPFLAGS"
+case $NO_SOCKADDR_STORAGE:$NO_IPV6 in
+YesPlease:YesPlease)
+ CPPFLAGS="-Dsockaddr_storage=sockaddr_in${CPPFLAGS+ $CPPFLAGS}" ;;
+YesPlease:)
+ CPPFLAGS="-Dsockaddr_storage=sockaddr_in6${CPPFLAGS+ $CPPFLAGS}" ;;
+esac
+AC_CHECK_MEMBER(struct sockaddr_storage.ss_family,
+[NO_SS_FAMILY_IN_SOCKADDR_X=],
+[NO_SS_FAMILY_IN_SOCKADDR_X=YesPlease],[
+#include <sys/types.h>
+#include <sys/socket.h>
+])
+AC_SUBST(NO_SS_FAMILY_IN_SOCKADDR_X)
+#
# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
# do not support the 'size specifiers' introduced by C99, namely ll, hh,
# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
--
Gary V. Vaughan (gary@thewrittenword.com)
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html