mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-03 11:40:18 +01:00
config: convert NMConfig to object
This commit is contained in:
parent
20031e1846
commit
c910a52241
3 changed files with 148 additions and 63 deletions
|
|
@ -642,7 +642,7 @@ done:
|
|||
if (pidfile && wrote_pidfile)
|
||||
unlink (pidfile);
|
||||
|
||||
nm_config_free (config);
|
||||
g_object_unref (config);
|
||||
|
||||
/* Free options */
|
||||
g_free (pidfile);
|
||||
|
|
|
|||
185
src/nm-config.c
185
src/nm-config.c
|
|
@ -16,6 +16,7 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2011 Red Hat, Inc.
|
||||
* Copyright (C) 2013 Thomas Bechtold <thomasbechtold@jpberlin.de>
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
|
@ -27,7 +28,7 @@
|
|||
#define NM_DEFAULT_SYSTEM_CONF_FILE NMCONFDIR "/NetworkManager.conf"
|
||||
#define NM_OLD_SYSTEM_CONF_FILE NMCONFDIR "/nm-system-settings.conf"
|
||||
|
||||
struct NMConfig {
|
||||
typedef struct {
|
||||
char *path;
|
||||
char **plugins;
|
||||
char *dhcp_client;
|
||||
|
|
@ -37,7 +38,13 @@ struct NMConfig {
|
|||
char *connectivity_uri;
|
||||
guint connectivity_interval;
|
||||
char *connectivity_response;
|
||||
};
|
||||
} NMConfigPrivate;
|
||||
|
||||
static NMConfig *singleton = NULL;
|
||||
|
||||
G_DEFINE_TYPE (NMConfig, nm_config, G_TYPE_OBJECT)
|
||||
|
||||
#define NM_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CONFIG, NMConfigPrivate))
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
|
|
@ -52,12 +59,85 @@ nm_config_error_quark (void)
|
|||
|
||||
/************************************************************************/
|
||||
|
||||
static void
|
||||
nm_config_init (NMConfig *config)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
dispose (GObject *object)
|
||||
{
|
||||
NMConfig *config = NM_CONFIG (object);
|
||||
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
|
||||
|
||||
if (priv->path) {
|
||||
g_free (priv->path);
|
||||
priv->path = NULL;
|
||||
}
|
||||
if (priv->plugins) {
|
||||
g_strfreev (priv->plugins);
|
||||
priv->plugins = NULL;
|
||||
}
|
||||
if (priv->dhcp_client) {
|
||||
g_free (priv->dhcp_client);
|
||||
priv->dhcp_client = NULL;
|
||||
}
|
||||
if (priv->dns_plugins) {
|
||||
g_strfreev (priv->dns_plugins);
|
||||
priv->dns_plugins = NULL;
|
||||
}
|
||||
if (priv->log_level) {
|
||||
g_free (priv->log_level);
|
||||
priv->log_level = NULL;
|
||||
}
|
||||
if (priv->log_domains) {
|
||||
g_free (priv->log_domains);
|
||||
priv->log_domains = NULL;
|
||||
}
|
||||
if (priv->connectivity_uri) {
|
||||
g_free (priv->connectivity_uri);
|
||||
priv->connectivity_uri = NULL;
|
||||
}
|
||||
if (priv->connectivity_response) {
|
||||
g_free (priv->connectivity_response);
|
||||
priv->connectivity_response = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (nm_config_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
finalize (GObject *gobject)
|
||||
{
|
||||
singleton = NULL;
|
||||
G_OBJECT_CLASS (nm_config_parent_class)->finalize (gobject);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nm_config_class_init (NMConfigClass *config_class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (config_class);
|
||||
|
||||
g_type_class_add_private (config_class, sizeof (NMConfigPrivate));
|
||||
object_class->dispose = dispose;
|
||||
object_class->finalize = finalize;
|
||||
}
|
||||
|
||||
NMConfig *
|
||||
nm_config_get (void)
|
||||
{
|
||||
g_assert (singleton);
|
||||
g_object_ref (singleton);
|
||||
return singleton;
|
||||
}
|
||||
|
||||
const char *
|
||||
nm_config_get_path (NMConfig *config)
|
||||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return config->path;
|
||||
return NM_CONFIG_GET_PRIVATE (config)->path;
|
||||
}
|
||||
|
||||
const char **
|
||||
|
|
@ -65,7 +145,7 @@ nm_config_get_plugins (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return (const char **) config->plugins;
|
||||
return (const char **) NM_CONFIG_GET_PRIVATE (config)->plugins;
|
||||
}
|
||||
|
||||
const char *
|
||||
|
|
@ -73,7 +153,7 @@ nm_config_get_dhcp_client (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return config->dhcp_client;
|
||||
return NM_CONFIG_GET_PRIVATE (config)->dhcp_client;;
|
||||
}
|
||||
|
||||
const char **
|
||||
|
|
@ -81,7 +161,7 @@ nm_config_get_dns_plugins (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return (const char **) config->dns_plugins;
|
||||
return (const char **) NM_CONFIG_GET_PRIVATE (config)->dns_plugins;
|
||||
}
|
||||
|
||||
const char *
|
||||
|
|
@ -89,7 +169,7 @@ nm_config_get_log_level (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return config->log_level;
|
||||
return NM_CONFIG_GET_PRIVATE (config)->log_level;;
|
||||
}
|
||||
|
||||
const char *
|
||||
|
|
@ -97,7 +177,7 @@ nm_config_get_log_domains (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return config->log_domains;
|
||||
return NM_CONFIG_GET_PRIVATE (config)->log_domains;
|
||||
}
|
||||
|
||||
const char *
|
||||
|
|
@ -105,7 +185,7 @@ nm_config_get_connectivity_uri (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return config->connectivity_uri;
|
||||
return NM_CONFIG_GET_PRIVATE (config)->connectivity_uri;
|
||||
}
|
||||
|
||||
const guint
|
||||
|
|
@ -113,7 +193,7 @@ nm_config_get_connectivity_interval (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, 0);
|
||||
|
||||
return config->connectivity_interval;
|
||||
return NM_CONFIG_GET_PRIVATE (config)->connectivity_interval;
|
||||
}
|
||||
|
||||
const char *
|
||||
|
|
@ -121,7 +201,7 @@ nm_config_get_connectivity_response (NMConfig *config)
|
|||
{
|
||||
g_return_val_if_fail (config != NULL, NULL);
|
||||
|
||||
return config->connectivity_response;
|
||||
return NM_CONFIG_GET_PRIVATE (config)->connectivity_response;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -138,6 +218,7 @@ fill_from_file (NMConfig *config,
|
|||
const char *cli_connectivity_response,
|
||||
GError **error)
|
||||
{
|
||||
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
|
||||
GKeyFile *kf;
|
||||
gboolean success = FALSE;
|
||||
|
||||
|
|
@ -149,41 +230,41 @@ fill_from_file (NMConfig *config,
|
|||
kf = g_key_file_new ();
|
||||
g_key_file_set_list_separator (kf, ',');
|
||||
if (g_key_file_load_from_file (kf, path, G_KEY_FILE_NONE, error)) {
|
||||
config->path = g_strdup (path);
|
||||
priv->path = g_strdup (path);
|
||||
|
||||
/* CLI provided options override config file options */
|
||||
if (cli_plugins && strlen (cli_plugins))
|
||||
config->plugins = g_strsplit_set (cli_plugins, ",", 0);
|
||||
priv->plugins = g_strsplit_set (cli_plugins, ",", 0);
|
||||
else
|
||||
config->plugins = g_key_file_get_string_list (kf, "main", "plugins", NULL, NULL);
|
||||
priv->plugins = g_key_file_get_string_list (kf, "main", "plugins", NULL, NULL);
|
||||
|
||||
config->dhcp_client = g_key_file_get_value (kf, "main", "dhcp", NULL);
|
||||
config->dns_plugins = g_key_file_get_string_list (kf, "main", "dns", NULL, NULL);
|
||||
priv->dhcp_client = g_key_file_get_value (kf, "main", "dhcp", NULL);
|
||||
priv->dns_plugins = g_key_file_get_string_list (kf, "main", "dns", NULL, NULL);
|
||||
|
||||
if (cli_log_level && strlen (cli_log_level))
|
||||
config->log_level = g_strdup (cli_log_level);
|
||||
priv->log_level = g_strdup (cli_log_level);
|
||||
else
|
||||
config->log_level = g_key_file_get_value (kf, "logging", "level", NULL);
|
||||
priv->log_level = g_key_file_get_value (kf, "logging", "level", NULL);
|
||||
|
||||
if (cli_log_domains && strlen (cli_log_domains))
|
||||
config->log_domains = g_strdup (cli_log_domains);
|
||||
priv->log_domains = g_strdup (cli_log_domains);
|
||||
else
|
||||
config->log_domains = g_key_file_get_value (kf, "logging", "domains", NULL);
|
||||
priv->log_domains = g_key_file_get_value (kf, "logging", "domains", NULL);
|
||||
|
||||
if (cli_connectivity_uri && strlen (cli_connectivity_uri))
|
||||
config->connectivity_uri = g_strdup (cli_connectivity_uri);
|
||||
priv->connectivity_uri = g_strdup (cli_connectivity_uri);
|
||||
else
|
||||
config->connectivity_uri = g_key_file_get_value (kf, "connectivity", "uri", NULL);
|
||||
priv->connectivity_uri = g_key_file_get_value (kf, "connectivity", "uri", NULL);
|
||||
|
||||
if (cli_connectivity_interval >= 0)
|
||||
config->connectivity_interval = cli_connectivity_interval;
|
||||
priv->connectivity_interval = cli_connectivity_interval;
|
||||
else
|
||||
config->connectivity_interval = g_key_file_get_integer (kf, "connectivity", "interval", NULL);
|
||||
priv->connectivity_interval = g_key_file_get_integer (kf, "connectivity", "interval", NULL);
|
||||
|
||||
if (cli_connectivity_response && strlen (cli_connectivity_response))
|
||||
config->connectivity_response = g_strdup (cli_connectivity_response);
|
||||
priv->connectivity_response = g_strdup (cli_connectivity_response);
|
||||
else
|
||||
config->connectivity_response = g_key_file_get_value (kf, "connectivity", "response", NULL);
|
||||
priv->connectivity_response = g_key_file_get_value (kf, "connectivity", "response", NULL);
|
||||
|
||||
success = TRUE;
|
||||
}
|
||||
|
|
@ -192,6 +273,7 @@ fill_from_file (NMConfig *config,
|
|||
return success;
|
||||
}
|
||||
|
||||
/* call this function only once! */
|
||||
NMConfig *
|
||||
nm_config_new (const char *cli_config_path,
|
||||
const char *cli_plugins,
|
||||
|
|
@ -202,20 +284,22 @@ nm_config_new (const char *cli_config_path,
|
|||
const char *cli_connectivity_response,
|
||||
GError **error)
|
||||
{
|
||||
NMConfig *config;
|
||||
GError *local = NULL;
|
||||
NMConfigPrivate *priv = NULL;
|
||||
|
||||
config = g_malloc0 (sizeof (*config));
|
||||
g_assert (!singleton);
|
||||
singleton = NM_CONFIG (g_object_new (NM_TYPE_CONFIG, NULL));
|
||||
priv = NM_CONFIG_GET_PRIVATE (singleton);
|
||||
|
||||
if (cli_config_path) {
|
||||
/* Bad user-specific config file path is a hard error */
|
||||
if (!fill_from_file (config, cli_config_path, cli_plugins, cli_log_level, cli_log_domains,
|
||||
if (!fill_from_file (singleton, cli_config_path, cli_plugins, cli_log_level, cli_log_domains,
|
||||
cli_connectivity_uri, cli_connectivity_interval, cli_connectivity_response,
|
||||
error)) {
|
||||
nm_config_free (config);
|
||||
return NULL;
|
||||
g_object_unref (singleton);
|
||||
singleton = NULL;
|
||||
}
|
||||
return config;
|
||||
return singleton;
|
||||
}
|
||||
|
||||
/* Even though we prefer NetworkManager.conf, we need to check the
|
||||
|
|
@ -226,10 +310,10 @@ nm_config_new (const char *cli_config_path,
|
|||
*/
|
||||
|
||||
/* Try deprecated nm-system-settings.conf first */
|
||||
if (fill_from_file (config, NM_OLD_SYSTEM_CONF_FILE, cli_plugins, cli_log_level, cli_log_domains,
|
||||
if (fill_from_file (singleton, NM_OLD_SYSTEM_CONF_FILE, cli_plugins, cli_log_level, cli_log_domains,
|
||||
cli_connectivity_uri, cli_connectivity_interval, cli_connectivity_response,
|
||||
&local))
|
||||
return config;
|
||||
return singleton;
|
||||
|
||||
if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND) == FALSE) {
|
||||
fprintf (stderr, "Default config file %s invalid: (%d) %s\n",
|
||||
|
|
@ -240,10 +324,10 @@ nm_config_new (const char *cli_config_path,
|
|||
g_clear_error (&local);
|
||||
|
||||
/* Try the standard config file location next */
|
||||
if (fill_from_file (config, NM_DEFAULT_SYSTEM_CONF_FILE, cli_plugins, cli_log_level, cli_log_domains,
|
||||
if (fill_from_file (singleton, NM_DEFAULT_SYSTEM_CONF_FILE, cli_plugins, cli_log_level, cli_log_domains,
|
||||
cli_connectivity_uri, cli_connectivity_interval, cli_connectivity_response,
|
||||
&local))
|
||||
return config;
|
||||
return singleton;
|
||||
|
||||
if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND) == FALSE) {
|
||||
fprintf (stderr, "Default config file %s invalid: (%d) %s\n",
|
||||
|
|
@ -251,38 +335,21 @@ nm_config_new (const char *cli_config_path,
|
|||
local ? local->code : -1,
|
||||
(local && local->message) ? local->message : "unknown");
|
||||
g_propagate_error (error, local);
|
||||
nm_config_free (config);
|
||||
return NULL;
|
||||
g_object_unref (singleton);
|
||||
singleton = NULL;
|
||||
return singleton;
|
||||
}
|
||||
|
||||
/* If for some reason no config file exists, and NM wasn't given on on
|
||||
* the command line, just use the default config file path.
|
||||
*/
|
||||
if (config->path == NULL) {
|
||||
config->path = g_strdup (NM_DEFAULT_SYSTEM_CONF_FILE);
|
||||
if (priv->path == NULL) {
|
||||
priv->path = g_strdup (NM_DEFAULT_SYSTEM_CONF_FILE);
|
||||
fprintf (stderr, "No config file found or given; using %s\n",
|
||||
NM_DEFAULT_SYSTEM_CONF_FILE);
|
||||
}
|
||||
|
||||
/* ignore error if config file not found */
|
||||
g_clear_error (&local);
|
||||
return config;
|
||||
return singleton;
|
||||
}
|
||||
|
||||
void
|
||||
nm_config_free (NMConfig *config)
|
||||
{
|
||||
g_return_if_fail (config != NULL);
|
||||
|
||||
g_free (config->path);
|
||||
g_strfreev (config->plugins);
|
||||
g_free (config->dhcp_client);
|
||||
g_strfreev (config->dns_plugins);
|
||||
g_free (config->log_level);
|
||||
g_free (config->log_domains);
|
||||
g_free (config->connectivity_uri);
|
||||
g_free (config->connectivity_response);
|
||||
memset (config, 0, sizeof (*config));
|
||||
g_free (config);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2011 Red Hat, Inc.
|
||||
* Copyright (C) 2013 Thomas Bechtold <thomasbechtold@jpberlin.de>
|
||||
*/
|
||||
|
||||
#ifndef NM_CONFIG_H
|
||||
|
|
@ -24,7 +25,24 @@
|
|||
#include <glib.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
typedef struct NMConfig NMConfig;
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define NM_TYPE_CONFIG (nm_config_get_type ())
|
||||
#define NM_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CONFIG, NMConfig))
|
||||
#define NM_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CONFIG, NMConfigClass))
|
||||
#define NM_IS_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CONFIG))
|
||||
#define NM_IS_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CONFIG))
|
||||
#define NM_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CONFIG, NMConfigClass))
|
||||
|
||||
typedef struct {
|
||||
GObject parent;
|
||||
} NMConfig;
|
||||
|
||||
typedef struct {
|
||||
GObjectClass parent;
|
||||
} NMConfigClass;
|
||||
|
||||
GType nm_config_get_type (void);
|
||||
|
||||
typedef enum {
|
||||
NM_CONFIG_ERROR_NO_MEMORY = 0, /*< nick=NoMemory >*/
|
||||
|
|
@ -33,7 +51,7 @@ typedef enum {
|
|||
#define NM_CONFIG_ERROR (nm_config_error_quark ())
|
||||
GQuark nm_config_error_quark (void);
|
||||
|
||||
|
||||
NMConfig *nm_config_get (void);
|
||||
NMConfig *nm_config_new (const char *cli_config_path,
|
||||
const char *cli_plugins,
|
||||
const char *cli_log_level,
|
||||
|
|
@ -53,7 +71,7 @@ const char *nm_config_get_connectivity_uri (NMConfig *config);
|
|||
const guint nm_config_get_connectivity_interval (NMConfig *config);
|
||||
const char *nm_config_get_connectivity_response (NMConfig *config);
|
||||
|
||||
void nm_config_free (NMConfig *config);
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* NM_CONFIG_H */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue