@@ -344,7 +344,7 @@ std::vector<std::string> dns_lookup_impl_with_socket(const char *domain, int fam
344
344
temp = &packet[steps];
345
345
j = 0 ;
346
346
while (*temp != 0 ) {
347
- if ((uchar)(*temp) == 0xc0 ) {
347
+ if ((uchar) (*temp) == 0xc0 ) {
348
348
++temp;
349
349
temp = &packet[(uint8_t ) *temp];
350
350
} else {
@@ -373,7 +373,7 @@ std::vector<std::string> dns_lookup_impl_with_socket(const char *domain, int fam
373
373
temp = &packet[steps];
374
374
j = 0 ;
375
375
while (*temp != 0 ) {
376
- if ((uchar)(*temp) == 0xc0 ) {
376
+ if ((uchar) (*temp) == 0xc0 ) {
377
377
++temp;
378
378
temp = &packet[(uint8_t ) *temp];
379
379
} else {
@@ -767,36 +767,40 @@ int getaddrinfo(GetaddrinfoRequest *req) {
767
767
hints.ai_socktype = req->socktype ;
768
768
hints.ai_protocol = req->protocol ;
769
769
770
- int ret = ::getaddrinfo (req->hostname , req->service , &hints, &result);
770
+ int ret = ::getaddrinfo (req->hostname . c_str () , req->service . c_str () , &hints, &result);
771
771
if (ret != 0 ) {
772
772
req->error = ret;
773
773
return SW_ERR;
774
774
}
775
775
776
- void *buffer = req->result ;
777
776
int i = 0 ;
778
- for (ptr = result; ptr != nullptr ; ptr = ptr->ai_next ) {
777
+ for (ptr = result; ptr != nullptr ; ptr = ptr->ai_next , i++) {
778
+ }
779
+ req->count = SW_MIN (i, SW_DNS_HOST_BUFFER_SIZE);
780
+ req->results .resize (req->count );
781
+
782
+ for (ptr = result, i = 0 ; ptr != nullptr ; ptr = ptr->ai_next , i++) {
779
783
switch (ptr->ai_family ) {
780
784
case AF_INET:
781
- memcpy (( char *) buffer + (i * sizeof ( struct sockaddr_in )) , ptr->ai_addr , sizeof (struct sockaddr_in ));
785
+ memcpy (&req-> results [i] , ptr->ai_addr , sizeof (struct sockaddr_in ));
782
786
break ;
783
787
case AF_INET6:
784
- memcpy (( char *) buffer + (i * sizeof ( struct sockaddr_in6 )) , ptr->ai_addr , sizeof (struct sockaddr_in6 ));
788
+ memcpy (&req-> results [i] , ptr->ai_addr , sizeof (struct sockaddr_in6 ));
785
789
break ;
786
790
default :
787
791
swoole_warning (" unknown socket family[%d]" , ptr->ai_family );
788
792
break ;
789
793
}
790
- i++;
791
794
if (i == SW_DNS_HOST_BUFFER_SIZE) {
792
795
break ;
793
796
}
794
797
}
795
798
::freeaddrinfo (result);
796
799
req->error = 0 ;
797
- req-> count = i;
800
+
798
801
return SW_OK;
799
802
}
803
+ } // namespace network
800
804
801
805
void GetaddrinfoRequest::parse_result (std::vector<std::string> &retval) {
802
806
struct sockaddr_in *addr_v4;
@@ -805,18 +809,17 @@ void GetaddrinfoRequest::parse_result(std::vector<std::string> &retval) {
805
809
char tmp[INET6_ADDRSTRLEN];
806
810
const char *r;
807
811
808
- for (int i = 0 ; i < count; i++ ) {
812
+ for (auto &addr : results ) {
809
813
if (family == AF_INET) {
810
- addr_v4 = (struct sockaddr_in *) (( char *) result + (i * sizeof ( struct sockaddr_in ))) ;
814
+ addr_v4 = (struct sockaddr_in *) &addr ;
811
815
r = inet_ntop (AF_INET, (const void *) &addr_v4->sin_addr , tmp, sizeof (tmp));
812
816
} else {
813
- addr_v6 = (struct sockaddr_in6 *) (( char *) result + (i * sizeof ( struct sockaddr_in6 ))) ;
817
+ addr_v6 = (struct sockaddr_in6 *) &addr ;
814
818
r = inet_ntop (AF_INET6, (const void *) &addr_v6->sin6_addr , tmp, sizeof (tmp));
815
819
}
816
820
if (r) {
817
821
retval.push_back (tmp);
818
822
}
819
823
}
820
824
}
821
- } // namespace network
822
825
} // namespace swoole
0 commit comments