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],
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 <sys/types.h>
+#include <sys/socket.h>
+socklen_t x;
+],
+ [], [AC_MSG_RESULT(yes)], [
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+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 ************************************************************
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.
+2003-10-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * 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 <hniksic@xemacs.org>
* recur.c (retrieve_tree): Don't descend into documents that are
/* 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
struct cwt_context {
int fd;
const struct sockaddr *addr;
- int addrlen;
+ socklen_t addrlen;
int result;
};
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;
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);
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)
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)
/* 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:
* - 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)
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 *));