configure test for getaddrinfo, use gethostbyname when getaddrinfo is not available
svn: r1723
This commit is contained in:
parent
060f7c026c
commit
9d5323fb57
58
src/configure
vendored
58
src/configure
vendored
|
@ -8784,6 +8784,64 @@ rm -f conftest.err conftest.$ac_objext \
|
||||||
echo "$as_me:$LINENO: result: $have_codeset" >&5
|
echo "$as_me:$LINENO: result: $have_codeset" >&5
|
||||||
echo "${ECHO_T}$have_codeset" >&6
|
echo "${ECHO_T}$have_codeset" >&6
|
||||||
|
|
||||||
|
echo "$as_me:$LINENO: checking for getaddrinfo" >&5
|
||||||
|
echo $ECHO_N "checking for getaddrinfo... $ECHO_C" >&6
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
getaddrinfo(NULL, NULL, NULL, NULL);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||||
|
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||||
|
(eval $ac_link) 2>conftest.er1
|
||||||
|
ac_status=$?
|
||||||
|
grep -v '^ *+' conftest.er1 >conftest.err
|
||||||
|
rm -f conftest.er1
|
||||||
|
cat conftest.err >&5
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } &&
|
||||||
|
{ ac_try='test -z "$ac_c_werror_flag"
|
||||||
|
|| test ! -s conftest.err'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; } &&
|
||||||
|
{ ac_try='test -s conftest$ac_exeext'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; }; then
|
||||||
|
|
||||||
|
cat >>confdefs.h <<\_ACEOF
|
||||||
|
#define HAVE_GETADDRINFO 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
have_getaddrinfo=yes
|
||||||
|
else
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
have_getaddrinfo=no
|
||||||
|
fi
|
||||||
|
rm -f conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
echo "$as_me:$LINENO: result: $have_getaddrinfo" >&5
|
||||||
|
echo "${ECHO_T}$have_getaddrinfo" >&6
|
||||||
|
|
||||||
iconv_lib_flag=""
|
iconv_lib_flag=""
|
||||||
if test "${enable_iconv}" = "yes" ; then
|
if test "${enable_iconv}" = "yes" ; then
|
||||||
if test "${ac_cv_header_iconv_h+set}" = set; then
|
if test "${ac_cv_header_iconv_h+set}" = set; then
|
||||||
|
|
|
@ -565,6 +565,16 @@ AC_TRY_LINK([#include <langinfo.h>],
|
||||||
have_codeset=no)
|
have_codeset=no)
|
||||||
AC_MSG_RESULT($have_codeset)
|
AC_MSG_RESULT($have_codeset)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for getaddrinfo])
|
||||||
|
AC_TRY_LINK([#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netdb.h>],
|
||||||
|
[getaddrinfo(NULL, NULL, NULL, NULL);],
|
||||||
|
AC_DEFINE(HAVE_GETADDRINFO,1,[Have getaddrinfo])
|
||||||
|
have_getaddrinfo=yes,
|
||||||
|
have_getaddrinfo=no)
|
||||||
|
AC_MSG_RESULT($have_getaddrinfo)
|
||||||
|
|
||||||
iconv_lib_flag=""
|
iconv_lib_flag=""
|
||||||
if test "${enable_iconv}" = "yes" ; then
|
if test "${enable_iconv}" = "yes" ; then
|
||||||
AC_CHECK_HEADER(iconv.h, enable_iconv=yes, enable_iconv=no)
|
AC_CHECK_HEADER(iconv.h, enable_iconv=yes, enable_iconv=no)
|
||||||
|
|
|
@ -1563,6 +1563,24 @@ MZ_EXTERN Scheme_Object *scheme_register_parameter(Scheme_Prim *function, char *
|
||||||
|
|
||||||
#endif /* SCHEME_DIRECT_EMBEDDED */
|
#endif /* SCHEME_DIRECT_EMBEDDED */
|
||||||
|
|
||||||
|
/*========================================================================*/
|
||||||
|
/* addrinfo */
|
||||||
|
/*========================================================================*/
|
||||||
|
|
||||||
|
#ifdef HAVE_GETADDRINFO
|
||||||
|
# define mz_addrinfo addrinfo
|
||||||
|
#else
|
||||||
|
struct mz_addrinfo {
|
||||||
|
int ai_flags;
|
||||||
|
int ai_family;
|
||||||
|
int ai_socktype;
|
||||||
|
int ai_protocol;
|
||||||
|
size_t ai_addrlen;
|
||||||
|
struct sockaddr *ai_addr;
|
||||||
|
struct mz_addrinfo *ai_next;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
/* FFI functions */
|
/* FFI functions */
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
@ -1664,6 +1682,8 @@ extern Scheme_Extension_Table *scheme_extension_table;
|
||||||
# define MZ_FD_ISSET(n, p) FD_ISSET(n, p)
|
# define MZ_FD_ISSET(n, p) FD_ISSET(n, p)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*========================================================================*/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,3 +20,6 @@
|
||||||
|
|
||||||
/* whether nl_langinfo works */
|
/* whether nl_langinfo works */
|
||||||
#undef HAVE_CODESET
|
#undef HAVE_CODESET
|
||||||
|
|
||||||
|
/* whether getaddrinfo works */
|
||||||
|
#undef HAVE_GETADDRINFO
|
||||||
|
|
|
@ -452,6 +452,69 @@ static struct protoent *proto;
|
||||||
# define MZ_LPTHREAD_START_ROUTINE void *(*)(void *)
|
# define MZ_LPTHREAD_START_ROUTINE void *(*)(void *)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
/* mz_addrinfo is defined in scheme.h */
|
||||||
|
|
||||||
|
#ifdef HAVE_GETADDRINFO
|
||||||
|
# define mzAI_PASSIVE AI_PASSIVE
|
||||||
|
# define mz_getaddrinfo getaddrinfo
|
||||||
|
# define mz_freeaddrinfo freeaddrinfo
|
||||||
|
# define mz_gai_strerror gai_strerror
|
||||||
|
#else
|
||||||
|
# define mzAI_PASSIVE 0
|
||||||
|
static int mz_getaddrinfo(const char *nodename, const char *servname,
|
||||||
|
const struct mz_addrinfo *hints, struct mz_addrinfo **res)
|
||||||
|
{
|
||||||
|
struct hostent *h;
|
||||||
|
|
||||||
|
if (nodename)
|
||||||
|
h = gethostbyname(nodename);
|
||||||
|
else
|
||||||
|
h = NULL;
|
||||||
|
|
||||||
|
if (h || !nodename) {
|
||||||
|
struct mz_addrinfo *ai;
|
||||||
|
struct sockaddr_in *sa;
|
||||||
|
int j, id = 0;
|
||||||
|
|
||||||
|
ai = (struct mz_addrinfo *)malloc(sizeof(struct mz_addrinfo));
|
||||||
|
sa = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in));
|
||||||
|
ai->ai_addr = (struct sockaddr *)sa;
|
||||||
|
|
||||||
|
ai->ai_addrlen = sizeof(struct sockaddr_in);
|
||||||
|
if (servname) {
|
||||||
|
for (j = 0; servname[j]; j++) {
|
||||||
|
id = (id * 10) + (servname[j] - '0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ai->ai_family = MZ_PF_INET;
|
||||||
|
ai->ai_socktype = hints->ai_socktype;
|
||||||
|
ai->ai_protocol = hints->ai_protocol;
|
||||||
|
ai->ai_next = NULL;
|
||||||
|
|
||||||
|
sa->sin_family = (id ? AF_INET : AF_UNSPEC);
|
||||||
|
sa->sin_port = htons(id);
|
||||||
|
memset(&(sa->sin_addr), 0, sizeof(sa->sin_addr));
|
||||||
|
memset(&(sa->sin_zero), 0, sizeof(sa->sin_zero));
|
||||||
|
if (h)
|
||||||
|
memcpy(&sa->sin_addr, h->h_addr_list[0], h->h_length);
|
||||||
|
|
||||||
|
*res = ai;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return h_errno;
|
||||||
|
}
|
||||||
|
void mz_freeaddrinfo(struct mz_addrinfo *ai)
|
||||||
|
{
|
||||||
|
free(ai->ai_addr);
|
||||||
|
free(ai);
|
||||||
|
}
|
||||||
|
const char *mz_gai_strerror(int ecode)
|
||||||
|
{
|
||||||
|
return hstrerror(ecode);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static volatile int ghbn_lock;
|
static volatile int ghbn_lock;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -460,12 +523,12 @@ typedef struct {
|
||||||
# else
|
# else
|
||||||
int pin;
|
int pin;
|
||||||
# endif
|
# endif
|
||||||
struct addrinfo *result;
|
struct mz_addrinfo *result;
|
||||||
int err;
|
int err;
|
||||||
int done;
|
int done;
|
||||||
} GHBN_Rec;
|
} GHBN_Rec;
|
||||||
|
|
||||||
static struct addrinfo * volatile ghbn_result;
|
static struct mz_addrinfo * volatile ghbn_result;
|
||||||
static volatile int ghbn_err;
|
static volatile int ghbn_err;
|
||||||
|
|
||||||
/* For in-thread DNS: */
|
/* For in-thread DNS: */
|
||||||
|
@ -474,7 +537,7 @@ static volatile int ghbn_err;
|
||||||
|
|
||||||
static char ghbn_hostname[MZ_MAX_HOSTNAME_LEN];
|
static char ghbn_hostname[MZ_MAX_HOSTNAME_LEN];
|
||||||
static char ghbn_servname[MZ_MAX_SERVNAME_LEN];
|
static char ghbn_servname[MZ_MAX_SERVNAME_LEN];
|
||||||
static struct addrinfo ghbn_hints;
|
static struct mz_addrinfo ghbn_hints;
|
||||||
# ifdef USE_WINSOCK_TCP
|
# ifdef USE_WINSOCK_TCP
|
||||||
HANDLE ready_sema;
|
HANDLE ready_sema;
|
||||||
# else
|
# else
|
||||||
|
@ -488,14 +551,14 @@ START_XFORM_SKIP;
|
||||||
static long getaddrinfo_in_thread(void *data)
|
static long getaddrinfo_in_thread(void *data)
|
||||||
{
|
{
|
||||||
int ok;
|
int ok;
|
||||||
struct addrinfo *res, hints;
|
struct mz_addrinfo *res, hints;
|
||||||
char hn_copy[MZ_MAX_HOSTNAME_LEN], sn_copy[MZ_MAX_SERVNAME_LEN];
|
char hn_copy[MZ_MAX_HOSTNAME_LEN], sn_copy[MZ_MAX_SERVNAME_LEN];
|
||||||
# ifndef USE_WINSOCK_TCP
|
# ifndef USE_WINSOCK_TCP
|
||||||
int fd = ready_fd;
|
int fd = ready_fd;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (ghbn_result) {
|
if (ghbn_result) {
|
||||||
freeaddrinfo(ghbn_result);
|
mz_freeaddrinfo(ghbn_result);
|
||||||
ghbn_result = NULL;
|
ghbn_result = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,9 +572,9 @@ static long getaddrinfo_in_thread(void *data)
|
||||||
write(fd, "?", 1);
|
write(fd, "?", 1);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
ok = getaddrinfo(hn_copy[0] ? hn_copy : NULL,
|
ok = mz_getaddrinfo(hn_copy[0] ? hn_copy : NULL,
|
||||||
sn_copy[0] ? sn_copy : NULL,
|
sn_copy[0] ? sn_copy : NULL,
|
||||||
&hints, &res);
|
&hints, &res);
|
||||||
|
|
||||||
ghbn_result = res;
|
ghbn_result = res;
|
||||||
ghbn_err = ok;
|
ghbn_err = ok;
|
||||||
|
@ -595,7 +658,7 @@ static void ghbn_thread_need_wakeup(Scheme_Object *_rec, void *fds)
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int MZ_GETADDRINFO(const char *name, const char *svc, struct addrinfo *hints, struct addrinfo **res)
|
static int MZ_GETADDRINFO(const char *name, const char *svc, struct mz_addrinfo *hints, struct mz_addrinfo **res)
|
||||||
{
|
{
|
||||||
GHBN_Rec *rec;
|
GHBN_Rec *rec;
|
||||||
int ok;
|
int ok;
|
||||||
|
@ -603,7 +666,7 @@ static int MZ_GETADDRINFO(const char *name, const char *svc, struct addrinfo *hi
|
||||||
if ((name && ((strlen(name) >= MZ_MAX_HOSTNAME_LEN) || !name[0]))
|
if ((name && ((strlen(name) >= MZ_MAX_HOSTNAME_LEN) || !name[0]))
|
||||||
|| (svc && ((strlen(svc) >= MZ_MAX_SERVNAME_LEN) || !svc[0]))) {
|
|| (svc && ((strlen(svc) >= MZ_MAX_SERVNAME_LEN) || !svc[0]))) {
|
||||||
/* Give up on a separate thread. */
|
/* Give up on a separate thread. */
|
||||||
return getaddrinfo(name, svc, hints, res);
|
return mz_getaddrinfo(name, svc, hints, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
rec = MALLOC_ONE_ATOMIC(GHBN_Rec);
|
rec = MALLOC_ONE_ATOMIC(GHBN_Rec);
|
||||||
|
@ -690,17 +753,17 @@ static int MZ_GETADDRINFO(const char *name, const char *svc, struct addrinfo *hi
|
||||||
return rec->err;
|
return rec->err;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
# define MZ_GETADDRINFO getaddrinfo
|
# define MZ_GETADDRINFO mz_getaddrinfo
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_SOCKETS_TCP
|
#ifdef USE_SOCKETS_TCP
|
||||||
|
|
||||||
struct addrinfo *scheme_get_host_address(const char *address, int id, int *err,
|
struct mz_addrinfo *scheme_get_host_address(const char *address, int id, int *err,
|
||||||
int family, int passive, int tcp)
|
int family, int passive, int tcp)
|
||||||
{
|
{
|
||||||
char buf[32], *service;
|
char buf[32], *service;
|
||||||
int ok;
|
int ok;
|
||||||
GC_CAN_IGNORE struct addrinfo *r, hints;
|
GC_CAN_IGNORE struct mz_addrinfo *r, hints;
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
service = buf;
|
service = buf;
|
||||||
|
@ -713,10 +776,10 @@ struct addrinfo *scheme_get_host_address(const char *address, int id, int *err,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(struct addrinfo));
|
memset(&hints, 0, sizeof(struct mz_addrinfo));
|
||||||
hints.ai_family = ((family < 0) ? PF_UNSPEC : family);
|
hints.ai_family = ((family < 0) ? PF_UNSPEC : family);
|
||||||
if (passive) {
|
if (passive) {
|
||||||
hints.ai_flags |= AI_PASSIVE;
|
hints.ai_flags |= mzAI_PASSIVE;
|
||||||
}
|
}
|
||||||
if (tcp) {
|
if (tcp) {
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
@ -1517,15 +1580,15 @@ make_tcp_output_port(void *data, const char *name)
|
||||||
#ifdef USE_SOCKETS_TCP
|
#ifdef USE_SOCKETS_TCP
|
||||||
typedef struct Close_Socket_Data {
|
typedef struct Close_Socket_Data {
|
||||||
tcp_t s;
|
tcp_t s;
|
||||||
struct addrinfo *src_addr, *dest_addr;
|
struct mz_addrinfo *src_addr, *dest_addr;
|
||||||
} Close_Socket_Data;
|
} Close_Socket_Data;
|
||||||
|
|
||||||
static void closesocket_w_decrement(Close_Socket_Data *csd)
|
static void closesocket_w_decrement(Close_Socket_Data *csd)
|
||||||
{
|
{
|
||||||
closesocket(csd->s);
|
closesocket(csd->s);
|
||||||
if (csd->src_addr)
|
if (csd->src_addr)
|
||||||
freeaddrinfo(csd->src_addr);
|
mz_freeaddrinfo(csd->src_addr);
|
||||||
freeaddrinfo(csd->dest_addr);
|
mz_freeaddrinfo(csd->dest_addr);
|
||||||
--scheme_file_open_count;
|
--scheme_file_open_count;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1533,7 +1596,7 @@ static void closesocket_w_decrement(Close_Socket_Data *csd)
|
||||||
const char *scheme_hostname_error(int err)
|
const char *scheme_hostname_error(int err)
|
||||||
{
|
{
|
||||||
#ifdef USE_SOCKETS_TCP
|
#ifdef USE_SOCKETS_TCP
|
||||||
return gai_strerror(err);
|
return mz_gai_strerror(err);
|
||||||
#else
|
#else
|
||||||
return "?";
|
return "?";
|
||||||
#endif
|
#endif
|
||||||
|
@ -1546,7 +1609,7 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
||||||
int errpart = 0, errid = 0, nameerr = 0, no_local_spec;
|
int errpart = 0, errid = 0, nameerr = 0, no_local_spec;
|
||||||
Scheme_Object *bs, *src_bs;
|
Scheme_Object *bs, *src_bs;
|
||||||
#ifdef USE_SOCKETS_TCP
|
#ifdef USE_SOCKETS_TCP
|
||||||
GC_CAN_IGNORE struct addrinfo *tcp_connect_dest, *tcp_connect_src;
|
GC_CAN_IGNORE struct mz_addrinfo *tcp_connect_dest, *tcp_connect_src;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!SCHEME_CHAR_STRINGP(argv[0]))
|
if (!SCHEME_CHAR_STRINGP(argv[0]))
|
||||||
|
@ -1606,7 +1669,7 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
||||||
else
|
else
|
||||||
tcp_connect_src = scheme_get_host_address(src_address, src_id, &errid, -1, 1, 1);
|
tcp_connect_src = scheme_get_host_address(src_address, src_id, &errid, -1, 1, 1);
|
||||||
if (no_local_spec || tcp_connect_src) {
|
if (no_local_spec || tcp_connect_src) {
|
||||||
GC_CAN_IGNORE struct addrinfo *addr;
|
GC_CAN_IGNORE struct mz_addrinfo *addr;
|
||||||
for (addr = tcp_connect_dest; addr; addr = addr->ai_next) {
|
for (addr = tcp_connect_dest; addr; addr = addr->ai_next) {
|
||||||
tcp_t s;
|
tcp_t s;
|
||||||
s = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
|
s = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
|
||||||
|
@ -1687,8 +1750,8 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
||||||
Scheme_Tcp *tcp;
|
Scheme_Tcp *tcp;
|
||||||
|
|
||||||
if (tcp_connect_src)
|
if (tcp_connect_src)
|
||||||
freeaddrinfo(tcp_connect_src);
|
mz_freeaddrinfo(tcp_connect_src);
|
||||||
freeaddrinfo(tcp_connect_dest);
|
mz_freeaddrinfo(tcp_connect_dest);
|
||||||
|
|
||||||
tcp = make_tcp_port_data(s, 2);
|
tcp = make_tcp_port_data(s, 2);
|
||||||
|
|
||||||
|
@ -1714,14 +1777,14 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tcp_connect_src)
|
if (tcp_connect_src)
|
||||||
freeaddrinfo(tcp_connect_src);
|
mz_freeaddrinfo(tcp_connect_src);
|
||||||
} else {
|
} else {
|
||||||
errpart = 2;
|
errpart = 2;
|
||||||
nameerr = 1;
|
nameerr = 1;
|
||||||
errmsg = "; local host not found";
|
errmsg = "; local host not found";
|
||||||
}
|
}
|
||||||
if (tcp_connect_dest)
|
if (tcp_connect_dest)
|
||||||
freeaddrinfo(tcp_connect_dest);
|
mz_freeaddrinfo(tcp_connect_dest);
|
||||||
} else {
|
} else {
|
||||||
errpart = 1;
|
errpart = 1;
|
||||||
nameerr = 1;
|
nameerr = 1;
|
||||||
|
@ -1799,7 +1862,7 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
GC_CAN_IGNORE struct addrinfo *tcp_listen_addr, *addr;
|
GC_CAN_IGNORE struct mz_addrinfo *tcp_listen_addr, *addr;
|
||||||
int err, count = 0, pos = 0, i;
|
int err, count = 0, pos = 0, i;
|
||||||
listener_t *l = NULL;
|
listener_t *l = NULL;
|
||||||
#ifdef MZ_TCP_LISTEN_IPV6_ONLY_SOCKOPT
|
#ifdef MZ_TCP_LISTEN_IPV6_ONLY_SOCKOPT
|
||||||
|
@ -1856,7 +1919,7 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
||||||
if (any_v4 && !pos) {
|
if (any_v4 && !pos) {
|
||||||
/* Maybe we can make it work with just IPv4. Try again. */
|
/* Maybe we can make it work with just IPv4. Try again. */
|
||||||
no_ipv6 = 1;
|
no_ipv6 = 1;
|
||||||
freeaddrinfo(tcp_listen_addr);
|
mz_freeaddrinfo(tcp_listen_addr);
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1874,7 +1937,7 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
||||||
if (!pos) {
|
if (!pos) {
|
||||||
/* IPV6_V6ONLY doesn't work */
|
/* IPV6_V6ONLY doesn't work */
|
||||||
no_ipv6 = 1;
|
no_ipv6 = 1;
|
||||||
freeaddrinfo(tcp_listen_addr);
|
mz_freeaddrinfo(tcp_listen_addr);
|
||||||
goto retry;
|
goto retry;
|
||||||
} else {
|
} else {
|
||||||
errid = errno;
|
errid = errno;
|
||||||
|
@ -1921,7 +1984,7 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
||||||
REGISTER_SOCKET(s);
|
REGISTER_SOCKET(s);
|
||||||
|
|
||||||
if (pos == count) {
|
if (pos == count) {
|
||||||
freeaddrinfo(tcp_listen_addr);
|
mz_freeaddrinfo(tcp_listen_addr);
|
||||||
|
|
||||||
return (Scheme_Object *)l;
|
return (Scheme_Object *)l;
|
||||||
}
|
}
|
||||||
|
@ -1958,7 +2021,7 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
||||||
--scheme_file_open_count;
|
--scheme_file_open_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeaddrinfo(tcp_listen_addr);
|
mz_freeaddrinfo(tcp_listen_addr);
|
||||||
} else {
|
} else {
|
||||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||||
"tcp-listen: host not found: %s (%N)",
|
"tcp-listen: host not found: %s (%N)",
|
||||||
|
@ -2428,7 +2491,7 @@ static Scheme_Object *make_udp(int argc, Scheme_Object *argv[])
|
||||||
|
|
||||||
if (address || origid) {
|
if (address || origid) {
|
||||||
int err;
|
int err;
|
||||||
GC_CAN_IGNORE struct addrinfo *udp_bind_addr = NULL;
|
GC_CAN_IGNORE struct mz_addrinfo *udp_bind_addr = NULL;
|
||||||
if (!origid)
|
if (!origid)
|
||||||
origid = 1025;
|
origid = 1025;
|
||||||
id = origid;
|
id = origid;
|
||||||
|
@ -2442,7 +2505,7 @@ static Scheme_Object *make_udp(int argc, Scheme_Object *argv[])
|
||||||
s = socket(udp_bind_addr->ai_family,
|
s = socket(udp_bind_addr->ai_family,
|
||||||
udp_bind_addr->ai_socktype,
|
udp_bind_addr->ai_socktype,
|
||||||
udp_bind_addr->ai_protocol);
|
udp_bind_addr->ai_protocol);
|
||||||
freeaddrinfo(udp_bind_addr);
|
mz_freeaddrinfo(udp_bind_addr);
|
||||||
} else {
|
} else {
|
||||||
s = socket(MZ_PF_INET, SOCK_DGRAM, 0);
|
s = socket(MZ_PF_INET, SOCK_DGRAM, 0);
|
||||||
}
|
}
|
||||||
|
@ -2552,7 +2615,7 @@ static Scheme_Object *udp_bind_or_connect(const char *name, int argc, Scheme_Obj
|
||||||
Scheme_UDP *udp;
|
Scheme_UDP *udp;
|
||||||
char *address = "";
|
char *address = "";
|
||||||
unsigned short origid, id;
|
unsigned short origid, id;
|
||||||
GC_CAN_IGNORE struct addrinfo *udp_bind_addr;
|
GC_CAN_IGNORE struct mz_addrinfo *udp_bind_addr;
|
||||||
int errid, err;
|
int errid, err;
|
||||||
|
|
||||||
udp = (Scheme_UDP *)argv[0];
|
udp = (Scheme_UDP *)argv[0];
|
||||||
|
@ -2614,7 +2677,7 @@ static Scheme_Object *udp_bind_or_connect(const char *name, int argc, Scheme_Obj
|
||||||
if (do_bind) {
|
if (do_bind) {
|
||||||
if (!bind(udp->s, udp_bind_addr->ai_addr, udp_bind_addr->ai_addrlen)) {
|
if (!bind(udp->s, udp_bind_addr->ai_addr, udp_bind_addr->ai_addrlen)) {
|
||||||
udp->bound = 1;
|
udp->bound = 1;
|
||||||
freeaddrinfo(udp_bind_addr);
|
mz_freeaddrinfo(udp_bind_addr);
|
||||||
return scheme_void;
|
return scheme_void;
|
||||||
}
|
}
|
||||||
errid = SOCK_ERRNO();
|
errid = SOCK_ERRNO();
|
||||||
|
@ -2660,13 +2723,13 @@ static Scheme_Object *udp_bind_or_connect(const char *name, int argc, Scheme_Obj
|
||||||
else
|
else
|
||||||
udp->connected = 0;
|
udp->connected = 0;
|
||||||
if (udp_bind_addr)
|
if (udp_bind_addr)
|
||||||
freeaddrinfo(udp_bind_addr);
|
mz_freeaddrinfo(udp_bind_addr);
|
||||||
return scheme_void;
|
return scheme_void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (udp_bind_addr)
|
if (udp_bind_addr)
|
||||||
freeaddrinfo(udp_bind_addr);
|
mz_freeaddrinfo(udp_bind_addr);
|
||||||
|
|
||||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||||
"%s: can't %s to port: %d on address: %s (%E)",
|
"%s: can't %s to port: %d on address: %s (%E)",
|
||||||
|
@ -2819,7 +2882,7 @@ static Scheme_Object *udp_send_it(const char *name, int argc, Scheme_Object *arg
|
||||||
long start, end;
|
long start, end;
|
||||||
int delta, err;
|
int delta, err;
|
||||||
unsigned short origid, id;
|
unsigned short origid, id;
|
||||||
GC_CAN_IGNORE struct addrinfo *udp_dest_addr;
|
GC_CAN_IGNORE struct mz_addrinfo *udp_dest_addr;
|
||||||
|
|
||||||
udp = (Scheme_UDP *)argv[0];
|
udp = (Scheme_UDP *)argv[0];
|
||||||
#endif
|
#endif
|
||||||
|
@ -2874,7 +2937,7 @@ static Scheme_Object *udp_send_it(const char *name, int argc, Scheme_Object *arg
|
||||||
memcpy(s, udp_dest_addr->ai_addr, udp_dest_addr->ai_addrlen);
|
memcpy(s, udp_dest_addr->ai_addr, udp_dest_addr->ai_addrlen);
|
||||||
fill_evt->dest_addr = s;
|
fill_evt->dest_addr = s;
|
||||||
fill_evt->dest_addr_len = udp_dest_addr->ai_addrlen;
|
fill_evt->dest_addr_len = udp_dest_addr->ai_addrlen;
|
||||||
freeaddrinfo(udp_dest_addr);
|
mz_freeaddrinfo(udp_dest_addr);
|
||||||
}
|
}
|
||||||
return scheme_void;
|
return scheme_void;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2885,7 +2948,7 @@ static Scheme_Object *udp_send_it(const char *name, int argc, Scheme_Object *arg
|
||||||
(udp_dest_addr ? udp_dest_addr->ai_addrlen : 0),
|
(udp_dest_addr ? udp_dest_addr->ai_addrlen : 0),
|
||||||
can_block);
|
can_block);
|
||||||
if (udp_dest_addr)
|
if (udp_dest_addr)
|
||||||
freeaddrinfo(udp_dest_addr);
|
mz_freeaddrinfo(udp_dest_addr);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -776,8 +776,8 @@ MZ_EXTERN void scheme_add_fd_eventmask(void *fds, int mask);
|
||||||
MZ_EXTERN void scheme_security_check_file(const char *who, const char *filename, int guards);
|
MZ_EXTERN void scheme_security_check_file(const char *who, const char *filename, int guards);
|
||||||
MZ_EXTERN void scheme_security_check_network(const char *who, const char *host, int port, int client);
|
MZ_EXTERN void scheme_security_check_network(const char *who, const char *host, int port, int client);
|
||||||
|
|
||||||
MZ_EXTERN struct addrinfo *scheme_get_host_address(const char *address, int id, int *err,
|
MZ_EXTERN struct mz_addrinfo *scheme_get_host_address(const char *address, int id, int *err,
|
||||||
int family, int passive, int tcp);
|
int family, int passive, int tcp);
|
||||||
|
|
||||||
MZ_EXTERN int scheme_get_port_file_descriptor(Scheme_Object *p, long *_fd);
|
MZ_EXTERN int scheme_get_port_file_descriptor(Scheme_Object *p, long *_fd);
|
||||||
MZ_EXTERN int scheme_get_port_socket(Scheme_Object *p, long *_s);
|
MZ_EXTERN int scheme_get_port_socket(Scheme_Object *p, long *_s);
|
||||||
|
|
|
@ -647,8 +647,8 @@ void (*scheme_add_fd_handle)(void *h, void *fds, int repost);
|
||||||
void (*scheme_add_fd_eventmask)(void *fds, int mask);
|
void (*scheme_add_fd_eventmask)(void *fds, int mask);
|
||||||
void (*scheme_security_check_file)(const char *who, const char *filename, int guards);
|
void (*scheme_security_check_file)(const char *who, const char *filename, int guards);
|
||||||
void (*scheme_security_check_network)(const char *who, const char *host, int port, int client);
|
void (*scheme_security_check_network)(const char *who, const char *host, int port, int client);
|
||||||
struct addrinfo *(*scheme_get_host_address)(const char *address, int id, int *err,
|
struct mz_addrinfo *(*scheme_get_host_address)(const char *address, int id, int *err,
|
||||||
int family, int passive, int tcp);
|
int family, int passive, int tcp);
|
||||||
int (*scheme_get_port_file_descriptor)(Scheme_Object *p, long *_fd);
|
int (*scheme_get_port_file_descriptor)(Scheme_Object *p, long *_fd);
|
||||||
int (*scheme_get_port_socket)(Scheme_Object *p, long *_s);
|
int (*scheme_get_port_socket)(Scheme_Object *p, long *_s);
|
||||||
void (*scheme_set_type_printer)(Scheme_Type stype, Scheme_Type_Printer printer);
|
void (*scheme_set_type_printer)(Scheme_Type stype, Scheme_Type_Printer printer);
|
||||||
|
|
|
@ -24,3 +24,6 @@
|
||||||
|
|
||||||
/* whether nl_langinfo works */
|
/* whether nl_langinfo works */
|
||||||
#undef HAVE_CODESET
|
#undef HAVE_CODESET
|
||||||
|
|
||||||
|
/* whether getaddrinfo works */
|
||||||
|
#define HAVE_GETADDRINFO 1
|
||||||
|
|
|
@ -24,3 +24,6 @@
|
||||||
|
|
||||||
/* whether nl_langinfo works */
|
/* whether nl_langinfo works */
|
||||||
#undef HAVE_CODESET
|
#undef HAVE_CODESET
|
||||||
|
|
||||||
|
/* whether getaddrinfo works */
|
||||||
|
#define HAVE_GETADDRINFO 1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user