Skip to content

Commit 917b049

Browse files
committed
LocalIP: cache default route value
1 parent 4843ded commit 917b049

File tree

8 files changed

+64
-24
lines changed

8 files changed

+64
-24
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ set(LIBFASTFETCH_SRC
263263
src/common/jsonconfig.c
264264
src/common/library.c
265265
src/common/modules.c
266+
src/common/netif/netif.c
266267
src/common/option.c
267268
src/common/parsing.c
268269
src/common/printing.c

src/common/netif/netif.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include "netif.h"
2+
3+
#ifndef _WIN32
4+
#include <net/if.h>
5+
6+
bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1]);
7+
8+
const char* ffNetifGetDefaultRoute()
9+
{
10+
static char iface[IF_NAMESIZE + 1];
11+
12+
if (*(uint16_t*) iface == 0)
13+
{
14+
if (!ffNetifGetDefaultRouteImpl(iface))
15+
iface[1] = 1;
16+
}
17+
18+
return iface;
19+
}
20+
#else
21+
bool ffNetifGetDefaultRouteImpl(uint32_t* ifIndex);
22+
23+
uint32_t ffNetifGetDefaultRoute()
24+
{
25+
static uint32_t ifIndex = (uint32_t) -1;
26+
27+
if (ifIndex == (uint32_t) -1)
28+
{
29+
if (!ffNetifGetDefaultRouteImpl(&ifIndex))
30+
ifIndex = (uint32_t) -2;
31+
}
32+
33+
return ifIndex;
34+
}
35+
#endif

src/common/netif/netif.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "fastfetch.h"
44

55
#ifndef _WIN32
6-
bool ffNetifGetDefaultRoute(FFstrbuf* iface);
6+
const char* ffNetifGetDefaultRoute();
77
#else
8-
bool ffNetifGetDefaultRoute(uint32_t* ifIndex);
8+
uint32_t ffNetifGetDefaultRoute();
99
#endif

src/common/netif/netif_bsd.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "common/io/io.h"
44

5+
#include <net/if.h>
56
#include <net/if_dl.h>
67
#include <net/route.h>
78
#include <netinet/in.h>
@@ -38,9 +39,7 @@ get_rt_address(struct rt_msghdr *rtm, int desired)
3839
return NULL;
3940
}
4041

41-
42-
43-
bool ffNetifGetDefaultRoute(FFstrbuf* iface)
42+
bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1])
4443
{
4544
//https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104
4645

@@ -86,7 +85,9 @@ bool ffNetifGetDefaultRoute(FFstrbuf* iface)
8685
struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP);
8786
if (sdl)
8887
{
89-
ffStrbufSetNS(iface, sdl->sdl_nlen, sdl->sdl_data);
88+
assert(sdl->sdl_nlen <= IF_NAMESIZE);
89+
memcpy(iface, sdl->sdl_data, sdl->sdl_nlen);
90+
iface[sdl->sdl_nlen] = '\0';
9091
return true;
9192
}
9293
return false;

src/common/netif/netif_linux.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#include "netif.h"
22
#include "common/io/io.h"
33

4+
#include <net/if.h>
45
#include <stdio.h>
56

