From 6bfe6877835ef1a6f1c605c5c2e3f936740a7b1a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 17 Jan 2006 19:45:27 +0000 Subject: [PATCH] put mzscheme in charge of freeing getaddrinfo records that it creates svn: r1848 --- collects/openssl/mzssl.c | 26 +++++--------------------- src/mzscheme/include/mzscheme.exp | 2 ++ src/mzscheme/include/mzscheme3m.exp | 2 ++ src/mzscheme/include/mzwin.def | 2 ++ src/mzscheme/src/network.c | 18 +++++++++++++++--- src/mzscheme/src/schemef.h | 2 ++ src/mzscheme/src/schemex.h | 2 ++ src/mzscheme/src/schemex.inc | 2 ++ src/mzscheme/src/schemexm.h | 2 ++ 9 files changed, 34 insertions(+), 24 deletions(-) diff --git a/collects/openssl/mzssl.c b/collects/openssl/mzssl.c index a73e70fb01..e8d290c8c7 100644 --- a/collects/openssl/mzssl.c +++ b/collects/openssl/mzssl.c @@ -33,22 +33,6 @@ # define mz_hstrerror(x) NULL #endif -/* stolen from $(PLTHOME}/src/mzscheme/src/network.c */ -#ifdef HAVE_GETADDRINFO -# define mz_freeaddrinfo freeaddrinfo -# define mz_gai_strerror gai_strerror -#else -void mz_freeaddrinfo(struct mz_addrinfo *ai) -{ - free(ai->ai_addr); - free(ai); -} -const char *mz_gai_strerror(int ecode) -{ - return hstrerror(ecode); -} -#endif - /* stolen from $(PLTHOME}/src/mzscheme/src/network.c */ /* For getting connection names: */ #define MZ_SOCK_NAME_MAX_LEN 256 @@ -1077,7 +1061,7 @@ static Scheme_Object *ssl_connect(int argc, Scheme_Object *argv[]) addr = scheme_get_host_address(address, nport, &err, -1, 0, 1); if (!addr) { sock = INVALID_SOCKET; - errstr = mz_gai_strerror(err); + errstr = scheme_host_address_strerror(err); err = 0; goto clean_up_and_die; } @@ -1095,7 +1079,7 @@ static Scheme_Object *ssl_connect(int argc, Scheme_Object *argv[]) #endif status = connect(sock, (struct sockaddr *)addr->ai_addr, addr->ai_addrlen); - mz_freeaddrinfo(addr); + scheme_free_host_address(addr); /* here's the complicated bit */ if (status) { @@ -1250,7 +1234,7 @@ ssl_listen(int argc, Scheme_Object *argv[]) l->mref = mref; } - mz_freeaddrinfo(tcp_listen_addr); + scheme_free_host_address(tcp_listen_addr); return (Scheme_Object *)l; } @@ -1259,9 +1243,9 @@ ssl_listen(int argc, Scheme_Object *argv[]) errid = SOCK_ERRNO(); closesocket(s); - mz_freeaddrinfo(tcp_listen_addr); + scheme_free_host_address(tcp_listen_addr); } else { - mz_freeaddrinfo(tcp_listen_addr); + scheme_free_host_address(tcp_listen_addr); errid = SOCK_ERRNO(); } } else { diff --git a/src/mzscheme/include/mzscheme.exp b/src/mzscheme/include/mzscheme.exp index 4c02b775dc..c9cb0b8ac8 100644 --- a/src/mzscheme/include/mzscheme.exp +++ b/src/mzscheme/include/mzscheme.exp @@ -391,6 +391,8 @@ scheme_add_fd_eventmask scheme_security_check_file scheme_security_check_network scheme_get_host_address +scheme_free_host_address +scheme_host_address_strerror scheme_getnameinfo scheme_get_port_file_descriptor scheme_get_port_socket diff --git a/src/mzscheme/include/mzscheme3m.exp b/src/mzscheme/include/mzscheme3m.exp index 2d54543e29..a298c39fc4 100644 --- a/src/mzscheme/include/mzscheme3m.exp +++ b/src/mzscheme/include/mzscheme3m.exp @@ -398,6 +398,8 @@ scheme_add_fd_eventmask scheme_security_check_file scheme_security_check_network scheme_get_host_address +scheme_free_host_address +scheme_host_address_strerror scheme_getnameinfo scheme_get_port_file_descriptor scheme_get_port_socket diff --git a/src/mzscheme/include/mzwin.def b/src/mzscheme/include/mzwin.def index 9ac7f0cf00..7775f6aa7a 100644 --- a/src/mzscheme/include/mzwin.def +++ b/src/mzscheme/include/mzwin.def @@ -383,6 +383,8 @@ EXPORTS scheme_security_check_file scheme_security_check_network scheme_get_host_address + scheme_free_host_address + scheme_host_address_strerror scheme_getnameinfo scheme_get_port_file_descriptor scheme_get_port_socket diff --git a/src/mzscheme/src/network.c b/src/mzscheme/src/network.c index d71fb93304..b7a6d79e37 100644 --- a/src/mzscheme/src/network.c +++ b/src/mzscheme/src/network.c @@ -802,6 +802,16 @@ struct mz_addrinfo *scheme_get_host_address(const char *address, int id, int *er else return NULL; } + +void scheme_free_host_address(struct mz_addrinfo *a) +{ + mz_freeaddrinfo(a); +} + +const char *scheme_host_address_strerror(int errnum) +{ + return mz_gai_strerror(errnum); +} #endif /******************************* WinSock ***********************************/ @@ -1607,10 +1617,12 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[]) { char * volatile address = "", * volatile src_address, * volatile errmsg = ""; unsigned short origid, id, src_origid, src_id; - int errpart = 0, errid = 0, nameerr = 0, no_local_spec; + int errpart = 0, errid = 0; + volatile int nameerr = 0, no_local_spec; Scheme_Object *bs, *src_bs; #ifdef USE_SOCKETS_TCP - GC_CAN_IGNORE struct mz_addrinfo *tcp_connect_dest, *tcp_connect_src; + GC_CAN_IGNORE struct mz_addrinfo *tcp_connect_dest; + GC_CAN_IGNORE struct mz_addrinfo * volatile tcp_connect_src; #endif if (!SCHEME_CHAR_STRINGP(argv[0])) @@ -1670,7 +1682,7 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[]) else tcp_connect_src = scheme_get_host_address(src_address, src_id, &errid, -1, 1, 1); if (no_local_spec || tcp_connect_src) { - GC_CAN_IGNORE struct mz_addrinfo *addr; + GC_CAN_IGNORE struct mz_addrinfo * volatile addr; for (addr = tcp_connect_dest; addr; addr = addr->ai_next) { tcp_t s; s = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); diff --git a/src/mzscheme/src/schemef.h b/src/mzscheme/src/schemef.h index 978a60e545..a327751856 100644 --- a/src/mzscheme/src/schemef.h +++ b/src/mzscheme/src/schemef.h @@ -780,6 +780,8 @@ MZ_EXTERN void scheme_security_check_network(const char *who, const char *host, MZ_EXTERN struct mz_addrinfo *scheme_get_host_address(const char *address, int id, int *err, int family, int passive, int tcp); +MZ_EXTERN void scheme_free_host_address(struct mz_addrinfo *a); +MZ_EXTERN const char *scheme_host_address_strerror(int errnum); MZ_EXTERN void scheme_getnameinfo(void *sa, int salen, char *host, int hostlen, char *serv, int servlen); diff --git a/src/mzscheme/src/schemex.h b/src/mzscheme/src/schemex.h index a8474c54fa..251db3a9ca 100644 --- a/src/mzscheme/src/schemex.h +++ b/src/mzscheme/src/schemex.h @@ -650,6 +650,8 @@ void (*scheme_security_check_file)(const char *who, const char *filename, int gu void (*scheme_security_check_network)(const char *who, const char *host, int port, int client); struct mz_addrinfo *(*scheme_get_host_address)(const char *address, int id, int *err, int family, int passive, int tcp); +void (*scheme_free_host_address)(struct mz_addrinfo *a); +const char *(*scheme_host_address_strerror)(int errnum); void (*scheme_getnameinfo)(void *sa, int salen, char *host, int hostlen, char *serv, int servlen); diff --git a/src/mzscheme/src/schemex.inc b/src/mzscheme/src/schemex.inc index 1f9794f519..c798fd85ed 100644 --- a/src/mzscheme/src/schemex.inc +++ b/src/mzscheme/src/schemex.inc @@ -440,6 +440,8 @@ scheme_extension_table->scheme_security_check_file = scheme_security_check_file; scheme_extension_table->scheme_security_check_network = scheme_security_check_network; scheme_extension_table->scheme_get_host_address = scheme_get_host_address; + scheme_extension_table->scheme_free_host_address = scheme_free_host_address; + scheme_extension_table->scheme_host_address_strerror = scheme_host_address_strerror; scheme_extension_table->scheme_getnameinfo = scheme_getnameinfo; scheme_extension_table->scheme_get_port_file_descriptor = scheme_get_port_file_descriptor; scheme_extension_table->scheme_get_port_socket = scheme_get_port_socket; diff --git a/src/mzscheme/src/schemexm.h b/src/mzscheme/src/schemexm.h index 74f41823d9..7225ee0f19 100644 --- a/src/mzscheme/src/schemexm.h +++ b/src/mzscheme/src/schemexm.h @@ -440,6 +440,8 @@ #define scheme_security_check_file (scheme_extension_table->scheme_security_check_file) #define scheme_security_check_network (scheme_extension_table->scheme_security_check_network) #define scheme_get_host_address (scheme_extension_table->scheme_get_host_address) +#define scheme_free_host_address (scheme_extension_table->scheme_free_host_address) +#define scheme_host_address_strerror (scheme_extension_table->scheme_host_address_strerror) #define scheme_getnameinfo (scheme_extension_table->scheme_getnameinfo) #define scheme_get_port_file_descriptor (scheme_extension_table->scheme_get_port_file_descriptor) #define scheme_get_port_socket (scheme_extension_table->scheme_get_port_socket)