X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkctl.c;h=815ea1698d575b8ef11964e9933ad0f93eeda3e1;hb=14b0295f916a7ce5262b0b5b8a3418ce474b9c69;hp=91eb6357d40d58e1ae4f41705ff34c4c9625d141;hpb=c09da72900b03fcddade06643f24c6357f3e0482;p=elogind.git diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 91eb6357d..815ea1698 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -34,6 +34,7 @@ #include "arphrd-list.h" #include "local-addresses.h" #include "socket-util.h" +#include "ether-addr-util.h" static bool arg_no_pager = false; static bool arg_legend = true; @@ -251,14 +252,13 @@ static int list_links(char **args, unsigned n) { static int ieee_oui(struct udev_hwdb *hwdb, struct ether_addr *mac, char **ret) { struct udev_list_entry *entry; char *description; - char str[32]; + char str[strlen("OUI:XXYYXXYYXXYY") + 1]; /* skip commonly misused 00:00:00 (Xerox) prefix */ if (memcmp(mac, "\0\0\0", 3) == 0) return -EINVAL; - snprintf(str, sizeof(str), "OUI:%02X%02X%02X%02X%02X%02X", mac->ether_addr_octet[0], mac->ether_addr_octet[1], mac->ether_addr_octet[2], - mac->ether_addr_octet[3], mac->ether_addr_octet[4], mac->ether_addr_octet[5]); + snprintf(str, sizeof(str), "OUI:" ETHER_ADDR_FORMAT_STR, ETHER_ADDR_FORMAT_VAL(*mac)); udev_list_entry_foreach(entry, udev_hwdb_get_properties_list_entry(hwdb, str, 0)) if (strcmp(udev_list_entry_get_name(entry), "ID_OUI_FROM_DATABASE") == 0) { @@ -333,7 +333,7 @@ static int get_gateway_description(sd_rtnl *rtnl, struct udev_hwdb *hwdb, int if r = sd_rtnl_message_neigh_get_ifindex(m, &ifi); if (r < 0) { - log_error_errno(r, "colud not get ifindex: %m"); + log_error_errno(r, "could not get ifindex: %m"); continue; } @@ -375,118 +375,34 @@ static int get_gateway_description(sd_rtnl *rtnl, struct udev_hwdb *hwdb, int if } static int dump_gateways(sd_rtnl *rtnl, struct udev_hwdb *hwdb, const char *prefix, int ifindex) { - _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL; - sd_rtnl_message *m; - bool first = true; - int r; - - assert(rtnl); - assert(ifindex >= 0); - - r = sd_rtnl_message_new_route(rtnl, &req, RTM_GETROUTE, AF_UNSPEC, RTPROT_UNSPEC); - if (r < 0) - return r; - - r = sd_rtnl_message_request_dump(req, true); - if (r < 0) - return r; - - r = sd_rtnl_call(rtnl, req, 0, &reply); - if (r < 0) - return r; - - for (m = reply; m; m = sd_rtnl_message_next(m)) { - _cleanup_free_ char *gateway = NULL, *gateway_description = NULL; - union in_addr_union gw = {}; - uint16_t type; - uint32_t ifi; - int family; - - r = sd_rtnl_message_get_errno(m); - if (r < 0) { - log_error_errno(r, "got error: %m"); - continue; - } - - r = sd_rtnl_message_get_type(m, &type); - if (r < 0) { - log_error_errno(r, "could not get type: %m"); - continue; - } - - if (type != RTM_NEWROUTE) { - log_error("type is not RTM_NEWROUTE"); - continue; - } - - r = sd_rtnl_message_route_get_family(m, &family); - if (r < 0) { - log_error_errno(r, "could not get family: %m"); - continue; - } - - r = sd_rtnl_message_read_u32(m, RTA_OIF, &ifi); - if (r < 0) { - log_error_errno(r, "colud not get RTA_OIF: %m"); - continue; - } - - if (ifindex > 0 && ifi != (unsigned) ifindex) - continue; - - switch (family) { - case AF_INET: - r = sd_rtnl_message_read_in_addr(m, RTA_GATEWAY, &gw.in); - if (r < 0) - continue; - - r = sd_rtnl_message_read_in_addr(m, RTA_DST, NULL); - if (r >= 0) - continue; - - r = sd_rtnl_message_read_in_addr(m, RTA_SRC, NULL); - if (r >= 0) - continue; - - break; - case AF_INET6: - r = sd_rtnl_message_read_in6_addr(m, RTA_GATEWAY, &gw.in6); - if (r < 0) - continue; - - r = sd_rtnl_message_read_in6_addr(m, RTA_DST, NULL); - if (r >= 0) - continue; + _cleanup_free_ struct local_address *local = NULL; + int r, n, i; - r = sd_rtnl_message_read_in6_addr(m, RTA_SRC, NULL); - if (r >= 0) - continue; + n = local_gateways(rtnl, ifindex, AF_UNSPEC, &local); + if (n < 0) + return n; - break; - default: - continue; - } + for (i = 0; i < n; i++) { + _cleanup_free_ char *gateway = NULL, *description = NULL; - r = in_addr_to_string(family, &gw, &gateway); + r = in_addr_to_string(local[i].family, &local[i].address, &gateway); if (r < 0) - continue; + return r; - r = get_gateway_description(rtnl, hwdb, ifi, family, &gw, &gateway_description); + r = get_gateway_description(rtnl, hwdb, ifindex, local[i].family, &local[i].address, &description); if (r < 0) - log_debug("could not get description of gateway: %s", strerror(-r)); + log_debug_errno(r, "Could not get description of gateway: %m"); - if (gateway_description) + if (description) printf("%*s%s (%s)\n", (int) strlen(prefix), - first ? prefix : "", - gateway, gateway_description); + i == 0 ? prefix : "", + gateway, description); else printf("%*s%s\n", (int) strlen(prefix), - first ? prefix : "", + i == 0 ? prefix : "", gateway); - - first = false; } return 0; @@ -496,7 +412,7 @@ static int dump_addresses(sd_rtnl *rtnl, const char *prefix, int ifindex) { _cleanup_free_ struct local_address *local = NULL; int r, n, i; - n = local_addresses(rtnl, ifindex, &local); + n = local_addresses(rtnl, ifindex, AF_UNSPEC, &local); if (n < 0) return n; @@ -529,8 +445,7 @@ static void dump_list(const char *prefix, char **l) { static int link_status_one(sd_rtnl *rtnl, struct udev *udev, const char *name) { _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **domains = NULL; - _cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *gateway = NULL, *gateway_description = NULL, - *gateway6 = NULL, *gateway6_description = NULL; + _cleanup_free_ char *setup_state = NULL, *operational_state = NULL; _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL; _cleanup_udev_device_unref_ struct udev_device *d = NULL; _cleanup_udev_hwdb_unref_ struct udev_hwdb *hwdb = NULL; @@ -709,7 +624,7 @@ static int link_status(char **args, unsigned n) { printf(" State: %s%s%s\n", on_color_operational, strna(operational_state), off_color_operational); - c = local_addresses(rtnl, 0, &addresses); + c = local_addresses(rtnl, 0, AF_UNSPEC, &addresses); for (i = 0; i < c; i++) { _cleanup_free_ char *pretty = NULL;