diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c index 3a4bcb4ab8..79fc7d6cb8 100644 --- a/src/dns-manager/nm-dns-dnsmasq.c +++ b/src/dns-manager/nm-dns-dnsmasq.c @@ -431,11 +431,16 @@ start_dnsmasq (NMDnsDnsmasq *self) NMBusManager *dbus_mgr; GDBusConnection *connection; - - if ( priv->running - || priv->dnsmasq - || priv->dnsmasq_cancellable) + if (priv->running) { + /* the dnsmasq process is running. Nothing to do. */ return; + } + + if (nm_dns_plugin_child_pid ((NMDnsPlugin *) self) > 0) { + /* if we already have a child process spawned, don't do + * it again. */ + return; + } dm_binary = nm_utils_find_helper ("dnsmasq", DNSMASQ_PATH, NULL); if (!dm_binary) { @@ -467,6 +472,13 @@ start_dnsmasq (NMDnsDnsmasq *self) if (!pid) return; + if ( priv->dnsmasq + || priv->dnsmasq_cancellable) { + /* we already have a proxy or are about to create it. + * We are done. */ + return; + } + dbus_mgr = nm_bus_manager_get (); g_return_if_fail (dbus_mgr); @@ -522,6 +534,7 @@ static void child_quit (NMDnsPlugin *plugin, gint status) { NMDnsDnsmasq *self = NM_DNS_DNSMASQ (plugin); + NMDnsDnsmasqPrivate *priv = NM_DNS_DNSMASQ_GET_PRIVATE (self); gboolean failed = TRUE; int err; @@ -541,6 +554,8 @@ child_quit (NMDnsPlugin *plugin, gint status) else _LOGW ("dnsmasq died from an unknown cause"); + priv->running = FALSE; + if (failed) g_signal_emit_by_name (self, NM_DNS_PLUGIN_FAILED); } diff --git a/src/dns-manager/nm-dns-plugin.c b/src/dns-manager/nm-dns-plugin.c index 38eaf060c0..b9e6e8bf07 100644 --- a/src/dns-manager/nm-dns-plugin.c +++ b/src/dns-manager/nm-dns-plugin.c @@ -177,6 +177,17 @@ watch_cb (GPid pid, gint status, gpointer user_data) g_signal_emit (self, signals[CHILD_QUIT], 0, status); } +GPid +nm_dns_plugin_child_pid (NMDnsPlugin *self) +{ + NMDnsPluginPrivate *priv; + + g_return_val_if_fail (NM_IS_DNS_PLUGIN (self), 0); + + priv = NM_DNS_PLUGIN_GET_PRIVATE (self); + return priv->pid; +} + GPid nm_dns_plugin_child_spawn (NMDnsPlugin *self, const char **argv, diff --git a/src/dns-manager/nm-dns-plugin.h b/src/dns-manager/nm-dns-plugin.h index d715582cbe..a5eb741ae7 100644 --- a/src/dns-manager/nm-dns-plugin.h +++ b/src/dns-manager/nm-dns-plugin.h @@ -103,6 +103,8 @@ GPid nm_dns_plugin_child_spawn (NMDnsPlugin *self, const char *pidfile, const char *kill_match); +GPid nm_dns_plugin_child_pid (NMDnsPlugin *self); + gboolean nm_dns_plugin_child_kill (NMDnsPlugin *self); #endif /* __NETWORKMANAGER_DNS_PLUGIN_H__ */