summaryrefslogtreecommitdiff
path: root/src/nm-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-manager.c')
-rw-r--r--src/nm-manager.c225
1 files changed, 66 insertions, 159 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index b4e832dfb0..333e47366f 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -21,13 +21,14 @@
#include "nm-default.h"
+#include "nm-manager.h"
+
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
-#include "nm-manager.h"
#include "nm-bus-manager.h"
#include "nm-vpn-manager.h"
#include "nm-device.h"
@@ -45,7 +46,6 @@
#include "nm-sleep-monitor.h"
#include "nm-connectivity.h"
#include "nm-policy.h"
-#include "nm-connection-provider.h"
#include "nm-session-monitor.h"
#include "nm-activation-request.h"
#include "nm-core-internal.h"
@@ -90,15 +90,13 @@ typedef struct {
gboolean sw_enabled;
gboolean hw_enabled;
RfKillType rtype;
+ NMConfigRunStatePropertyType key;
const char *desc;
- const char *key;
const char *prop;
const char *hw_prop;
} RadioState;
typedef struct {
- char *state_file;
-
GSList *active_connections;
GSList *authorizing_connections;
guint ac_cleanup_id;
@@ -144,7 +142,16 @@ typedef struct {
gboolean devices_inited;
} NMManagerPrivate;
-#define NM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MANAGER, NMManagerPrivate))
+struct _NMManager {
+ NMExportedObject parent;
+ NMManagerPrivate priv;
+};
+
+typedef struct {
+ NMExportedObjectClass parent;
+} NMManagerClass;
+
+#define NM_MANAGER_GET_PRIVATE(o) ({ nm_assert (NM_IS_MANAGER (o)); &((o)->priv); })
G_DEFINE_TYPE (NMManager, nm_manager, NM_TYPE_EXPORTED_OBJECT)
@@ -167,7 +174,6 @@ static guint signals[LAST_SIGNAL] = { 0 };
NM_GOBJECT_PROPERTIES_DEFINE (NMManager,
PROP_VERSION,
PROP_STATE,
- PROP_STATE_FILE,
PROP_STARTUP,
PROP_NETWORKING_ENABLED,
PROP_WIRELESS_ENABLED,
@@ -401,7 +407,7 @@ find_ac_for_connection (NMManager *manager, NMConnection *connection)
}
/* Filter out connections that are already active.
- * nm_settings_get_connections() returns sorted list. We need to preserve the
+ * nm_settings_get_connections_sorted() returns sorted list. We need to preserve the
* order so that we didn't change auto-activation order (recent timestamps
* are first).
* Caller is responsible for freeing the returned list with g_slist_free().
@@ -410,7 +416,7 @@ GSList *
nm_manager_get_activatable_connections (NMManager *manager)
{
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
- GSList *all_connections = nm_settings_get_connections (priv->settings);
+ GSList *all_connections = nm_settings_get_connections_sorted (priv->settings);
GSList *connections = NULL, *iter;
NMSettingsConnection *connection;
@@ -1125,7 +1131,7 @@ system_create_virtual_device (NMManager *self, NMConnection *connection)
}
/* Create backing resources if the device has any autoconnect connections */
- connections = nm_settings_get_connections (priv->settings);
+ connections = nm_settings_get_connections_sorted (priv->settings);
for (iter = connections; iter; iter = g_slist_next (iter)) {
NMConnection *candidate = iter->data;
NMSettingConnection *s_con;
@@ -1160,7 +1166,7 @@ retry_connections_for_parent_device (NMManager *self, NMDevice *device)
g_return_if_fail (device);
- connections = nm_settings_get_connections (priv->settings);
+ connections = nm_settings_get_connections_sorted (priv->settings);
for (iter = connections; iter; iter = g_slist_next (iter)) {
NMConnection *candidate = iter->data;
gs_free_error GError *error = NULL;
@@ -1229,7 +1235,7 @@ system_unmanaged_devices_changed_cb (NMSettings *settings,
unmanaged_specs = nm_settings_get_unmanaged_specs (priv->settings);
for (iter = priv->devices; iter; iter = g_slist_next (iter))
- nm_device_set_unmanaged_by_user_config (NM_DEVICE (iter->data), unmanaged_specs);
+ nm_device_set_unmanaged_by_user_settings (NM_DEVICE (iter->data), unmanaged_specs);
}
static void
@@ -1268,54 +1274,6 @@ system_hostname_changed_cb (NMSettings *settings,
/* General NMManager stuff */
/*******************************************************************/
-/* Store value into key-file; supported types: boolean, int, string */
-static gboolean
-write_value_to_state_file (const char *filename,
- const char *group,
- const char *key,
- GType value_type,
- gpointer value,
- GError **error)
-{
- GKeyFile *key_file;
- char *data;
- gsize len = 0;
- gboolean ret = FALSE;
-
- g_return_val_if_fail (filename != NULL, FALSE);
- g_return_val_if_fail (group != NULL, FALSE);
- g_return_val_if_fail (key != NULL, FALSE);
- g_return_val_if_fail (value_type == G_TYPE_BOOLEAN ||
- value_type == G_TYPE_INT ||
- value_type == G_TYPE_STRING,
- FALSE);
-
- key_file = g_key_file_new ();
-
- g_key_file_set_list_separator (key_file, ',');
- g_key_file_load_from_file (key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
- switch (value_type) {
- case G_TYPE_BOOLEAN:
- g_key_file_set_boolean (key_file, group, key, *((gboolean *) value));
- break;
- case G_TYPE_INT:
- g_key_file_set_integer (key_file, group, key, *((gint *) value));
- break;
- case G_TYPE_STRING:
- g_key_file_set_string (key_file, group, key, *((const gchar **) value));
- break;
- }
-
- data = g_key_file_to_data (key_file, &len, NULL);
- if (data) {
- ret = g_file_set_contents (filename, data, len, error);
- g_free (data);
- }
- g_key_file_free (key_file);
-
- return ret;
-}
-
static gboolean
radio_enabled_for_rstate (RadioState *rstate, gboolean check_changeable)
{
@@ -1944,7 +1902,7 @@ add_device (NMManager *self, NMDevice *device, GError **error)
type_desc = nm_device_get_type_desc (device);
g_assert (type_desc);
- nm_device_set_unmanaged_by_user_config (device, nm_settings_get_unmanaged_specs (priv->settings));
+ nm_device_set_unmanaged_by_user_settings (device, nm_settings_get_unmanaged_specs (priv->settings));
nm_device_set_unmanaged_flags (device,
NM_UNMANAGED_SLEEPING,
@@ -1999,11 +1957,12 @@ factory_component_added_cb (NMDeviceFactory *factory,
GObject *component,
gpointer user_data)
{
+ NMManager *self = user_data;
GSList *iter;
- g_return_val_if_fail (NM_IS_MANAGER (user_data), FALSE);
+ g_return_val_if_fail (self, FALSE);
- for (iter = NM_MANAGER_GET_PRIVATE (user_data)->devices; iter; iter = iter->next) {
+ for (iter = NM_MANAGER_GET_PRIVATE (self)->devices; iter; iter = iter->next) {
if (nm_device_notify_component_added ((NMDevice *) iter->data, component))
return TRUE;
}
@@ -2079,6 +2038,9 @@ platform_link_added (NMManager *self,
if (!ignore) {
_LOGW (LOGD_HW, "%s: factory failed to create device: %s",
plink->name, error->message);
+ } else {
+ _LOGD (LOGD_HW, "%s: factory failed to create device: %s",
+ plink->name, error->message);
}
return;
}
@@ -2641,7 +2603,7 @@ find_slaves (NMManager *manager,
* even if a slave was already active, it might be deactivated during
* master reactivation.
*/
- all_connections = nm_settings_get_connections (priv->settings);
+ all_connections = nm_settings_get_connections_sorted (priv->settings);
for (iter = all_connections; iter; iter = iter->next) {
NMSettingsConnection *master_connection = NULL;
NMDevice *master_device = NULL;
@@ -3375,7 +3337,7 @@ _activation_auth_done (NMActiveConnection *active,
g_dbus_method_invocation_return_value (context,
g_variant_new ("(o)",
nm_exported_object_get_path (NM_EXPORTED_OBJECT (active))));
- nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ACTIVATE, connection, TRUE,
+ nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ACTIVATE, connection, TRUE, NULL,
subject, NULL);
g_object_unref (active);
return;
@@ -3387,7 +3349,7 @@ _activation_auth_done (NMActiveConnection *active,
}
g_assert (error);
- nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ACTIVATE, connection, FALSE,
+ nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ACTIVATE, connection, FALSE, NULL,
subject, error->message);
_internal_activation_failed (self, active, error->message);
@@ -3475,7 +3437,7 @@ impl_manager_activate_connection (NMManager *self,
error:
if (connection) {
- nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ACTIVATE, connection, FALSE,
+ nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ACTIVATE, connection, FALSE, NULL,
subject, error->message);
}
g_clear_object (&active);
@@ -3524,6 +3486,7 @@ activation_add_done (NMSettings *settings,
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD_ACTIVATE,
nm_active_connection_get_settings_connection (active),
TRUE,
+ NULL,
nm_active_connection_get_subject (active),
NULL);
return;
@@ -3538,6 +3501,7 @@ activation_add_done (NMSettings *settings,
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD_ACTIVATE,
NULL,
FALSE,
+ NULL,
nm_active_connection_get_subject (active),
error->message);
g_clear_error (&local);
@@ -3582,6 +3546,7 @@ _add_and_activate_auth_done (NMActiveConnection *active,
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD_ACTIVATE,
NULL,
FALSE,
+ NULL,
nm_active_connection_get_subject (active),
error->message);
g_dbus_method_invocation_take_error (context, error);
@@ -3633,7 +3598,7 @@ impl_manager_add_and_activate_connection (NMManager *self,
if (!subject)
goto error;
- all_connections = nm_settings_get_connections (priv->settings);
+ all_connections = nm_settings_get_connections_sorted (priv->settings);
if (vpn) {
/* Try to fill the VPN's connection setting and name at least */
if (!nm_connection_get_setting_vpn (connection)) {
@@ -3683,7 +3648,7 @@ impl_manager_add_and_activate_connection (NMManager *self,
return;
error:
- nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD_ACTIVATE, NULL, FALSE, subject, error->message);
+ nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD_ACTIVATE, NULL, FALSE, NULL, subject, error->message);
g_clear_object (&connection);
g_slist_free (all_connections);
g_clear_object (&subject);
@@ -3779,6 +3744,7 @@ deactivate_net_auth_done_cb (NMAuthChain *chain,
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_DEACTIVATE,
nm_active_connection_get_settings_connection (active),
!error,
+ NULL,
nm_auth_chain_get_subject (chain),
error ? error->message : NULL);
}
@@ -3852,7 +3818,7 @@ impl_manager_deactivate_connection (NMManager *self,
done:
if (error) {
if (connection) {
- nm_audit_log_connection_op (NM_AUDIT_OP_CONN_DEACTIVATE, connection, FALSE,
+ nm_audit_log_connection_op (NM_AUDIT_OP_CONN_DEACTIVATE, connection, FALSE, NULL,
subject, error->message);
}
g_dbus_method_invocation_take_error (context, error);
@@ -4192,21 +4158,9 @@ static void
_internal_enable (NMManager *self, gboolean enable)
{
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- GError *error = NULL;
- /* Update "NetworkingEnabled" key in state file */
- if (priv->state_file) {
- if (!write_value_to_state_file (priv->state_file,
- "main", "NetworkingEnabled",
- G_TYPE_BOOLEAN, (gpointer) &enable,
- &error)) {
- /* Not a hard error */
- _LOGW (LOGD_SUSPEND, "writing to state file %s failed: %s",
- priv->state_file,
- error->message);
- g_clear_error (&error);
- }
- }
+ nm_config_state_set (priv->config, TRUE, FALSE,
+ NM_CONFIG_STATE_PROPERTY_NETWORKING_ENABLED, enable);
_LOGI (LOGD_SUSPEND, "%s requested (sleeping: %s enabled: %s)",
enable ? "enable" : "disable",
@@ -4592,7 +4546,7 @@ nm_manager_start (NMManager *self, GError **error)
* connection-added signals thus devices have to be created manually.
*/
_LOGD (LOGD_CORE, "creating virtual devices...");
- connections = nm_settings_get_connections (priv->settings);
+ connections = nm_settings_get_connections_sorted (priv->settings);
for (iter = connections; iter; iter = iter->next)
connection_changed (self, NM_CONNECTION (iter->data));
g_slist_free (connections);
@@ -5144,7 +5098,6 @@ manager_radio_user_toggled (NMManager *self,
gboolean enabled)
{
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- GError *error = NULL;
gboolean old_enabled, new_enabled;
/* Don't touch devices if asleep/networking disabled */
@@ -5158,17 +5111,8 @@ manager_radio_user_toggled (NMManager *self,
}
/* Update enabled key in state file */
- if (priv->state_file) {
- if (!write_value_to_state_file (priv->state_file,
- "main", rstate->key,
- G_TYPE_BOOLEAN, (gpointer) &enabled,
- &error)) {
- _LOGW (LOGD_CORE, "writing to state file %s failed: %s",
- priv->state_file,
- error->message);
- g_clear_error (&error);
- }
- }
+ nm_config_state_set (priv->config, TRUE, FALSE,
+ rstate->key, enabled);
/* When the user toggles the radio, their request should override any
* daemon (like ModemManager) enabled state that can be changed. For WWAN
@@ -5230,34 +5174,22 @@ nm_manager_get (void)
return singleton_instance;
}
-NMConnectionProvider *
-nm_connection_provider_get (void)
+NMSettings *
+nm_settings_get (void)
{
- NMConnectionProvider *p;
-
g_return_val_if_fail (singleton_instance, NULL);
- p = NM_CONNECTION_PROVIDER (NM_MANAGER_GET_PRIVATE (singleton_instance)->settings);
- g_return_val_if_fail (p, NULL);
- return p;
+ return NM_MANAGER_GET_PRIVATE (singleton_instance)->settings;
}
NMManager *
-nm_manager_setup (const char *state_file,
- gboolean initial_net_enabled,
- gboolean initial_wifi_enabled,
- gboolean initial_wwan_enabled)
+nm_manager_setup (void)
{
NMManager *self;
g_return_val_if_fail (!singleton_instance, singleton_instance);
- self = g_object_new (NM_TYPE_MANAGER,
- NM_MANAGER_NETWORKING_ENABLED, initial_net_enabled,
- NM_MANAGER_WIRELESS_ENABLED, initial_wifi_enabled,
- NM_MANAGER_WWAN_ENABLED, initial_wwan_enabled,
- NM_MANAGER_STATE_FILE, state_file,
- NULL);
+ self = g_object_new (NM_TYPE_MANAGER, NULL);
nm_assert (NM_IS_MANAGER (self));
singleton_instance = self;
@@ -5275,6 +5207,7 @@ constructed (GObject *object)
NMManager *self = NM_MANAGER (object);
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
NMConfigData *config_data;
+ const NMConfigState *state;
G_OBJECT_CLASS (nm_manager_parent_class)->constructed (object);
@@ -5320,6 +5253,13 @@ constructed (GObject *object)
g_signal_connect (priv->connectivity, "notify::" NM_CONNECTIVITY_STATE,
G_CALLBACK (connectivity_changed), self);
+ state = nm_config_state_get (priv->config);
+
+ priv->net_enabled = state->net_enabled;
+
+ priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = state->wifi_enabled;
+ priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = state->wwan_enabled;
+
priv->rfkill_mgr = nm_rfkill_manager_new ();
g_signal_connect (priv->rfkill_mgr,
"rfkill-changed",
@@ -5346,14 +5286,14 @@ nm_manager_init (NMManager *self)
memset (priv->radio_states, 0, sizeof (priv->radio_states));
priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = TRUE;
- priv->radio_states[RFKILL_TYPE_WLAN].key = "WirelessEnabled";
+ priv->radio_states[RFKILL_TYPE_WLAN].key = NM_CONFIG_STATE_PROPERTY_WIFI_ENABLED;
priv->radio_states[RFKILL_TYPE_WLAN].prop = NM_MANAGER_WIRELESS_ENABLED;
priv->radio_states[RFKILL_TYPE_WLAN].hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED;
priv->radio_states[RFKILL_TYPE_WLAN].desc = "WiFi";
priv->radio_states[RFKILL_TYPE_WLAN].rtype = RFKILL_TYPE_WLAN;
priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = TRUE;
- priv->radio_states[RFKILL_TYPE_WWAN].key = "WWANEnabled";
+ priv->radio_states[RFKILL_TYPE_WWAN].key = NM_CONFIG_STATE_PROPERTY_WWAN_ENABLED;
priv->radio_states[RFKILL_TYPE_WWAN].prop = NM_MANAGER_WWAN_ENABLED;
priv->radio_states[RFKILL_TYPE_WWAN].hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED;
priv->radio_states[RFKILL_TYPE_WWAN].desc = "WWAN";
@@ -5516,33 +5456,15 @@ set_property (GObject *object, guint prop_id,
GError *error = NULL;
switch (prop_id) {
- case PROP_STATE_FILE:
- /* construct-only */
- priv->state_file = g_value_dup_string (value);
- break;
- case PROP_NETWORKING_ENABLED:
- /* construct-only */
- priv->net_enabled = g_value_get_boolean (value);
- break;
case PROP_WIRELESS_ENABLED:
- if (!priv->rfkill_mgr) {
- /* called during object construction. */
- priv->radio_states[RFKILL_TYPE_WLAN].user_enabled = g_value_get_boolean (value);
- } else {
- manager_radio_user_toggled (NM_MANAGER (object),
- &priv->radio_states[RFKILL_TYPE_WLAN],
- g_value_get_boolean (value));
- }
+ manager_radio_user_toggled (NM_MANAGER (object),
+ &priv->radio_states[RFKILL_TYPE_WLAN],
+ g_value_get_boolean (value));
break;
case PROP_WWAN_ENABLED:
- if (!priv->rfkill_mgr) {
- /* called during object construction. */
- priv->radio_states[RFKILL_TYPE_WWAN].user_enabled = g_value_get_boolean (value);
- } else {
- manager_radio_user_toggled (NM_MANAGER (object),
- &priv->radio_states[RFKILL_TYPE_WWAN],
- g_value_get_boolean (value));
- }
+ manager_radio_user_toggled (NM_MANAGER (object),
+ &priv->radio_states[RFKILL_TYPE_WWAN],
+ g_value_get_boolean (value));
break;
case PROP_WIMAX_ENABLED:
/* WIMAX is depreacted. This does nothing. */
@@ -5620,7 +5542,6 @@ dispose (GObject *object)
g_clear_object (&priv->settings);
}
- g_clear_pointer (&priv->state_file, g_free);
g_clear_object (&priv->vpn_manager);
/* Unregister property filter */
@@ -5665,8 +5586,6 @@ nm_manager_class_init (NMManagerClass *manager_class)
GObjectClass *object_class = G_OBJECT_CLASS (manager_class);
NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (manager_class);
- g_type_class_add_private (manager_class, sizeof (NMManagerPrivate));
-
exported_object_class->export_path = NM_DBUS_PATH;
/* virtual methods */
@@ -5682,13 +5601,6 @@ nm_manager_class_init (NMManagerClass *manager_class)
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
- obj_properties[PROP_STATE_FILE] =
- g_param_spec_string (NM_MANAGER_STATE_FILE, "", "",
- NULL,
- G_PARAM_WRITABLE |
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_STATIC_STRINGS);
-
obj_properties[PROP_STATE] =
g_param_spec_uint (NM_MANAGER_STATE, "", "",
0, NM_STATE_DISCONNECTED, 0,
@@ -5704,14 +5616,13 @@ nm_manager_class_init (NMManagerClass *manager_class)
obj_properties[PROP_NETWORKING_ENABLED] =
g_param_spec_boolean (NM_MANAGER_NETWORKING_ENABLED, "", "",
TRUE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_WIRELESS_ENABLED] =
g_param_spec_boolean (NM_MANAGER_WIRELESS_ENABLED, "", "",
TRUE,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_WIRELESS_HARDWARE_ENABLED] =
@@ -5724,7 +5635,6 @@ nm_manager_class_init (NMManagerClass *manager_class)
g_param_spec_boolean (NM_MANAGER_WWAN_ENABLED, "", "",
TRUE,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS);
obj_properties[PROP_WWAN_HARDWARE_ENABLED] =
@@ -5844,8 +5754,7 @@ nm_manager_class_init (NMManagerClass *manager_class)
g_signal_new (NM_MANAGER_DEVICE_ADDED,
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMManagerClass, device_added),
- NULL, NULL, NULL,
+ 0, NULL, NULL, NULL,
G_TYPE_NONE, 1, NM_TYPE_DEVICE);
/* Emitted for both realized devices and placeholder devices */
@@ -5861,8 +5770,7 @@ nm_manager_class_init (NMManagerClass *manager_class)
g_signal_new (NM_MANAGER_DEVICE_REMOVED,
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMManagerClass, device_removed),
- NULL, NULL, NULL,
+ 0, NULL, NULL, NULL,
G_TYPE_NONE, 1, NM_TYPE_DEVICE);
/* Emitted for both realized devices and placeholder devices */
@@ -5877,8 +5785,7 @@ nm_manager_class_init (NMManagerClass *manager_class)
g_signal_new (NM_MANAGER_STATE_CHANGED,
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMManagerClass, state_changed),
- NULL, NULL, NULL,
+ 0, NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals[CHECK_PERMISSIONS] =