pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/libosmocore/+/41879?usp=email )

Change subject: logging: Add APIs to set/get log_{target,context} fields
......................................................................

logging: Add APIs to set/get log_{target,context} fields

Change-Id: Ie48e7e635feb91509b9c034394df4fb16cb931a3
---
M TODO-RELEASE
M include/osmocom/core/logging.h
M src/core/libosmocore.map
M src/core/logging.c
4 files changed, 115 insertions(+), 5 deletions(-)

Approvals:
  fixeria: Looks good to me, approved
  osmith: Looks good to me, but someone else must approve
  pespin: Verified




diff --git a/TODO-RELEASE b/TODO-RELEASE
index 3c98f06..b7d1585 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -10,3 +10,4 @@
 core      added     osmo_sock_set_nonblock(), osmo_sock_get_nonblock()
 core      added     gsmtap_source_set_nonblock(), gsmtap_source_using_wq()
 core      added     osmo_iofd_set_name_f()
+core      added     log_{get,set}_filter(_data)(), log_get_context()
diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index 44263fb..286f646 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -225,7 +225,7 @@

 /*! Log context information, passed to filter */
 struct log_context {
-       void *ctx[LOG_MAX_CTX+1];
+       void *ctx[LOG_MAX_CTX+1] OSMO_DEPRECATED_OUTSIDE("Accessing struct 
log_context members directly is deprecated");
 };

 /*! Compatibility with older libosmocore versions */
@@ -298,13 +298,15 @@
 };

 /*! structure representing a logging target */
