]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkctl: define a helper for interface name resolution
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 18 Dec 2019 13:18:34 +0000 (14:18 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 11 Jan 2020 11:07:28 +0000 (12:07 +0100)
src/libsystemd/sd-netlink/netlink-util.c
src/libsystemd/sd-netlink/netlink-util.h
src/network/networkctl.c
src/network/networkd-manager-bus.c

index a91db5df5f1f0adbf8bbc406d16a79f7c9128015..c9d4e3c607906b7d95e4524cd7c15a8890a12e8a 100644 (file)
@@ -167,13 +167,12 @@ int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifn
         return 0;
 }
 
-int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, int *ret) {
+int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL;
-        int r;
+        int r, ret;
 
         assert(rtnl);
         assert(name);
-        assert(ret);
 
         if (!*rtnl) {
                 r = sd_netlink_open(rtnl);
@@ -193,7 +192,11 @@ int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, int
         if (r < 0)
                 return r;
 
-        return sd_rtnl_message_link_get_ifindex(reply, ret);
+        r = sd_rtnl_message_link_get_ifindex(reply, &ret);
+        if (r < 0)
+                return r;
+        assert(ret > 0);
+        return ret;
 }
 
 int rtnl_message_new_synthetic_error(sd_netlink *rtnl, int error, uint32_t serial, sd_netlink_message **ret) {
index 7b007a61c23ac04ec97f201374f2a71183c4c862..55bc12712a0c47eaf5382b098a55bc46c8db70d4 100644 (file)
@@ -51,7 +51,7 @@ int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name);
 int rtnl_set_link_properties(sd_netlink **rtnl, int ifindex, const char *alias, const struct ether_addr *mac, uint32_t mtu);
 int rtnl_set_link_alternative_names(sd_netlink **rtnl, int ifindex, char * const *alternative_names);
 int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifname, char * const *alternative_names);
-int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, int *ret);
+int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name);
 
 int rtnl_log_parse_error(int r);
 int rtnl_log_create_error(int r);
index 0cc018e088c5eace1500dc073ab6aff530e46530..5cc62841ec4a6db8cb600efd16c8b1e09c845c57 100644 (file)
@@ -64,6 +64,21 @@ static bool arg_stats = false;
 static bool arg_full = false;
 static unsigned arg_lines = 10;
 
+static int resolve_ifname(sd_netlink **rtnl, const char *name) {
+        int r;
+
+        r = parse_ifindex_or_ifname(name);
+        if (r > 0)
+                return r;
+        assert(r < 0);
+
+        r = rtnl_resolve_link_alternative_name(rtnl, name);
+        if (r > 0)
+                return r;
+        assert(r < 0);
+        return log_error_errno(r, "Failed to resolve interface \"%s\": %m", name);
+}
+
 static char *link_get_type_string(unsigned short iftype, sd_device *d) {
         const char *t, *devtype;
         char *p;
@@ -1880,12 +1895,9 @@ static int link_delete(int argc, char *argv[], void *userdata) {
                 return log_oom();
 
         for (i = 1; i < argc; i++) {
-                index = parse_ifindex_or_ifname(argv[i]);
-                if (index < 0) {
-                        r = rtnl_resolve_link_alternative_name(&rtnl, argv[i], &index);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to resolve interface %s", argv[i]);
-                }
+                index = resolve_ifname(&rtnl, argv[i]);
+                if (index < 0)
+                        return index;
 
                 r = set_put(indexes, INT_TO_PTR(index));
                 if (r < 0)
@@ -1936,12 +1948,9 @@ static int link_renew(int argc, char *argv[], void *userdata) {
                 return log_error_errno(r, "Failed to connect system bus: %m");
 
         for (i = 1; i < argc; i++) {
-                index = parse_ifindex_or_ifname(argv[i]);
-                if (index < 0) {
-                        r = rtnl_resolve_link_alternative_name(&rtnl, argv[i], &index);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to resolve interface %s", argv[i]);
-                }
+                index = resolve_ifname(&rtnl, argv[i]);
+                if (index < 0)
+                        return index;
 
                 r = link_renew_one(bus, index, argv[i]);
                 if (r < 0 && k >= 0)
@@ -1991,12 +2000,9 @@ static int verb_reconfigure(int argc, char *argv[], void *userdata) {
                 return log_oom();
 
         for (i = 1; i < argc; i++) {
-                index = parse_ifindex_or_ifname(argv[i]);
-                if (index < 0) {
-                        r = rtnl_resolve_link_alternative_name(&rtnl, argv[i], &index);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to resolve interface %s", argv[i]);
-                }
+                index = resolve_ifname(&rtnl, argv[i]);
+                if (index < 0)
+                        return index;
 
                 r = set_put(indexes, INT_TO_PTR(index));
                 if (r < 0)
index 8bcce06b854cdbf109ef713b68c9c3c44d2e47d9..4db72b3302485765660df7f11e6207aa23f952d9 100644 (file)
@@ -68,8 +68,8 @@ static int method_get_link_by_name(sd_bus_message *message, void *userdata, sd_b
 
         index = if_nametoindex(name);
         if (index <= 0) {
-                r = rtnl_resolve_link_alternative_name(&manager->rtnl, name, &index);
-                if (r < 0)
+                index = rtnl_resolve_link_alternative_name(&manager->rtnl, name);
+                if (index < 0)
                         return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_LINK, "Link %s not known", name);
         }