summaryrefslogtreecommitdiff
path: root/src/mm-filter.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-10-12 23:49:10 +0200
committerAleksander Morgado <aleksander@aleksander.es>2017-12-05 10:58:29 +0100
commitf270a09cb2df37c134e567049a5fe09c73d7fd3c (patch)
treec98d68b512337425b888fd363a34982c003f2bc2 /src/mm-filter.c
parent239f7ba8a285d737aa9ef2f52dbc078d2b2f5371 (diff)
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.
Diffstat (limited to 'src/mm-filter.c')
-rw-r--r--src/mm-filter.c39
1 files changed, 38 insertions, 1 deletions
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
@@ -106,6 +106,43 @@ mm_filter_port (MMFilter *self,
}
/*****************************************************************************/
+/* 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 *
mm_filter_new (MMFilterRule enabled_rules)
@@ -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")