mirror of
https://github.com/systemd/systemd.git
synced 2025-02-09 13:57:42 +03:00
Resolve alternative ifnames wherever we would resolve an interface name
To keep the names manageable, "ifname_or_ifindex" is replaced by "interface".
This commit is contained in:
parent
fc2ea97ad0
commit
d308bb99d2
@ -93,23 +93,6 @@ int parse_ifindex(const char *s) {
|
||||
return ifi;
|
||||
}
|
||||
|
||||
int parse_ifindex_or_ifname(const char *s) {
|
||||
int r;
|
||||
|
||||
assert(s);
|
||||
|
||||
r = parse_ifindex(s);
|
||||
if (r > 0)
|
||||
return r;
|
||||
assert(r < 0);
|
||||
|
||||
r = (int) if_nametoindex(s);
|
||||
if (r <= 0)
|
||||
return -errno;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int parse_mtu(int family, const char *s, uint32_t *ret) {
|
||||
uint64_t u;
|
||||
size_t m;
|
||||
|
@ -14,7 +14,6 @@ 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 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);
|
||||
|
@ -191,6 +191,8 @@ int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name) {
|
||||
return r;
|
||||
|
||||
r = sd_netlink_call(*rtnl, message, 0, &reply);
|
||||
if (r == -EINVAL)
|
||||
return -ENODEV; /* The device doesn't exist */
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "parse-util.h"
|
||||
#include "pretty-print.h"
|
||||
#include "set.h"
|
||||
#include "socket-netlink.h"
|
||||
#include "socket-util.h"
|
||||
#include "sort-util.h"
|
||||
#include "sparse-endian.h"
|
||||
@ -64,21 +65,6 @@ 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;
|
||||
@ -1895,7 +1881,7 @@ static int link_delete(int argc, char *argv[], void *userdata) {
|
||||
return log_oom();
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
index = resolve_ifname(&rtnl, argv[i]);
|
||||
index = resolve_interface_or_warn(&rtnl, argv[i]);
|
||||
if (index < 0)
|
||||
return index;
|
||||
|
||||
@ -1948,7 +1934,7 @@ 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 = resolve_ifname(&rtnl, argv[i]);
|
||||
index = resolve_interface_or_warn(&rtnl, argv[i]);
|
||||
if (index < 0)
|
||||
return index;
|
||||
|
||||
@ -2000,7 +1986,7 @@ static int verb_reconfigure(int argc, char *argv[], void *userdata) {
|
||||
return log_oom();
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
index = resolve_ifname(&rtnl, argv[i]);
|
||||
index = resolve_interface_or_warn(&rtnl, argv[i]);
|
||||
if (index < 0)
|
||||
return index;
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "networkd-route.h"
|
||||
#include "parse-util.h"
|
||||
#include "set.h"
|
||||
#include "socket-netlink.h"
|
||||
#include "string-table.h"
|
||||
#include "string-util.h"
|
||||
#include "strxcpyx.h"
|
||||
@ -1646,7 +1647,7 @@ int config_parse_multipath_route(
|
||||
m->gateway.family = family;
|
||||
|
||||
if (dev) {
|
||||
r = parse_ifindex_or_ifname(dev);
|
||||
r = resolve_interface(NULL, dev);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r,
|
||||
"Invalid interface name or index, ignoring assignment: %s", dev);
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "nspawn-network.h"
|
||||
#include "parse-util.h"
|
||||
#include "siphash24.h"
|
||||
#include "socket-netlink.h"
|
||||
#include "socket-util.h"
|
||||
#include "stat-util.h"
|
||||
#include "string-util.h"
|
||||
@ -280,7 +281,8 @@ int setup_veth(const char *machine_name,
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
u = if_nametoindex(n);
|
||||
u = if_nametoindex(n); /* We don't need to use resolve_ifname() here because the
|
||||
* name we assigned is always the main name. */
|
||||
if (u == 0)
|
||||
return log_error_errno(errno, "Failed to resolve interface %s: %m", n);
|
||||
|
||||
@ -337,7 +339,7 @@ static int join_bridge(sd_netlink *rtnl, const char *veth_name, const char *brid
|
||||
assert(veth_name);
|
||||
assert(bridge_name);
|
||||
|
||||
bridge_ifi = parse_ifindex_or_ifname(bridge_name);
|
||||
bridge_ifi = resolve_interface(&rtnl, bridge_name);
|
||||
if (bridge_ifi < 0)
|
||||
return bridge_ifi;
|
||||
|
||||
@ -472,16 +474,6 @@ int remove_bridge(const char *bridge_name) {
|
||||
return remove_one_link(rtnl, bridge_name);
|
||||
}
|
||||
|
||||
static int parse_interface(const char *name) {
|
||||
int ifi;
|
||||
|
||||
ifi = parse_ifindex_or_ifname(name);
|
||||
if (ifi < 0)
|
||||
return log_error_errno(ifi, "Failed to resolve interface %s: %m", name);
|
||||
|
||||
return ifi;
|
||||
}
|
||||
|
||||
int test_network_interface_initialized(const char *name) {
|
||||
_cleanup_(sd_device_unrefp) sd_device *d = NULL;
|
||||
int ifi, r;
|
||||
@ -492,7 +484,7 @@ int test_network_interface_initialized(const char *name) {
|
||||
|
||||
/* udev should be around. */
|
||||
|
||||
ifi = parse_interface(name);
|
||||
ifi = resolve_interface_or_warn(NULL, name);
|
||||
if (ifi < 0)
|
||||
return ifi;
|
||||
|
||||
@ -532,7 +524,7 @@ int move_network_interfaces(int netns_fd, char **ifaces) {
|
||||
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
|
||||
int ifi;
|
||||
|
||||
ifi = parse_interface(*i);
|
||||
ifi = resolve_interface_or_warn(&rtnl, *i);
|
||||
if (ifi < 0)
|
||||
return ifi;
|
||||
|
||||
@ -571,7 +563,7 @@ int setup_macvlan(const char *machine_name, pid_t pid, char **ifaces) {
|
||||
struct ether_addr mac;
|
||||
int ifi;
|
||||
|
||||
ifi = parse_interface(*i);
|
||||
ifi = resolve_interface_or_warn(&rtnl, *i);
|
||||
if (ifi < 0)
|
||||
return ifi;
|
||||
|
||||
@ -657,7 +649,7 @@ int setup_ipvlan(const char *machine_name, pid_t pid, char **ifaces) {
|
||||
_cleanup_free_ char *n = NULL, *a = NULL;
|
||||
int ifi;
|
||||
|
||||
ifi = parse_interface(*i);
|
||||
ifi = resolve_interface_or_warn(&rtnl, *i);
|
||||
if (ifi < 0)
|
||||
return ifi;
|
||||
|
||||
|
@ -94,14 +94,14 @@ int ifname_mangle(const char *s) {
|
||||
if (!iface)
|
||||
return log_oom();
|
||||
|
||||
ifi = parse_ifindex_or_ifname(iface);
|
||||
ifi = resolve_interface(NULL, 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(ifi, "Unknown interface '%s': %m", iface);
|
||||
return log_error_errno(ifi, "Failed to resolve interface \"%s\": %m", iface);
|
||||
}
|
||||
|
||||
if (arg_ifindex > 0 && arg_ifindex != ifi)
|
||||
@ -1828,9 +1828,9 @@ static int verb_status(int argc, char **argv, void *userdata) {
|
||||
STRV_FOREACH(ifname, argv + 1) {
|
||||
int ifindex, q;
|
||||
|
||||
ifindex = parse_ifindex_or_ifname(*ifname);
|
||||
ifindex = resolve_interface(NULL, *ifname);
|
||||
if (ifindex < 0) {
|
||||
log_warning_errno(ifindex, "Unknown interface '%s', ignoring: %m", *ifname);
|
||||
log_warning_errno(ifindex, "Failed to resolve interface \"%s\", ignoring: %m", *ifname);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,30 @@ int resolve_ifname(sd_netlink **rtnl, const char *name) {
|
||||
return rtnl_resolve_link_alternative_name(rtnl, name);
|
||||
}
|
||||
|
||||
int resolve_interface(sd_netlink **rtnl, const char *name) {
|
||||
int r;
|
||||
|
||||
/* Like resolve_ifname, but resolves interface numbers too. */
|
||||
|
||||
assert(name);
|
||||
|
||||
r = parse_ifindex(name);
|
||||
if (r > 0)
|
||||
return r;
|
||||
assert(r < 0);
|
||||
|
||||
return resolve_ifname(rtnl, name);
|
||||
}
|
||||
|
||||
int resolve_interface_or_warn(sd_netlink **rtnl, const char *name) {
|
||||
int r;
|
||||
|
||||
r = resolve_interface(rtnl, name);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to resolve interface \"%s\": %m", name);
|
||||
return r;
|
||||
}
|
||||
|
||||
int socket_address_parse(SocketAddress *a, const char *s) {
|
||||
_cleanup_free_ char *n = NULL;
|
||||
char *e;
|
||||
@ -318,7 +342,7 @@ int in_addr_ifindex_from_string_auto(const char *s, int *family, union in_addr_u
|
||||
if (suffix) {
|
||||
if (ret_ifindex) {
|
||||
/* If we shall return the interface index, try to parse it */
|
||||
ifindex = parse_ifindex_or_ifname(suffix + 1);
|
||||
ifindex = resolve_interface(NULL, suffix + 1);
|
||||
if (ifindex < 0)
|
||||
return ifindex;
|
||||
}
|
||||
|
@ -8,6 +8,8 @@
|
||||
#include "socket-util.h"
|
||||
|
||||
int resolve_ifname(sd_netlink **rtnl, const char *name);
|
||||
int resolve_interface(sd_netlink **rtnl, const char *name);
|
||||
int resolve_interface_or_warn(sd_netlink **rtnl, const char *name);
|
||||
|
||||
int make_socket_fd(int log_level, const char* address, int type, int flags);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user