From f270a09cb2df37c134e567049a5fe09c73d7fd3c Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Thu, 12 Oct 2017 23:49:10 +0200 Subject: [PATCH] filter: allow enabling/disabling rules via envvars E.g. forcing a MBIM modem to run in AT-only mode: # MM_FILTER_RULE_NET=0 \ MM_FILTER_RULE_CDC_WDM=0 \ /usr/sbin/ModemManager --debug This is just for quick testing for now. --- src/mm-base-manager.c | 8 +------- src/mm-filter.c | 39 ++++++++++++++++++++++++++++++++++++++- src/mm-filter.h | 9 +++++++++ 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c index cb328d04..02a1106a 100644 --- a/src/mm-base-manager.c +++ b/src/mm-base-manager.c @@ -1127,13 +1127,7 @@ initable_init (GInitable *initable, #endif /* Create filter */ - priv->filter = mm_filter_new (MM_FILTER_RULE_VIRTUAL | - MM_FILTER_RULE_NET | - MM_FILTER_RULE_CDC_WDM | - MM_FILTER_RULE_TTY | - MM_FILTER_RULE_TTY_BLACKLIST | - MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY | - MM_FILTER_RULE_TTY_PLATFORM_DRIVER); + priv->filter = mm_filter_new (MM_FILTER_RULE_ALL); /* Create plugin manager */ priv->plugin_manager = mm_plugin_manager_new (priv->plugin_dir, error); diff --git a/src/mm-filter.c b/src/mm-filter.c index 4f9e4c79..ee82c1dc 100644 --- a/src/mm-filter.c +++ b/src/mm-filter.c @@ -105,6 +105,43 @@ mm_filter_port (MMFilter *self, return FALSE; } +/*****************************************************************************/ +/* Use filter rule names as environment variables to control them on startup: + * - MM_FILTER_RULE_XXX=1 to explicitly enable the rule. + * - MM_FILTER_RULE_XXX=0 to explicitly disable the rule. + */ + +static MMFilterRule +filter_rule_env_process (MMFilterRule enabled_rules) +{ + MMFilterRule updated_rules = enabled_rules; + GFlagsClass *flags_class; + guint i; + + flags_class = g_type_class_ref (MM_TYPE_FILTER_RULE); + + for (i = 0; (1 << i) & MM_FILTER_RULE_ALL; i++) { + GFlagsValue *flags_value; + const gchar *env_value; + + flags_value = g_flags_get_first_value (flags_class, (1 << i)); + g_assert (flags_value); + + env_value = g_getenv (flags_value->value_name); + if (!env_value) + continue; + + if (g_str_equal (env_value, "0")) + updated_rules &= ~(1 << i); + else if (g_str_equal (env_value, "1")) + updated_rules |= (1 << i); + } + + g_type_class_unref (flags_class); + + return updated_rules; +} + /*****************************************************************************/ MMFilter * @@ -113,7 +150,7 @@ mm_filter_new (MMFilterRule enabled_rules) MMFilter *self; self = g_object_new (MM_TYPE_FILTER, - MM_FILTER_ENABLED_RULES, enabled_rules, + MM_FILTER_ENABLED_RULES, filter_rule_env_process (enabled_rules), NULL); #define RULE_ENABLED_STR(flag) ((self->priv->enabled_rules & flag) ? "yes" : "no") diff --git a/src/mm-filter.h b/src/mm-filter.h index 80a31594..bde394c6 100644 --- a/src/mm-filter.h +++ b/src/mm-filter.h @@ -54,6 +54,15 @@ typedef enum { /*< underscore_name=mm_filter_rule >*/ MM_FILTER_RULE_TTY_PLATFORM_DRIVER = 1 << 6, } MMFilterRule; +#define MM_FILTER_RULE_ALL \ + (MM_FILTER_RULE_VIRTUAL | \ + MM_FILTER_RULE_NET | \ + MM_FILTER_RULE_CDC_WDM | \ + MM_FILTER_RULE_TTY | \ + MM_FILTER_RULE_TTY_BLACKLIST | \ + MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY | \ + MM_FILTER_RULE_TTY_PLATFORM_DRIVER) + MMFilter *mm_filter_new (MMFilterRule enabled_rules); gboolean mm_filter_port (MMFilter *self,