mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-08 21:48:08 +02:00
2008-05-30 Dan Williams <dcbw@redhat.com>
* src/named-manager/nm-named-manager.c src/named-manager/nm-named-manager.h - Remove stale/obsolete bits for controlling bind over DBus git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3714 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
parent
bd583cc8fd
commit
a53ebdbd37
3 changed files with 24 additions and 528 deletions
|
|
@ -1,3 +1,9 @@
|
||||||
|
2008-05-30 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
* src/named-manager/nm-named-manager.c
|
||||||
|
src/named-manager/nm-named-manager.h
|
||||||
|
- Remove stale/obsolete bits for controlling bind over DBus
|
||||||
|
|
||||||
2008-05-29 Dan Williams <dcbw@redhat.com>
|
2008-05-29 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
* src/dnsmasq-manager/nm-dnsmasq-manager.c
|
* src/dnsmasq-manager/nm-dnsmasq-manager.c
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2004 Red Hat, Inc.
|
* Copyright (C) 2004 - 2008 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* Written by Colin Walters <walters@redhat.com>
|
* Written by Colin Walters <walters@redhat.com>
|
||||||
*
|
*
|
||||||
|
|
@ -20,28 +20,20 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "nm-named-manager.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <resolv.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <syslog.h>
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <dbus/dbus.h>
|
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
|
#include "nm-named-manager.h"
|
||||||
#include "nm-ip4-config.h"
|
#include "nm-ip4-config.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "NetworkManagerSystem.h"
|
#include "NetworkManagerSystem.h"
|
||||||
#include "nm-dbus-manager.h"
|
|
||||||
|
|
||||||
#ifdef HAVE_SELINUX
|
#ifdef HAVE_SELINUX
|
||||||
#include <selinux/selinux.h>
|
#include <selinux/selinux.h>
|
||||||
|
|
@ -51,29 +43,14 @@
|
||||||
#define RESOLV_CONF "/etc/resolv.conf"
|
#define RESOLV_CONF "/etc/resolv.conf"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NAMED_DBUS_SERVICE
|
|
||||||
#define NAMED_DBUS_SERVICE "com.redhat.named"
|
|
||||||
#define NAMED_DBUS_INTERFACE "com.redhat.named"
|
|
||||||
#define NAMED_DBUS_PATH "/com/redhat/named"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
G_DEFINE_TYPE(NMNamedManager, nm_named_manager, G_TYPE_OBJECT)
|
G_DEFINE_TYPE(NMNamedManager, nm_named_manager, G_TYPE_OBJECT)
|
||||||
|
|
||||||
#define NM_NAMED_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
|
#define NM_NAMED_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
|
||||||
NM_TYPE_NAMED_MANAGER, \
|
NM_TYPE_NAMED_MANAGER, \
|
||||||
NMNamedManagerPrivate))
|
NMNamedManagerPrivate))
|
||||||
|
|
||||||
static gboolean add_all_ip4_configs_to_named (NMNamedManager *mgr);
|
|
||||||
|
|
||||||
static gboolean rewrite_resolv_conf (NMNamedManager *mgr, GError **error);
|
|
||||||
|
|
||||||
static gboolean remove_ip4_config_from_named (NMNamedManager *mgr, NMIP4Config *config);
|
|
||||||
|
|
||||||
|
|
||||||
struct NMNamedManagerPrivate {
|
struct NMNamedManagerPrivate {
|
||||||
gboolean use_named;
|
|
||||||
NMDBusManager * dbus_mgr;
|
|
||||||
|
|
||||||
NMIP4Config * vpn_config;
|
NMIP4Config * vpn_config;
|
||||||
NMIP4Config * device_config;
|
NMIP4Config * device_config;
|
||||||
GSList * configs;
|
GSList * configs;
|
||||||
|
|
@ -108,86 +85,6 @@ nm_named_manager_error_quark (void)
|
||||||
return quark;
|
return quark;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* nm_named_manager_process_name_owner_changed
|
|
||||||
*
|
|
||||||
* Respond to "service created"/"service deleted" signals from dbus for named.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
nm_named_manager_name_owner_changed (NMDBusManager *dbus_mgr,
|
|
||||||
const char *name,
|
|
||||||
const char *old,
|
|
||||||
const char *new,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
NMNamedManager *mgr = (NMNamedManager *) user_data;
|
|
||||||
gboolean handled = FALSE;
|
|
||||||
gboolean old_owner_good = (old && strlen (old));
|
|
||||||
gboolean new_owner_good = (new && strlen (new));
|
|
||||||
|
|
||||||
g_return_if_fail (mgr != NULL);
|
|
||||||
g_return_if_fail (name != NULL);
|
|
||||||
|
|
||||||
/* Ensure signal is for named's service */
|
|
||||||
if (strcmp (NAMED_DBUS_SERVICE, name) != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!old_owner_good && new_owner_good) {
|
|
||||||
mgr->priv->use_named = TRUE;
|
|
||||||
|
|
||||||
if (!add_all_ip4_configs_to_named (mgr))
|
|
||||||
nm_warning ("Could not set fowarders in named.");
|
|
||||||
|
|
||||||
handled = TRUE;
|
|
||||||
} else if (old_owner_good && !new_owner_good) {
|
|
||||||
mgr->priv->use_named = FALSE;
|
|
||||||
handled = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handled) {
|
|
||||||
GError *error = NULL;
|
|
||||||
if (!rewrite_resolv_conf (mgr, &error)) {
|
|
||||||
nm_warning ("Could not write resolv.conf. Error: '%s'",
|
|
||||||
error ? error->message : "(none)");
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
nm_named_manager_dbus_connection_changed (NMDBusManager *dbus_mgr,
|
|
||||||
DBusConnection *dbus_connection,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
NMNamedManager *mgr = (NMNamedManager *) user_data;
|
|
||||||
gboolean handled = FALSE;
|
|
||||||
|
|
||||||
g_return_if_fail (mgr != NULL);
|
|
||||||
|
|
||||||
if (dbus_connection) {
|
|
||||||
if (nm_dbus_manager_name_has_owner (dbus_mgr, NAMED_DBUS_SERVICE)) {
|
|
||||||
mgr->priv->use_named = TRUE;
|
|
||||||
if (!add_all_ip4_configs_to_named (mgr))
|
|
||||||
nm_warning ("Could not set fowarders in named.");
|
|
||||||
handled = TRUE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mgr->priv->use_named = FALSE;
|
|
||||||
handled = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handled) {
|
|
||||||
GError *error = NULL;
|
|
||||||
if (!rewrite_resolv_conf (mgr, &error)) {
|
|
||||||
nm_warning ("Could not write resolv.conf. Error: '%s'",
|
|
||||||
error ? error->message : "(none)");
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
compute_nameservers (NMIP4Config *config)
|
compute_nameservers (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
|
|
@ -262,6 +159,7 @@ rewrite_resolv_conf (NMNamedManager *mgr, GError **error)
|
||||||
NMNamedManagerPrivate *priv;
|
NMNamedManagerPrivate *priv;
|
||||||
const char *tmp_resolv_conf = RESOLV_CONF ".tmp";
|
const char *tmp_resolv_conf = RESOLV_CONF ".tmp";
|
||||||
char *searches = NULL, *domain = NULL;
|
char *searches = NULL, *domain = NULL;
|
||||||
|
char *nameservers = NULL;
|
||||||
guint32 num_domains, num_searches, i;
|
guint32 num_domains, num_searches, i;
|
||||||
NMIP4Config *composite;
|
NMIP4Config *composite;
|
||||||
GSList *iter;
|
GSList *iter;
|
||||||
|
|
@ -368,35 +266,19 @@ rewrite_resolv_conf (NMNamedManager *mgr, GError **error)
|
||||||
domain = g_string_free (str, FALSE);
|
domain = g_string_free (str, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mgr->priv->use_named == TRUE) {
|
/* Using glibc resolver */
|
||||||
/* Using caching-nameserver & local DNS */
|
nameservers = compute_nameservers (composite);
|
||||||
if (fprintf (f,
|
if (fprintf (f, "%s%s%s\n",
|
||||||
"%s%s%s",
|
domain ? domain : "",
|
||||||
"; Use a local caching nameserver controlled by NetworkManager\n\n",
|
searches ? searches : "",
|
||||||
searches ? searches : "",
|
nameservers ? nameservers : "") < 0) {
|
||||||
"\nnameserver 127.0.0.1\n") < 0) {
|
g_set_error (error,
|
||||||
g_set_error (error,
|
NM_NAMED_MANAGER_ERROR,
|
||||||
NM_NAMED_MANAGER_ERROR,
|
NM_NAMED_MANAGER_ERROR_SYSTEM,
|
||||||
NM_NAMED_MANAGER_ERROR_SYSTEM,
|
"Could not write to " RESOLV_CONF ": %s\n",
|
||||||
"Could not write " RESOLV_CONF ": %s\n",
|
g_strerror (errno));
|
||||||
g_strerror (errno));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Using glibc resolver */
|
|
||||||
char *nameservers = compute_nameservers (composite);
|
|
||||||
|
|
||||||
if (fprintf (f, "%s%s%s\n",
|
|
||||||
domain ? domain : "",
|
|
||||||
searches ? searches : "",
|
|
||||||
nameservers ? nameservers : "") < 0) {
|
|
||||||
g_set_error (error,
|
|
||||||
NM_NAMED_MANAGER_ERROR,
|
|
||||||
NM_NAMED_MANAGER_ERROR_SYSTEM,
|
|
||||||
"Could not write to " RESOLV_CONF ": %s\n",
|
|
||||||
g_strerror (errno));
|
|
||||||
}
|
|
||||||
g_free (nameservers);
|
|
||||||
}
|
}
|
||||||
|
g_free (nameservers);
|
||||||
|
|
||||||
if (fclose (f) < 0) {
|
if (fclose (f) < 0) {
|
||||||
if (*error == NULL) {
|
if (*error == NULL) {
|
||||||
|
|
@ -426,342 +308,6 @@ rewrite_resolv_conf (NMNamedManager *mgr, GError **error)
|
||||||
return *error ? FALSE : TRUE;
|
return *error ? FALSE : TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
|
||||||
get_domain_for_config (NMNamedManager *mgr, NMIP4Config *config, gboolean *dflt)
|
|
||||||
{
|
|
||||||
NMNamedManagerPrivate *priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
|
|
||||||
gboolean is_dflt = FALSE;
|
|
||||||
const char *domain;
|
|
||||||
|
|
||||||
g_return_val_if_fail (config != NULL, NULL);
|
|
||||||
|
|
||||||
/* Primary configs always use default domain */
|
|
||||||
if (config == priv->vpn_config)
|
|
||||||
is_dflt = TRUE;
|
|
||||||
|
|
||||||
/* Any config without a domain becomes default */
|
|
||||||
if (nm_ip4_config_get_num_domains (config) == 0)
|
|
||||||
is_dflt = TRUE;
|
|
||||||
|
|
||||||
if (is_dflt)
|
|
||||||
domain = "."; /* Default domain */
|
|
||||||
else
|
|
||||||
domain = nm_ip4_config_get_domain (config, 0);
|
|
||||||
|
|
||||||
if (dflt)
|
|
||||||
*dflt = is_dflt;
|
|
||||||
|
|
||||||
return domain;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
add_ip4_config_to_named (NMNamedManager *mgr, NMIP4Config *config)
|
|
||||||
{
|
|
||||||
NMNamedManagerPrivate *priv;
|
|
||||||
const char *domain;
|
|
||||||
NMIP4Config *ns_config = config;
|
|
||||||
int i, num_nameservers;
|
|
||||||
gboolean success = FALSE;
|
|
||||||
DBusMessage * message;
|
|
||||||
DBusMessage * reply = NULL;
|
|
||||||
DBusError error;
|
|
||||||
gboolean dflt = FALSE;
|
|
||||||
DBusConnection *dbus_connection;
|
|
||||||
|
|
||||||
g_return_val_if_fail (mgr != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (config != NULL, FALSE);
|
|
||||||
|
|
||||||
priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
|
|
||||||
|
|
||||||
dbus_error_init (&error);
|
|
||||||
|
|
||||||
dbus_connection = nm_dbus_manager_get_dbus_connection (priv->dbus_mgr);
|
|
||||||
if (!dbus_connection) {
|
|
||||||
nm_warning ("could not get dbus connection.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(domain = get_domain_for_config (mgr, config, &dflt)))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
message = dbus_message_new_method_call (NAMED_DBUS_SERVICE,
|
|
||||||
NAMED_DBUS_PATH,
|
|
||||||
NAMED_DBUS_INTERFACE,
|
|
||||||
"SetForwarders");
|
|
||||||
if (!message) {
|
|
||||||
nm_warning ("could not allocate dbus message.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
dbus_message_append_args (message,
|
|
||||||
DBUS_TYPE_STRING, &domain,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
|
|
||||||
/* If the ip4 config is a secondary config and has no nameservers, use the
|
|
||||||
* nameservers from the primary config.
|
|
||||||
*/
|
|
||||||
if ( (config == priv->vpn_config)
|
|
||||||
&& !nm_ip4_config_get_num_nameservers (config)) {
|
|
||||||
ns_config = priv->device_config;
|
|
||||||
}
|
|
||||||
g_return_val_if_fail (ns_config != NULL, FALSE);
|
|
||||||
|
|
||||||
num_nameservers = nm_ip4_config_get_num_nameservers (ns_config);
|
|
||||||
for (i = 0; i < num_nameservers; i++) {
|
|
||||||
dbus_uint32_t server = nm_ip4_config_get_nameserver (ns_config, i);
|
|
||||||
dbus_uint16_t port = htons (53); /* default DNS port */
|
|
||||||
char fwd_policy = dflt ? 1 : 2; /* 'first' : 'only' */
|
|
||||||
|
|
||||||
dbus_message_append_args (message,
|
|
||||||
DBUS_TYPE_UINT32, &server,
|
|
||||||
DBUS_TYPE_UINT16, &port,
|
|
||||||
DBUS_TYPE_BYTE, &fwd_policy,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
}
|
|
||||||
|
|
||||||
reply = dbus_connection_send_with_reply_and_block (dbus_connection,
|
|
||||||
message, -1, &error);
|
|
||||||
dbus_message_unref (message);
|
|
||||||
if (dbus_error_is_set (&error)) {
|
|
||||||
nm_warning ("Could not set forwarders for zone '%s'. Error: '%s'.",
|
|
||||||
domain,
|
|
||||||
error.message);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reply) {
|
|
||||||
nm_warning ("Could not set forwarders for zone '%s', did not receive "
|
|
||||||
"a reply from named.",
|
|
||||||
domain);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) {
|
|
||||||
const char *err_msg = NULL;
|
|
||||||
dbus_message_get_args (reply,
|
|
||||||
NULL,
|
|
||||||
DBUS_TYPE_STRING, &err_msg,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
nm_warning ("Could not set forwarders for zone '%s'. "
|
|
||||||
"Named replied: '%s'",
|
|
||||||
domain,
|
|
||||||
err_msg);
|
|
||||||
}
|
|
||||||
success = TRUE;
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (dbus_error_is_set (&error))
|
|
||||||
dbus_error_free (&error);
|
|
||||||
dbus_message_unref (reply);
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
add_all_ip4_configs_to_named (NMNamedManager *mgr)
|
|
||||||
{
|
|
||||||
NMNamedManagerPrivate *priv;
|
|
||||||
GSList *iter = NULL;
|
|
||||||
|
|
||||||
g_return_val_if_fail (mgr != NULL, FALSE);
|
|
||||||
|
|
||||||
priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
|
|
||||||
|
|
||||||
if (priv->vpn_config)
|
|
||||||
add_ip4_config_to_named (mgr, priv->vpn_config);
|
|
||||||
|
|
||||||
if (priv->device_config)
|
|
||||||
add_ip4_config_to_named (mgr, priv->device_config);
|
|
||||||
|
|
||||||
for (iter = priv->configs; iter; iter = g_slist_next (iter)) {
|
|
||||||
NMIP4Config *config = NM_IP4_CONFIG (iter->data);
|
|
||||||
|
|
||||||
if ((config == priv->vpn_config) || (config == priv->device_config))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
add_ip4_config_to_named (mgr, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
remove_one_zone_from_named (NMNamedManager *mgr, const char *zone)
|
|
||||||
{
|
|
||||||
gboolean success = FALSE;
|
|
||||||
DBusMessage * message = NULL;
|
|
||||||
DBusMessage * reply = NULL;
|
|
||||||
DBusError error;
|
|
||||||
DBusConnection *dbus_connection;
|
|
||||||
|
|
||||||
g_return_val_if_fail (mgr != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (zone != NULL, FALSE);
|
|
||||||
|
|
||||||
dbus_error_init (&error);
|
|
||||||
|
|
||||||
dbus_connection = nm_dbus_manager_get_dbus_connection (mgr->priv->dbus_mgr);
|
|
||||||
if (!dbus_connection) {
|
|
||||||
nm_warning ("could not get dbus connection.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
message = dbus_message_new_method_call (NAMED_DBUS_SERVICE,
|
|
||||||
NAMED_DBUS_PATH,
|
|
||||||
NAMED_DBUS_INTERFACE,
|
|
||||||
"SetForwarders");
|
|
||||||
if (!message) {
|
|
||||||
nm_warning ("could not allocate dbus message.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
dbus_message_append_args (message,
|
|
||||||
DBUS_TYPE_STRING, &zone,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
|
|
||||||
reply = dbus_connection_send_with_reply_and_block (dbus_connection,
|
|
||||||
message,
|
|
||||||
-1,
|
|
||||||
&error);
|
|
||||||
dbus_message_unref (message);
|
|
||||||
|
|
||||||
if (dbus_error_is_set (&error)) {
|
|
||||||
nm_warning ("Could not remove forwarders for zone '%s'. "
|
|
||||||
"Error: '%s'.",
|
|
||||||
zone,
|
|
||||||
error.message);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reply) {
|
|
||||||
nm_warning ("Could not remove forwarders for zone '%s', did not "
|
|
||||||
" receive a reply from named.",
|
|
||||||
zone);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) {
|
|
||||||
const char *err_msg = NULL;
|
|
||||||
dbus_message_get_args (reply,
|
|
||||||
NULL,
|
|
||||||
DBUS_TYPE_STRING, &err_msg,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
nm_warning ("Could not remove forwarders for zone '%s'. "
|
|
||||||
"Named replied: '%s'",
|
|
||||||
zone,
|
|
||||||
err_msg);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
success = TRUE;
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (dbus_error_is_set (&error))
|
|
||||||
dbus_error_free (&error);
|
|
||||||
if (reply)
|
|
||||||
dbus_message_unref (reply);
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
remove_ip4_config_from_named (NMNamedManager *mgr, NMIP4Config *config)
|
|
||||||
{
|
|
||||||
const char *domain;
|
|
||||||
|
|
||||||
g_return_val_if_fail (mgr != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (config != NULL, FALSE);
|
|
||||||
|
|
||||||
if (!(domain = get_domain_for_config (mgr, config, NULL)))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return remove_one_zone_from_named (mgr, domain);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
remove_all_zones_from_named (NMNamedManager *mgr)
|
|
||||||
{
|
|
||||||
DBusMessage * message;
|
|
||||||
DBusMessage * reply = NULL;
|
|
||||||
DBusError error;
|
|
||||||
DBusMessageIter iter;
|
|
||||||
GSList * zones = NULL;
|
|
||||||
GSList * elt = NULL;
|
|
||||||
DBusConnection * dbus_connection;
|
|
||||||
|
|
||||||
g_return_if_fail (mgr != NULL);
|
|
||||||
|
|
||||||
if (!mgr->priv->use_named)
|
|
||||||
return;
|
|
||||||
|
|
||||||
dbus_connection = nm_dbus_manager_get_dbus_connection (mgr->priv->dbus_mgr);
|
|
||||||
if (!dbus_connection) {
|
|
||||||
nm_warning ("could not get dbus connection.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
message = dbus_message_new_method_call (NAMED_DBUS_SERVICE,
|
|
||||||
NAMED_DBUS_PATH,
|
|
||||||
NAMED_DBUS_INTERFACE,
|
|
||||||
"GetForwarders");
|
|
||||||
if (!message) {
|
|
||||||
nm_warning ("could not allocate dbus message.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
dbus_error_init (&error);
|
|
||||||
reply = dbus_connection_send_with_reply_and_block (dbus_connection,
|
|
||||||
message,
|
|
||||||
-1,
|
|
||||||
&error);
|
|
||||||
dbus_message_unref (message);
|
|
||||||
|
|
||||||
if (dbus_error_is_set (&error)) {
|
|
||||||
nm_warning ("Could not get forwarder list from named. Error: '%s'.",
|
|
||||||
error.message);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reply) {
|
|
||||||
nm_warning ("Could not get forarder list from named, did not receive "
|
|
||||||
" a reply from named.");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) {
|
|
||||||
const char *err_msg = NULL;
|
|
||||||
dbus_message_get_args (reply,
|
|
||||||
NULL,
|
|
||||||
DBUS_TYPE_STRING, &err_msg,
|
|
||||||
DBUS_TYPE_INVALID);
|
|
||||||
nm_warning ("Could not get forwarder list from named. "
|
|
||||||
"Named replied: '%s'",
|
|
||||||
err_msg);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
dbus_message_iter_init (reply, &iter);
|
|
||||||
do {
|
|
||||||
/* We depend on zones being the only strings in what
|
|
||||||
* named returns (obviously)
|
|
||||||
*/
|
|
||||||
if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRING) {
|
|
||||||
char *zone = NULL;
|
|
||||||
dbus_message_iter_get_basic (&iter, &zone);
|
|
||||||
zones = g_slist_append (zones, g_strdup (zone));
|
|
||||||
}
|
|
||||||
} while (dbus_message_iter_next (&iter));
|
|
||||||
|
|
||||||
/* Remove all the zones from named */
|
|
||||||
for (elt = zones; elt; elt = g_slist_next (elt))
|
|
||||||
remove_one_zone_from_named (mgr, (const char *)(elt->data));
|
|
||||||
|
|
||||||
g_slist_foreach (zones, (GFunc) g_free, NULL);
|
|
||||||
g_slist_free (zones);
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (dbus_error_is_set (&error))
|
|
||||||
dbus_error_free (&error);
|
|
||||||
dbus_message_unref (reply);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
nm_named_manager_add_ip4_config (NMNamedManager *mgr,
|
nm_named_manager_add_ip4_config (NMNamedManager *mgr,
|
||||||
NMIP4Config *config,
|
NMIP4Config *config,
|
||||||
|
|
@ -790,12 +336,6 @@ nm_named_manager_add_ip4_config (NMNamedManager *mgr,
|
||||||
if (!g_slist_find (priv->configs, config))
|
if (!g_slist_find (priv->configs, config))
|
||||||
priv->configs = g_slist_append (priv->configs, g_object_ref (config));
|
priv->configs = g_slist_append (priv->configs, g_object_ref (config));
|
||||||
|
|
||||||
/* First clear out and reload configs in named */
|
|
||||||
if (priv->use_named) {
|
|
||||||
remove_all_zones_from_named (mgr);
|
|
||||||
add_all_ip4_configs_to_named (mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rewrite_resolv_conf (mgr, &error)) {
|
if (!rewrite_resolv_conf (mgr, &error)) {
|
||||||
nm_warning ("Could not commit DNS changes. Error: '%s'", error ? error->message : "(none)");
|
nm_warning ("Could not commit DNS changes. Error: '%s'", error ? error->message : "(none)");
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
|
@ -819,10 +359,6 @@ nm_named_manager_remove_ip4_config (NMNamedManager *mgr, NMIP4Config *config)
|
||||||
if (!g_slist_find (priv->configs, config))
|
if (!g_slist_find (priv->configs, config))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Deactivate the config */
|
|
||||||
if (priv->use_named)
|
|
||||||
remove_ip4_config_from_named (mgr, config);
|
|
||||||
|
|
||||||
priv->configs = g_slist_remove (priv->configs, config);
|
priv->configs = g_slist_remove (priv->configs, config);
|
||||||
|
|
||||||
if (config == priv->vpn_config)
|
if (config == priv->vpn_config)
|
||||||
|
|
@ -833,15 +369,6 @@ nm_named_manager_remove_ip4_config (NMNamedManager *mgr, NMIP4Config *config)
|
||||||
|
|
||||||
g_object_unref (config);
|
g_object_unref (config);
|
||||||
|
|
||||||
/* Clear out and reload configs since we may need a new
|
|
||||||
* default zone if the one we are removing was the old
|
|
||||||
* default zone.
|
|
||||||
*/
|
|
||||||
if (mgr->priv->use_named) {
|
|
||||||
remove_all_zones_from_named (mgr);
|
|
||||||
add_all_ip4_configs_to_named (mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rewrite_resolv_conf (mgr, &error)) {
|
if (!rewrite_resolv_conf (mgr, &error)) {
|
||||||
nm_warning ("Could not commit DNS changes. Error: '%s'", error ? error->message : "(none)");
|
nm_warning ("Could not commit DNS changes. Error: '%s'", error ? error->message : "(none)");
|
||||||
if (error)
|
if (error)
|
||||||
|
|
@ -855,49 +382,15 @@ nm_named_manager_remove_ip4_config (NMNamedManager *mgr, NMIP4Config *config)
|
||||||
static void
|
static void
|
||||||
nm_named_manager_init (NMNamedManager *mgr)
|
nm_named_manager_init (NMNamedManager *mgr)
|
||||||
{
|
{
|
||||||
mgr->priv = NM_NAMED_MANAGER_GET_PRIVATE (mgr);
|
|
||||||
mgr->priv->use_named = FALSE;
|
|
||||||
mgr->priv->dbus_mgr = nm_dbus_manager_get ();
|
|
||||||
g_signal_connect (G_OBJECT (mgr->priv->dbus_mgr),
|
|
||||||
"name-owner-changed",
|
|
||||||
G_CALLBACK (nm_named_manager_name_owner_changed),
|
|
||||||
mgr);
|
|
||||||
g_signal_connect (G_OBJECT (mgr->priv->dbus_mgr),
|
|
||||||
"dbus-connection-changed",
|
|
||||||
G_CALLBACK (nm_named_manager_dbus_connection_changed),
|
|
||||||
mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
nm_named_manager_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
NMNamedManager *mgr = NM_NAMED_MANAGER (object);
|
|
||||||
GSList *elt;
|
|
||||||
|
|
||||||
if (mgr->priv->disposed) {
|
|
||||||
G_OBJECT_CLASS (nm_named_manager_parent_class)->dispose (object);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mgr->priv->disposed = TRUE;
|
|
||||||
|
|
||||||
for (elt = mgr->priv->configs; elt; elt = g_slist_next (elt))
|
|
||||||
remove_ip4_config_from_named (mgr, (NMIP4Config *)(elt->data));
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (nm_named_manager_parent_class)->dispose (object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nm_named_manager_finalize (GObject *object)
|
nm_named_manager_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
NMNamedManager *mgr = NM_NAMED_MANAGER (object);
|
NMNamedManagerPrivate *priv = NM_NAMED_MANAGER_GET_PRIVATE (object);
|
||||||
|
|
||||||
g_return_if_fail (mgr->priv != NULL);
|
g_slist_foreach (priv->configs, (GFunc) g_object_unref, NULL);
|
||||||
|
g_slist_free (priv->configs);
|
||||||
g_slist_foreach (mgr->priv->configs, (GFunc) g_object_unref, NULL);
|
|
||||||
g_slist_free (mgr->priv->configs);
|
|
||||||
|
|
||||||
g_object_unref (mgr->priv->dbus_mgr);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (nm_named_manager_parent_class)->finalize (object);
|
G_OBJECT_CLASS (nm_named_manager_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
@ -907,7 +400,6 @@ nm_named_manager_class_init (NMNamedManagerClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->dispose = nm_named_manager_dispose;
|
|
||||||
object_class->finalize = nm_named_manager_finalize;
|
object_class->finalize = nm_named_manager_finalize;
|
||||||
|
|
||||||
g_type_class_add_private (object_class, sizeof (NMNamedManagerPrivate));
|
g_type_class_add_private (object_class, sizeof (NMNamedManagerPrivate));
|
||||||
|
|
|
||||||
|
|
@ -57,8 +57,6 @@ typedef struct NMNamedManagerPrivate NMNamedManagerPrivate;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GObject parent;
|
GObject parent;
|
||||||
|
|
||||||
NMNamedManagerPrivate *priv;
|
|
||||||
} NMNamedManager;
|
} NMNamedManager;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue