static void ui_to_setting (CEPageInfiniband *self) { CEPageInfinibandPrivate *priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self); const char *mode; GByteArray *device_mac = NULL; GtkWidget *entry; /* Transport mode */ if (gtk_combo_box_get_active (priv->transport_mode) == TRANSPORT_MODE_CONNECTED) mode = "connected"; else mode = "datagram"; entry = gtk_bin_get_child (GTK_BIN (priv->device_mac)); if (entry) device_mac = nm_utils_hwaddr_atoba (gtk_entry_get_text (GTK_ENTRY (entry)), ARPHRD_INFINIBAND); g_object_set (priv->setting, NM_SETTING_INFINIBAND_MAC_ADDRESS, device_mac, NM_SETTING_INFINIBAND_MTU, (guint32) gtk_spin_button_get_value_as_int (priv->mtu), NM_SETTING_INFINIBAND_TRANSPORT_MODE, mode, NULL); if (device_mac) g_byte_array_free (device_mac, TRUE); }
static gboolean hwaddr_matches (NMDevice *device, NMConnection *connection, const guint8 *other_hwaddr, guint other_hwaddr_len, gboolean fail_if_no_hwaddr) { NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (device); NMSettingBluetooth *s_bt; const GByteArray *mac = NULL; gboolean matches = FALSE; GByteArray *devmac; s_bt = nm_connection_get_setting_bluetooth (connection); if (s_bt) mac = nm_setting_bluetooth_get_bdaddr (s_bt); if (mac) { devmac = nm_utils_hwaddr_atoba (priv->bdaddr, ARPHRD_ETHER); g_return_val_if_fail (devmac != NULL, FALSE); g_return_val_if_fail (devmac->len == mac->len, FALSE); if (other_hwaddr) { g_return_val_if_fail (other_hwaddr_len == devmac->len, FALSE); matches = (memcmp (mac->data, other_hwaddr, mac->len) == 0) ? TRUE : FALSE; } else matches = (memcmp (mac->data, devmac->data, mac->len) == 0) ? TRUE : FALSE; g_byte_array_free (devmac, TRUE); return matches; } else if (fail_if_no_hwaddr == FALSE) return TRUE; return FALSE; }
static void mac_address_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); char *tmp_string = NULL, *p; gint *tmp_list; GByteArray *array = NULL; gsize length; int i, type; p = tmp_string = g_key_file_get_string (keyfile, setting_name, key, NULL); if (tmp_string) { /* Look for enough ':' characters to signify a MAC address */ i = 0; while (*p) { if (*p == ':') i++; p++; } /* If we found enough it's probably a string-format MAC address */ type = nm_utils_hwaddr_type (i + 1); if (type > 0) array = nm_utils_hwaddr_atoba (tmp_string, type); } g_free (tmp_string); if (array == NULL) { /* Old format; list of ints */ tmp_list = g_key_file_get_integer_list (keyfile, setting_name, key, &length, NULL); type = nm_utils_hwaddr_type (length); if (type < 0) { array = g_byte_array_sized_new (length); for (i = 0; i < length; i++) { int val = tmp_list[i]; const guint8 v = (guint8) (val & 0xFF); if (val < 0 || val > 255) { g_warning ("%s: %s / %s ignoring invalid byte element '%d' (not " " between 0 and 255 inclusive)", __func__, setting_name, key, val); g_byte_array_free (array, TRUE); array = NULL; break; } g_byte_array_append (array, &v, 1); } } g_free (tmp_list); } if (array) { g_object_set (setting, key, array, NULL); g_byte_array_free (array, TRUE); } else { g_warning ("%s: ignoring invalid MAC address for %s / %s", __func__, setting_name, key); } }
static void mac_address_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) { const char *setting_name = nm_setting_get_name (setting); char *tmp_string = NULL, *p; gint *tmp_list; GByteArray *array = NULL; gsize length; int i; p = tmp_string = g_key_file_get_string (keyfile, setting_name, key, NULL); if (tmp_string) { /* Look for enough ':' characters to signify a MAC address */ i = 0; while (*p) { if (*p == ':') i++; p++; } if (i == 5) { /* parse as a MAC address */ array = nm_utils_hwaddr_atoba (tmp_string, ARPHRD_ETHER); if (array) { g_free (tmp_string); goto done; } } } g_free (tmp_string); /* Old format; list of ints */ tmp_list = g_key_file_get_integer_list (keyfile, setting_name, key, &length, NULL); array = g_byte_array_sized_new (length); for (i = 0; i < length; i++) { int val = tmp_list[i]; unsigned char v = (unsigned char) (val & 0xFF); if (val < 0 || val > 255) { g_warning ("%s: %s / %s ignoring invalid byte element '%d' (not " " between 0 and 255 inclusive)", __func__, setting_name, key, val); } else g_byte_array_append (array, (const unsigned char *) &v, sizeof (v)); } g_free (tmp_list); done: if (array->len == ETH_ALEN) { g_object_set (setting, key, array, NULL); } else { g_warning ("%s: ignoring invalid MAC address for %s / %s", __func__, setting_name, key); } g_byte_array_free (array, TRUE); }
static void bind_device_to_connection (SCPluginIfupdown *self, GUdevDevice *device, NMIfupdownConnection *exported) { GByteArray *mac_address; NMSettingWired *s_wired; NMSettingWireless *s_wifi; const char *iface, *address; iface = g_udev_device_get_name (device); if (!iface) { PLUGIN_WARN ("SCPluginIfupdown", "failed to get ifname for device."); return; } address = g_udev_device_get_sysfs_attr (device, "address"); if (!address || !strlen (address)) { PLUGIN_WARN ("SCPluginIfupdown", "failed to get MAC address for %s", iface); return; } mac_address = nm_utils_hwaddr_atoba (address, ARPHRD_ETHER); if (!mac_address) { PLUGIN_WARN ("SCPluginIfupdown", "failed to parse MAC address '%s' for %s", address, iface); return; } s_wired = nm_connection_get_setting_wired (NM_CONNECTION (exported)); s_wifi = nm_connection_get_setting_wireless (NM_CONNECTION (exported)); if (s_wired) { PLUGIN_PRINT ("SCPluginIfupdown", "locking wired connection setting"); g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, mac_address, NULL); } else if (s_wifi) { PLUGIN_PRINT ("SCPluginIfupdown", "locking wireless connection setting"); g_object_set (s_wifi, NM_SETTING_WIRELESS_MAC_ADDRESS, mac_address, NULL); } g_byte_array_free (mac_address, TRUE); nm_settings_connection_commit_changes (NM_SETTINGS_CONNECTION (exported), ignore_cb, NULL); }