mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-14 06:40:23 +01:00
nm-shared-utils: add nm_utils_ifname_valid*() to shared utils
Move the body of nm_utils_is_valid_iface_name() to
nm_utils_ifname_valid_kernel() so that it's shared between NM and
clients.
(cherry picked from commit 550f538564)
This commit is contained in:
parent
5fb293cfc6
commit
2cf568bd8f
3 changed files with 103 additions and 40 deletions
|
|
@ -14,7 +14,6 @@
|
|||
#include <libintl.h>
|
||||
#include <gmodule.h>
|
||||
#include <sys/stat.h>
|
||||
#include <net/if.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
|
||||
#if WITH_JSON_VALIDATION
|
||||
|
|
@ -4718,45 +4717,7 @@ nm_utils_is_valid_iface_name_utf8safe (const char *utf8safe_name)
|
|||
gboolean
|
||||
nm_utils_is_valid_iface_name (const char *name, GError **error)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!name) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is missing"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (name[0] == '\0') {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is too short"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( name[0] == '.'
|
||||
&& ( name[1] == '\0'
|
||||
|| ( name[1] == '.'
|
||||
&& name[2] == '\0'))) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is reserved"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < IFNAMSIZ; i++) {
|
||||
char ch = name[i];
|
||||
|
||||
if (ch == '\0')
|
||||
return TRUE;
|
||||
if ( NM_IN_SET (ch, '/', ':')
|
||||
|| g_ascii_isspace (ch)) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name contains an invalid character"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is longer than 15 characters"));
|
||||
return FALSE;
|
||||
return nm_utils_ifname_valid_kernel (name, error);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <fcntl.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <glib-unix.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#include "nm-errno.h"
|
||||
|
||||
|
|
@ -3987,3 +3988,91 @@ nm_utils_g_main_context_create_integrate_source (GMainContext *inner_context)
|
|||
|
||||
return &ctx_src->source;
|
||||
}
|
||||
|
||||
gboolean
|
||||
nm_utils_ifname_valid_kernel (const char *name, GError **error)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!name) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is missing"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (name[0] == '\0') {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is too short"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( name[0] == '.'
|
||||
&& ( name[1] == '\0'
|
||||
|| ( name[1] == '.'
|
||||
&& name[2] == '\0'))) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is reserved"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < IFNAMSIZ; i++) {
|
||||
char ch = name[i];
|
||||
|
||||
if (ch == '\0')
|
||||
return TRUE;
|
||||
if ( NM_IN_SET (ch, '/', ':')
|
||||
|| g_ascii_isspace (ch)) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name contains an invalid character"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name is longer than 15 characters"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_nm_utils_ifname_valid_ovs (const char* name, GError **error)
|
||||
{
|
||||
const char *ch;
|
||||
|
||||
for (ch = name; *ch; ++ch) {
|
||||
if ( *ch == '\\'
|
||||
|| *ch == '/'
|
||||
|| g_ascii_isspace (*ch)
|
||||
|| !g_ascii_isalnum (*ch)) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name must be alphanumerical with "
|
||||
"no forward or backward slashes"));
|
||||
return FALSE;
|
||||
}
|
||||
};
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
nm_utils_ifname_valid (const char* name,
|
||||
NMUtilsIfaceType type,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (!error || !(*error), FALSE);
|
||||
|
||||
if (!name || !(name[0])) {
|
||||
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
|
||||
_("interface name must not be empty"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_return_val_if_fail (g_utf8_validate (name, -1, NULL), FALSE);
|
||||
|
||||
switch (type) {
|
||||
case NMU_IFACE_KERNEL:
|
||||
return nm_utils_ifname_valid_kernel (name, error);
|
||||
case NMU_IFACE_OVS:
|
||||
return _nm_utils_ifname_valid_ovs (name, error);
|
||||
}
|
||||
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1440,4 +1440,17 @@ guint nm_utils_parse_debug_string (const char *string,
|
|||
const GDebugKey *keys,
|
||||
guint nkeys);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef enum {
|
||||
NMU_IFACE_KERNEL = 0,
|
||||
NMU_IFACE_OVS,
|
||||
} NMUtilsIfaceType;
|
||||
|
||||
gboolean nm_utils_ifname_valid_kernel (const char *name, GError **error);
|
||||
|
||||
gboolean nm_utils_ifname_valid (const char* name,
|
||||
NMUtilsIfaceType type,
|
||||
GError **error);
|
||||
|
||||
#endif /* __NM_SHARED_UTILS_H__ */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue