@@ -819,6 +819,31 @@ void proxy_freeaddrinfo(struct addrinfo *res) {
819819 free (res );
820820}
821821
822+ void proxy_getserverbyname (const char * service , struct servent * se_buf ,
823+ char * buf , size_t buf_len , struct servent * * se_result )
824+ {
825+
826+ #ifdef __linux__
827+ getservbyname_r (service , NULL , se_buf , buf , buf_len , se_result );
828+ #endif
829+
830+ #ifdef __APPLE__
831+ struct servent * se ;
832+ #ifdef THREAD_SAFE
833+ MUTEX_LOCK (& internal_getsrvbyname_lock );
834+ #endif
835+ if (service )
836+ se = getservbyname (service , NULL );
837+ if (!se )
838+ memcpy (se_buf , se , buf_len );
839+ * se_result = se_buf ;
840+ #ifdef THREAD_SAFE
841+ MUTEX_UNLOCK (& internal_getsrvbyname_lock );
842+ #endif
843+
844+ #endif
845+ }
846+
822847
823848int proxy_getaddrinfo (const char * node , const char * service , const struct addrinfo * hints , struct addrinfo * * res ) {
824849 struct gethostbyname_data ghdata ;
@@ -833,7 +858,7 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin
833858// printf("proxy_getaddrinfo node %s service %s\n",node,service);
834859 space = calloc (1 , sizeof (struct addrinfo_data ));
835860 if (!space ) goto err1 ;
836-
861+
837862 if (node && !inet_aton (node , & ((struct sockaddr_in * ) & space -> sockaddr_space )-> sin_addr )) {
838863 hp = proxy_gethostbyname (node , & ghdata );
839864 if (hp )
@@ -842,14 +867,15 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin
842867 else
843868 goto err2 ;
844869 }
845- if (service ) getservbyname_r (service , NULL , & se_buf , buf , sizeof (buf ), & se );
870+ if (service )
871+ proxy_getserverbyname (service , & se_buf , buf , sizeof (buf ), & se );
846872
847873 port = se ? se -> s_port : htons (atoi (service ? service : "0" ));
848874 ((struct sockaddr_in * ) & space -> sockaddr_space )-> sin_port = port ;
849875
850876 * res = p = & space -> addrinfo_space ;
851877 assert ((size_t )p == (size_t ) space );
852-
878+
853879 p -> ai_addr = & space -> sockaddr_space ;
854880 if (node )
855881 strncpy (space -> addr_name , node , sizeof (space -> addr_name ));
@@ -865,7 +891,7 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin
865891 } else {
866892 p -> ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG );
867893 }
868-
894+
869895 goto out ;
870896 err2 :
871897 free (space );
0 commit comments