gboolean ce_page_device_entry_get (GtkEntry *entry, int type, gboolean check_ifname, char **ifname, char **mac, const char *device_name, GError **error) { char *first, *second; const char *ifname_tmp = NULL, *mac_tmp = NULL; gboolean valid = TRUE; const char *str; g_return_val_if_fail (entry != NULL, FALSE); g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); str = gtk_entry_get_text (entry); valid = _device_entry_parse (str, &first, &second); if (first) { if (nm_utils_hwaddr_valid (first, nm_utils_hwaddr_len (type))) mac_tmp = first; else if (!check_ifname || nm_utils_iface_valid_name (first)) ifname_tmp = first; else valid = FALSE; } if (second) { if (nm_utils_hwaddr_valid (second, nm_utils_hwaddr_len (type))) { if (!mac_tmp) mac_tmp = second; else valid = FALSE; } else if (!check_ifname || nm_utils_iface_valid_name (second)) { if (!ifname_tmp) ifname_tmp = second; else valid = FALSE; } else valid = FALSE; } if (ifname) *ifname = g_strdup (ifname_tmp); if (mac) *mac = g_strdup (mac_tmp); g_free (first); g_free (second); if (!valid) { g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid %s (%s)"), device_name ? device_name : _("device"), str); } return valid; }
gboolean ce_page_mac_entry_valid (GtkEntry *entry, int type, const char *property_name, GError **error) { const char *mac; g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); mac = gtk_entry_get_text (entry); if (mac && *mac) { if (!nm_utils_hwaddr_valid (mac, nm_utils_hwaddr_len (type))) { const char *addr_type; addr_type = type == ARPHRD_ETHER ? _("MAC address") : _("HW address"); if (property_name) { g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid %s for %s (%s)"), addr_type, property_name, mac); } else { g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid %s (%s)"), addr_type, mac); } return FALSE; } } return TRUE; }
static gboolean device_entry_parse (NmtDeviceEntry *deventry, const char *text, char **interface_name, char **mac_address) { NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry); guint8 buf[NM_UTILS_HWADDR_LEN_MAX]; char **words; int len; *interface_name = *mac_address = NULL; if (!*text) return TRUE; if (priv->hardware_type == G_TYPE_NONE && !priv->device_filter) { if (nm_utils_iface_valid_name (text)) { *interface_name = g_strdup (text); return TRUE; } else return FALSE; } words = g_strsplit (text, " ", -1); if (g_strv_length (words) > 2) { g_strfreev (words); return FALSE; } if (words[1]) { len = strlen (words[1]); if (len < 3 || words[1][0] != '(' || words[1][len - 1] != ')') goto fail; memmove (words[1], words[1] + 1, len - 2); words[1][len - 2] = '\0'; } len = nm_utils_hwaddr_len (priv->arptype); if ( nm_utils_hwaddr_aton (words[0], buf, len) && (!words[1] || nm_utils_iface_valid_name (words[1]))) { *mac_address = words[0]; *interface_name = NULL; g_free (words); return TRUE; } else if ( nm_utils_iface_valid_name (words[0]) && (!words[1] || nm_utils_hwaddr_aton (words[1], buf, len))) { *interface_name = words[0]; *mac_address = NULL; g_free (words); return TRUE; } fail: g_strfreev (words); return FALSE; }