To keep the names manageable, "ifname_or_ifindex" is replaced by "interface".
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;
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);
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;
#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"
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;
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;
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;
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;
#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"
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);
#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"
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);
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;
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;
/* udev should be around. */
- ifi = parse_interface(name);
+ ifi = resolve_interface_or_warn(NULL, name);
if (ifi < 0)
return ifi;
_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;
struct ether_addr mac;
int ifi;
- ifi = parse_interface(*i);
+ ifi = resolve_interface_or_warn(&rtnl, *i);
if (ifi < 0)
return ifi;
_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;
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)
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;
}
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;
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;
}
#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);