From 042121e05504cc7c0808c1ec5a9ea5b0f4a3b223 Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Sat, 15 Oct 2005 01:55:18 +0000 Subject: [PATCH] Use socklen_t for socket calls whenever it is available and appropriate. This fixes some type problems on systems (recent linux) where int wasn't quite right. If HAVE_SOCKLEN_T isn't defined, then revert to int. This is a short-term fix, local to socket.c, and will be addressed more generally in the next major release. (ipv6_net_to_num): Change the argument type from "const char *" to "const unsigned char *" to match the sign of the s6_addr type. (ipv6_num_to_net): Change the argument type from "const char *" to "const unsigned char *" to match its usage. (s_scm_inet_pton): Use unsigned type when calling ipv6_net_to_num. (s_scm_inet_ntop): Use unsigned type when calling ipv6_net_to_num. (s_scm_getsockopt): Use scm_socklen_t rather than int. (s_scm_accept): Use socklen_t rather than int. (s_scm_getsockname): Use socklen_t rather than int. (s_scm_getpeername): Use socklen_t rather than int. (s_scm_recvfrom): Use socklen_t rather than int. --- libguile/socket.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/libguile/socket.c b/libguile/socket.c index f1732faaa..04dec0ae0 100644 --- a/libguile/socket.c +++ b/libguile/socket.c @@ -73,6 +73,12 @@ #include #endif +/* Temporary hack -- in the next major Guile release, this will be + handled more generally. */ +#ifndef HAVE_SOCKLEN_T +typedef int socklen_t; +#endif + #if defined (HAVE_UNIX_DOMAIN_SOCKETS) && !defined (SUN_LEN) #define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \ + strlen ((ptr)->sun_path)) @@ -278,12 +284,12 @@ SCM_DEFINE (scm_inet_makeaddr, "inet-makeaddr", 2, 0, 0, /* convert a 128 bit IPv6 address in network order to a host ordered SCM integer. */ -static SCM ipv6_net_to_num (const char *src) +static SCM ipv6_net_to_num (const unsigned char *src) { int big_digits = 128 / SCM_BITSPERDIG; const int bytes_per_dig = SCM_BITSPERDIG / 8; - char addr[16]; - char *ptr = addr; + unsigned char addr[16]; + unsigned char *ptr = addr; SCM result; memcpy (addr, src, 16); @@ -317,7 +323,7 @@ static SCM ipv6_net_to_num (const char *src) /* convert a host ordered SCM integer to a 128 bit IPv6 address in network order. */ -static void ipv6_num_to_net (SCM src, char *dst) +static void ipv6_num_to_net (SCM src, unsigned char *dst) { if (SCM_INUMP (src)) { @@ -364,7 +370,7 @@ SCM_DEFINE (scm_inet_pton, "inet-pton", 2, 0, 0, { int af; char *src; - char dst[16]; + unsigned char dst[16]; int rv; SCM_VALIDATE_INUM_COPY (1, family, af); @@ -378,7 +384,7 @@ SCM_DEFINE (scm_inet_pton, "inet-pton", 2, 0, 0, if (af == AF_INET) return scm_ulong2num (ntohl (*(uint32_t *) dst)); else - return ipv6_net_to_num ((char *) dst); + return ipv6_net_to_num (dst); } #undef FUNC_NAME #endif @@ -403,7 +409,7 @@ SCM_DEFINE (scm_inet_ntop, "inet-ntop", 2, 0, 0, #else char dst[46]; #endif - char addr6[16]; + unsigned char addr6[16]; SCM_VALIDATE_INUM_COPY (1, family, af); SCM_ASSERT_RANGE (1, family, af == AF_INET || af == AF_INET6); @@ -497,10 +503,10 @@ SCM_DEFINE (scm_getsockopt, "getsockopt", 3, 0, 0, /* size of optval is the largest supported option. */ #ifdef HAVE_STRUCT_LINGER char optval[sizeof (struct linger)]; - int optlen = sizeof (struct linger); + socklen_t optlen = sizeof (struct linger); #else char optval[sizeof (size_t)]; - int optlen = sizeof (size_t); + socklen_t optlen = sizeof (size_t); #endif int ilevel; int ioptname; @@ -1010,7 +1016,7 @@ SCM_DEFINE (scm_accept, "accept", 1, 0, 0, int newfd; SCM address; SCM newsock; - int addr_size = MAX_ADDR_SIZE; + socklen_t addr_size = MAX_ADDR_SIZE; char max_addr[MAX_ADDR_SIZE]; struct sockaddr *addr = (struct sockaddr *) max_addr; @@ -1034,7 +1040,7 @@ SCM_DEFINE (scm_getsockname, "getsockname", 1, 0, 0, #define FUNC_NAME s_scm_getsockname { int fd; - int addr_size = MAX_ADDR_SIZE; + socklen_t addr_size = MAX_ADDR_SIZE; char max_addr[MAX_ADDR_SIZE]; struct sockaddr *addr = (struct sockaddr *) max_addr; @@ -1056,7 +1062,7 @@ SCM_DEFINE (scm_getpeername, "getpeername", 1, 0, 0, #define FUNC_NAME s_scm_getpeername { int fd; - int addr_size = MAX_ADDR_SIZE; + socklen_t addr_size = MAX_ADDR_SIZE; char max_addr[MAX_ADDR_SIZE]; struct sockaddr *addr = (struct sockaddr *) max_addr; @@ -1170,7 +1176,7 @@ SCM_DEFINE (scm_recvfrom, "recvfrom!", 2, 3, 0, int offset; int cend; SCM address; - int addr_size = MAX_ADDR_SIZE; + socklen_t addr_size = MAX_ADDR_SIZE; char max_addr[MAX_ADDR_SIZE]; struct sockaddr *addr = (struct sockaddr *) max_addr;