diff --git a/src/basic/in-addr-util.c b/src/basic/in-addr-util.c index 06b92db579..b6ca27e3e8 100644 --- a/src/basic/in-addr-util.c +++ b/src/basic/in-addr-util.c @@ -439,48 +439,38 @@ int in_addr_from_string_auto(const char *s, int *ret_family, union in_addr_union return -EINVAL; } -int in_addr_ifindex_from_string_auto(const char *s, int *family, union in_addr_union *ret, int *ifindex) { +int in_addr_ifindex_from_string_auto(const char *s, int *family, union in_addr_union *ret_addr, int *ret_ifindex) { _cleanup_free_ char *buf = NULL; const char *suffix; - int r, ifi = 0; + int r, ifindex = 0; assert(s); assert(family); - assert(ret); + assert(ret_addr); /* Similar to in_addr_from_string_auto() but also parses an optionally appended IPv6 zone suffix ("scope id") * if one is found. */ suffix = strchr(s, '%'); if (suffix) { - - if (ifindex) { + if (ret_ifindex) { /* If we shall return the interface index, try to parse it */ - r = parse_ifindex(suffix + 1, &ifi); - if (r < 0) { - unsigned u; - - u = if_nametoindex(suffix + 1); - if (u <= 0) - return -errno; - - ifi = (int) u; - } + ifindex = parse_ifindex_or_ifname(suffix + 1); + if (ifindex < 0) + return ifindex; } - buf = strndup(s, suffix - s); + s = buf = strndup(s, suffix - s); if (!buf) return -ENOMEM; - - s = buf; } - r = in_addr_from_string_auto(s, family, ret); + r = in_addr_from_string_auto(s, family, ret_addr); if (r < 0) return r; - if (ifindex) - *ifindex = ifi; + if (ret_ifindex) + *ret_ifindex = ifindex; return r; } diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index b81db04989..d3140cc1a4 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -79,11 +79,10 @@ int parse_mode(const char *s, mode_t *ret) { return 0; } -int parse_ifindex(const char *s, int *ret) { +int parse_ifindex(const char *s) { int ifi, r; assert(s); - assert(ret); r = safe_atoi(s, &ifi); if (r < 0) @@ -91,26 +90,24 @@ int parse_ifindex(const char *s, int *ret) { if (ifi <= 0) return -EINVAL; - *ret = ifi; - return 0; + return ifi; } -int parse_ifindex_or_ifname(const char *s, int *ret) { +int parse_ifindex_or_ifname(const char *s) { int r; assert(s); - assert(ret); - r = parse_ifindex(s, ret); - if (r >= 0) + r = parse_ifindex(s); + if (r > 0) return r; + assert(r < 0); r = (int) if_nametoindex(s); if (r <= 0) return -errno; - *ret = r; - return 0; + return r; } int parse_mtu(int family, const char *s, uint32_t *ret) { diff --git a/src/basic/parse-util.h b/src/basic/parse-util.h index 3a70b79276..b20f5b52cc 100644 --- a/src/basic/parse-util.h +++ b/src/basic/parse-util.h @@ -13,8 +13,8 @@ int parse_boolean(const char *v) _pure_; int parse_dev(const char *s, dev_t *ret); int parse_pid(const char *s, pid_t* ret_pid); int parse_mode(const char *s, mode_t *ret); -int parse_ifindex(const char *s, int *ret); -int parse_ifindex_or_ifname(const char *s, int *ret); +int parse_ifindex(const char *s); +int parse_ifindex_or_ifname(const char *s); int parse_mtu(int family, const char *s, uint32_t *ret); int parse_size(const char *t, uint64_t base, uint64_t *size); diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index f35612fe12..1f2451f8e1 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -340,17 +340,17 @@ int device_set_devtype(sd_device *device, const char *_devtype) { return 0; } -int device_set_ifindex(sd_device *device, const char *_ifindex) { - int ifindex, r; +int device_set_ifindex(sd_device *device, const char *name) { + int r, ifindex; assert(device); - assert(_ifindex); + assert(name); - r = parse_ifindex(_ifindex, &ifindex); - if (r < 0) - return r; + ifindex = parse_ifindex(name); + if (ifindex < 0) + return ifindex; - r = device_add_property_internal(device, "IFINDEX", _ifindex); + r = device_add_property_internal(device, "IFINDEX", name); if (r < 0) return r; @@ -619,7 +619,7 @@ _public_ int sd_device_new_from_device_id(sd_device **ret, const char *id) { struct ifreq ifr = {}; int ifindex; - r = parse_ifindex(&id[1], &ifr.ifr_ifindex); + r = ifr.ifr_ifindex = parse_ifindex(&id[1]); if (r < 0) return r; diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index fbfd89b69b..3e96c98cd9 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -928,7 +928,8 @@ _public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) { *(char*) (mempcpy(buf, word, l)) = 0; - if (parse_ifindex(buf, &ifi) < 0) + ifi = parse_ifindex(buf); + if (ifi < 0) continue; if (!GREEDY_REALLOC(ni, allocated, nr+1)) { diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index dc5ccb793b..b9b618e585 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -276,7 +276,6 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { _cleanup_free_ int *ifis = NULL; _cleanup_free_ char *s = NULL; size_t allocated = 0, c = 0; - const char *x; int r; assert_return(ifindex > 0, -EINVAL); @@ -289,7 +288,7 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { if (r < 0) return r; - for (x = s;;) { + for (const char *x = s;;) { _cleanup_free_ char *word = NULL; r = extract_first_word(&x, &word, NULL, 0); @@ -298,14 +297,12 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { if (r == 0) break; - r = parse_ifindex(word, &ifindex); - if (r < 0) - return r; - if (!GREEDY_REALLOC(ifis, allocated, c + 2)) return -ENOMEM; - ifis[c++] = ifindex; + r = ifis[c++] = parse_ifindex(word); + if (r < 0) + return r; } if (ifis) diff --git a/src/machine/machine.c b/src/machine/machine.c index efe327f381..8154c42ed7 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -294,12 +294,11 @@ int machine_load(Machine *m) { if (netif) { size_t allocated = 0, nr = 0; const char *p; - int *ni = NULL; + _cleanup_free_ int *ni = NULL; p = netif; for (;;) { _cleanup_free_ char *word = NULL; - int ifi; r = extract_first_word(&p, &word, NULL, 0); if (r == 0) @@ -311,19 +310,18 @@ int machine_load(Machine *m) { break; } - if (parse_ifindex(word, &ifi) < 0) + r = parse_ifindex(word); + if (r < 0) continue; - if (!GREEDY_REALLOC(ni, allocated, nr+1)) { - free(ni); + if (!GREEDY_REALLOC(ni, allocated, nr + 1)) return log_oom(); - } - ni[nr++] = ifi; + ni[nr++] = r; } free(m->netif); - m->netif = ni; + m->netif = TAKE_PTR(ni); m->n_netif = nr; } diff --git a/src/network/networkctl.c b/src/network/networkctl.c index e6dc70a0e2..0cc018e088 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1880,8 +1880,8 @@ static int link_delete(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - r = parse_ifindex_or_ifname(argv[i], &index); - if (r < 0) { + 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]); @@ -1936,8 +1936,8 @@ 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++) { - r = parse_ifindex_or_ifname(argv[i], &index); - if (r < 0) { + 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]); @@ -1991,8 +1991,8 @@ static int verb_reconfigure(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - r = parse_ifindex_or_ifname(argv[i], &index); - if (r < 0) { + 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]); diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c index 356ceaf063..8f3b2e92f8 100644 --- a/src/network/networkd-link-bus.c +++ b/src/network/networkd-link-bus.c @@ -715,8 +715,8 @@ int link_object_find(sd_bus *bus, const char *path, const char *interface, void if (r <= 0) return 0; - r = parse_ifindex(identifier, &ifindex); - if (r < 0) + ifindex = parse_ifindex(identifier); + if (ifindex < 0) return 0; r = link_get(m, ifindex, &link); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index f94bee6d8b..2223a356da 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -1646,12 +1646,13 @@ int config_parse_multipath_route( m->gateway.family = family; if (dev) { - r = parse_ifindex_or_ifname(dev, &m->ifindex); + r = parse_ifindex_or_ifname(dev); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Invalid interface name or index, ignoring assignment: %s", dev); return 0; } + m->ifindex = r; } if (!isempty(p)) { diff --git a/src/nspawn/nspawn-network.c b/src/nspawn/nspawn-network.c index 9c9cf4812e..b2592b023d 100644 --- a/src/nspawn/nspawn-network.c +++ b/src/nspawn/nspawn-network.c @@ -337,9 +337,9 @@ static int join_bridge(sd_netlink *rtnl, const char *veth_name, const char *brid assert(veth_name); assert(bridge_name); - r = parse_ifindex_or_ifname(bridge_name, &bridge_ifi); - if (r < 0) - return r; + bridge_ifi = parse_ifindex_or_ifname(bridge_name); + if (bridge_ifi < 0) + return bridge_ifi; r = sd_rtnl_message_new_link(rtnl, &m, RTM_SETLINK, 0); if (r < 0) @@ -473,11 +473,11 @@ int remove_bridge(const char *bridge_name) { } static int parse_interface(const char *name) { - int ifi, r; + int ifi; - r = parse_ifindex_or_ifname(name, &ifi); - if (r < 0) - return log_error_errno(r, "Failed to resolve interface %s: %m", name); + ifi = parse_ifindex_or_ifname(name); + if (ifi < 0) + return log_error_errno(ifi, "Failed to resolve interface %s: %m", name); return ifi; } diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index 0a96a18b38..87ecd519d5 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -80,7 +80,7 @@ typedef enum StatusMode { int ifname_mangle(const char *s) { _cleanup_free_ char *iface = NULL; const char *dot; - int ifi, r; + int ifi; assert(s); @@ -94,14 +94,14 @@ int ifname_mangle(const char *s) { if (!iface) return log_oom(); - r = parse_ifindex_or_ifname(iface, &ifi); - if (r < 0) { - if (r == -ENODEV && arg_ifindex_permissive) { + ifi = parse_ifindex_or_ifname(iface); + if (ifi < 0) { + if (ifi == -ENODEV && arg_ifindex_permissive) { log_debug("Interface '%s' not found, but -f specified, ignoring.", iface); return 0; /* done */ } - return log_error_errno(r, "Unknown interface '%s': %m", iface); + return log_error_errno(ifi, "Unknown interface '%s': %m", iface); } if (arg_ifindex > 0 && arg_ifindex != ifi) @@ -1819,18 +1819,18 @@ static int status_all(sd_bus *bus, StatusMode mode) { static int verb_status(int argc, char **argv, void *userdata) { sd_bus *bus = userdata; - int q, r = 0; + int r = 0; if (argc > 1) { char **ifname; bool empty_line = false; STRV_FOREACH(ifname, argv + 1) { - int ifindex; + int ifindex, q; - q = parse_ifindex_or_ifname(*ifname, &ifindex); - if (q < 0) { - log_error_errno(q, "Unknown interface '%s', ignoring: %m", *ifname); + ifindex = parse_ifindex_or_ifname(*ifname); + if (ifindex < 0) { + log_warning_errno(ifindex, "Unknown interface '%s', ignoring: %m", *ifname); continue; } diff --git a/src/resolve/resolved-link-bus.c b/src/resolve/resolved-link-bus.c index dae8435b45..a8480f190a 100644 --- a/src/resolve/resolved-link-bus.c +++ b/src/resolve/resolved-link-bus.c @@ -712,9 +712,8 @@ const sd_bus_vtable link_vtable[] = { int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { _cleanup_free_ char *e = NULL; Manager *m = userdata; - int ifindex; Link *link; - int r; + int ifindex, r; assert(bus); assert(path); @@ -726,8 +725,8 @@ int link_object_find(sd_bus *bus, const char *path, const char *interface, void if (r <= 0) return 0; - r = parse_ifindex(e, &ifindex); - if (r < 0) + ifindex = parse_ifindex(e); + if (ifindex < 0) return 0; link = hashmap_get(m->links, INT_TO_PTR(ifindex)); diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 95f698ab06..af91a8ec1a 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -1466,7 +1466,6 @@ void manager_reset_server_features(Manager *m) { void manager_cleanup_saved_user(Manager *m) { _cleanup_closedir_ DIR *d = NULL; struct dirent *de; - int r; assert(m); @@ -1494,8 +1493,8 @@ void manager_cleanup_saved_user(Manager *m) { if (dot_or_dot_dot(de->d_name)) continue; - r = parse_ifindex(de->d_name, &ifindex); - if (r < 0) /* Probably some temporary file from a previous run. Delete it */ + ifindex = parse_ifindex(de->d_name); + if (ifindex < 0) /* Probably some temporary file from a previous run. Delete it */ goto rm; l = hashmap_get(m->links, INT_TO_PTR(ifindex)); diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c index 17297ab228..d51e29de1e 100644 --- a/src/timedate/timedatectl.c +++ b/src/timedate/timedatectl.c @@ -839,9 +839,12 @@ static int parse_ifindex_bus(sd_bus *bus, const char *str, int *ret) { assert(str); assert(ret); - r = parse_ifindex(str, ret); - if (r >= 0) + r = parse_ifindex(str); + if (r >= 0) { + assert(r != 0); + *ret = r; return 0; + } r = sd_bus_call_method( bus,