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 */