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); }