put mzscheme in charge of freeing getaddrinfo records that it creates

svn: r1848
This commit is contained in:
Matthew Flatt 2006-01-17 19:45:27 +00:00
parent b1442e74c4
commit 6bfe687783
9 changed files with 34 additions and 24 deletions

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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)