From 515538434058cab972900f65ae203c226f1796bc Mon Sep 17 00:00:00 2001 From: hniksic Date: Fri, 10 Oct 2003 18:39:07 -0700 Subject: [PATCH] [svn] Look for and use socklen_t. --- aclocal.m4 | 33 ++++++++++++++++++++++++++++++++- configure.in | 4 +++- src/ChangeLog | 12 ++++++++++++ src/config.h.in | 3 +++ src/connect.c | 18 ++++++------------ src/ftp-basic.c | 6 +++--- src/host.c | 4 ++-- src/host.h | 2 +- 8 files changed, 62 insertions(+), 20 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 753ad2ab..3e3da839 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -74,7 +74,7 @@ case "x$am_cv_prog_cc_stdc" in esac ]) -AC_DEFUN(WGET_STRUCT_UTIMBUF, +AC_DEFUN([WGET_STRUCT_UTIMBUF], [AC_MSG_CHECKING([for struct utimbuf]) if test x"$ac_cv_header_utime_h" = xyes; then AC_EGREP_CPP([struct[ ]+utimbuf], @@ -87,6 +87,37 @@ else fi]) +dnl Check for socklen_t. The third argument of accept, getsockname, +dnl etc. is int * on some systems, but size_t * on others. POSIX +dnl finally standardized on socklen_t, but older systems don't have +dnl it. If socklen_t exists, we use it, else if accept() accepts +dnl size_t *, we use that, else we use int. + +AC_DEFUN([WGET_SOCKLEN_T], [ + AC_MSG_CHECKING(for socklen_t) + AC_TRY_COMPILE([ +#include +#include +socklen_t x; +], + [], [AC_MSG_RESULT(yes)], [ + AC_TRY_COMPILE([ +#include +#include +int accept (int, struct sockaddr *, size_t *); +], + [], [ + AC_MSG_RESULT(size_t) + AC_DEFINE(socklen_t, size_t) + ], [ + AC_MSG_RESULT(int) + AC_DEFINE(socklen_t, int) + ]) + ]) +]) + + + dnl ************************************************************ dnl START OF IPv6 AUTOCONFIGURATION SUPPORT MACROS dnl ************************************************************ diff --git a/configure.in b/configure.in index 3476f89e..8e46ff65 100644 --- a/configure.in +++ b/configure.in @@ -175,8 +175,10 @@ dnl AC_TYPE_SIGNAL dnl -dnl Check for struct utimbuf +dnl Call several of Wget's macros. +dnl WGET_STRUCT_UTIMBUF +WGET_SOCKLEN_T dnl dnl Checks for library functions. diff --git a/src/ChangeLog b/src/ChangeLog index a554f150..23b5dae1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2003-10-11 Hrvoje Niksic + + * ftp-basic.c (ftp_epsv): Use socklen_t * as the third argument to + getpeername. + + * config.h.in: Define socklen_t stub. + + * host.c (sockaddr_len): Return socklen_t. + + * connect.c (conaddr): Use socklen_t as the third argument to + accept, getsockname, and connect. + 2003-10-10 Hrvoje Niksic * recur.c (retrieve_tree): Don't descend into documents that are diff --git a/src/config.h.in b/src/config.h.in index b9fc24b8..eb811e3b 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -271,6 +271,9 @@ char *alloca (); /* Define if you want to enable the IPv6 support. */ #undef ENABLE_IPV6 +/* Define if you don't have socklen_t. */ +#undef socklen_t + /* First a gambit to see whether we're on Solaris. We'll need it below. */ #ifdef __sun diff --git a/src/connect.c b/src/connect.c index 96c7c319..2fc23235 100644 --- a/src/connect.c +++ b/src/connect.c @@ -98,7 +98,7 @@ resolve_bind_address (void) struct cwt_context { int fd; const struct sockaddr *addr; - int addrlen; + socklen_t addrlen; int result; }; @@ -114,7 +114,7 @@ connect_with_timeout_callback (void *arg) ETIMEDOUT. */ static int -connect_with_timeout (int fd, const struct sockaddr *addr, int addrlen, +connect_with_timeout (int fd, const struct sockaddr *addr, socklen_t addrlen, double timeout) { struct cwt_context ctx; @@ -327,10 +327,7 @@ bindport (unsigned short *port, int family) DEBUGP (("Master socket fd %d bound.\n", msock)); if (!*port) { - /* #### addrlen should be a 32-bit type, which int is not - guaranteed to be. Oh, and don't try to make it a size_t, - because that can be 64-bit. */ - int sa_len = sockaddr_len (); + socklen_t sa_len = sockaddr_len (); if (getsockname (msock, &srv.sa, &sa_len) < 0) { CLOSE (msock); @@ -392,7 +389,7 @@ select_fd (int fd, double maxtime, int writep) uerr_t acceptport (int *sock) { - int addrlen = sockaddr_len (); + socklen_t addrlen = sockaddr_len (); #ifdef HAVE_SELECT if (select_fd (msock, opt.connect_timeout, 0) <= 0) @@ -423,11 +420,8 @@ int conaddr (int fd, ip_address *ip) { wget_sockaddr mysrv; - - /* see bindport() for discussion of using `int' here. */ - int addrlen = sizeof (mysrv); - - if (getsockname (fd, &mysrv.sa, (int *)&addrlen) < 0) + socklen_t addrlen = sizeof (mysrv); + if (getsockname (fd, &mysrv.sa, &addrlen) < 0) return 0; switch (mysrv.sa.sa_family) diff --git a/src/ftp-basic.c b/src/ftp-basic.c index 0201b6d7..05f3f32e 100644 --- a/src/ftp-basic.c +++ b/src/ftp-basic.c @@ -420,9 +420,9 @@ ftp_epsv (struct rbuf *rbuf, ip_address *addr, unsigned short *port, /* Now we have the port but we need the IPv6 :-( */ { wget_sockaddr remote; - int len = sizeof (remote); - struct sockaddr_in *ipv4_sock = ( struct sockaddr_in *)&remote; - getpeername (RBUF_FD (rbuf), (struct sockaddr*)&remote, &len); + socklen_t addrlen = sizeof (remote); + struct sockaddr_in *ipv4_sock = (struct sockaddr_in *)&remote; + getpeername (RBUF_FD (rbuf), (struct sockaddr *)&remote, &addrlen); switch(remote.sa.sa_family) { case AF_INET6: diff --git a/src/host.c b/src/host.c index 601487ae..652edacf 100644 --- a/src/host.c +++ b/src/host.c @@ -419,9 +419,9 @@ wget_sockaddr_get_port (const wget_sockaddr *sa) * - Public IP-Family Information * * Output: - * int structure length for socket options + * socklen_t structure length for socket options */ -int +socklen_t sockaddr_len () { if (ip_default_family == AF_INET) diff --git a/src/host.h b/src/host.h index 3688bd8b..3b863aab 100644 --- a/src/host.h +++ b/src/host.h @@ -97,7 +97,7 @@ void wget_sockaddr_set_address PARAMS((wget_sockaddr *, int, void wget_sockaddr_set_port PARAMS((wget_sockaddr *, unsigned short)); void *wget_sockaddr_get_addr PARAMS((wget_sockaddr *)); unsigned short wget_sockaddr_get_port PARAMS((const wget_sockaddr *)); -int sockaddr_len PARAMS(()); +socklen_t sockaddr_len PARAMS(()); void map_ipv4_to_ip PARAMS((ip4_address *, ip_address *)); int map_ip_to_ipv4 PARAMS((ip_address *, ip4_address *)); -- 2.39.2