6-
bool ffNetifGetDefaultRoute(FFstrbuf* iface)
7+
#define FF_STR_INDIR(x) #x
8+
#define FF_STR(x) FF_STR_INDIR(x)
9+
10+
bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1])
711
{
812
FILE* FF_AUTO_CLOSE_FILE netRoute = fopen("/proc/net/route", "r");
913
if (!netRoute) return false;
@@ -14,11 +18,9 @@ bool ffNetifGetDefaultRoute(FFstrbuf* iface)
1418
funlockfile(netRoute);
1519
unsigned long long destination; //, gateway, flags, refCount, use, metric, mask, mtu,
1620

17-
char buf[16 /*IF_NAMESIZE*/ + 1];
18-
while (fscanf(netRoute, "%16s%llx%*[^\n]", buf, &destination) == 2)
21+
while (fscanf(netRoute, "%" FF_STR(IF_NAMESIZE) "s%llx%*[^\n]", iface, &destination) == 2)
1922
{
2023
if (destination != 0) continue;
21-
ffStrbufSetS(iface, buf);
2224
return true;
2325
}
2426
return false;

src/common/netif/netif_windows.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#include <iphlpapi.h>
55

6-
bool ffNetifGetDefaultRoute(uint32_t* ifIndex)
6+
bool ffNetifGetDefaultRouteImpl(uint32_t* ifIndex)
77
{
88
ULONG size = 0;
99
if (GetIpForwardTable(NULL, &size, TRUE) != ERROR_INSUFFICIENT_BUFFER)

src/detection/localip/localip_linux.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "localip.h"
22
#include "common/io/io.h"
33
#include "common/netif/netif.h"
4+
#include "util/stringUtils.h"
45

56
#include <string.h>
67
#include <ctype.h>
@@ -56,15 +57,15 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
5657
if(getifaddrs(&ifAddrStruct) < 0)
5758
return "getifaddrs(&ifAddrStruct) failed";
5859

59-
FF_STRBUF_AUTO_DESTROY defaultRouteIface = ffStrbufCreate();
60-
ffNetifGetDefaultRoute(&defaultRouteIface);
60+
const char* defaultRouteIface = ffNetifGetDefaultRoute();
6161

6262
for (struct ifaddrs* ifa = ifAddrStruct; ifa; ifa = ifa->ifa_next)
6363
{
6464
if (!ifa->ifa_addr || !(ifa->ifa_flags & IFF_RUNNING))
6565
continue;
6666

67-
if (options->defaultRouteOnly && !ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name))
67+
bool isDefaultRoute = ffStrEquals(defaultRouteIface, ifa->ifa_name);
68+
if (options->defaultRouteOnly && !isDefaultRoute)
6869
continue;
6970

7071
if ((ifa->ifa_flags & IFF_LOOPBACK) && !(options->showType & FF_LOCALIP_TYPE_LOOP_BIT))
@@ -81,7 +82,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
8182
struct sockaddr_in* ipv4 = (struct sockaddr_in*) ifa->ifa_addr;
8283
char addressBuffer[INET_ADDRSTRLEN];
8384
inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN);
84-
addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name));
85+
addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET, isDefaultRoute);
8586
}
8687
else if (ifa->ifa_addr->sa_family == AF_INET6)
8788
{
@@ -91,7 +92,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
9192
struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr;
9293
char addressBuffer[INET6_ADDRSTRLEN];
9394
inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN);
94-
addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name));
95+
addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, isDefaultRoute);
9596
}
9697
#if defined(__FreeBSD__) || defined(__APPLE__)
9798
else if (ifa->ifa_addr->sa_family == AF_LINK)
@@ -103,7 +104,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
103104
uint8_t* ptr = (uint8_t*) LLADDR((struct sockaddr_dl *)ifa->ifa_addr);
104105
snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x",
105106
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);
106-
addNewIp(results, ifa->ifa_name, addressBuffer, -1, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name));
107+
addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRoute);
107108
}
108109
#else
109110
else if (ifa->ifa_addr->sa_family == AF_PACKET)
@@ -115,7 +116,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
115116
uint8_t* ptr = ((struct sockaddr_ll *)ifa->ifa_addr)->sll_addr;
116117
snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x",
117118
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);
118-
addNewIp(results, ifa->ifa_name, addressBuffer, -1, ffStrbufEqualS(&defaultRouteIface, ifa->ifa_name));
119+
addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRoute);
119120
}
120121
#endif
121122
}

src/detection/localip/localip_windows.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
7070
return "GetAdaptersAddresses() failed";
7171
}
7272

73-
uint32_t defaultRouteIfIndex = (uint32_t)-1;
74-
ffNetifGetDefaultRoute(&defaultRouteIfIndex);
73+
uint32_t defaultRouteIfIndex = ffNetifGetDefaultRoute();
7574

7675
// Iterate through all of the adapters
7776
for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next)
7877
{
79-
if (options->defaultRouteOnly && adapter->IfIndex != defaultRouteIfIndex)
78+
bool isDefaultRoute = adapter->IfIndex == defaultRouteIfIndex;
79+
if (options->defaultRouteOnly && !isDefaultRoute)
8080
continue;
8181

8282
bool isLoop = adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK;
@@ -96,7 +96,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
9696
uint8_t* ptr = adapter->PhysicalAddress;
9797
snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x",
9898
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);
99-
addNewIp(results, name, addressBuffer, -1, newIp, adapter->IfIndex == defaultRouteIfIndex);
99+
addNewIp(results, name, addressBuffer, -1, newIp, isDefaultRoute);
100100
newIp = false;
101101
}
102102

@@ -107,15 +107,15 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results)
107107
SOCKADDR_IN* ipv4 = (SOCKADDR_IN*) ifa->Address.lpSockaddr;
108108
char addressBuffer[INET_ADDRSTRLEN];
109109
inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN);
110-
addNewIp(results, name, addressBuffer, AF_INET, newIp, adapter->IfIndex == defaultRouteIfIndex);
110+
addNewIp(results, name, addressBuffer, AF_INET, newIp, isDefaultRoute);
111111
newIp = false;
112112
}
113113
else if (ifa->Address.lpSockaddr->sa_family == AF_INET6)
114114
{
115115
SOCKADDR_IN6* ipv6 = (SOCKADDR_IN6*) ifa->Address.lpSockaddr;
116116
char addressBuffer[INET6_ADDRSTRLEN];
117117
inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN);
118-
addNewIp(results, name, addressBuffer, AF_INET6, newIp, adapter->IfIndex == defaultRouteIfIndex);
118+
addNewIp(results, name, addressBuffer, AF_INET6, newIp, isDefaultRoute);
119119
newIp = false;
120120
}
121121
}

0 commit comments

Comments
 (0)