summaryrefslogtreecommitdiff
path: root/system-settings/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'system-settings/src/main.c')
-rw-r--r--system-settings/src/main.c900
1 files changed, 0 insertions, 900 deletions
diff --git a/system-settings/src/main.c b/system-settings/src/main.c
deleted file mode 100644
index 2c4734d8cd..0000000000
--- a/system-settings/src/main.c
+++ /dev/null
@@ -1,900 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* NetworkManager system settings service
- *
- * Søren Sandmann <sandmann@daimi.au.dk>
- * Dan Williams <dcbw@redhat.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * (C) Copyright 2007 - 2008 Red Hat, Inc.
- */
-
-#include <syslog.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netinet/ether.h>
-#include <signal.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gmodule.h>
-
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
-#include <nm-connection.h>
-#include <nm-setting-connection.h>
-#include <nm-setting-wired.h>
-#include <nm-setting-pppoe.h>
-#include <nm-settings.h>
-#include <nm-utils.h>
-#include <NetworkManager.h>
-#include "nm-glib-compat.h"
-
-#include "dbus-settings.h"
-#include "nm-system-config-hal-manager.h"
-#include "nm-system-config-interface.h"
-#include "nm-default-wired-connection.h"
-
-#define CONFIG_KEY_NO_AUTO_DEFAULT "no-auto-default"
-
-static GMainLoop *loop = NULL;
-static gboolean debug = FALSE;
-
-typedef struct {
- DBusConnection *connection;
- DBusGConnection *g_connection;
-
- DBusGProxy *bus_proxy;
- NMSystemConfigHalManager *hal_mgr;
-
- NMSysconfigSettings *settings;
-
- GHashTable *wired_devices;
-
- const char *config;
-} Application;
-
-
-NMSystemConfigHalManager *nm_system_config_hal_manager_get (DBusGConnection *g_connection);
-void nm_system_config_hal_manager_shutdown (NMSystemConfigHalManager *self);
-
-static gboolean dbus_init (Application *app);
-static gboolean start_dbus_service (Application *app);
-static void destroy_cb (DBusGProxy *proxy, gpointer user_data);
-static void device_added_cb (DBusGProxy *proxy, const char *udi, NMDeviceType devtype, gpointer user_data);
-
-
-static GQuark
-plugins_error_quark (void)
-{
- static GQuark error_quark = 0;
-
- if (G_UNLIKELY (error_quark == 0))
- error_quark = g_quark_from_static_string ("plugins-error-quark");
-
- return error_quark;
-}
-
-static GObject *
-find_plugin (GSList *list, const char *pname)
-{
- GSList *iter;
- GObject *obj = NULL;
-
- g_return_val_if_fail (pname != NULL, FALSE);
-
- for (iter = list; iter && !obj; iter = g_slist_next (iter)) {
- NMSystemConfigInterface *plugin = NM_SYSTEM_CONFIG_INTERFACE (iter->data);
- char *list_pname = NULL;
-
- g_object_get (G_OBJECT (plugin),
- NM_SYSTEM_CONFIG_INTERFACE_NAME,
- &list_pname,
- NULL);
- if (list_pname && !strcmp (pname, list_pname))
- obj = G_OBJECT (plugin);
-
- g_free (list_pname);
- }
-
- return obj;
-}
-
-static gboolean
-load_plugins (Application *app, const char *plugins, GError **error)
-{
- GSList *list = NULL;
- char **plist;
- char **iter;
-
- plist = g_strsplit (plugins, ",", 0);
- if (!plist)
- return FALSE;
-
- for (iter = plist; *iter; iter++) {
- GModule *plugin;
- char *full_name, *path;
- const char *pname = *iter;
- GObject *obj;
- GObject * (*factory_func) (void);
-
- /* ifcfg-fedora was renamed ifcfg-rh; handle old configs here */
- if (!strcmp (pname, "ifcfg-fedora"))
- pname = "ifcfg-rh";
-
- obj = find_plugin (list, pname);
- if (obj)
- continue;
-
- full_name = g_strdup_printf ("nm-settings-plugin-%s", pname);
- path = g_module_build_path (PLUGINDIR, full_name);
-
- plugin = g_module_open (path, G_MODULE_BIND_LOCAL);
- if (!plugin) {
- g_set_error (error, plugins_error_quark (), 0,
- "Could not load plugin '%s': %s",
- pname, g_module_error ());
- g_free (full_name);
- g_free (path);
- break;
- }
-
- g_free (full_name);
- g_free (path);
-
- if (!g_module_symbol (plugin, "nm_system_config_factory", (gpointer) (&factory_func))) {
- g_set_error (error, plugins_error_quark (), 0,
- "Could not find plugin '%s' factory function.",
- pname);
- break;
- }
-
- obj = (*factory_func) ();
- if (!obj || !NM_IS_SYSTEM_CONFIG_INTERFACE (obj)) {
- g_set_error (error, plugins_error_quark (), 0,
- "Plugin '%s' returned invalid system config object.",
- pname);
- break;
- }
-
- g_module_make_resident (plugin);
- g_object_weak_ref (obj, (GWeakNotify) g_module_close, plugin);
- nm_sysconfig_settings_add_plugin (app->settings, NM_SYSTEM_CONFIG_INTERFACE (obj));
- list = g_slist_append (list, obj);
- }
-
- g_strfreev (plist);
-
- g_slist_foreach (list, (GFunc) g_object_unref, NULL);
- g_slist_free (list);
-
- return TRUE;
-}
-
-static gboolean
-load_stuff (gpointer user_data)
-{
- Application *app = (Application *) user_data;
- GSList *devs, *iter;
-
- /* Grab wired devices to make default DHCP connections for them if needed */
- devs = nm_system_config_hal_manager_get_devices_of_type (app->hal_mgr, NM_DEVICE_TYPE_ETHERNET);
- for (iter = devs; iter; iter = g_slist_next (iter)) {
- device_added_cb (NULL, (const char *) iter->data, NM_DEVICE_TYPE_ETHERNET, app);
- g_free (iter->data);
- }
-
- g_slist_free (devs);
-
- if (!start_dbus_service (app)) {
- g_main_loop_quit (loop);
- return FALSE;
- }
-
- return FALSE;
-}
-
-typedef struct {
- Application *app;
- NMDefaultWiredConnection *connection;
- guint add_id;
- guint updated_id;
- guint deleted_id;
- char *udi;
-} WiredDeviceInfo;
-
-static void
-wired_device_info_destroy (gpointer user_data)
-{
- WiredDeviceInfo *info = (WiredDeviceInfo *) user_data;
-
- if (info->add_id)
- g_source_remove (info->add_id);
- if (info->updated_id)
- g_source_remove (info->updated_id);
- if (info->deleted_id)
- g_source_remove (info->deleted_id);
- if (info->connection) {
- nm_sysconfig_settings_remove_connection (info->app->settings,
- NM_EXPORTED_CONNECTION (info->connection),
- TRUE);
- g_object_unref (info->connection);
- }
- g_free (info);
-}
-
-static char *
-get_details_for_udi (Application *app, const char *udi, struct ether_addr *mac)
-{
- DBusGProxy *dev_proxy = NULL;
- char *address = NULL;
- char *iface = NULL;
- struct ether_addr *temp;
- GError *error = NULL;
-
- g_return_val_if_fail (app != NULL, FALSE);
- g_return_val_if_fail (udi != NULL, FALSE);
- g_return_val_if_fail (mac != NULL, FALSE);
-
- dev_proxy = dbus_g_proxy_new_for_name (app->g_connection,
- "org.freedesktop.Hal",
- udi,
- "org.freedesktop.Hal.Device");
- if (!dev_proxy)
- goto out;
-
- if (!dbus_g_proxy_call_with_timeout (dev_proxy,
- "GetPropertyString", 5000, &error,
- G_TYPE_STRING, "net.address", G_TYPE_INVALID,
- G_TYPE_STRING, &address, G_TYPE_INVALID)) {
- g_message ("Error getting hardware address for %s: (%d) %s",
- udi, error->code, error->message);
- g_error_free (error);
- goto out;
- }
-
- if (!address && !strlen (address))
- goto out;
-
- temp = ether_aton (address);
- if (!temp)
- goto out;
- memcpy (mac, temp, sizeof (struct ether_addr));
-
- if (!dbus_g_proxy_call_with_timeout (dev_proxy,
- "GetPropertyString", 5000, &error,
- G_TYPE_STRING, "net.interface", G_TYPE_INVALID,
- G_TYPE_STRING, &iface, G_TYPE_INVALID)) {
- g_message ("Error getting interface name for %s: (%d) %s",
- udi, error->code, error->message);
- g_error_free (error);
- }
-
-out:
- g_free (address);
- if (dev_proxy)
- g_object_unref (dev_proxy);
- return iface;
-}
-
-static gboolean
-have_connection_for_device (Application *app, GByteArray *mac)
-{
- GSList *list, *iter;
- NMSettingConnection *s_con;
- NMSettingWired *s_wired;
- const GByteArray *setting_mac;
- gboolean ret = FALSE;
-
- g_return_val_if_fail (app != NULL, FALSE);
- g_return_val_if_fail (mac != NULL, FALSE);
-
- /* Find a wired connection locked to the given MAC address, if any */
- list = nm_settings_list_connections (NM_SETTINGS (app->settings));
- for (iter = list; iter; iter = g_slist_next (iter)) {
- NMExportedConnection *exported = NM_EXPORTED_CONNECTION (iter->data);
- NMConnection *connection;
- const char *connection_type;
-
- connection = nm_exported_connection_get_connection (exported);
- if (!connection)
- continue;
-
- s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
- connection_type = nm_setting_connection_get_connection_type (s_con);
-
- if ( strcmp (connection_type, NM_SETTING_WIRED_SETTING_NAME)
- && strcmp (connection_type, NM_SETTING_PPPOE_SETTING_NAME))
- continue;
-
- s_wired = (NMSettingWired *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED);
-
- /* No wired setting; therefore the PPPoE connection applies to any device */
- if (!s_wired && !strcmp (connection_type, NM_SETTING_PPPOE_SETTING_NAME)) {
- ret = TRUE;
- break;
- }
-
- setting_mac = nm_setting_wired_get_mac_address (s_wired);
- if (setting_mac) {
- /* A connection mac-locked to this device */
- if (!memcmp (setting_mac->data, mac->data, ETH_ALEN)) {
- ret = TRUE;
- break;
- }
-
- } else {
- /* A connection that applies to any wired device */
- ret = TRUE;
- break;
- }
- }
-
- g_slist_free (list);
-
- return ret;
-}
-
-/* Search through the list of blacklisted MAC addresses in the config file. */
-static gboolean
-is_mac_auto_wired_blacklisted (const GByteArray *mac, const char *filename)
-{
- GKeyFile *config;
- char **list, **iter;
- gboolean found = FALSE;
-
- g_return_val_if_fail (mac != NULL, FALSE);
- g_return_val_if_fail (filename != NULL, FALSE);
-
- config = g_key_file_new ();
- if (!config) {
- g_warning ("%s: not enough memory to load config file.", __func__);
- return FALSE;
- }
-
- g_key_file_set_list_separator (config, ',');
- if (!g_key_file_load_from_file (config, filename, G_KEY_FILE_NONE, NULL))
- goto out;
-
- list = g_key_file_get_string_list (config, "main", CONFIG_KEY_NO_AUTO_DEFAULT, NULL, NULL);
- for (iter = list; iter && *iter; iter++) {
- struct ether_addr *candidate;
-
- candidate = ether_aton (*iter);
- if (candidate && !memcmp (mac->data, candidate->ether_addr_octet, ETH_ALEN)) {
- found = TRUE;
- break;
- }
- }
-
- if (list)
- g_strfreev (list);
-
-out:
- g_key_file_free (config);
- return found;
-}
-
-static void
-default_wired_deleted (NMDefaultWiredConnection *wired,
- const GByteArray *mac,
- WiredDeviceInfo *info)
-{
- NMConnection *wrapped;
- NMSettingConnection *s_con;
- char *tmp;
- GKeyFile *config;
- char **list, **iter, **updated;
- gboolean found = FALSE;
- gsize len = 0;
- char *data;
-
- /* If there was no config file specified, there's nothing to do */
- if (!info->app->config)
- goto cleanup;
-
- /* When the default wired connection is removed (either deleted or saved
- * to a new persistent connection by a plugin), write the MAC address of
- * the wired device to the config file and don't create a new default wired
- * connection for that device again.
- */
-
- wrapped = nm_exported_connection_get_connection (NM_EXPORTED_CONNECTION (wired));
- g_assert (wrapped);
- s_con = (NMSettingConnection *) nm_connection_get_setting (wrapped, NM_TYPE_SETTING_CONNECTION);
- g_assert (s_con);
-
- /* Ignore removals of read-only connections, since they couldn't have
- * been removed by the user.
- */
- if (nm_setting_connection_get_read_only (s_con))
- goto cleanup;
-
- config = g_key_file_new ();
- if (!config)
- goto cleanup;
-
- g_key_file_set_list_separator (config, ',');
- g_key_file_load_from_file (config, info->app->config, G_KEY_FILE_KEEP_COMMENTS, NULL);
-
- list = g_key_file_get_string_list (config, "main", CONFIG_KEY_NO_AUTO_DEFAULT, &len, NULL);
- /* Traverse entire list to get count of # items */
- for (iter = list; iter && *iter; iter++) {
- struct ether_addr *candidate;
-
- candidate = ether_aton (*iter);
- if (candidate && !memcmp (mac->data, candidate->ether_addr_octet, ETH_ALEN))
- found = TRUE;
- }
-
- /* Add this device's MAC to the list */
- if (!found) {
- tmp = g_strdup_printf ("%02x:%02x:%02x:%02x:%02x:%02x",
- mac->data[0], mac->data[1], mac->data[2],
- mac->data[3], mac->data[4], mac->data[5]);
-
- updated = g_malloc0 (sizeof (char*) * (len + 2));
- if (list && len)
- memcpy (updated, list, len);
- updated[len] = tmp;
-
- g_key_file_set_string_list (config,
- "main", CONFIG_KEY_NO_AUTO_DEFAULT,
- (const char **) updated,
- len + 1);
- /* g_free() not g_strfreev() since 'updated' isn't a deep-copy */
- g_free (updated);
- g_free (tmp);
-
- data = g_key_file_to_data (config, &len, NULL);
- if (data) {
- g_file_set_contents (info->app->config, data, len, NULL);
- g_free (data);
- }
- }
-
- if (list)
- g_strfreev (list);
- g_key_file_free (config);
-
-cleanup:
- /* Clear the connection first so that a 'removed' signal doesn't get emitted
- * during wired_device_info_destroy(), becuase this connection removal
- * is expected and already handled.
- */
- g_object_unref (wired);
- info->connection = NULL;
-
- g_hash_table_remove (info->app->wired_devices, info->udi);
-}
-
-static GError *
-default_wired_try_update (NMDefaultWiredConnection *wired,
- GHashTable *new_settings,
- WiredDeviceInfo *info)
-{
- GError *error = NULL;
- NMConnection *wrapped;
- NMSettingConnection *s_con;
- const char *id;
-
- /* Try to move this default wired conneciton to a plugin so that it has
- * persistent storage.
- */
-
- wrapped = nm_exported_connection_get_connection (NM_EXPORTED_CONNECTION (wired));
- g_assert (wrapped);
- s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (wrapped, NM_TYPE_SETTING_CONNECTION));
- g_assert (s_con);
- id = nm_setting_connection_get_id (s_con);
- g_assert (id);
-
- nm_sysconfig_settings_remove_connection (info->app->settings, NM_EXPORTED_CONNECTION (wired), FALSE);
- if (nm_sysconfig_settings_add_new_connection (info->app->settings, new_settings, &error)) {
- g_message ("Saved default wired connection '%s' to persistent storage", id);
- return NULL;
- }
-
- g_warning ("%s: couldn't save default wired connection '%s': %d / %s",
- __func__, id, error ? error->code : -1,
- (error && error->message) ? error->message : "(unknown)");
-
- /* If there was an error, don't destroy the default wired connection,
- * but add it back to the system settings service. Connection is already
- * exported on the bus, don't export it again, thus do_export == FALSE.
- */
- nm_sysconfig_settings_add_connection (info->app->settings, NM_EXPORTED_CONNECTION (wired), FALSE);
-
- return error;
-}
-
-static gboolean
-add_default_wired_connection (gpointer user_data)
-{
- WiredDeviceInfo *info = (WiredDeviceInfo *) user_data;
- GByteArray *mac = NULL;
- struct ether_addr tmp;
- char *iface = NULL;
- NMSettingConnection *s_con;
- NMConnection *wrapped;
- gboolean read_only = TRUE;
- const char *id;
-
- info->add_id = 0;
- g_assert (info->connection == NULL);
-
- /* If the device isn't managed, ignore it */
- if (!nm_sysconfig_settings_is_device_managed (info->app->settings, info->udi))
- goto ignore;
-
- iface = get_details_for_udi (info->app, info->udi, &tmp);
- if (!iface)
- goto ignore;
-
- mac = g_byte_array_sized_new (ETH_ALEN);
- g_byte_array_append (mac, tmp.ether_addr_octet, ETH_ALEN);
-
- if (have_connection_for_device (info->app, mac))
- goto ignore;
-
- if (info->app->config && is_mac_auto_wired_blacklisted (mac, info->app->config))
- goto ignore;
-
- if (nm_sysconfig_settings_get_plugin (info->app->settings, NM_SYSTEM_CONFIG_INTERFACE_CAP_MODIFY_CONNECTIONS))
- read_only = FALSE;
-
- info->connection = nm_default_wired_connection_new (mac, iface, read_only);
- if (!info->connection)
- goto ignore;
-
- wrapped = nm_exported_connection_get_connection (NM_EXPORTED_CONNECTION (info->connection));
- g_assert (wrapped);
- s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (wrapped, NM_TYPE_SETTING_CONNECTION));
- g_assert (s_con);
- id = nm_setting_connection_get_id (s_con);
- g_assert (id);
-
- g_message ("Added default wired connection '%s' for %s", id, info->udi);
-
- info->updated_id = g_signal_connect (info->connection, "try-update",
- (GCallback) default_wired_try_update, info);
- info->deleted_id = g_signal_connect (info->connection, "deleted",
- (GCallback) default_wired_deleted, info);
- nm_sysconfig_settings_add_connection (info->app->settings,
- NM_EXPORTED_CONNECTION (info->connection),
- TRUE);
- return FALSE;
-
-ignore:
- if (mac)
- g_byte_array_free (mac, TRUE);
- g_free (iface);
- g_hash_table_remove (info->app->wired_devices, info->udi);
- return FALSE;
-}
-
-static void
-device_added_cb (DBusGProxy *proxy, const char *udi, NMDeviceType devtype, gpointer user_data)
-{
- Application *app = (Application *) user_data;
- WiredDeviceInfo *info;
-
- if (devtype != NM_DEVICE_TYPE_ETHERNET)
- return;
-
- /* Wait for a plugin to figure out if the device should be managed or not */
- info = g_malloc0 (sizeof (WiredDeviceInfo));
- info->app = app;
- info->add_id = g_timeout_add_seconds (4, add_default_wired_connection, info);
- info->udi = g_strdup (udi);
- g_hash_table_insert (app->wired_devices, info->udi, info);
-}
-
-static void
-device_removed_cb (DBusGProxy *proxy, const char *udi, NMDeviceType devtype, gpointer user_data)
-{
- Application *app = (Application *) user_data;
-
- g_hash_table_remove (app->wired_devices, udi);
-}
-
-/******************************************************************/
-
-static void
-dbus_cleanup (Application *app)
-{
- if (app->g_connection) {
- dbus_g_connection_unref (app->g_connection);
- app->g_connection = NULL;
- app->connection = NULL;
- }
-
- if (app->bus_proxy) {
- g_signal_handlers_disconnect_by_func (app->bus_proxy, destroy_cb, app);
- g_object_unref (app->bus_proxy);
- app->bus_proxy = NULL;
- }
-}
-
-static void
-destroy_cb (DBusGProxy *proxy, gpointer user_data)
-{
- /* Clean up existing connection */
- g_warning ("disconnected from the system bus, exiting.");
- g_main_loop_quit (loop);
-}
-
-static gboolean
-start_dbus_service (Application *app)
-{
- int request_name_result;
- GError *err = NULL;
-
- if (!dbus_g_proxy_call (app->bus_proxy, "RequestName", &err,
- G_TYPE_STRING, NM_DBUS_SERVICE_SYSTEM_SETTINGS,
- G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
- G_TYPE_INVALID,
- G_TYPE_UINT, &request_name_result,
- G_TYPE_INVALID)) {
- g_warning ("Could not acquire the NetworkManagerSystemSettings service.\n"
- " Message: '%s'", err->message);
- g_error_free (err);
- return FALSE;
- }
-
- if (request_name_result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
- g_warning ("Could not acquire the NetworkManagerSystemSettings service "
- "as it is already taken. Return: %d",
- request_name_result);
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gboolean
-dbus_init (Application *app)
-{
- GError *err = NULL;
-
- dbus_connection_set_change_sigpipe (TRUE);
-
- app->g_connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &err);
- if (!app->g_connection) {
- g_warning ("Could not get the system bus. Make sure "
- "the message bus daemon is running! Message: %s",
- err->message);
- g_error_free (err);
- return FALSE;
- }
-
- app->connection = dbus_g_connection_get_connection (app->g_connection);
- dbus_connection_set_exit_on_disconnect (app->connection, FALSE);
-
- app->bus_proxy = dbus_g_proxy_new_for_name (app->g_connection,
- "org.freedesktop.DBus",
- "/org/freedesktop/DBus",
- "org.freedesktop.DBus");
- if (!app->bus_proxy) {
- g_warning ("Could not get the DBus object!");
- return FALSE;
- }
-
- g_signal_connect (app->bus_proxy, "destroy", G_CALLBACK (destroy_cb), app);
-
- return TRUE;
-}
-
-static gboolean
-parse_config_file (const char *filename, char **plugins, GError **error)
-{
- GKeyFile *config;
-
- config = g_key_file_new ();
- if (!config) {
- g_set_error (error, plugins_error_quark (), 0,
- "Not enough memory to load config file.");
- return FALSE;
- }
-
- g_key_file_set_list_separator (config, ',');
- if (!g_key_file_load_from_file (config, filename, G_KEY_FILE_NONE, error))
- return FALSE;
-
- *plugins = g_key_file_get_value (config, "main", "plugins", error);
- if (*error)
- return FALSE;
-
- g_key_file_free (config);
- return TRUE;
-}
-
-static void
-log_handler (const gchar *log_domain,
- GLogLevelFlags log_level,
- const gchar *message,
- gpointer ignored)
-{
- int syslog_priority;
-
- switch (log_level) {
- case G_LOG_LEVEL_ERROR:
- syslog_priority = LOG_CRIT;
- break;
-
- case G_LOG_LEVEL_CRITICAL:
- syslog_priority = LOG_ERR;
- break;
-
- case G_LOG_LEVEL_WARNING:
- syslog_priority = LOG_WARNING;
- break;
-
- case G_LOG_LEVEL_MESSAGE:
- syslog_priority = LOG_NOTICE;
- break;
-
- case G_LOG_LEVEL_DEBUG:
- syslog_priority = LOG_DEBUG;
- break;
-
- case G_LOG_LEVEL_INFO:
- default:
- syslog_priority = LOG_INFO;
- break;
- }
-
- syslog (syslog_priority, "%s", message);
-}
-
-
-static void
-logging_setup (void)
-{
- openlog (G_LOG_DOMAIN, LOG_CONS, LOG_DAEMON);
- g_log_set_handler (G_LOG_DOMAIN,
- G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
- log_handler,
- NULL);
-}
-
-static void
-logging_shutdown (void)
-{
- closelog ();
-}
-
-static void
-signal_handler (int signo)
-{
- if (signo == SIGINT || signo == SIGTERM) {
- if (debug)
- g_message ("Caught signal %d, shutting down...", signo);
- g_main_loop_quit (loop);
- }
-}
-
-static void
-setup_signals (void)
-{
- struct sigaction action;
- sigset_t mask;
-
- sigemptyset (&mask);
- action.sa_handler = signal_handler;
- action.sa_mask = mask;
- action.sa_flags = 0;
- sigaction (SIGTERM, &action, NULL);
- sigaction (SIGINT, &action, NULL);
-}
-
-int
-main (int argc, char **argv)
-{
- Application *app = g_new0 (Application, 1);
- GOptionContext *opt_ctx;
- GError *error = NULL;
- char *plugins = NULL;
- char *config = NULL;
-
- GOptionEntry entries[] = {
- { "config", 0, 0, G_OPTION_ARG_FILENAME, &config, "Config file location", "/path/to/config.file" },
- { "plugins", 0, 0, G_OPTION_ARG_STRING, &plugins, "List of plugins separated by ,", "plugin1,plugin2" },
- { "debug", 0, 0, G_OPTION_ARG_NONE, &debug, "Output to console rather than syslog", NULL },
- { NULL }
- };
-
- opt_ctx = g_option_context_new (NULL);
- g_option_context_set_summary (opt_ctx, "Provides system network settings to NetworkManager.");
- g_option_context_add_main_entries (opt_ctx, entries, NULL);
-
- if (!g_option_context_parse (opt_ctx, &argc, &argv, &error)) {
- g_warning ("%s\n", error->message);
- g_error_free (error);
- return 1;
- }
-
- g_option_context_free (opt_ctx);
-
- if (config) {
- app->config = config;
- if (!parse_config_file (app->config, &plugins, &error)) {
- g_warning ("Invalid config file: %s.", error->message);
- return 1;
- }
- }
-
- if (!plugins) {
- g_warning ("No plugins were specified.");
- return 1;
- }
-
- g_type_init ();
-
- if (!g_module_supported ()) {
- g_warning ("GModules are not supported on your platform!");
- return 1;
- }
-
- loop = g_main_loop_new (NULL, FALSE);
-
- if (!debug)
- logging_setup ();
-
- if (!dbus_init (app))
- return -1;
-
- app->hal_mgr = nm_system_config_hal_manager_get (app->g_connection);
- app->settings = nm_sysconfig_settings_new (app->g_connection, app->hal_mgr);
-
- app->wired_devices = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, wired_device_info_destroy);
- g_signal_connect (G_OBJECT (app->hal_mgr), "device-added",
- G_CALLBACK (device_added_cb), app);
- g_signal_connect (G_OBJECT (app->hal_mgr), "device-removed",
- G_CALLBACK (device_removed_cb), app);
-
- /* Load the plugins; fail if a plugin is not found. */
- load_plugins (app, plugins, &error);
- if (error) {
- g_warning ("Error: %d - %s", error->code, error->message);
- return -1;
- }
- g_free (plugins);
-
- setup_signals ();
-
- g_idle_add (load_stuff, app);
-
- g_main_loop_run (loop);
-
- nm_system_config_hal_manager_shutdown (app->hal_mgr);
- g_object_unref (app->hal_mgr);
-
- g_hash_table_destroy (app->wired_devices);
-
- g_object_unref (app->settings);
- dbus_cleanup (app);
-
- if (!debug)
- logging_shutdown ();
-
- return 0;
-}
-