glib-aux: move nm_utils_sysctl_ip_conf_*() helpers

This commit is contained in:
Thomas Haller 2021-03-04 09:56:19 +01:00
parent 2ce9cf3e20
commit 3c733cc32e
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
4 changed files with 143 additions and 141 deletions

View file

@ -2507,134 +2507,6 @@ out:
g_array_free(sorted_hashes, TRUE);
}
#define IPV6_PROPERTY_DIR "/proc/sys/net/ipv6/conf/"
#define IPV4_PROPERTY_DIR "/proc/sys/net/ipv4/conf/"
G_STATIC_ASSERT(sizeof(IPV4_PROPERTY_DIR) == sizeof(IPV6_PROPERTY_DIR));
G_STATIC_ASSERT(NM_STRLEN(IPV6_PROPERTY_DIR) + IFNAMSIZ + 60
== NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE);
/**
* nm_utils_sysctl_ip_conf_path:
* @addr_family: either AF_INET or AF_INET6.
* @buf: the output buffer where to write the path. It
* must be at least NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE bytes
* long.
* @ifname: an interface name
* @property: a property name
*
* Returns: the path to IPv6 property @property on @ifname. Note that
* this returns the input argument @buf.
*/
const char *
nm_utils_sysctl_ip_conf_path(int addr_family, char *buf, const char *ifname, const char *property)
{
int len;
nm_assert(buf);
nm_assert_addr_family(addr_family);
g_assert(nm_utils_ifname_valid_kernel(ifname, NULL));
property = NM_ASSERT_VALID_PATH_COMPONENT(property);
len = g_snprintf(buf,
NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE,
"%s%s/%s",
addr_family == AF_INET6 ? IPV6_PROPERTY_DIR : IPV4_PROPERTY_DIR,
ifname,
property);
g_assert(len < NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE - 1);
return buf;
}
gboolean
nm_utils_sysctl_ip_conf_is_path(int addr_family,
const char *path,
const char *ifname,
const char *property)
{
g_return_val_if_fail(path, FALSE);
NM_ASSERT_VALID_PATH_COMPONENT(property);
g_assert(!ifname || nm_utils_ifname_valid_kernel(ifname, NULL));
if (addr_family == AF_INET) {
if (!g_str_has_prefix(path, IPV4_PROPERTY_DIR))
return FALSE;
path += NM_STRLEN(IPV4_PROPERTY_DIR);
} else if (addr_family == AF_INET6) {
if (!g_str_has_prefix(path, IPV6_PROPERTY_DIR))
return FALSE;
path += NM_STRLEN(IPV6_PROPERTY_DIR);
} else
g_return_val_if_reached(FALSE);
if (ifname) {
if (!g_str_has_prefix(path, ifname))
return FALSE;
path += strlen(ifname);
if (path[0] != '/')
return FALSE;
path++;
} else {
const char *slash;
char buf[IFNAMSIZ];
gsize l;
slash = strchr(path, '/');
if (!slash)
return FALSE;
l = slash - path;
if (l >= IFNAMSIZ)
return FALSE;
memcpy(buf, path, l);
buf[l] = '\0';
if (!nm_utils_ifname_valid_kernel(buf, NULL))
return FALSE;
path = slash + 1;
}
if (!nm_streq(path, property))
return FALSE;
return TRUE;
}
gboolean
nm_utils_is_valid_path_component(const char *name)
{
const char *n;
if (name == NULL || name[0] == '\0')
return FALSE;
if (name[0] == '.') {
if (name[1] == '\0')
return FALSE;
if (name[1] == '.' && name[2] == '\0')
return FALSE;
}
n = name;
do {
if (*n == '/')
return FALSE;
} while (*(++n) != '\0');
return TRUE;
}
const char *
NM_ASSERT_VALID_PATH_COMPONENT(const char *name)
{
if (G_LIKELY(nm_utils_is_valid_path_component(name)))
return name;
nm_log_err(LOGD_CORE,
"Failed asserting path component: %s%s%s",
NM_PRINT_FMT_QUOTED(name, "\"", name, "\"", "(null)"));
g_error("FATAL: Failed asserting path component: %s%s%s",
NM_PRINT_FMT_QUOTED(name, "\"", name, "\"", "(null)"));
g_assert_not_reached();
}
/*****************************************************************************/
typedef struct {

View file

@ -235,19 +235,6 @@ void nm_utils_log_connection_diff(NMConnection *connection,
const char * prefix,
const char * dbus_path);
gboolean nm_utils_is_valid_path_component(const char *name);
const char *NM_ASSERT_VALID_PATH_COMPONENT(const char *name);
#define NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE 100
const char *
nm_utils_sysctl_ip_conf_path(int addr_family, char *buf, const char *ifname, const char *property);
gboolean nm_utils_sysctl_ip_conf_is_path(int addr_family,
const char *path,
const char *ifname,
const char *property);
gboolean nm_utils_is_specific_hostname(const char *name);
struct _NMUuid;

View file

@ -5908,3 +5908,131 @@ nm_utils_ip6_address_same_prefix_cmp(const struct in6_addr *addr_a,
}
return 0;
}
/*****************************************************************************/
#define IPV6_PROPERTY_DIR "/proc/sys/net/ipv6/conf/"
#define IPV4_PROPERTY_DIR "/proc/sys/net/ipv4/conf/"
G_STATIC_ASSERT(sizeof(IPV4_PROPERTY_DIR) == sizeof(IPV6_PROPERTY_DIR));
G_STATIC_ASSERT(NM_STRLEN(IPV6_PROPERTY_DIR) + IFNAMSIZ + 60
== NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE);
/**
* nm_utils_sysctl_ip_conf_path:
* @addr_family: either AF_INET or AF_INET6.
* @buf: the output buffer where to write the path. It
* must be at least NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE bytes
* long.
* @ifname: an interface name
* @property: a property name
*
* Returns: the path to IPv6 property @property on @ifname. Note that
* this returns the input argument @buf.
*/
const char *
nm_utils_sysctl_ip_conf_path(int addr_family, char *buf, const char *ifname, const char *property)
{
int len;
nm_assert(buf);
nm_assert_addr_family(addr_family);
g_assert(nm_utils_ifname_valid_kernel(ifname, NULL));
property = NM_ASSERT_VALID_PATH_COMPONENT(property);
len = g_snprintf(buf,
NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE,
"%s%s/%s",
addr_family == AF_INET6 ? IPV6_PROPERTY_DIR : IPV4_PROPERTY_DIR,
ifname,
property);
g_assert(len < NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE - 1);
return buf;
}
gboolean
nm_utils_sysctl_ip_conf_is_path(int addr_family,
const char *path,
const char *ifname,
const char *property)
{
g_return_val_if_fail(path, FALSE);
NM_ASSERT_VALID_PATH_COMPONENT(property);
g_assert(!ifname || nm_utils_ifname_valid_kernel(ifname, NULL));
if (addr_family == AF_INET) {
if (!g_str_has_prefix(path, IPV4_PROPERTY_DIR))
return FALSE;
path += NM_STRLEN(IPV4_PROPERTY_DIR);
} else if (addr_family == AF_INET6) {
if (!g_str_has_prefix(path, IPV6_PROPERTY_DIR))
return FALSE;
path += NM_STRLEN(IPV6_PROPERTY_DIR);
} else
g_return_val_if_reached(FALSE);
if (ifname) {
if (!g_str_has_prefix(path, ifname))
return FALSE;
path += strlen(ifname);
if (path[0] != '/')
return FALSE;
path++;
} else {
const char *slash;
char buf[IFNAMSIZ];
gsize l;
slash = strchr(path, '/');
if (!slash)
return FALSE;
l = slash - path;
if (l >= IFNAMSIZ)
return FALSE;
memcpy(buf, path, l);
buf[l] = '\0';
if (!nm_utils_ifname_valid_kernel(buf, NULL))
return FALSE;
path = slash + 1;
}
if (!nm_streq(path, property))
return FALSE;
return TRUE;
}
gboolean
nm_utils_is_valid_path_component(const char *name)
{
const char *n;
if (name == NULL || name[0] == '\0')
return FALSE;
if (name[0] == '.') {
if (name[1] == '\0')
return FALSE;
if (name[1] == '.' && name[2] == '\0')
return FALSE;
}
n = name;
do {
if (*n == '/')
return FALSE;
} while (*(++n) != '\0');
return TRUE;
}
const char *
NM_ASSERT_VALID_PATH_COMPONENT(const char *name)
{
if (G_LIKELY(nm_utils_is_valid_path_component(name)))
return name;
g_error("FATAL: Failed asserting path component: %s%s%s",
NM_PRINT_FMT_QUOTED(name, "\"", name, "\"", "(null)"));
g_assert_not_reached();
}

View file

@ -2713,4 +2713,19 @@ gboolean _nm_utils_is_empty_ssid_gbytes(GBytes *ssid);
char * _nm_utils_ssid_to_string_arr(const guint8 *ssid, gsize len);
char * _nm_utils_ssid_to_string_gbytes(GBytes *ssid);
/*****************************************************************************/
gboolean nm_utils_is_valid_path_component(const char *name);
const char *NM_ASSERT_VALID_PATH_COMPONENT(const char *name);
#define NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE 100
const char *
nm_utils_sysctl_ip_conf_path(int addr_family, char *buf, const char *ifname, const char *property);
gboolean nm_utils_sysctl_ip_conf_is_path(int addr_family,
const char *path,
const char *ifname,
const char *property);
#endif /* __NM_SHARED_UTILS_H__ */