diff --git a/introspection/nm-manager.xml b/introspection/nm-manager.xml
index 8303f4d46..406b5cfd1 100644
--- a/introspection/nm-manager.xml
+++ b/introspection/nm-manager.xml
@@ -96,6 +96,28 @@
+
+
+
+ Set logging verbosity and which operations are logged.
+
+
+
+ One of [ERR, WARN, INFO, DEBUG].
+
+
+
+
+ A combination of logging domains separated by commas (','), or "NONE"
+ to disable logging. Each domain enables logging for operations
+ related to that domain. Available domains are: [NONE, HW, RKILL,
+ ETHER, WIFI, BT, MB, DHCP4, DHCP6, PPP, WIFI_SCAN, IP4, IP6, AUTOIP4,
+ DNS, VPN, SHARING, SUPPLICANT, USER_SET, SYS_SET, SUSPEND, CORE,
+ DEVICE, OLPC]
+
+
+
+
Indicates if wireless is currently enabled or not.
diff --git a/src/logging/nm-logging.c b/src/logging/nm-logging.c
index 446c7a417..3e3efa476 100644
--- a/src/logging/nm-logging.c
+++ b/src/logging/nm-logging.c
@@ -85,6 +85,40 @@ static const LogDesc domain_descs[] = {
{ 0, NULL }
};
+/************************************************************************/
+
+enum {
+ NM_LOGGING_ERROR_UNKNOWN_LEVEL = 0,
+ NM_LOGGING_ERROR_UNKNOWN_DOMAIN = 1,
+};
+
+#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
+
+GQuark
+nm_logging_error_quark (void)
+{
+ static GQuark ret = 0;
+
+ if (ret == 0)
+ ret = g_quark_from_static_string ("nm_logging_error");
+ return ret;
+}
+
+GType
+nm_logging_error_get_type (void)
+{
+ static GType etype = 0;
+
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ ENUM_ENTRY (NM_LOGGING_ERROR_UNKNOWN_LEVEL, "UnknownLevel"),
+ ENUM_ENTRY (NM_LOGGING_ERROR_UNKNOWN_DOMAIN, "UnknownDomain"),
+ { 0, 0, 0 }
+ };
+ etype = g_enum_register_static ("NMLoggingError", values);
+ }
+ return etype;
+}
/************************************************************************/
@@ -108,18 +142,22 @@ nm_logging_setup (const char *level, const char *domains, GError **error)
}
if (!found) {
- g_set_error (error, 0, 0, _("Unknown log level '%s'"), level);
+ g_set_error (error, NM_LOGGING_ERROR, NM_LOGGING_ERROR_UNKNOWN_LEVEL,
+ _("Unknown log level '%s'"), level);
return FALSE;
}
}
/* domains */
if (domains && strlen (domains)) {
- tmp = g_strsplit (domains, ",", 0);
+ tmp = g_strsplit_set (domains, ", ", 0);
for (iter = tmp; iter && *iter; iter++) {
const LogDesc *diter;
gboolean found = FALSE;
+ if (!strlen (*iter))
+ continue;
+
for (diter = &domain_descs[0]; diter->name; diter++) {
if (!strcasecmp (diter->name, *iter)) {
new_domains |= diter->num;
@@ -129,7 +167,8 @@ nm_logging_setup (const char *level, const char *domains, GError **error)
}
if (!found) {
- g_set_error (error, 0, 0, _("Unknown log domain '%s'"), *iter);
+ g_set_error (error, NM_LOGGING_ERROR, NM_LOGGING_ERROR_UNKNOWN_DOMAIN,
+ _("Unknown log domain '%s'"), *iter);
return FALSE;
}
}
diff --git a/src/logging/nm-logging.h b/src/logging/nm-logging.h
index ba15268c3..4c381a24a 100644
--- a/src/logging/nm-logging.h
+++ b/src/logging/nm-logging.h
@@ -23,6 +23,7 @@
#define NM_LOGGING_H
#include
+#include
/* Log domains */
enum {
@@ -62,6 +63,12 @@ enum {
LOGL_DEBUG = 0x00000004
};
+#define NM_LOGGING_ERROR (nm_logging_error_quark ())
+#define NM_TYPE_LOGGING_ERROR (nm_logging_error_get_type ())
+GQuark nm_logging_error_quark (void);
+GType nm_logging_error_get_type (void);
+
+
#define nm_log_err(domain, fmt, args...) \
{ _nm_log (G_STRLOC, G_STRFUNC, domain, LOGL_ERR, fmt, ##args); }
diff --git a/src/nm-manager.c b/src/nm-manager.c
index ed90dfa8e..3189e3f76 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -79,6 +79,11 @@ static gboolean impl_manager_deactivate_connection (NMManager *manager,
static gboolean impl_manager_sleep (NMManager *manager, gboolean sleep, GError **err);
+static gboolean impl_manager_set_logging (NMManager *manager,
+ const char *level,
+ const char *domains,
+ GError **error);
+
/* Legacy 0.6 compatibility interface */
static gboolean impl_manager_legacy_sleep (NMManager *manager, GError **err);
@@ -2756,6 +2761,18 @@ impl_manager_legacy_state (NMManager *manager, guint32 *state, GError **err)
return TRUE;
}
+static gboolean
+impl_manager_set_logging (NMManager *manager,
+ const char *level,
+ const char *domains,
+ GError **error)
+{
+ if (nm_logging_setup (level, domains, error)) {
+ nm_log_info (LOGD_CORE, "logging: level '%s' domains '%s'", level, domains);
+ return TRUE;
+ }
+ return FALSE;
+}
/* Connections */
@@ -3353,5 +3370,6 @@ nm_manager_class_init (NMManagerClass *manager_class)
&dbus_glib_nm_manager_object_info);
dbus_g_error_domain_register (NM_MANAGER_ERROR, NULL, NM_TYPE_MANAGER_ERROR);
+ dbus_g_error_domain_register (NM_LOGGING_ERROR, "org.freedesktop.NetworkManager.Logging", NM_TYPE_LOGGING_ERROR);
}