Vitaly Lipatov : winsock: Add check for sin6_scope_id.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 20 14:18:21 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 40a6a74ac88902320bb3c15a52a6ea9b1994c45b
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=40a6a74ac88902320bb3c15a52a6ea9b1994c45b
Author: Vitaly Lipatov <lav at etersoft.ru>
Date: Mon Feb 20 15:33:09 2006 +0300
winsock: Add check for sin6_scope_id.
---
configure | 121 +++++++++++++++++++++++++++++++++++++++++++++++++
configure.ac | 9 ++++
dlls/winsock/socket.c | 38 +++++----------
include/config.h.in | 3 +
4 files changed, 145 insertions(+), 26 deletions(-)
diff --git a/configure b/configure
index 7ce6ed6..66335f0 100755
--- a/configure
+++ b/configure
@@ -18550,6 +18550,127 @@ _ACEOF
fi
+echo "$as_me:$LINENO: checking for struct sockaddr_in6.sin6_scope_id" >&5
+echo $ECHO_N "checking for struct sockaddr_in6.sin6_scope_id... $ECHO_C" >&6
+if test "${ac_cv_member_struct_sockaddr_in6_sin6_scope_id+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+int
+main ()
+{
+static struct sockaddr_in6 ac_aggr;
+if (ac_aggr.sin6_scope_id)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_sockaddr_in6_sin6_scope_id=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+int
+main ()
+{
+static struct sockaddr_in6 ac_aggr;
+if (sizeof ac_aggr.sin6_scope_id)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_sockaddr_in6_sin6_scope_id=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member_struct_sockaddr_in6_sin6_scope_id=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_in6_sin6_scope_id" >&5
+echo "${ECHO_T}$ac_cv_member_struct_sockaddr_in6_sin6_scope_id" >&6
+if test $ac_cv_member_struct_sockaddr_in6_sin6_scope_id = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1
+_ACEOF
+
+
+fi
+
+
echo "$as_me:$LINENO: checking for timezone variable" >&5
echo $ECHO_N "checking for timezone variable... $ECHO_C" >&6
if test "${ac_cv_have_timezone+set}" = set; then
diff --git a/configure.ac b/configure.ac
index 2f2fcd5..8fc5519 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1367,6 +1367,15 @@ AC_CHECK_MEMBERS([struct option.name],,,
dnl Check for stat.st_blocks
AC_CHECK_MEMBERS([struct stat.st_blocks])
+dnl Check for sin6_scope_id
+AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_scope_id],,,
+[#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif])
+
dnl Check for the external timezone variables timezone and daylight
AC_CACHE_CHECK([for timezone variable], ac_cv_have_timezone,
AC_TRY_LINK([#include <time.h>],[timezone;],
diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c
index ea730b8..a86249d 100644
--- a/dlls/winsock/socket.c
+++ b/dlls/winsock/socket.c
@@ -930,28 +930,20 @@ static struct sockaddr* ws_sockaddr_ws2u
case WS_AF_INET6: {
struct sockaddr_in6* uin6;
const struct WS_sockaddr_in6* win6 = (struct WS_sockaddr_in6*)wsaddr;
- const struct WS_sockaddr_in6_old* win6old = (struct WS_sockaddr_in6_old*)wsaddr;
/* Note: Windows has 2 versions of the sockaddr_in6 struct, one with
* scope_id, one without. Check:
* http://msdn.microsoft.com/library/en-us/winsock/winsock/sockaddr_2.asp
*/
- if (wsaddrlen==sizeof(struct WS_sockaddr_in6_old)) {
- *uaddrlen=sizeof(struct sockaddr_in6);
- uin6=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *uaddrlen);
- uin6->sin6_family = AF_INET6;
- uin6->sin6_port = win6old->sin6_port;
- uin6->sin6_flowinfo = win6old->sin6_flowinfo;
- memcpy(&uin6->sin6_addr,&win6old->sin6_addr,16); /* 16 bytes = 128 address bits */
- return (struct sockaddr*)uin6;
- }
- if (wsaddrlen>=sizeof(struct WS_sockaddr_in6)) {
+ if (wsaddrlen >= sizeof(struct WS_sockaddr_in6_old)) {
*uaddrlen=sizeof(struct sockaddr_in6);
uin6=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *uaddrlen);
uin6->sin6_family = AF_INET6;
uin6->sin6_port = win6->sin6_port;
uin6->sin6_flowinfo = win6->sin6_flowinfo;
- uin6->sin6_scope_id = win6->sin6_scope_id;
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ if (wsaddrlen >= sizeof(struct WS_sockaddr_in6)) uin6->sin6_scope_id = win6->sin6_scope_id;
+#endif
memcpy(&uin6->sin6_addr,&win6->sin6_addr,16); /* 16 bytes = 128 address bits */
return (struct sockaddr*)uin6;
}
@@ -1066,28 +1058,22 @@ static int ws_sockaddr_u2ws(const struct
#endif
case AF_INET6: {
const struct sockaddr_in6* uin6 = (struct sockaddr_in6*)uaddr;
- struct WS_sockaddr_in6* win6 = (struct WS_sockaddr_in6*)wsaddr;
struct WS_sockaddr_in6_old* win6old = (struct WS_sockaddr_in6_old*)wsaddr;
if (*wsaddrlen < sizeof(struct WS_sockaddr_in6_old))
return -1;
- if (*wsaddrlen == sizeof(struct WS_sockaddr_in6_old)) {
- win6old->sin6_family = WS_AF_INET6;
- win6old->sin6_port = uin6->sin6_port;
- win6old->sin6_flowinfo = uin6->sin6_flowinfo;
- memcpy(&win6old->sin6_addr,&uin6->sin6_addr,16); /* 16 bytes = 128 address bits */
- *wsaddrlen = sizeof(struct WS_sockaddr_in6_old);
- return 0;
- }
+ win6old->sin6_family = WS_AF_INET6;
+ win6old->sin6_port = uin6->sin6_port;
+ win6old->sin6_flowinfo = uin6->sin6_flowinfo;
+ memcpy(&win6old->sin6_addr,&uin6->sin6_addr,16); /* 16 bytes = 128 address bits */
+ *wsaddrlen = sizeof(struct WS_sockaddr_in6_old);
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
if (*wsaddrlen >= sizeof(struct WS_sockaddr_in6)) {
- win6->sin6_family = WS_AF_INET6;
- win6->sin6_port = uin6->sin6_port;
- win6->sin6_flowinfo = uin6->sin6_flowinfo;
- memcpy(&win6->sin6_addr,&uin6->sin6_addr,16); /* 16 bytes = 128 address bits */
+ struct WS_sockaddr_in6* win6 = (struct WS_sockaddr_in6*)wsaddr;
win6->sin6_scope_id = uin6->sin6_scope_id;
*wsaddrlen = sizeof(struct WS_sockaddr_in6);
- return 0;
}
+#endif
return 0;
}
case AF_INET: {
diff --git a/include/config.h.in b/include/config.h.in
index ed6fc4c..c057314 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -629,6 +629,9 @@
/* Define to 1 if `name' is member of `struct option'. */
#undef HAVE_STRUCT_OPTION_NAME
+/* Define to 1 if `sin6_scope_id' is member of `struct sockaddr_in6'. */
+#undef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+
/* Define to 1 if `sa_len' is member of `struct sockaddr'. */
#undef HAVE_STRUCT_SOCKADDR_SA_LEN
More information about the wine-cvs
mailing list