static gboolean demarshal_ip4_address_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) { NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object); g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip4_address_unref); priv->addresses = NULL; priv->addresses = nm_utils_ip4_addresses_from_gvalue (value); _nm_object_queue_notify (object, NM_IP4_CONFIG_ADDRESSES); return TRUE; }
static void set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { NMSettingIP4Config *setting = NM_SETTING_IP4_CONFIG (object); NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); switch (prop_id) { case PROP_METHOD: g_free (priv->method); priv->method = g_value_dup_string (value); break; case PROP_DNS: g_array_free (priv->dns, TRUE); priv->dns = g_value_dup_boxed (value); if (!priv->dns) priv->dns = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3); break; case PROP_DNS_SEARCH: nm_utils_slist_free (priv->dns_search, g_free); priv->dns_search = g_value_dup_boxed (value); break; case PROP_ADDRESSES: nm_utils_slist_free (priv->addresses, (GDestroyNotify) nm_ip4_address_unref); priv->addresses = nm_utils_ip4_addresses_from_gvalue (value); break; case PROP_ROUTES: nm_utils_slist_free (priv->routes, (GDestroyNotify) nm_ip4_route_unref); priv->routes = nm_utils_ip4_routes_from_gvalue (value); break; case PROP_IGNORE_AUTO_ROUTES: priv->ignore_auto_routes = g_value_get_boolean (value); break; case PROP_IGNORE_AUTO_DNS: priv->ignore_auto_dns = g_value_get_boolean (value); break; case PROP_DHCP_CLIENT_ID: g_free (priv->dhcp_client_id); priv->dhcp_client_id = g_value_dup_string (value); break; case PROP_DHCP_SEND_HOSTNAME: priv->dhcp_send_hostname = g_value_get_boolean (value); break; case PROP_DHCP_HOSTNAME: g_free (priv->dhcp_hostname); priv->dhcp_hostname = g_value_dup_string (value); /* FIXME: Is this a good idea? */ if (priv->dhcp_hostname) priv->dhcp_send_hostname = TRUE; break; case PROP_NEVER_DEFAULT: priv->never_default = g_value_get_boolean (value); break; case PROP_MAY_FAIL: priv->may_fail = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static GSList * construct_ip4_items (GSList *items, GHashTable *ip4_config, const char *prefix) { GSList *addresses = NULL, *routes = NULL, *iter; GArray *dns = NULL, *wins = NULL; guint32 num, i; GString *tmp; GValue *val; if (ip4_config == NULL) return items; if (prefix == NULL) prefix = ""; /* IP addresses */ val = g_hash_table_lookup (ip4_config, "addresses"); if (val) addresses = nm_utils_ip4_addresses_from_gvalue (val); for (iter = addresses, num = 0; iter; iter = g_slist_next (iter)) { NMIP4Address *addr = (NMIP4Address *) iter->data; char str_addr[INET_ADDRSTRLEN + 1]; char str_gw[INET_ADDRSTRLEN + 1]; struct in_addr tmp_addr; guint32 ip_prefix = nm_ip4_address_get_prefix (addr); char *addrtmp; memset (str_addr, 0, sizeof (str_addr)); tmp_addr.s_addr = nm_ip4_address_get_address (addr); if (!inet_ntop (AF_INET, &tmp_addr, str_addr, sizeof (str_addr))) continue; memset (str_gw, 0, sizeof (str_gw)); tmp_addr.s_addr = nm_ip4_address_get_gateway (addr); inet_ntop (AF_INET, &tmp_addr, str_gw, sizeof (str_gw)); addrtmp = g_strdup_printf ("%sIP4_ADDRESS_%d=%s/%d %s", prefix, num++, str_addr, ip_prefix, str_gw); items = g_slist_prepend (items, addrtmp); } if (num) items = g_slist_prepend (items, g_strdup_printf ("%sIP4_NUM_ADDRESSES=%d", prefix, num)); if (addresses) { g_slist_foreach (addresses, (GFunc) nm_ip4_address_unref, NULL); g_slist_free (addresses); } /* DNS servers */ val = g_hash_table_lookup (ip4_config, "nameservers"); if (val && G_VALUE_HOLDS (val, DBUS_TYPE_G_UINT_ARRAY)) dns = (GArray *) g_value_get_boxed (val); if (dns && (dns->len > 0)) { gboolean first = TRUE; tmp = g_string_new (NULL); g_string_append_printf (tmp, "%sIP4_NAMESERVERS=", prefix); for (i = 0; i < dns->len; i++) { struct in_addr addr; char buf[INET_ADDRSTRLEN + 1]; addr.s_addr = g_array_index (dns, guint32, i); memset (buf, 0, sizeof (buf)); if (inet_ntop (AF_INET, &addr, buf, sizeof (buf))) { if (!first) g_string_append_c (tmp, ' '); g_string_append (tmp, buf); first = FALSE; } } items = g_slist_prepend (items, tmp->str); g_string_free (tmp, FALSE); } /* Search domains */ items = add_domains (items, ip4_config, prefix, '4'); /* WINS servers */ val = g_hash_table_lookup (ip4_config, "wins-servers"); if (val && G_VALUE_HOLDS (val, DBUS_TYPE_G_UINT_ARRAY)) wins = (GArray *) g_value_get_boxed (val); if (wins && wins->len) { gboolean first = TRUE; tmp = g_string_new (NULL); g_string_append_printf (tmp, "%sIP4_WINS_SERVERS=", prefix); for (i = 0; i < wins->len; i++) { struct in_addr addr; char buf[INET_ADDRSTRLEN + 1]; addr.s_addr = g_array_index (wins, guint32, i); memset (buf, 0, sizeof (buf)); if (inet_ntop (AF_INET, &addr, buf, sizeof (buf))) { if (!first) g_string_append_c (tmp, ' '); g_string_append (tmp, buf); first = FALSE; } } items = g_slist_prepend (items, tmp->str); g_string_free (tmp, FALSE); } /* Static routes */ val = g_hash_table_lookup (ip4_config, "routes"); if (val) routes = nm_utils_ip4_routes_from_gvalue (val); for (iter = routes, num = 0; iter; iter = g_slist_next (iter)) { NMIP4Route *route = (NMIP4Route *) iter->data; char str_addr[INET_ADDRSTRLEN + 1]; char str_nh[INET_ADDRSTRLEN + 1]; struct in_addr tmp_addr; guint32 ip_prefix = nm_ip4_route_get_prefix (route); guint32 metric = nm_ip4_route_get_metric (route); char *routetmp; memset (str_addr, 0, sizeof (str_addr)); tmp_addr.s_addr = nm_ip4_route_get_dest (route); if (!inet_ntop (AF_INET, &tmp_addr, str_addr, sizeof (str_addr))) continue; memset (str_nh, 0, sizeof (str_nh)); tmp_addr.s_addr = nm_ip4_route_get_next_hop (route); inet_ntop (AF_INET, &tmp_addr, str_nh, sizeof (str_nh)); routetmp = g_strdup_printf ("%sIP4_ROUTE_%d=%s/%d %s %d", prefix, num++, str_addr, ip_prefix, str_nh, metric); items = g_slist_prepend (items, routetmp); } items = g_slist_prepend (items, g_strdup_printf ("%sIP4_NUM_ROUTES=%d", prefix, num)); if (routes) { g_slist_foreach (routes, (GFunc) nm_ip4_route_unref, NULL); g_slist_free (routes); } return items; }