put mzscheme in charge of freeing getaddrinfo records that it creates
svn: r1848
This commit is contained in:
parent
b1442e74c4
commit
6bfe687783
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user