[sane-devel] [PATCH] backends 1.0.12 compile-error

Julien BLACHE jb@jblache.org
Tue, 03 Jun 2003 18:46:37 +0200


--=-=-=
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Erik Inge Bolsų <knan@mo.himolde.no> wrote:

> ... anyone feel like adding a configure check and a patch for this?
> Probably a certain libc or a certain distro has this problem.

Patch attached. Apply, run aclocal, autoconf, autoheader.

Maybe I should ask for cvs write access, someday :)

JB.

-- 
Julien BLACHE                                   <http://www.jblache.org> 
<jb@jblache.org> 


--=-=-=
Content-Disposition: attachment; filename=ss_family-check.diff
Content-Description: Check for ss_family or __ss_family

--- sane-backends-1.0.12.orig/acinclude.m4	2003-05-15 12:51:16.000000000 +0200
+++ sane-backends-1.0.12/acinclude.m4	2003-06-03 18:34:09.000000000 +0200
@@ -353,6 +353,7 @@
 
 #
 # Check for AF_INET6, determines whether or not to enable IPv6 support
+# Check for ss_family member in struct sockaddr_storage
 AC_DEFUN([SANE_CHECK_IPV6],
 [
   AC_MSG_CHECKING([whether to enable IPv6]) 
@@ -383,6 +384,38 @@
         ipv6=no
       ])
   fi
+
+  if test "$ipv6" != "no" ; then
+    AC_MSG_CHECKING([whether struct sockaddr_storage has an ss_family member])
+    AC_TRY_COMPILE([
+	#define INET6
+	#include <sys/types.h>
+	#include <sys/socket.h> ], [
+	/* test if the ss_family member exists in struct sockaddr_storage */
+	struct sockaddr_storage ss;
+	ss.ss_family = AF_INET;
+	exit (0);
+    ], [
+	AC_MSG_RESULT(yes)
+	AC_DEFINE([HAS_SS_FAMILY], 1, [Define to 1 if struct sockaddr_storage has an ss_family member])
+    ], [
+		AC_TRY_COMPILE([
+		#define INET6
+		#include <sys/types.h>
+		#include <sys/socket.h> ], [
+		/* test if the __ss_family member exists in struct sockaddr_storage */
+		struct sockaddr_storage ss;
+		ss.__ss_family = AF_INET;
+		exit (0);
+	  ], [
+		AC_MSG_RESULT([no, but __ss_family exists])
+		AC_DEFINE([HAS___SS_FAMILY], 1, [Define to 1 if struct sockaddr_storage has __ss_family instead of ss_family])
+	  ], [
+		AC_MSG_RESULT([no])
+		ipv6=no
+    	  ])
+    ])
+  fi	
 ])
 
 #
--- sane-backends-1.0.12.orig/frontend/saned.c	2003-05-12 18:34:03.000000000 +0200
+++ sane-backends-1.0.12/frontend/saned.c	2003-06-03 18:39:11.000000000 +0200
@@ -34,6 +34,14 @@
 
 #if defined(HAVE_GETADDRINFO) && defined (HAVE_GETNAMEINFO)
 # define SANED_USES_AF_INDEP
+# ifdef HAS_SS_FAMILY
+#  define SS_FAMILY(ss) ss.ss_family
+# elif defined(HAS___SS_FAMILY)
+#  define SS_FAMILY(ss) ss.__ss_family
+# else /* fallback to the old, IPv4-only code */
+#  undef SANED_USES_AF_INDEP
+#  undef ENABLE_IPV6
+# endif
 #else
 # undef ENABLE_IPV6
 #endif /* HAVE_GETADDRINFO && HAVE_GETNAMEINFO && HAVE_POLL */
@@ -556,7 +564,7 @@
 
   sin = (struct sockaddr_in *) &remote_address;
 
-  switch (remote_address.ss_family)
+  switch (SS_FAMILY(remote_address))
     {
       case AF_INET:
 	if (IN_LOOPBACK (ntohl (sin->sin_addr.s_addr)))
@@ -1022,7 +1030,7 @@
       return -1;
     }
 
-  fd = socket (ss.ss_family, SOCK_STREAM, 0);
+  fd = socket (SS_FAMILY(ss), SOCK_STREAM, 0);
   if (fd < 0)
     {
       DBG (DBG_ERR, "start_scan: failed to obtain data socket (%s)\n",
@@ -1031,7 +1039,7 @@
       return -1;
     }
 
-  switch (ss.ss_family)
+  switch (SS_FAMILY(ss))
     {
       case AF_INET:
 	sin = (struct sockaddr_in *) &ss;
@@ -1071,7 +1079,7 @@
       return -1;
     }
 
-  switch (ss.ss_family)
+  switch (SS_FAMILY(ss))
     {
       case AF_INET:
 	sin = (struct sockaddr_in *) &ss;

--=-=-=--