commit 278575c
default
·
2023-03-08 03:28:20 +0000 UTC
parent 158bc12
Backport from xs.
2 files changed,
+35,
-1
+34,
-0
1@@ -7,6 +7,7 @@
2 int xs_socket_timeout(int s, double rto, double sto);
3 int xs_socket_server(const char *addr, int port);
4 FILE *xs_socket_accept(int rs);
5+xs_str *xs_socket_peername(int s);
6
7
8 #ifdef XS_IMPLEMENTATION
9@@ -14,6 +15,7 @@ FILE *xs_socket_accept(int rs);
10 #include <sys/socket.h>
11 #include <netdb.h>
12 #include <netinet/in.h>
13+#include <arpa/inet.h>
14
15
16 int xs_socket_timeout(int s, double rto, double sto)
17@@ -90,6 +92,38 @@ FILE *xs_socket_accept(int rs)
18 return cs == -1 ? NULL : fdopen(cs, "r+");
19 }
20
21+
22+xs_str *xs_socket_peername(int s)
23+/* returns the remote address as a string */
24+{
25+ xs_str *ip = NULL;
26+ struct sockaddr_storage addr;
27+ socklen_t slen = sizeof(addr);
28+
29+ if (getpeername(s, (struct sockaddr *)&addr, &slen) != -1) {
30+ char buf[1024];
31+ const char *p = NULL;
32+
33+ if (addr.ss_family == AF_INET) {
34+ struct sockaddr_in *sa = (struct sockaddr_in *)&addr;
35+
36+ p = inet_ntop(AF_INET, &sa->sin_addr, buf, sizeof(buf));
37+ }
38+ else
39+ if (addr.ss_family == AF_INET6) {
40+ struct sockaddr_in6 *sa = (struct sockaddr_in6 *)&addr;
41+
42+ p = inet_ntop(AF_INET6, &sa->sin6_addr, buf, sizeof(buf));
43+ }
44+
45+ if (p != NULL)
46+ ip = xs_str_new(p);
47+ }
48+
49+ return ip;
50+}
51+
52+
53 #endif /* XS_IMPLEMENTATION */
54
55 #endif /* _XS_SOCKET_H */
+1,
-1
1@@ -1 +1 @@
2-/* 576198d1ed0f3309a9d09cb674c7ce1bf5c12737 */
3+/* ee3466736d01d22d67ec800dbd4d3b0ccc4251b1 */