diff --git a/src/mzscheme/include/mzscheme.exp b/src/mzscheme/include/mzscheme.exp index c4cd213c65..18a4b38485 100644 --- a/src/mzscheme/include/mzscheme.exp +++ b/src/mzscheme/include/mzscheme.exp @@ -390,6 +390,7 @@ scheme_add_fd_eventmask scheme_security_check_file scheme_security_check_network scheme_get_host_address +scheme_getnameinfo scheme_get_port_file_descriptor scheme_get_port_socket scheme_set_type_printer diff --git a/src/mzscheme/include/mzscheme3m.exp b/src/mzscheme/include/mzscheme3m.exp index d8fd1f147e..5c050a2443 100644 --- a/src/mzscheme/include/mzscheme3m.exp +++ b/src/mzscheme/include/mzscheme3m.exp @@ -397,6 +397,7 @@ scheme_add_fd_eventmask scheme_security_check_file scheme_security_check_network scheme_get_host_address +scheme_getnameinfo scheme_get_port_file_descriptor scheme_get_port_socket scheme_set_type_printer diff --git a/src/mzscheme/include/mzwin.def b/src/mzscheme/include/mzwin.def index 4814cca35a..064b5d90ac 100644 --- a/src/mzscheme/include/mzwin.def +++ b/src/mzscheme/include/mzwin.def @@ -382,6 +382,7 @@ EXPORTS scheme_security_check_file scheme_security_check_network scheme_get_host_address + scheme_getnameinfo scheme_get_port_file_descriptor scheme_get_port_socket scheme_set_type_printer diff --git a/src/mzscheme/src/network.c b/src/mzscheme/src/network.c index bb2d50f623..1bc6074ac1 100644 --- a/src/mzscheme/src/network.c +++ b/src/mzscheme/src/network.c @@ -2229,6 +2229,27 @@ static Scheme_Object *tcp_listener_p(int argc, Scheme_Object *argv[]) : scheme_false); } +void scheme_getnameinfo(void *sa, int salen, + char *host, int hostlen, + char *serv, int servlen) +{ +#ifdef HAVE_GETADDRINFO + getnameinfo(sa, salen, host, hostlen, serv, servlen, + NI_NUMERICHOST | NI_NUMERICSERV); +#else + if (host) { + unsigned char *b; + b = (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr; + sprintf(host, "%d.%d.%d.%d", b[0], b[1], b[2], b[3]); + } + if (serv) { + int id; + id = ntohs(((struct sockaddr_in *)sa)->sin_port); + sprintf(serv, "%d", id); + } +#endif +} + static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[]) { #ifdef USE_TCP @@ -2280,16 +2301,14 @@ static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[]) } there_len = l; - getnameinfo((struct sockaddr *)here, here_len, - host_buf, sizeof(host_buf), - NULL, 0, - NI_NUMERICHOST | NI_NUMERICSERV); + scheme_getnameinfo((struct sockaddr *)here, here_len, + host_buf, sizeof(host_buf), + NULL, 0); result[0] = scheme_make_utf8_string(host_buf); - getnameinfo((struct sockaddr *)there, there_len, - host_buf, sizeof(host_buf), - NULL, 0, - NI_NUMERICHOST | NI_NUMERICSERV); + scheme_getnameinfo((struct sockaddr *)there, there_len, + host_buf, sizeof(host_buf), + NULL, 0); result[1] = scheme_make_utf8_string(host_buf); } # else @@ -3100,10 +3119,9 @@ static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, long start v[0] = scheme_make_integer(x); - getnameinfo((struct sockaddr *)src_addr, asize, - host_buf, sizeof(host_buf), - svc_buf, sizeof(svc_buf), - NI_NUMERICHOST | NI_NUMERICSERV); + scheme_getnameinfo((struct sockaddr *)src_addr, asize, + host_buf, sizeof(host_buf), + svc_buf, sizeof(svc_buf)); if (udp->previous_from_addr) { mzchar *s; diff --git a/src/mzscheme/src/schemef.h b/src/mzscheme/src/schemef.h index 167c81e757..46c0da57a7 100644 --- a/src/mzscheme/src/schemef.h +++ b/src/mzscheme/src/schemef.h @@ -778,6 +778,9 @@ 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_getnameinfo(void *sa, int salen, + char *host, int hostlen, + char *serv, int servlen); 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); diff --git a/src/mzscheme/src/schemex.h b/src/mzscheme/src/schemex.h index 2d4c459bbb..c41789430d 100644 --- a/src/mzscheme/src/schemex.h +++ b/src/mzscheme/src/schemex.h @@ -649,6 +649,9 @@ 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_getnameinfo)(void *sa, int salen, + char *host, int hostlen, + char *serv, int servlen); int (*scheme_get_port_file_descriptor)(Scheme_Object *p, long *_fd); int (*scheme_get_port_socket)(Scheme_Object *p, long *_s); void (*scheme_set_type_printer)(Scheme_Type stype, Scheme_Type_Printer printer); diff --git a/src/mzscheme/src/schemex.inc b/src/mzscheme/src/schemex.inc index 4d78287e37..678759840d 100644 --- a/src/mzscheme/src/schemex.inc +++ b/src/mzscheme/src/schemex.inc @@ -439,6 +439,7 @@ 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_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; scheme_extension_table->scheme_set_type_printer = scheme_set_type_printer; diff --git a/src/mzscheme/src/schemexm.h b/src/mzscheme/src/schemexm.h index 2fb151db92..f546fbf41a 100644 --- a/src/mzscheme/src/schemexm.h +++ b/src/mzscheme/src/schemexm.h @@ -439,6 +439,7 @@ #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_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) #define scheme_set_type_printer (scheme_extension_table->scheme_set_type_printer)