slstatus-leakedip-20230105-c919def.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
slstatus-leakedip-20230105-c919def.diff (3664B)
---
1 From 82914c53f777c3d69bb593a0108c6326f61a6d86 Mon Sep 17 00:00:00 2001
2 From: Matvey <mathway.home@gmail.com>
3 Date: Thu, 5 Jan 2023 03:34:23 +0300
4 Subject: [PATCH] added leaked_ip function - ip as seen by internet
5
6 ---
7 components/ip.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++--
8 config.def.h | 1 +
9 slstatus.h | 1 +
10 3 files changed, 80 insertions(+), 2 deletions(-)
11
12 diff --git a/components/ip.c b/components/ip.c
13 index 9476549..bed3003 100644
14 --- a/components/ip.c
15 +++ b/components/ip.c
16 @@ -1,4 +1,6 @@
17 /* See LICENSE file for copyright and license details. */
18 +#include <errno.h>
19 +#include <unistd.h>
20 #include <ifaddrs.h>
21 #include <netdb.h>
22 #include <stdio.h>
23 @@ -27,9 +29,9 @@ ip(const char *interface, unsigned short sa_family)
24 }
25
26 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
27 - if (!ifa->ifa_addr)
28 + if (!ifa->ifa_addr) {
29 continue;
30 -
31 + }
32 s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6),
33 host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
34 if (!strcmp(ifa->ifa_name, interface) &&
35 @@ -59,3 +61,77 @@ ipv6(const char *interface)
36 {
37 return ip(interface, AF_INET6);
38 }
39 +
40 +const char *
41 +leaked_ip(void)
42 +{
43 + static const char *check_domain = "ip-api.com";
44 + static const char *check_request =
45 + "GET /line/?fields=query,country HTTP/1.1\r\n"
46 + "Host: ip-api.com\r\n\r\n";
47 + static const char *bad_addr = "X.X.X.X(Unavailable)";
48 +
49 + struct addrinfo *ai;
50 + int remote_fd;
51 + char *p;
52 + int s, n;
53 + int gai_errno;
54 +
55 + if ((gai_errno = getaddrinfo(check_domain, "http", NULL, &ai)))
56 + {
57 + warn("Can't resolve domain %s: %s", check_domain, gai_strerror(gai_errno));
58 + return bad_addr;
59 + }
60 + if ((remote_fd = socket(ai->ai_family, ai->ai_socktype, 0)) == -1)
61 + {
62 + freeaddrinfo(ai);
63 + warn("socket:");
64 + return bad_addr;
65 + }
66 +
67 + if (connect(remote_fd, ai->ai_addr, ai->ai_addrlen) == -1)
68 + {
69 + freeaddrinfo(ai);
70 + close(remote_fd);
71 + warn("connect:", check_domain);
72 + return bad_addr;
73 + }
74 + freeaddrinfo(ai);
75 +
76 + // send request
77 + n = strlen(check_request);
78 + p = (char *) check_request;
79 + while (n)
80 + {
81 + s = write(remote_fd, p, n);
82 +
83 + if (s == -1)
84 + {
85 + if (errno == EINTR)
86 + continue;
87 + close(remote_fd);
88 + warn("write:");
89 + return bad_addr;
90 + }
91 + n -= s;
92 + p += s;
93 + }
94 +
95 + p = buf;
96 + n = sizeof(buf);
97 + s = read(remote_fd, p, n);
98 + close(remote_fd);
99 + p = strstr(buf, "\r\n\r\n");
100 + if (!p)
101 + {
102 + warn("Can't resolve %s: Bad response from server", check_domain);
103 + return bad_addr;
104 + }
105 + p += 4;
106 + sscanf(p, "%*s%s", buf);
107 + strcat(buf, "(");
108 + sscanf(p, "%s", buf+strlen(buf));
109 + strcat(buf, ")");
110 +
111 + return buf;
112 +}
113 diff --git a/config.def.h b/config.def.h
114 index d805331..75c282b 100644
115 --- a/config.def.h
116 +++ b/config.def.h
117 @@ -31,6 +31,7 @@ static const char unknown_str[] = "n/a";
118 * hostname hostname NULL
119 * ipv4 IPv4 address interface name (eth0)
120 * ipv6 IPv6 address interface name (eth0)
121 + * leaked_ip IP address leaked to Internet NULL
122 * kernel_release `uname -r` NULL
123 * keyboard_indicators caps/num lock indicators format string (c?n?)
124 * see keyboard_indicators.c
125 diff --git a/slstatus.h b/slstatus.h
126 index 8ef5874..6f67ccd 100644
127 --- a/slstatus.h
128 +++ b/slstatus.h
129 @@ -30,6 +30,7 @@ const char *hostname(const char *unused);
130 /* ip */
131 const char *ipv4(const char *interface);
132 const char *ipv6(const char *interface);
133 +const char *leaked_ip(void);
134
135 /* kernel_release */
136 const char *kernel_release(const char *unused);
137 --
138 2.35.1
139