From 93a06769c432cc57e6da77d234ad0d0b62dc9466 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 25 Oct 2021 17:16:40 -0500 Subject: [PATCH] client: Print IP Addresses / hint about netconfig When station 'show' is invoked, parse and print any IP addresses associated with the interface. If iwd network configuration is disabled and no IP addresses were configured, print a hint to the user that a DHCP client might need to be configured. --- client/station.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/client/station.c b/client/station.c index 425b10a1..a811ebf4 100644 --- a/client/station.c +++ b/client/station.c @@ -24,6 +24,9 @@ #include #endif +#include +#include + #include #include "client/command.h" @@ -32,6 +35,7 @@ #include "client/network.h" #include "client/display.h" #include "client/diagnostic.h" +#include "client/daemon.h" struct station { bool scanning; @@ -597,6 +601,65 @@ static enum cmd_status cmd_scan(const char *device_name, return CMD_STATUS_TRIGGERED; } +static void display_addresses(const char *device_name) +{ + struct ifaddrs *ifa; + struct ifaddrs *cur; + bool have_address = false; + char addrstr[INET6_ADDRSTRLEN]; + int r; + + if (getifaddrs(&ifa) == -1) + return; + + for (cur = ifa; cur; cur = cur->ifa_next) { + if (cur->ifa_addr == NULL) + continue; + + if (strcmp(cur->ifa_name, device_name)) + continue; + + if (cur->ifa_addr->sa_family == AF_INET6) { + struct sockaddr_in6 *si6 = + (struct sockaddr_in6 *) cur->ifa_addr; + + if (IN6_IS_ADDR_LINKLOCAL(&si6->sin6_addr)) + continue; + + if (!inet_ntop(AF_INET6, &si6->sin6_addr, + addrstr, sizeof(addrstr))) + continue; + + have_address = true; + display("%s%*s %-*s%-*s\n", MARGIN, 8, "", 20, + "IPv6 address", 47, addrstr); + } else if (cur->ifa_addr->sa_family == AF_INET) { + struct sockaddr_in *si = + (struct sockaddr_in *) cur->ifa_addr; + + if (!inet_ntop(AF_INET, &si->sin_addr, + addrstr, sizeof(addrstr))) + continue; + + have_address = true; + display("%s%*s %-*s%-*s\n", MARGIN, 8, "", 20, + "IPv4 address", 47, addrstr); + } + } + + freeifaddrs(ifa); + + if (have_address) + return; + + r = daemon_netconfig_enabled(); + if (r < 0 || r == 1) + return; + + display("%s%*s %-*s%-*s\n", MARGIN, 8, "", 20, + "No IP addresses", 47, "Is DHCP client configured?"); +} + static void get_diagnostics_callback(struct l_dbus_message *message, void *user_data) { @@ -632,6 +695,7 @@ static enum cmd_status cmd_show(const char *device_name, } display_station(device_name, station); + display_addresses(device_name); /* * No need to query additional diagnostic information if IWD has