diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2016-03-24 10:16:39 +0100 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2016-03-24 15:03:04 +0100 |
commit | fd971567b996f950aa784f9b3bd7a57423442e20 (patch) | |
tree | 1da1bc81457a727d31ddfa8caadb03c7842d27e7 | |
parent | 519787e1e4a3f2c33f0f06c2c760ad5c8194d0f1 (diff) | |
download | NetworkManager-fd971567b996f950aa784f9b3bd7a57423442e20.tar.gz |
dhcp: fall back to other clients when an invalid one is specified
If the user specifies an invalid 'dhcp' option in configuration,
currently we disable DHCP. Instead, fall back to other available
clients, as we do for other options.
-rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.c | 53 |
1 files changed, 19 insertions, 34 deletions
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c index 44c3365d2a..de7c895322 100644 --- a/src/dhcp-manager/nm-dhcp-manager.c +++ b/src/dhcp-manager/nm-dhcp-manager.c @@ -113,7 +113,7 @@ find_client_desc (const char *name, GType gtype) } static GType -is_client_enabled (const char *name, GError **error) +is_client_enabled (const char *name) { ClientDesc *desc; @@ -121,9 +121,6 @@ is_client_enabled (const char *name, GError **error) if (desc && (!desc->get_path_func || desc->get_path_func())) return desc->gtype; - g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED, - _("'%s' support not found or not enabled."), - name); return G_TYPE_INVALID; } @@ -153,28 +150,6 @@ get_client_for_ifindex (NMDhcpManager *manager, int ifindex, gboolean ip6) return NULL; } -static GType -get_client_type (const char *client, GError **error) -{ - GType client_gtype; - - if (client) - client_gtype = is_client_enabled (client, error); - else { - /* Fallbacks */ - client_gtype = is_client_enabled ("dhclient", NULL); - if (client_gtype == G_TYPE_INVALID) - client_gtype = is_client_enabled ("dhcpcd", NULL); - if (client_gtype == G_TYPE_INVALID) - client_gtype = is_client_enabled ("internal", NULL); - if (client_gtype == G_TYPE_INVALID) { - g_set_error_literal (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED, - _("no usable DHCP client could be found.")); - } - } - return client_gtype; -} - static void client_state_changed (NMDhcpClient *client, NMDhcpState state, GObject *ip_config, @@ -385,8 +360,8 @@ nm_dhcp_manager_init (NMDhcpManager *self) NMDhcpManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self); NMConfig *config = nm_config_get (); const char *client; - GError *error = NULL; GSList *iter; + GType type = G_TYPE_INVALID; for (iter = client_descs; iter; iter = iter->next) { ClientDesc *desc = iter->data; @@ -403,16 +378,26 @@ nm_dhcp_manager_init (NMDhcpManager *self) client = "internal"; } - priv->client_type = get_client_type (client, &error); - if (priv->client_type == G_TYPE_INVALID) { - nm_log_warn (LOGD_DHCP, "No usable DHCP client found (%s)! DHCP configurations will fail.", - error->message); - } else { - nm_log_dbg (LOGD_DHCP, "Using DHCP client '%s'", find_client_desc (NULL, priv->client_type)->name); + if (client) + type = is_client_enabled (client); + + if (type == G_TYPE_INVALID) { + if (client) + nm_log_warn (LOGD_DHCP, "DHCP client '%s' not available", client); + type = is_client_enabled ("dhclient"); + if (type == G_TYPE_INVALID) + type = is_client_enabled ("dhcpcd"); + if (type == G_TYPE_INVALID) + type = is_client_enabled ("internal"); } - g_clear_error (&error); + if (type == G_TYPE_INVALID) + nm_log_warn (LOGD_DHCP, "No usable DHCP client found! DHCP configurations will fail"); + else + nm_log_info (LOGD_DHCP, "Using DHCP client '%s'", find_client_desc (NULL, type)->name); + + priv->client_type = type; priv->clients = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_object_unref); |