Without this flag, log filters can only explicitly accept messages.
Allowing denial makes it easier to filter certain subsystems. Unlike
allow-ing filters, deny-ing filters are added to the beginning of the
filter list. This should do the Right Thing most of the time, but it's
less-universal than allowing filters to be inserted anywhere. If this
becomes a problem, then perhaps log_filter_add* should take a filter number
to insert before/after.

Signed-off-by: Sean Anderson <sean...@gmail.com>
Reviewed-by: Simon Glass <s...@chromium.org>
---

(no changes since v1)

 common/log.c  | 12 ++++++++++--
 include/log.h | 11 ++++++++++-
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/common/log.c b/common/log.c
index a14b227231..6299c8b2d4 100644
--- a/common/log.c
+++ b/common/log.c
@@ -164,7 +164,11 @@ static bool log_passes_filters(struct log_device *ldev, 
struct log_rec *rec)
                if (filt->file_list &&
                    !log_has_file(filt->file_list, rec->file))
                        continue;
-               return true;
+
+               if (filt->flags & LOGFF_DENY)
+                       return false;
+               else
+                       return true;
        }
 
        return false;
@@ -268,7 +272,11 @@ int log_add_filter_flags(const char *drv_name, enum 
log_category_t cat_list[],
                }
        }
        filt->filter_num = ldev->next_filter_num++;
-       list_add_tail(&filt->sibling_node, &ldev->filter_head);
+       /* Add deny filters to the beginning of the list */
+       if (flags & LOGFF_DENY)
+               list_add(&filt->sibling_node, &ldev->filter_head);
+       else
+               list_add_tail(&filt->sibling_node, &ldev->filter_head);
 
        return filt->filter_num;
 
diff --git a/include/log.h b/include/log.h
index 4e59a2cf74..018180e788 100644
--- a/include/log.h
+++ b/include/log.h
@@ -359,13 +359,22 @@ enum {
        LOGF_MAX_CATEGORIES = 5,        /* maximum categories per filter */
 };
 
+/**
+ * enum log_filter_flags - Flags which modify a filter
+ */
 enum log_filter_flags {
-       LOGFF_HAS_CAT           = 1 << 0,       /* Filter has a category list */
+       /** @LOGFF_HAS_CAT: Filter has a category list */
+       LOGFF_HAS_CAT   = 1 << 0,
+       /** @LOGFF_DENY: Filter denies matching messages */
+       LOGFF_DENY      = 1 << 1,
 };
 
 /**
  * struct log_filter - criterial to filter out log messages
  *
+ * If a message matches all criteria, then it is allowed. If LOGFF_DENY is set,
+ * then it is denied instead.
+ *
  * @filter_num: Sequence number of this filter.  This is returned when adding a
  *     new filter, and must be provided when removing a previously added
  *     filter.
-- 
2.28.0

Reply via email to