mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-07 09:50:28 +01:00
glib-aux: move nm_utils_sysctl_ip_conf_*() helpers
This commit is contained in:
parent
2ce9cf3e20
commit
3c733cc32e
4 changed files with 143 additions and 141 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue