summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-12-18 13:54:13 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-01-11 12:06:08 +0100
commit597da51bae9e46a93b310125174d48c9438d3bab (patch)
treedb481a70aa76af1d7b02ed8f8ae5792e883645d8
parent0e05be8405132fb392bc0bd01ea520e58d447467 (diff)
downloadsystemd-597da51bae9e46a93b310125174d48c9438d3bab.tar.gz
tree-wide: make parse_ifindex simply return the index
We don't need a seperate output parameter that is of type int. glibc() says that the type is "unsigned", but the kernel thinks it's "int". And the "alternative names" interface also uses ints. So let's standarize on ints, since it's clearly not realisitic to have interface numbers in the upper half of unsigned int range.
-rw-r--r--src/basic/in-addr-util.c32
-rw-r--r--src/basic/parse-util.c17
-rw-r--r--src/basic/parse-util.h4
-rw-r--r--src/libsystemd/sd-device/sd-device.c16
-rw-r--r--src/libsystemd/sd-login/sd-login.c3
-rw-r--r--src/libsystemd/sd-network/sd-network.c11
-rw-r--r--src/machine/machine.c14
-rw-r--r--src/network/networkctl.c12
-rw-r--r--src/network/networkd-link-bus.c4
-rw-r--r--src/network/networkd-route.c3
-rw-r--r--src/nspawn/nspawn-network.c14
-rw-r--r--src/resolve/resolvectl.c20
-rw-r--r--src/resolve/resolved-link-bus.c7
-rw-r--r--src/resolve/resolved-manager.c5
-rw-r--r--src/timedate/timedatectl.c7
15 files changed, 77 insertions, 92 deletions
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,