void nm_ip4_config_hash (NMIP4Config *config, GChecksum *sum, gboolean dns_only) { guint32 i, n; const char *s; g_return_if_fail (config != NULL); g_return_if_fail (sum != NULL); if (dns_only == FALSE) { for (i = 0; i < nm_ip4_config_get_num_addresses (config); i++) { NMIP4Address *a = nm_ip4_config_get_address (config, i); hash_u32 (sum, nm_ip4_address_get_address (a)); hash_u32 (sum, nm_ip4_address_get_prefix (a)); hash_u32 (sum, nm_ip4_address_get_gateway (a)); } for (i = 0; i < nm_ip4_config_get_num_routes (config); i++) { NMIP4Route *r = nm_ip4_config_get_route (config, i); hash_u32 (sum, nm_ip4_route_get_dest (r)); hash_u32 (sum, nm_ip4_route_get_prefix (r)); hash_u32 (sum, nm_ip4_route_get_next_hop (r)); hash_u32 (sum, nm_ip4_route_get_metric (r)); } n = nm_ip4_config_get_ptp_address (config); if (n) hash_u32 (sum, n); for (i = 0; i < nm_ip4_config_get_num_nis_servers (config); i++) hash_u32 (sum, nm_ip4_config_get_nis_server (config, i)); s = nm_ip4_config_get_nis_domain (config); if (s) g_checksum_update (sum, (const guint8 *) s, strlen (s)); } for (i = 0; i < nm_ip4_config_get_num_nameservers (config); i++) hash_u32 (sum, nm_ip4_config_get_nameserver (config, i)); for (i = 0; i < nm_ip4_config_get_num_wins (config); i++) hash_u32 (sum, nm_ip4_config_get_wins (config, i)); for (i = 0; i < nm_ip4_config_get_num_domains (config); i++) { s = nm_ip4_config_get_domain (config, i); g_checksum_update (sum, (const guint8 *) s, strlen (s)); } for (i = 0; i < nm_ip4_config_get_num_searches (config); i++) { s = nm_ip4_config_get_search (config, i); g_checksum_update (sum, (const guint8 *) s, strlen (s)); } }
static void merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src) { guint32 num, i; num = nm_ip4_config_get_num_nameservers (src); for (i = 0; i < num; i++) { struct in_addr addr; char buf[INET_ADDRSTRLEN]; addr.s_addr = nm_ip4_config_get_nameserver (src, i); if (inet_ntop (AF_INET, &addr, buf, INET_ADDRSTRLEN) > 0) add_string_item (rc->nameservers, buf); } num = nm_ip4_config_get_num_domains (src); for (i = 0; i < num; i++) { const char *domain; domain = nm_ip4_config_get_domain (src, i); if (!rc->domain) rc->domain = domain; add_string_item (rc->searches, domain); } num = nm_ip4_config_get_num_searches (src); for (i = 0; i < num; i++) add_string_item (rc->searches, nm_ip4_config_get_search (src, i)); /* NIS stuff */ num = nm_ip4_config_get_num_nis_servers (src); for (i = 0; i < num; i++) { struct in_addr addr; char buf[INET_ADDRSTRLEN]; addr.s_addr = nm_ip4_config_get_nis_server (src, i); if (inet_ntop (AF_INET, &addr, buf, INET_ADDRSTRLEN) > 0) add_string_item (rc->nis_servers, buf); } if (nm_ip4_config_get_nis_domain (src)) { /* FIXME: handle multiple domains */ if (!rc->nis_domain) rc->nis_domain = nm_ip4_config_get_nis_domain (src); } }
static void dump_ip4_to_props (NMIP4Config *ip4, GVariantBuilder *builder) { GVariantBuilder int_builder; guint n, i; const NMPlatformIP4Address *addr; const NMPlatformIP4Route *route; guint32 array[4]; /* Addresses */ g_variant_builder_init (&int_builder, G_VARIANT_TYPE ("aau")); n = nm_ip4_config_get_num_addresses (ip4); for (i = 0; i < n; i++) { addr = nm_ip4_config_get_address (ip4, i); array[0] = addr->address; array[1] = addr->plen; array[2] = (i == 0) ? nm_ip4_config_get_gateway (ip4) : 0; g_variant_builder_add (&int_builder, "@au", g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32, array, 3, sizeof (guint32))); } g_variant_builder_add (builder, "{sv}", "addresses", g_variant_builder_end (&int_builder)); /* DNS servers */ g_variant_builder_init (&int_builder, G_VARIANT_TYPE ("au")); n = nm_ip4_config_get_num_nameservers (ip4); for (i = 0; i < n; i++) g_variant_builder_add (&int_builder, "u", nm_ip4_config_get_nameserver (ip4, i)); g_variant_builder_add (builder, "{sv}", "nameservers", g_variant_builder_end (&int_builder)); /* Search domains */ g_variant_builder_init (&int_builder, G_VARIANT_TYPE ("as")); n = nm_ip4_config_get_num_domains (ip4); for (i = 0; i < n; i++) g_variant_builder_add (&int_builder, "s", nm_ip4_config_get_domain (ip4, i)); g_variant_builder_add (builder, "{sv}", "domains", g_variant_builder_end (&int_builder)); /* WINS servers */ g_variant_builder_init (&int_builder, G_VARIANT_TYPE ("au")); n = nm_ip4_config_get_num_wins (ip4); for (i = 0; i < n; i++) g_variant_builder_add (&int_builder, "u", nm_ip4_config_get_wins (ip4, i)); g_variant_builder_add (builder, "{sv}", "wins-servers", g_variant_builder_end (&int_builder)); /* Static routes */ g_variant_builder_init (&int_builder, G_VARIANT_TYPE ("aau")); n = nm_ip4_config_get_num_routes (ip4); for (i = 0; i < n; i++) { route = nm_ip4_config_get_route (ip4, i); array[0] = route->network; array[1] = route->plen; array[2] = route->gateway; array[3] = route->metric; g_variant_builder_add (&int_builder, "@au", g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32, array, 4, sizeof (guint32))); } g_variant_builder_add (builder, "{sv}", "routes", g_variant_builder_end (&int_builder)); }
static gboolean add_ip4_config (GString *str, NMIP4Config *ip4, gboolean split) { char buf[INET_ADDRSTRLEN + 1]; struct in_addr addr; int n, i; gboolean added = FALSE; if (split) { char **domains, **iter; /* FIXME: it appears that dnsmasq can only handle one nameserver * per domain (and the manpage says this too) so only use the first * nameserver here. */ addr.s_addr = nm_ip4_config_get_nameserver (ip4, 0); memset (&buf[0], 0, sizeof (buf)); if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf))) return FALSE; /* searches are preferred over domains */ n = nm_ip4_config_get_num_searches (ip4); for (i = 0; i < n; i++) { g_string_append_printf (str, "server=/%s/%s\n", nm_ip4_config_get_search (ip4, i), buf); added = TRUE; } if (n == 0) { /* If not searches, use any domains */ n = nm_ip4_config_get_num_domains (ip4); for (i = 0; i < n; i++) { g_string_append_printf (str, "server=/%s/%s\n", nm_ip4_config_get_domain (ip4, i), buf); added = TRUE; } } /* Ensure reverse-DNS works by directing queries for in-addr.arpa * domains to the split domain's nameserver. */ domains = nm_dns_utils_get_ip4_rdns_domains (ip4); if (domains) { for (iter = domains; iter && *iter; iter++) g_string_append_printf (str, "server=/%s/%s\n", *iter, buf); g_strfreev (domains); added = TRUE; } } /* If no searches or domains, just add the namservers */ if (!added) { n = nm_ip4_config_get_num_nameservers (ip4); for (i = 0; i < n; i++) { memset (&buf[0], 0, sizeof (buf)); addr.s_addr = nm_ip4_config_get_nameserver (ip4, i); if (inet_ntop (AF_INET, &addr, buf, sizeof (buf))) g_string_append_printf (str, "server=%s\n", buf); } } return TRUE; }
static gboolean add_ip4_config (GString *str, NMIP4Config *ip4, gboolean split) { char buf[INET_ADDRSTRLEN]; in_addr_t addr; int nnameservers, i_nameserver, n, i; gboolean added = FALSE; nnameservers = nm_ip4_config_get_num_nameservers (ip4); if (split) { char **domains, **iter; if (nnameservers == 0) return FALSE; for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) { addr = nm_ip4_config_get_nameserver (ip4, i_nameserver); nm_utils_inet4_ntop (addr, buf); /* searches are preferred over domains */ n = nm_ip4_config_get_num_searches (ip4); for (i = 0; i < n; i++) { g_string_append_printf (str, "server=/%s/%s\n", nm_ip4_config_get_search (ip4, i), buf); added = TRUE; } if (n == 0) { /* If not searches, use any domains */ n = nm_ip4_config_get_num_domains (ip4); for (i = 0; i < n; i++) { g_string_append_printf (str, "server=/%s/%s\n", nm_ip4_config_get_domain (ip4, i), buf); added = TRUE; } } /* Ensure reverse-DNS works by directing queries for in-addr.arpa * domains to the split domain's nameserver. */ domains = nm_dns_utils_get_ip4_rdns_domains (ip4); if (domains) { for (iter = domains; iter && *iter; iter++) g_string_append_printf (str, "server=/%s/%s\n", *iter, buf); g_strfreev (domains); added = TRUE; } } } /* If no searches or domains, just add the namservers */ if (!added) { for (i = 0; i < nnameservers; i++) { addr = nm_ip4_config_get_nameserver (ip4, i); g_string_append_printf (str, "server=%s\n", nm_utils_inet4_ntop (addr, NULL)); } } return TRUE; }
static gboolean add_ip4_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP4Config *ip4, const char *iface, gboolean split) { char buf[INET_ADDRSTRLEN + 1 + IFNAMSIZ]; char buf2[INET_ADDRSTRLEN]; in_addr_t addr; int nnameservers, i_nameserver, n, i; gboolean added = FALSE; g_return_val_if_fail (iface, FALSE); nnameservers = nm_ip4_config_get_num_nameservers (ip4); if (split) { char **domains, **iter; if (nnameservers == 0) return FALSE; for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) { addr = nm_ip4_config_get_nameserver (ip4, i_nameserver); g_snprintf (buf, sizeof (buf), "%s@%s", nm_utils_inet4_ntop (addr, buf2), iface); /* searches are preferred over domains */ n = nm_ip4_config_get_num_searches (ip4); for (i = 0; i < n; i++) { add_dnsmasq_nameserver (self, servers, buf, nm_ip4_config_get_search (ip4, i)); added = TRUE; } if (n == 0) { /* If not searches, use any domains */ n = nm_ip4_config_get_num_domains (ip4); for (i = 0; i < n; i++) { add_dnsmasq_nameserver (self, servers, buf, nm_ip4_config_get_domain (ip4, i)); added = TRUE; } } /* Ensure reverse-DNS works by directing queries for in-addr.arpa * domains to the split domain's nameserver. */ domains = get_ip4_rdns_domains (ip4); if (domains) { for (iter = domains; iter && *iter; iter++) add_dnsmasq_nameserver (self, servers, buf, *iter); g_strfreev (domains); } } } /* If no searches or domains, just add the nameservers */ if (!added) { for (i = 0; i < nnameservers; i++) { addr = nm_ip4_config_get_nameserver (ip4, i); g_snprintf (buf, sizeof (buf), "%s@%s", nm_utils_inet4_ntop (addr, buf2), iface); add_dnsmasq_nameserver (self, servers, buf, NULL); } } return TRUE; }