rsync ipv6 patch merge?

SUMIKAWA Munechika sumikawa at ebina.hitachi.co.jp
Tue Dec 4 17:59:59 EST 2001


> Would it be sufficient for us to just read into a byte array large
> enough to hold all reasonable IPv6 encodings, and then cast it as
> appropriate?  I have not had a chance to follow this idea through yet.

I don't think at most 240 byte larger array has bad influence to
system.  Moreover all of sokcaddr_storage in rsync are auto-variable.

Here is new patch for rsync-current which including compatible
checking. Please try it in missing sockaddr_storage system.

Some systems may not have typedef u_int{8,32}_t.
I'm not sure whether we should use u_short/u_long instead of them.

Regards,

---
Munechika SUMIKAWA @ KAME Project

Index: config.h.in
===================================================================
RCS file: /cvsroot/rsync/config.h.in,v
retrieving revision 1.64
diff -u -r1.64 config.h.in
--- config.h.in	28 Nov 2001 03:12:20 -0000	1.64
+++ config.h.in	4 Dec 2001 06:56:15 -0000
@@ -8,6 +8,7 @@
 #undef HAVE_GETTIMEOFDAY_TZ
 #undef ENABLE_IPV6
 #undef HAVE_SOCKADDR_LEN
+#undef HAVE_SOCKADDR_STORAGE
 #undef HAVE_SOCKETPAIR
 
 /* Define to turn on debugging code that may slow normal operation */
Index: configure.in
===================================================================
RCS file: /cvsroot/rsync/configure.in,v
retrieving revision 1.112
diff -u -r1.112 configure.in
--- configure.in	2 Dec 2001 22:26:09 -0000	1.112
+++ configure.in	4 Dec 2001 06:56:21 -0000
@@ -284,6 +284,14 @@
 #include <sys/socket.h>
 ])
 
+AC_MSG_CHECKING(struct sockaddr_storage)
+AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/socket.h>],
+[struct sockaddr_storage x;],
+	AC_MSG_RESULT(yes)
+	AC_DEFINE(HAVE_SOCKADDR_STORAGE),
+	AC_MSG_RESULT(no))
+
 # if we can't find strcasecmp, look in -lresolv (for Unixware at least)
 #
 AC_CHECK_FUNCS(strcasecmp)
Index: socket.c
===================================================================
RCS file: /cvsroot/rsync/socket.c,v
retrieving revision 1.45
diff -u -r1.45 socket.c
--- socket.c	27 Nov 2001 06:01:05 -0000	1.45
+++ socket.c	4 Dec 2001 06:56:21 -0000
@@ -372,8 +372,8 @@
 	while (1) {
 		fd_set fds;
 		int fd;
-		struct sockaddr addr;
-		int in_addrlen = sizeof(addr);
+		struct sockaddr_storage addr;
+		int addrlen = sizeof(addr);
 
 		/* close log file before the potentially very long select so
 		   file can be trimmed by another process instead of growing
@@ -389,7 +389,7 @@
 
 		if(!FD_ISSET(s, &fds)) continue;
 
-		fd = accept(s,(struct sockaddr *)&addr,&in_addrlen);
+		fd = accept(s,(struct sockaddr *)&addr,&addrlen);
 
 		if (fd == -1) continue;
 
@@ -555,7 +555,7 @@
  **/
 char *client_addr(int fd)
 {
-	struct sockaddr ss;
+	struct sockaddr_storage ss;
 	int     length = sizeof(ss);
 	static char addr_buf[100];
 	static int initialised;
@@ -564,11 +564,11 @@
 
 	initialised = 1;
 
-	if (getpeername(fd, &ss, &length)) {
+	if (getpeername(fd, (struct sockaddr *)&ss, &length)) {
 		exit_cleanup(RERR_SOCKETIO);
 	}
 
-	getnameinfo(&ss, length,
+	getnameinfo((struct sockaddr *)&ss, length,
 		addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
 	return addr_buf;
 }
@@ -579,7 +579,7 @@
  **/
 char *client_name(int fd)
 {
-	struct sockaddr ss;
+	struct sockaddr_storage ss;
 	int     length = sizeof(ss);
 	static char name_buf[100];
 	static char port_buf[100];
@@ -602,7 +602,7 @@
 	}
 
 #ifdef INET6
-        if (ss.sa_family == AF_INET6 && 
+        if (ss.ss_family == AF_INET6 && 
 	    IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)&ss)->sin6_addr)) {
 		struct sockaddr_in6 sin6;
 		struct sockaddr_in *sin;
@@ -646,7 +646,7 @@
 
 	/* XXX sin6_flowinfo and other fields */
 	for (res = res0; res; res = res->ai_next) {
-		if (res->ai_family != ss.sa_family)
+		if (res->ai_family != ss.ss_family)
 			continue;
 		if (res->ai_addrlen != length)
 			continue;
Index: lib/addrinfo.h
===================================================================
RCS file: /cvsroot/rsync/lib/addrinfo.h,v
retrieving revision 1.6
diff -u -r1.6 addrinfo.h
--- lib/addrinfo.h	27 Nov 2001 03:46:03 -0000	1.6
+++ lib/addrinfo.h	4 Dec 2001 06:56:21 -0000
@@ -102,6 +102,18 @@
 	struct addrinfo *ai_next;	/* next structure in linked list */
 };
 
+#ifndef HAVE_SOCKADDR_STORAGE
+struct sockaddr_storage {
+#ifdef HAVE_SOCKADDR_LEN
+	u_int8_t	ss_len;		/* address length */
+	u_int8_t	ss_family;	/* address family */
+#else
+	u_int16_t	ss_family;
+#endif
+	u_int8_t fill[126];
+};
+#endif
+
 extern void freehostent(struct hostent *);
 extern char *gai_strerror(int);
 #endif /* AI_PASSIVE */




More information about the rsync mailing list