2008-05-29 Dan Williams <dcbw@redhat.com>
* src/dnsmasq-manager/nm-dnsmasq-manager.c src/dnsmasq-manager/nm-dnsmasq-manager.h - (nm_dnsmasq_manager_new): move iface argument here - (constructor): remove, not needed - (get_pidfile_for_iface, create_dm_cmd_line, kill_existing_for_iface, nm_dnsmasq_manager_start, nm_dnsmasq_manager_stop): use priv->pidfile * src/nm-device.c - (real_act_stage4_get_ip4_config, nm_device_activate_stage5_ip_config_commit): fix for dnsmasq manager changes git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3712 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
14
ChangeLog
14
ChangeLog
@@ -1,3 +1,17 @@
|
|||||||
|
2008-05-29 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
* src/dnsmasq-manager/nm-dnsmasq-manager.c
|
||||||
|
src/dnsmasq-manager/nm-dnsmasq-manager.h
|
||||||
|
- (nm_dnsmasq_manager_new): move iface argument here
|
||||||
|
- (constructor): remove, not needed
|
||||||
|
- (get_pidfile_for_iface, create_dm_cmd_line, kill_existing_for_iface,
|
||||||
|
nm_dnsmasq_manager_start, nm_dnsmasq_manager_stop): use priv->pidfile
|
||||||
|
|
||||||
|
* src/nm-device.c
|
||||||
|
- (real_act_stage4_get_ip4_config,
|
||||||
|
nm_device_activate_stage5_ip_config_commit): fix for dnsmasq manager
|
||||||
|
changes
|
||||||
|
|
||||||
2008-05-29 Dan Williams <dcbw@redhat.com>
|
2008-05-29 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
* src/nm-device.c
|
* src/nm-device.c
|
||||||
|
@@ -12,6 +12,8 @@
|
|||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
char *iface;
|
||||||
|
char *pidfile;
|
||||||
GPid pid;
|
GPid pid;
|
||||||
guint32 dm_watch_id;
|
guint32 dm_watch_id;
|
||||||
} NMDnsMasqManagerPrivate;
|
} NMDnsMasqManagerPrivate;
|
||||||
@@ -29,7 +31,7 @@ enum {
|
|||||||
static guint signals[LAST_SIGNAL] = { 0 };
|
static guint signals[LAST_SIGNAL] = { 0 };
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NM_DNSMASQ_MANAGER_ERROR_UNKOWN
|
NM_DNSMASQ_MANAGER_ERROR_NOT_FOUND,
|
||||||
} NMDnsMasqManagerError;
|
} NMDnsMasqManagerError;
|
||||||
|
|
||||||
GQuark
|
GQuark
|
||||||
@@ -48,21 +50,16 @@ nm_dnsmasq_manager_init (NMDnsMasqManager *manager)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static GObject *
|
|
||||||
constructor (GType type,
|
|
||||||
guint n_construct_params,
|
|
||||||
GObjectConstructParam *construct_params)
|
|
||||||
{
|
|
||||||
return G_OBJECT_CLASS (nm_dnsmasq_manager_parent_class)->constructor (type,
|
|
||||||
n_construct_params,
|
|
||||||
construct_params);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
finalize (GObject *object)
|
finalize (GObject *object)
|
||||||
{
|
{
|
||||||
|
NMDnsMasqManagerPrivate *priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (object);
|
||||||
|
|
||||||
nm_dnsmasq_manager_stop (NM_DNSMASQ_MANAGER (object));
|
nm_dnsmasq_manager_stop (NM_DNSMASQ_MANAGER (object));
|
||||||
|
|
||||||
|
g_free (priv->iface);
|
||||||
|
g_free (priv->pidfile);
|
||||||
|
|
||||||
G_OBJECT_CLASS (nm_dnsmasq_manager_parent_class)->finalize (object);
|
G_OBJECT_CLASS (nm_dnsmasq_manager_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +70,6 @@ nm_dnsmasq_manager_class_init (NMDnsMasqManagerClass *manager_class)
|
|||||||
|
|
||||||
g_type_class_add_private (manager_class, sizeof (NMDnsMasqManagerPrivate));
|
g_type_class_add_private (manager_class, sizeof (NMDnsMasqManagerPrivate));
|
||||||
|
|
||||||
object_class->constructor = constructor;
|
|
||||||
object_class->finalize = finalize;
|
object_class->finalize = finalize;
|
||||||
|
|
||||||
/* signals */
|
/* signals */
|
||||||
@@ -89,9 +85,20 @@ nm_dnsmasq_manager_class_init (NMDnsMasqManagerClass *manager_class)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NMDnsMasqManager *
|
NMDnsMasqManager *
|
||||||
nm_dnsmasq_manager_new (void)
|
nm_dnsmasq_manager_new (const char *iface)
|
||||||
{
|
{
|
||||||
return (NMDnsMasqManager *) g_object_new (NM_TYPE_DNSMASQ_MANAGER, NULL);
|
NMDnsMasqManager *manager;
|
||||||
|
NMDnsMasqManagerPrivate *priv;
|
||||||
|
|
||||||
|
manager = (NMDnsMasqManager *) g_object_new (NM_TYPE_DNSMASQ_MANAGER, NULL);
|
||||||
|
if (!manager)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (manager);
|
||||||
|
priv->iface = g_strdup (iface);
|
||||||
|
priv->pidfile = g_strdup_printf (LOCALSTATEDIR "/run/nm-dnsmasq-%s.pid", iface);
|
||||||
|
|
||||||
|
return manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -217,24 +224,16 @@ dm_watch_cb (GPid pid, gint status, gpointer user_data)
|
|||||||
g_signal_emit (manager, signals[STATE_CHANGED], 0, NM_DNSMASQ_STATUS_DEAD);
|
g_signal_emit (manager, signals[STATE_CHANGED], 0, NM_DNSMASQ_STATUS_DEAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
|
||||||
get_pidfile_for_iface (const char *iface)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (iface != NULL, NULL);
|
|
||||||
|
|
||||||
return g_strdup_printf (LOCALSTATEDIR "/run/nm-dnsmasq-%s.pid", iface);
|
|
||||||
}
|
|
||||||
|
|
||||||
static NMCmdLine *
|
static NMCmdLine *
|
||||||
create_dm_cmd_line (const char *iface, GError **err)
|
create_dm_cmd_line (const char *iface, const char *pidfile, GError **error)
|
||||||
{
|
{
|
||||||
const char *dm_binary;
|
const char *dm_binary;
|
||||||
NMCmdLine *cmd;
|
NMCmdLine *cmd;
|
||||||
char *s, *pidfile;
|
char *s;
|
||||||
|
|
||||||
dm_binary = nm_find_dnsmasq ();
|
dm_binary = nm_find_dnsmasq ();
|
||||||
if (!dm_binary) {
|
if (!dm_binary) {
|
||||||
g_set_error (err, NM_DNSMASQ_MANAGER_ERROR, NM_DNSMASQ_MANAGER_ERROR,
|
g_set_error (error, NM_DNSMASQ_MANAGER_ERROR, NM_DNSMASQ_MANAGER_ERROR_NOT_FOUND,
|
||||||
"Could not find dnsmasq binary.");
|
"Could not find dnsmasq binary.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -252,9 +251,7 @@ create_dm_cmd_line (const char *iface, GError **err)
|
|||||||
nm_cmd_line_add_string (cmd, "--dhcp-option=option:router,0.0.0.0");
|
nm_cmd_line_add_string (cmd, "--dhcp-option=option:router,0.0.0.0");
|
||||||
nm_cmd_line_add_string (cmd, "--dhcp-lease-max=50");
|
nm_cmd_line_add_string (cmd, "--dhcp-lease-max=50");
|
||||||
|
|
||||||
pidfile = get_pidfile_for_iface (iface);
|
|
||||||
s = g_strdup_printf ("--pid-file=%s", pidfile);
|
s = g_strdup_printf ("--pid-file=%s", pidfile);
|
||||||
g_free (pidfile);
|
|
||||||
nm_cmd_line_add_string (cmd, s);
|
nm_cmd_line_add_string (cmd, s);
|
||||||
g_free (s);
|
g_free (s);
|
||||||
|
|
||||||
@@ -270,15 +267,13 @@ dm_child_setup (gpointer user_data G_GNUC_UNUSED)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
kill_existing_for_iface (const char *iface)
|
kill_existing_for_iface (const char *iface, const char *pidfile)
|
||||||
{
|
{
|
||||||
char *pidfile;
|
|
||||||
char *contents = NULL;
|
char *contents = NULL;
|
||||||
glong pid;
|
glong pid;
|
||||||
char *proc_path = NULL;
|
char *proc_path = NULL;
|
||||||
char *cmdline_contents = NULL;
|
char *cmdline_contents = NULL;
|
||||||
|
|
||||||
pidfile = get_pidfile_for_iface (iface);
|
|
||||||
if (!g_file_get_contents (pidfile, &contents, NULL, NULL))
|
if (!g_file_get_contents (pidfile, &contents, NULL, NULL))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -302,13 +297,10 @@ out:
|
|||||||
g_free (cmdline_contents);
|
g_free (cmdline_contents);
|
||||||
g_free (proc_path);
|
g_free (proc_path);
|
||||||
g_free (contents);
|
g_free (contents);
|
||||||
g_free (pidfile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
nm_dnsmasq_manager_start (NMDnsMasqManager *manager,
|
nm_dnsmasq_manager_start (NMDnsMasqManager *manager, GError **error)
|
||||||
const char *iface,
|
|
||||||
GError **err)
|
|
||||||
{
|
{
|
||||||
NMDnsMasqManagerPrivate *priv;
|
NMDnsMasqManagerPrivate *priv;
|
||||||
NMCmdLine *dm_cmd;
|
NMCmdLine *dm_cmd;
|
||||||
@@ -316,18 +308,19 @@ nm_dnsmasq_manager_start (NMDnsMasqManager *manager,
|
|||||||
GSource *dm_watch;
|
GSource *dm_watch;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DNSMASQ_MANAGER (manager), FALSE);
|
g_return_val_if_fail (NM_IS_DNSMASQ_MANAGER (manager), FALSE);
|
||||||
g_return_val_if_fail (iface != NULL, FALSE);
|
if (error)
|
||||||
|
g_return_val_if_fail (*error == NULL, FALSE);
|
||||||
|
|
||||||
kill_existing_for_iface (iface);
|
priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (manager);
|
||||||
|
|
||||||
dm_cmd = create_dm_cmd_line (iface, err);
|
kill_existing_for_iface (priv->iface, priv->pidfile);
|
||||||
|
|
||||||
|
dm_cmd = create_dm_cmd_line (priv->iface, priv->pidfile, error);
|
||||||
if (!dm_cmd)
|
if (!dm_cmd)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
g_ptr_array_add (dm_cmd->array, NULL);
|
g_ptr_array_add (dm_cmd->array, NULL);
|
||||||
|
|
||||||
priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (manager);
|
|
||||||
|
|
||||||
nm_info ("Starting dnsmasq...");
|
nm_info ("Starting dnsmasq...");
|
||||||
|
|
||||||
cmd_str = nm_cmd_line_to_str (dm_cmd);
|
cmd_str = nm_cmd_line_to_str (dm_cmd);
|
||||||
@@ -338,7 +331,7 @@ nm_dnsmasq_manager_start (NMDnsMasqManager *manager,
|
|||||||
if (!g_spawn_async (NULL, (char **) dm_cmd->array->pdata, NULL,
|
if (!g_spawn_async (NULL, (char **) dm_cmd->array->pdata, NULL,
|
||||||
G_SPAWN_DO_NOT_REAP_CHILD,
|
G_SPAWN_DO_NOT_REAP_CHILD,
|
||||||
dm_child_setup,
|
dm_child_setup,
|
||||||
NULL, &priv->pid, err)) {
|
NULL, &priv->pid, error)) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -390,4 +383,6 @@ nm_dnsmasq_manager_stop (NMDnsMasqManager *manager)
|
|||||||
|
|
||||||
priv->pid = 0;
|
priv->pid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlink (priv->pidfile);
|
||||||
}
|
}
|
||||||
|
@@ -33,11 +33,9 @@ typedef struct {
|
|||||||
|
|
||||||
GType nm_dnsmasq_manager_get_type (void);
|
GType nm_dnsmasq_manager_get_type (void);
|
||||||
|
|
||||||
NMDnsMasqManager *nm_dnsmasq_manager_new (void);
|
NMDnsMasqManager *nm_dnsmasq_manager_new (const char *iface);
|
||||||
|
|
||||||
gboolean nm_dnsmasq_manager_start (NMDnsMasqManager *manager,
|
gboolean nm_dnsmasq_manager_start (NMDnsMasqManager *manager, GError **error);
|
||||||
const char *device,
|
|
||||||
GError **err);
|
|
||||||
|
|
||||||
void nm_dnsmasq_manager_stop (NMDnsMasqManager *manager);
|
void nm_dnsmasq_manager_stop (NMDnsMasqManager *manager);
|
||||||
|
|
||||||
|
@@ -701,7 +701,7 @@ real_act_stage4_get_ip4_config (NMDevice *self,
|
|||||||
nm_utils_merge_ip4_config (*config, s_ip4);
|
nm_utils_merge_ip4_config (*config, s_ip4);
|
||||||
} else if (!strcmp (s_ip4->method, NM_SETTING_IP4_CONFIG_METHOD_SHARED)) {
|
} else if (!strcmp (s_ip4->method, NM_SETTING_IP4_CONFIG_METHOD_SHARED)) {
|
||||||
*config = nm_device_new_ip4_shared_config (self);
|
*config = nm_device_new_ip4_shared_config (self);
|
||||||
priv->dnsmasq_manager = nm_dnsmasq_manager_new ();
|
priv->dnsmasq_manager = nm_dnsmasq_manager_new (nm_device_get_ip_iface (self));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -895,7 +895,7 @@ nm_device_activate_stage5_ip_config_commit (gpointer user_data)
|
|||||||
if (s_ip4 && !strcmp (s_ip4->method, "shared")) {
|
if (s_ip4 && !strcmp (s_ip4->method, "shared")) {
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
if (!nm_dnsmasq_manager_start (priv->dnsmasq_manager, nm_device_get_ip_iface (self), &error)) {
|
if (!nm_dnsmasq_manager_start (priv->dnsmasq_manager, &error)) {
|
||||||
nm_warning ("(%s): failed to start dnsmasq: %s", iface, error->message);
|
nm_warning ("(%s): failed to start dnsmasq: %s", iface, error->message);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
nm_device_state_changed (self, NM_DEVICE_STATE_FAILED);
|
nm_device_state_changed (self, NM_DEVICE_STATE_FAILED);
|
||||||
|
Reference in New Issue
Block a user