sockaddr_storage is not defined, then supply our own definition that
will hopefully satisfy RFC2553 but also compile on all supported
platforms.
Thankyou to YOSHIFUJI Hideaki, SUMIKAWA Munechika and Jun-ichiro
"itojun" Hagino.
- * rsync.1 typo fix by Matt Kraai
+ * Correct string<->address parsing for both IPv4 and 6. Thankyou
+ to YOSHIFUJI Hideaki, SUMIKAWA Munechika and Jun-ichiro "itojun"
+ Hagino.
- * Fix for segfault in rsyncd.conf parser by Paul Mackerras
+ * rsync.1 typo fix by Matt Kraai.
- * Test suite typo fixes Tom Schmidt
+ * Fix for segfault in rsyncd.conf parser by Paul Mackerras.
+
+ * Test suite typo fixes Tom Schmidt.
#include <sys/socket.h>
])
#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)
# if we can't find strcasecmp, look in -lresolv (for Unixware at least)
#
AC_CHECK_FUNCS(strcasecmp)
+ /* Try to connect to all addresses for this machine until we get
+ * through. It might e.g. be multi-homed, or have both IPv4 and IPv6
+ * addresses. We need to create a socket for each record, since the
+ * address record tells us what protocol to use to try to connect. */
for (res = res0; res; res = res->ai_next) {
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (s < 0)
for (res = res0; res; res = res->ai_next) {
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (s < 0)
bhints.ai_flags = AI_PASSIVE;
error = getaddrinfo(bind_address, NULL, &bhints, &bres);
if (error) {
bhints.ai_flags = AI_PASSIVE;
error = getaddrinfo(bind_address, NULL, &bhints, &bres);
if (error) {
- rprintf(FERROR, RSYNC_NAME ": getaddrinfo: bind address %s <noport>: %s\n",
+ rprintf(FERROR, RSYNC_NAME ": getaddrinfo: "
+ "bind address %s <noport>: %s\n",
bind_address, gai_strerror(error));
continue;
}
if (bres->ai_next) {
bind_address, gai_strerror(error));
continue;
}
if (bres->ai_next) {
- rprintf(FERROR, RSYNC_NAME ": getaddrinfo: bind address %s resolved to multiple hosts\n",
+ /* I'm not at all sure that this is the right
+ * response here... -- mbp */
+ rprintf(FERROR, RSYNC_NAME ": getaddrinfo: "
+ "bind address %s resolved to multiple hosts\n",
bind_address);
freeaddrinfo(bres);
continue;
bind_address);
freeaddrinfo(bres);
continue;
while (1) {
fd_set fds;
int fd;
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
/* close log file before the potentially very long select so
file can be trimmed by another process instead of growing
if(!FD_ISSET(s, &fds)) continue;
if(!FD_ISSET(s, &fds)) continue;
- fd = accept(s,(struct sockaddr *)&addr,&in_addrlen);
+ fd = accept(s,(struct sockaddr *)&addr,&addrlen);
**/
char *client_addr(int fd)
{
**/
char *client_addr(int fd)
{
+ struct sockaddr_storage ss;
int length = sizeof(ss);
static char addr_buf[100];
static int initialised;
int length = sizeof(ss);
static char addr_buf[100];
static int initialised;
- if (getpeername(fd, &ss, &length)) {
+ if (getpeername(fd, (struct sockaddr *)&ss, &length)) {
exit_cleanup(RERR_SOCKETIO);
}
exit_cleanup(RERR_SOCKETIO);
}
- getnameinfo(&ss, length,
+ getnameinfo((struct sockaddr *)&ss, length,
addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
return addr_buf;
}
addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
return addr_buf;
}
**/
char *client_name(int fd)
{
**/
char *client_name(int fd)
{
+ struct sockaddr_storage ss;
int length = sizeof(ss);
static char name_buf[100];
static char port_buf[100];
int length = sizeof(ss);
static char name_buf[100];
static char port_buf[100];
- 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;
IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)&ss)->sin6_addr)) {
struct sockaddr_in6 sin6;
struct sockaddr_in *sin;
/* XXX sin6_flowinfo and other fields */
for (res = res0; res; res = res->ai_next) {
/* 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;
continue;
if (res->ai_addrlen != length)
continue;