core: use nmp_utils_sysctl_open_netdir() in platform link operations

This commit is contained in:
Thomas Haller
2016-12-09 12:47:17 +01:00
parent 7fc3eace31
commit a9a41edcbd

View File

@@ -4578,44 +4578,27 @@ nla_put_failure:
static char * static char *
link_get_physical_port_id (NMPlatform *platform, int ifindex) link_get_physical_port_id (NMPlatform *platform, int ifindex)
{ {
const char *ifname; nm_auto_close int dirfd = -1;
char *path, *id; char ifname_verified[IFNAMSIZ];
ifname = nm_platform_link_get_name (platform, ifindex); dirfd = nm_platform_sysctl_open_netdir (platform, ifindex, ifname_verified);
if (!ifname) if (dirfd < 0)
return NULL; return NULL;
return sysctl_get (platform, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname_verified, "phys_port_id"));
ifname = NM_ASSERT_VALID_PATH_COMPONENT (ifname);
path = g_strdup_printf ("/sys/class/net/%s/phys_port_id", ifname);
id = sysctl_get (platform, NMP_SYSCTL_PATHID_ABSOLUTE (path));
g_free (path);
return id;
} }
static guint static guint
link_get_dev_id (NMPlatform *platform, int ifindex) link_get_dev_id (NMPlatform *platform, int ifindex)
{ {
const char *ifname; nm_auto_close int dirfd = -1;
gs_free char *path = NULL, *id = NULL; char ifname_verified[IFNAMSIZ];
gint64 int_val;
ifname = nm_platform_link_get_name (platform, ifindex); dirfd = nm_platform_sysctl_open_netdir (platform, ifindex, ifname_verified);
if (!ifname) if (dirfd < 0)
return 0; return 0;
return nm_platform_sysctl_get_int_checked (platform,
ifname = NM_ASSERT_VALID_PATH_COMPONENT (ifname); NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname_verified, "dev_id"),
16, 0, G_MAXUINT16, 0);
path = g_strdup_printf ("/sys/class/net/%s/dev_id", ifname);
id = sysctl_get (platform, NMP_SYSCTL_PATHID_ABSOLUTE (path));
if (!id || !*id)
return 0;
/* Value is reported as hex */
int_val = _nm_utils_ascii_str_to_int64 (id, 16, 0, G_MAXUINT16, 0);
return errno ? 0 : (int) int_val;
} }
static int static int
@@ -5273,9 +5256,9 @@ _infiniband_partition_action (NMPlatform *platform,
const NMPlatformLink **out_link) const NMPlatformLink **out_link)
{ {
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform); NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
const NMPObject *obj_parent; nm_auto_close int dirfd = -1;
char ifname_parent[IFNAMSIZ];
const NMPObject *obj; const NMPObject *obj;
char path[NM_STRLEN ("/sys/class/net/%s/%s") + IFNAMSIZ + 100];
char id[20]; char id[20];
char name[IFNAMSIZ]; char name[IFNAMSIZ];
gboolean success; gboolean success;
@@ -5283,20 +5266,18 @@ _infiniband_partition_action (NMPlatform *platform,
nm_assert (NM_IN_SET (action, INFINIBAND_ACTION_CREATE_CHILD, INFINIBAND_ACTION_DELETE_CHILD)); nm_assert (NM_IN_SET (action, INFINIBAND_ACTION_CREATE_CHILD, INFINIBAND_ACTION_DELETE_CHILD));
nm_assert (p_key > 0 && p_key <= 0xffff && p_key != 0x8000); nm_assert (p_key > 0 && p_key <= 0xffff && p_key != 0x8000);
obj_parent = nmp_cache_lookup_link (priv->cache, parent); dirfd = nm_platform_sysctl_open_netdir (platform, parent, ifname_parent);
if (!obj_parent || !obj_parent->link.name[0]) { if (dirfd < 0) {
errno = ENOENT; errno = ENOENT;
return FALSE; return FALSE;
} }
nm_sprintf_buf (path,
"/sys/class/net/%s/%s",
NM_ASSERT_VALID_PATH_COMPONENT (obj_parent->link.name),
(action == INFINIBAND_ACTION_CREATE_CHILD
? "create_child"
: "delete_child"));
nm_sprintf_buf (id, "0x%04x", p_key); nm_sprintf_buf (id, "0x%04x", p_key);
success = nm_platform_sysctl_set (platform, NMP_SYSCTL_PATHID_ABSOLUTE (path), id); if (action == INFINIBAND_ACTION_CREATE_CHILD)
success = nm_platform_sysctl_set (platform, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname_parent, "create_child"), id);
else
success = nm_platform_sysctl_set (platform, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname_parent, "delete_child"), id);
if (!success) { if (!success) {
if ( action == INFINIBAND_ACTION_DELETE_CHILD if ( action == INFINIBAND_ACTION_DELETE_CHILD
&& errno == ENODEV) && errno == ENODEV)
@@ -5304,7 +5285,7 @@ _infiniband_partition_action (NMPlatform *platform,
return FALSE; return FALSE;
} }
nm_utils_new_infiniband_name (name, obj_parent->link.name, p_key); nm_utils_new_infiniband_name (name, ifname_parent, p_key);
do_request_link (platform, 0, name); do_request_link (platform, 0, name);
if (action == INFINIBAND_ACTION_DELETE_CHILD) if (action == INFINIBAND_ACTION_DELETE_CHILD)