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;
}
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)
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) {
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);
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;
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;
*(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)) {
_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);
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);
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)
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)
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;
}
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]);
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]);
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]);
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);
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)) {
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)
}
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;
}
int ifname_mangle(const char *s) {
_cleanup_free_ char *iface = NULL;
const char *dot;
- int ifi, r;
+ int ifi;
assert(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)
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;
}
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);
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));
void manager_cleanup_saved_user(Manager *m) {
_cleanup_closedir_ DIR *d = NULL;
struct dirent *de;
- int r;
assert(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));
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,