diff options
author | Thomas Haller <thaller@redhat.com> | 2014-11-20 23:39:21 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-01-24 18:27:12 +0100 |
commit | 49d700e862cd16ab398439790ebe889856f1e6cb (patch) | |
tree | 81d78869a27bc96bc15d5067b86074a829eebfe6 | |
parent | 92d800b2e35b4c36c13dfb088f1d7a69b83f7191 (diff) | |
download | NetworkManager-49d700e862cd16ab398439790ebe889856f1e6cb.tar.gz |
core: add intersect() functions to NMIP?Config
-rw-r--r-- | src/nm-ip4-config.c | 82 | ||||
-rw-r--r-- | src/nm-ip4-config.h | 1 | ||||
-rw-r--r-- | src/nm-ip6-config.c | 70 | ||||
-rw-r--r-- | src/nm-ip6-config.h | 1 |
4 files changed, 154 insertions, 0 deletions
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 6e86365c92..97ca718a5e 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -740,6 +740,88 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src) g_object_thaw_notify (G_OBJECT (dst)); } +void +nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src) +{ + guint32 i; + gint idx; + + g_return_if_fail (src != NULL); + g_return_if_fail (dst != NULL); + + g_object_freeze_notify (G_OBJECT (dst)); + + /* addresses */ + for (i = 0; i < nm_ip4_config_get_num_addresses (dst); ) { + idx = _addresses_get_index (src, nm_ip4_config_get_address (dst, i)); + if (idx < 0) + nm_ip4_config_del_address (dst, i); + else + i++; + } + + /* nameservers */ + for (i = 0; i < nm_ip4_config_get_num_nameservers (dst); ) { + idx = _nameservers_get_index (src, nm_ip4_config_get_nameserver (dst, i)); + if (idx < 0) + nm_ip4_config_del_nameserver (dst, i); + else + i++; + } + + /* default gateway */ + if ( !nm_ip4_config_get_num_addresses (dst) + || (nm_ip4_config_get_gateway (src) != nm_ip4_config_get_gateway (dst))) + nm_ip4_config_set_gateway (dst, 0); + + /* routes */ + for (i = 0; i < nm_ip4_config_get_num_routes (dst); ) { + idx = _routes_get_index (src, nm_ip4_config_get_route (dst, i)); + if (idx < 0) + nm_ip4_config_del_route (dst, i); + else + i++; + } + + /* domains */ + for (i = 0; i < nm_ip4_config_get_num_domains (dst); ) { + idx = _domains_get_index (src, nm_ip4_config_get_domain (dst, i)); + if (idx < 0) + nm_ip4_config_del_domain (dst, i); + else + i++; + } + + /* dns searches */ + for (i = 0; i < nm_ip4_config_get_num_searches (dst); ) { + idx = _searches_get_index (src, nm_ip4_config_get_search (dst, i)); + if (idx < 0) + nm_ip4_config_del_search (dst, i); + else + i++; + } + + /* NIS */ + for (i = 0; i < nm_ip4_config_get_num_nis_servers (dst); ) { + idx = _nis_servers_get_index (src, nm_ip4_config_get_nis_server (dst, i)); + if (idx < 0) + nm_ip4_config_del_nis_server (dst, i); + else + i++; + } + + /* WINS */ + for (i = 0; i < nm_ip4_config_get_num_wins (dst); ) { + idx = _wins_get_index (src, nm_ip4_config_get_wins (dst, i)); + if (idx < 0) + nm_ip4_config_del_wins (dst, i); + else + i++; + } + + g_object_thaw_notify (G_OBJECT (dst)); +} + /** * nm_ip4_config_replace: diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h index 5ac455d84f..2b3b24e6af 100644 --- a/src/nm-ip4-config.h +++ b/src/nm-ip4-config.h @@ -71,6 +71,7 @@ NMSetting *nm_ip4_config_create_setting (const NMIP4Config *config); /* Utility functions */ void nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src); void nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src); +void nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src); gboolean nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relevant_changes); gboolean nm_ip4_config_destination_is_direct (const NMIP4Config *config, guint32 dest, int plen); void nm_ip4_config_dump (const NMIP4Config *config, const char *detail); diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 950adc1967..a148d826e6 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -801,6 +801,76 @@ nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src) g_object_thaw_notify (G_OBJECT (dst)); } +void +nm_ip6_config_intersect (NMIP6Config *dst, const NMIP6Config *src) +{ + guint i; + gint idx; + const struct in6_addr *dst_tmp, *src_tmp; + + g_return_if_fail (src != NULL); + g_return_if_fail (dst != NULL); + + g_object_freeze_notify (G_OBJECT (dst)); + + /* addresses */ + for (i = 0; i < nm_ip6_config_get_num_addresses (dst); ) { + idx = _addresses_get_index (src, nm_ip6_config_get_address (dst, i)); + if (idx < 0) + nm_ip6_config_del_address (dst, i); + else + i++; + } + + /* nameservers */ + for (i = 0; i < nm_ip6_config_get_num_nameservers (dst); ) { + idx = _nameservers_get_index (src, nm_ip6_config_get_nameserver (dst, i)); + if (idx < 0) + nm_ip6_config_del_nameserver (dst, i); + else + i++; + } + + /* default gateway */ + dst_tmp = nm_ip6_config_get_gateway (dst); + if (dst_tmp) { + src_tmp = nm_ip6_config_get_gateway (src); + if ( !nm_ip6_config_get_num_addresses (dst) + || !src_tmp + || !IN6_ARE_ADDR_EQUAL (src_tmp, dst_tmp)) + nm_ip6_config_set_gateway (dst, NULL); + } + + /* routes */ + for (i = 0; i < nm_ip6_config_get_num_routes (dst); ) { + idx = _routes_get_index (src, nm_ip6_config_get_route (dst, i)); + if (idx < 0) + nm_ip6_config_del_route (dst, i); + else + i++; + } + + /* domains */ + for (i = 0; i < nm_ip6_config_get_num_domains (src); ) { + idx = _domains_get_index (src, nm_ip6_config_get_domain (dst, i)); + if (idx < 0) + nm_ip6_config_del_domain (dst, i); + else + i++; + } + + /* dns searches */ + for (i = 0; i < nm_ip6_config_get_num_searches (src); i++) { + idx = _searches_get_index (src, nm_ip6_config_get_search (dst, i)); + if (idx < 0) + nm_ip6_config_del_search (dst, i); + else + i++; + } + + g_object_thaw_notify (G_OBJECT (dst)); +} + /** * nm_ip6_config_replace: * @dst: config which will be replaced with everything in @src diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h index f1d2dc8dd9..04c9e00341 100644 --- a/src/nm-ip6-config.h +++ b/src/nm-ip6-config.h @@ -71,6 +71,7 @@ NMSetting *nm_ip6_config_create_setting (const NMIP6Config *config); /* Utility functions */ void nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src); void nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src); +void nm_ip6_config_intersect (NMIP6Config *dst, const NMIP6Config *src); gboolean nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relevant_changes); int nm_ip6_config_destination_is_direct (const NMIP6Config *config, const struct in6_addr *dest, int plen); void nm_ip6_config_dump (const NMIP6Config *config, const char *detail); |