master
c 58 lines 1.93 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "libnetdata/libnetdata.h"
4
5 SOCKET_PEERS socket_peers(int sock_fd) {
6 SOCKET_PEERS peers;
7
8 if(sock_fd < 0) {
9 strncpyz(peers.peer.ip, "not connected", sizeof(peers.peer.ip) - 1);
10 peers.peer.port = 0;
11
12 strncpyz(peers.local.ip, "not connected", sizeof(peers.local.ip) - 1);
13 peers.local.port = 0;
14
15 return peers;
16 }
17
18 struct sockaddr_storage addr;
19 socklen_t addr_len = sizeof(addr);
20
21 // Get peer info
22 if (getpeername(sock_fd, (struct sockaddr *)&addr, &addr_len) == 0) {
23 if (addr.ss_family == AF_INET) { // IPv4
24 struct sockaddr_in *s = (struct sockaddr_in *)&addr;
25 inet_ntop(AF_INET, &s->sin_addr, peers.peer.ip, sizeof(peers.peer.ip));
26 peers.peer.port = ntohs(s->sin_port);
27 }
28 else { // IPv6
29 struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
30 inet_ntop(AF_INET6, &s->sin6_addr, peers.peer.ip, sizeof(peers.peer.ip));
31 peers.peer.port = ntohs(s->sin6_port);
32 }
33 }
34 else {
35 strncpyz(peers.peer.ip, "unknown", sizeof(peers.peer.ip) - 1);
36 peers.peer.port = 0;
37 }
38
39 // Get local info
40 addr_len = sizeof(addr);
41 if (getsockname(sock_fd, (struct sockaddr *)&addr, &addr_len) == 0) {
42 if (addr.ss_family == AF_INET) { // IPv4
43 struct sockaddr_in *s = (struct sockaddr_in *) &addr;
44 inet_ntop(AF_INET, &s->sin_addr, peers.local.ip, sizeof(peers.local.ip));
45 peers.local.port = ntohs(s->sin_port);
46 } else { // IPv6
47 struct sockaddr_in6 *s = (struct sockaddr_in6 *) &addr;
48 inet_ntop(AF_INET6, &s->sin6_addr, peers.local.ip, sizeof(peers.local.ip));
49 peers.local.port = ntohs(s->sin6_port);
50 }
51 }
52 else {
53 strncpyz(peers.local.ip, "unknown", sizeof(peers.local.ip) - 1);
54 peers.local.port = 0;
55 }
56
57 return peers;
58 }