summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2014-12-05 13:45:19 +0100
committerThomas Haller <thaller@redhat.com>2014-12-08 19:14:31 +0100
commit37361a038f0dbc503943552d9bf4297451bea417 (patch)
tree1b7b2701d2b6483301823b3424bea1b00193b6dc
parent937a5639fccd8eb295e9bf2f11a5774cb1989195 (diff)
downloadNetworkManager-37361a038f0dbc503943552d9bf4297451bea417.tar.gz
dispatcher: refactor constructing environment variables from strv
This also avoids warnings with -O2 -Wstrict-overflow (gcc-4.8.3): make[4]: Entering directory `./NetworkManager/callouts' CC libtest_dispatcher_envp_la-nm-dispatcher-utils.lo nm-dispatcher-utils.c: In function 'construct_ip6_items': nm-dispatcher-utils.c:283:8: error: assuming signed overflow does not occur when simplifying conditional to constant [-Werror=strict-overflow] if (i != 0) ^ nm-dispatcher-utils.c: In function 'construct_ip4_items': nm-dispatcher-utils.c:144:8: error: assuming signed overflow does not occur when simplifying conditional to constant [-Werror=strict-overflow] if (i != 0) ^ nm-dispatcher-utils.c:168:8: error: assuming signed overflow does not occur when simplifying conditional to constant [-Werror=strict-overflow] if (i != 0) ^ https://bugzilla.gnome.org/show_bug.cgi?id=741168
-rw-r--r--callouts/nm-dispatcher-utils.c113
1 files changed, 43 insertions, 70 deletions
diff --git a/callouts/nm-dispatcher-utils.c b/callouts/nm-dispatcher-utils.c
index 5b1419db1b..99616c1a12 100644
--- a/callouts/nm-dispatcher-utils.c
+++ b/callouts/nm-dispatcher-utils.c
@@ -53,6 +53,37 @@ construct_basic_items (GSList *list,
return list;
}
+static GSList *_list_append_val_strv (GSList *items, char **values, const char *format, ...) G_GNUC_PRINTF(3, 4);
+
+static GSList *
+_list_append_val_strv (GSList *items, char **values, const char *format, ...)
+{
+ if (!values)
+ g_return_val_if_reached (items);
+
+ /* Only add an item if the list of @values is not empty */
+ if (values[0]) {
+ va_list args;
+ guint i;
+ GString *str = g_string_new (NULL);
+
+ va_start (args, format);
+ g_string_append_vprintf (str, format, args);
+ va_end (args);
+
+ g_string_append (str, values[0]);
+ for (i = 1; values[i]; i++) {
+ g_string_append_c (str, ' ');
+ g_string_append (str, values[i]);
+ }
+ items = g_slist_prepend (items, g_string_free (str, FALSE));
+ }
+
+ /* we take ownership of the values array and free it. */
+ g_strfreev (values);
+ return items;
+}
+
static GSList *
add_domains (GSList *items,
GVariant *dict,
@@ -60,32 +91,14 @@ add_domains (GSList *items,
const char four_or_six)
{
GVariant *val;
- char **domains = NULL;
- GString *tmp;
- guint i;
/* Search domains */
val = g_variant_lookup_value (dict, "domains", G_VARIANT_TYPE_STRING_ARRAY);
- if (!val)
- return items;
-
- domains = g_variant_dup_strv (val, NULL);
- g_variant_unref (val);
- if (!domains[0]) {
- g_strfreev (domains);
- return items;
- }
-
- tmp = g_string_new (NULL);
- g_string_append_printf (tmp, "%sIP%c_DOMAINS=", prefix, four_or_six);
- for (i = 0; domains[i]; i++) {
- if (i > 0)
- g_string_append_c (tmp, ' ');
- g_string_append (tmp, domains[i]);
+ if (val) {
+ items = _list_append_val_strv (items, g_variant_dup_strv (val, NULL),
+ "%sIP%c_DOMAINS=", prefix, four_or_six);
+ g_variant_unref (val);
}
- items = g_slist_prepend (items, g_string_free (tmp, FALSE));
-
- g_strfreev (domains);
return items;
}
@@ -93,8 +106,7 @@ static GSList *
construct_ip4_items (GSList *items, GVariant *ip4_config, const char *prefix)
{
GPtrArray *addresses, *routes;
- char **dns, **wins, *gateway;
- GString *tmp;
+ char *gateway;
GVariant *val;
int i;
@@ -135,20 +147,8 @@ construct_ip4_items (GSList *items, GVariant *ip4_config, const char *prefix)
/* DNS servers */
val = g_variant_lookup_value (ip4_config, "nameservers", G_VARIANT_TYPE ("au"));
if (val) {
- dns = nm_utils_ip4_dns_from_variant (val);
-
- if (dns[0]) {
- tmp = g_string_new (NULL);
- g_string_append_printf (tmp, "%sIP4_NAMESERVERS=", prefix);
- for (i = 0; dns[i]; i++) {
- if (i != 0)
- g_string_append_c (tmp, ' ');
- g_string_append (tmp, dns[i]);
- }
-
- items = g_slist_prepend (items, g_string_free (tmp, FALSE));
- }
- g_strfreev (dns);
+ items = _list_append_val_strv (items, nm_utils_ip4_dns_from_variant (val),
+ "%sIP4_NAMESERVERS=", prefix);
g_variant_unref (val);
}
@@ -158,21 +158,8 @@ construct_ip4_items (GSList *items, GVariant *ip4_config, const char *prefix)
/* WINS servers */
val = g_variant_lookup_value (ip4_config, "wins-servers", G_VARIANT_TYPE ("au"));
if (val) {
- wins = nm_utils_ip4_dns_from_variant (val);
-
- if (wins[0]) {
- tmp = g_string_new (NULL);
- g_string_append_printf (tmp, "%sIP4_WINS_SERVERS=", prefix);
-
- for (i = 0; wins[i]; i++) {
- if (i != 0)
- g_string_append_c (tmp, ' ');
- g_string_append (tmp, wins[i]);
- }
-
- items = g_slist_prepend (items, g_string_free (tmp, FALSE));
- }
- g_strfreev (wins);
+ items = _list_append_val_strv (items, nm_utils_ip4_dns_from_variant (val),
+ "%sIP4_WINS_SERVERS=", prefix);
g_variant_unref (val);
}
@@ -231,8 +218,7 @@ static GSList *
construct_ip6_items (GSList *items, GVariant *ip6_config, const char *prefix)
{
GPtrArray *addresses, *routes;
- char **dns, *gateway = NULL;
- GString *tmp;
+ char *gateway = NULL;
GVariant *val;
int i;
@@ -273,21 +259,8 @@ construct_ip6_items (GSList *items, GVariant *ip6_config, const char *prefix)
/* DNS servers */
val = g_variant_lookup_value (ip6_config, "nameservers", G_VARIANT_TYPE ("aay"));
if (val) {
- dns = nm_utils_ip6_dns_from_variant (val);
-
- if (dns[0]) {
- tmp = g_string_new (NULL);
- g_string_append_printf (tmp, "%sIP6_NAMESERVERS=", prefix);
-
- for (i = 0; dns[i]; i++) {
- if (i != 0)
- g_string_append_c (tmp, ' ');
- g_string_append (tmp, dns[i]);
- }
-
- items = g_slist_prepend (items, g_string_free (tmp, FALSE));
- }
- g_strfreev (dns);
+ items = _list_append_val_strv (items, nm_utils_ip6_dns_from_variant (val),
+ "%sIP6_NAMESERVERS=", prefix);
g_variant_unref (val);
}