@@ -12,43 +12,51 @@ static constexpr auto null = JSONWriter::Null{};
1212static void ReportEndpoint (uv_handle_t * h,
1313 struct sockaddr * addr,
1414 const char * name,
15- JSONWriter* writer) {
15+ JSONWriter* writer,
16+ bool exclude_network) {
1617 if (addr == nullptr ) {
1718 writer->json_keyvalue (name, null);
1819 return ;
1920 }
2021
2122 uv_getnameinfo_t endpoint;
2223 char * host = nullptr ;
23- char hostbuf[INET6_ADDRSTRLEN];
2424 const int family = addr->sa_family ;
2525 const int port = ntohs (family == AF_INET ?
2626 reinterpret_cast <sockaddr_in*>(addr)->sin_port :
2727 reinterpret_cast <sockaddr_in6*>(addr)->sin6_port );
2828
29- if (uv_getnameinfo (h->loop , &endpoint, nullptr , addr, NI_NUMERICSERV) == 0 ) {
29+ writer->json_objectstart (name);
30+ if (!exclude_network &&
31+ uv_getnameinfo (h->loop , &endpoint, nullptr , addr, NI_NUMERICSERV) == 0 ) {
3032 host = endpoint.host ;
3133 DCHECK_EQ (port, std::stoi (endpoint.service ));
34+ writer->json_keyvalue (" host" , host);
35+ }
36+
37+ if (family == AF_INET) {
38+ char ipbuf[INET_ADDRSTRLEN];
39+ if (uv_ip4_name (
40+ reinterpret_cast <sockaddr_in*>(addr), ipbuf, sizeof (ipbuf)) == 0 ) {
41+ writer->json_keyvalue (" ip4" , ipbuf);
42+ if (host == nullptr ) writer->json_keyvalue (" host" , ipbuf);
43+ }
3244 } else {
33- const void * src = family == AF_INET ?
34- static_cast <void *>(
35- &(reinterpret_cast <sockaddr_in*>(addr)->sin_addr )) :
36- static_cast <void *>(
37- &(reinterpret_cast <sockaddr_in6*>(addr)->sin6_addr ));
38- if (uv_inet_ntop (family, src, hostbuf, sizeof (hostbuf)) == 0 ) {
39- host = hostbuf;
45+ char ipbuf[INET6_ADDRSTRLEN];
46+ if (uv_ip6_name (
47+ reinterpret_cast <sockaddr_in6*>(addr), ipbuf, sizeof (ipbuf)) == 0 ) {
48+ writer->json_keyvalue (" ip6" , ipbuf);
49+ if (host == nullptr ) writer->json_keyvalue (" host" , ipbuf);
4050 }
4151 }
42- writer->json_objectstart (name);
43- if (host != nullptr ) {
44- writer->json_keyvalue (" host" , host);
45- }
4652 writer->json_keyvalue (" port" , port);
4753 writer->json_objectend ();
4854}
4955
5056// Utility function to format libuv socket information.
51- static void ReportEndpoints (uv_handle_t * h, JSONWriter* writer) {
57+ static void ReportEndpoints (uv_handle_t * h,
58+ JSONWriter* writer,
59+ bool exclude_network) {
5260 struct sockaddr_storage addr_storage;
5361 struct sockaddr * addr = reinterpret_cast <sockaddr*>(&addr_storage);
5462 uv_any_handle* handle = reinterpret_cast <uv_any_handle*>(h);
@@ -65,7 +73,8 @@ static void ReportEndpoints(uv_handle_t* h, JSONWriter* writer) {
6573 default :
6674 break ;
6775 }
68- ReportEndpoint (h, rc == 0 ? addr : nullptr , " localEndpoint" , writer);
76+ ReportEndpoint (
77+ h, rc == 0 ? addr : nullptr , " localEndpoint" , writer, exclude_network);
6978
7079 switch (h->type ) {
7180 case UV_UDP:
@@ -77,7 +86,8 @@ static void ReportEndpoints(uv_handle_t* h, JSONWriter* writer) {
7786 default :
7887 break ;
7988 }
80- ReportEndpoint (h, rc == 0 ? addr : nullptr , " remoteEndpoint" , writer);
89+ ReportEndpoint (
90+ h, rc == 0 ? addr : nullptr , " remoteEndpoint" , writer, exclude_network);
8191}
8292
8393// Utility function to format libuv pipe information.
@@ -155,7 +165,7 @@ static void ReportPath(uv_handle_t* h, JSONWriter* writer) {
155165}
156166
157167// Utility function to walk libuv handles.
158- void WalkHandle (uv_handle_t * h, void * arg) {
168+ void WalkHandle (uv_handle_t * h, void * arg, bool exclude_network = false ) {
159169 const char * type = uv_handle_type_name (h->type );
160170 JSONWriter* writer = static_cast <JSONWriter*>(arg);
161171 uv_any_handle* handle = reinterpret_cast <uv_any_handle*>(h);
@@ -177,7 +187,7 @@ void WalkHandle(uv_handle_t* h, void* arg) {
177187 break ;
178188 case UV_TCP:
179189 case UV_UDP:
180- ReportEndpoints (h, writer);
190+ ReportEndpoints (h, writer, exclude_network );
181191 break ;
182192 case UV_NAMED_PIPE:
183193 ReportPipeEndpoints (h, writer);
@@ -267,6 +277,11 @@ void WalkHandle(uv_handle_t* h, void* arg) {
267277 }
268278 writer->json_end ();
269279}
270-
280+ void WalkHandleNetwork (uv_handle_t * h, void * arg) {
281+ WalkHandle (h, arg, false );
282+ }
283+ void WalkHandleNoNetwork (uv_handle_t * h, void * arg) {
284+ WalkHandle (h, arg, true );
285+ }
271286} // namespace report
272287} // namespace node
0 commit comments