+#define OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE_LOG_TARGET \
+       OSMO_DEPRECATED_OUTSIDE("Accessing struct log_target members directly 
is deprecated")
 struct log_target {
        struct llist_head entry;                /*!< linked list */

        /*! Internal data for filtering */
-       int filter_map;
+       int filter_map OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE_LOG_TARGET;
        /*! Internal data for filtering */
-       void *filter_data[LOG_MAX_FILTERS+1];
+       void *filter_data[LOG_MAX_FILTERS+1] 
OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE_LOG_TARGET;

        /*! logging categories */
        struct log_category *categories;
@@ -406,10 +408,16 @@

 /* context management */
 void log_reset_context(void);
-int log_set_context(uint8_t ctx, void *value);
+int log_set_context(uint8_t ctx_nr, void *value);
+void *log_get_context(const struct log_context *ctx, uint8_t ctx_nr);

 /* filter on the targets */
 void log_set_all_filter(struct log_target *target, int);
+bool log_get_filter(const struct log_target *target, int log_filter_index);
+int log_set_filter(struct log_target *target, int log_filter_index, bool 
enable);
+void *log_get_filter_data(const struct log_target *target, int 
log_filter_index);
+int log_set_filter_data(struct log_target *target, int log_filter_index, void 
*data);
+
 int log_cache_enable(void);
 void log_cache_update(int mapped_subsys, uint8_t enabled, uint8_t level);
 void log_set_use_color(struct log_target *target, int);
diff --git a/src/core/libosmocore.map b/src/core/libosmocore.map
index 2818f8a..3ec322c 100644
--- a/src/core/libosmocore.map
+++ b/src/core/libosmocore.map
@@ -75,8 +75,13 @@
 log_parse_level;
 logp_stub;
 log_reset_context;
+log_get_context;
+log_get_filter;
+log_get_filter_data;
 log_set_all_filter;
 log_set_category_filter;
+log_set_filter;
+log_set_filter_data;
 log_set_context;
 log_set_log_level;
 log_set_print_category;
diff --git a/src/core/logging.c b/src/core/logging.c
index 9e5ae9f..ac10d00 100644
--- a/src/core/logging.c
+++ b/src/core/logging.c
@@ -886,7 +886,42 @@
        return 0;
 }

-/*! Enable the \ref LOG_FLT_ALL log filter
+/*! Get the logging context
+ *  \param[in] ctx logging context
+ *  \param[in] ctx_nr logging context number
+ *  \returns value set for the context
+ *
+ * A logging context is something like the subscriber identity to which
+ * the currently processed message relates, or the BTS through which it
+ * was received. The main use of this API is during
+ * (struct log_info)->filter_fn(ctx, log_tgt).
+ */
+void *log_get_context(const struct log_context *ctx, uint8_t ctx_nr)
+{
+       if (ctx_nr > LOG_MAX_CTX)
+               return NULL;
+       return ctx->ctx[ctx_nr];
+}
+
+/*! Query whether a log filter is enabled or disabled
+ *  \param[in] target Log target to be queried
+ *  \param[in] log_filter_index the index of the log filter to query
+ *  \returns whether the filtering is enabled (true) or disabled (false)
+ */
+bool log_get_filter(const struct log_target *target, int log_filter_index)
+{
+       /* TODO: in the future we can support app-specified log filters here,
+        * similar to how we do dynamic cateogries defined by apps. */
+       if (log_filter_index < 0)
+               return false;
+
+       if (log_filter_index >= LOG_MAX_FILTERS)
+               return false;
+
+       return target->filter_map & (1 << log_filter_index);
+}
+
+/*! Enable/disable the \ref LOG_FLT_ALL log filter
  *  \param[in] target Log target to be affected
  *  \param[in] all enable (1) or disable (0) the ALL filter
  *
@@ -902,6 +937,67 @@
                target->filter_map &= ~(1 << LOG_FLT_ALL);
 }

+/*! Enable/disable a log filter
+ *  \param[in] target Log target to be affected
+ *  \param[in] log_filter_index the index of the log filter to set
+ *  \param[in] enable enable (true) or disable (false) the ALL filter
+ *  \returns 0 on success, negative on error.
+ */
+int log_set_filter(struct log_target *target, int log_filter_index, bool 
enable)
+{
+       /* TODO: in the future we can support app-specified log filters here,
+        * similar to how we do dynamic cateogries defined by apps. */
+       if (log_filter_index < 0)
+               return -EINVAL;
+
+       if (log_filter_index >= LOG_MAX_FILTERS)
+               return -EINVAL;
+
+       if (enable)
+               target->filter_map |= (1 << log_filter_index);
+       else
+               target->filter_map &= ~(1 << log_filter_index);
+       return 0;
+}
+
+/*! Obtain data associated to a log filter
+ *  \param[in] target Log target to be queried
+ *  \param[in] log_filter_index the index of the log filter to query
+ *  \returns data associated to the log filter
+ */
+void *log_get_filter_data(const struct log_target *target, int 
log_filter_index)
+{
+       /* TODO: in the future we can support app-specified log filters here,
+        * similar to how we do dynamic cateogries defined by apps. */
+       if (log_filter_index < 0)
+               return NULL;
+
+       if (log_filter_index >= LOG_MAX_FILTERS)
+               return NULL;
+
+       return target->filter_data[log_filter_index];
+}
+
+/*! Set data associated to a log filter
+ *  \param[in] target Log target to be affected
+ *  \param[in] log_filter_index the index of the log filter to set associate 
data for
+ *  \param[in] data The user provided data pointer to associate to the log 
filter
+ *  \returns 0 on success, negative on error.
+ */
+int log_set_filter_data(struct log_target *target, int log_filter_index, void 
*data)
+{
+       /* TODO: in the future we can support app-specified log filters here,
+        * similar to how we do dynamic cateogries defined by apps. */
+       if (log_filter_index < 0)
+               return -EINVAL;
+
+       if (log_filter_index >= LOG_MAX_FILTERS)
+               return -EINVAL;
+
+       target->filter_data[log_filter_index] = data;
+       return 0;
+}
+
 /*! Enable or disable the use of colored output
  *  \param[in] target Log target to be affected
  *  \param[in] use_color Use color (1) or don't use color (0)

--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/41879?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Ie48e7e635feb91509b9c034394df4fb16cb931a3
Gerrit-Change-Number: 41879
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to