From: "Rafaël Carré" <funman@videolan.org>
To: linux-media@vger.kernel.org
Cc: "Rafaël Carré" <funman@videolan.org>
Subject: [PATCH v2] dvb_logfunc: add a user private parameter
Date: Thu, 16 Nov 2017 17:36:42 +0100 [thread overview]
Message-ID: <20171116163642.15716-1-funman@videolan.org> (raw)
In-Reply-To: <20171115113336.3756-1-funman@videolan.org>
This is useful if an application is using 2 different devices,
and want logging to be split by device, or if application logging
needs some private context.
Care has been taken to not break the API/ABI and only add new functions,
or only modify private structures.
A drawback is that when dvb_fe_open_flags() is called, the custom function
can not be set yet, so dvb_fe_open_flags() will log errors using the old
function without private context.
Signed-off-by: Rafaël Carré <funman@videolan.org>
---
lib/include/libdvbv5/dvb-dev.h | 21 ++++++++++++
lib/include/libdvbv5/dvb-log.h | 73 ++++++++++++++++++++----------------------
lib/libdvbv5/dvb-dev.c | 13 ++++++++
lib/libdvbv5/dvb-fe-priv.h | 3 ++
lib/libdvbv5/dvb-fe.c | 8 +++++
utils/dvb/dvbv5-daemon.c | 9 +++---
6 files changed, 85 insertions(+), 42 deletions(-)
diff --git a/lib/include/libdvbv5/dvb-dev.h b/lib/include/libdvbv5/dvb-dev.h
index 55e0f065..6dbd2ae7 100644
--- a/lib/include/libdvbv5/dvb-dev.h
+++ b/lib/include/libdvbv5/dvb-dev.h
@@ -234,6 +234,27 @@ struct dvb_dev_list *dvb_get_dev_info(struct dvb_device *dvb,
*/
void dvb_dev_stop_monitor(struct dvb_device *dvb);
+/**
+ * @brief Sets the DVB verbosity and log function with context private data
+ * @ingroup dvb_device
+ *
+ * @param dvb pointer to struct dvb_device to be used
+ * @param verbose Verbosity level of the messages that will be printed
+ * @param logfunc Callback function to be called when a log event
+ * happens. Can either store the event into a file or
+ * to print it at the TUI/GUI. Can be null.
+ * @param logpriv Private data for log function
+ *
+ * @details Sets the function to report log errors and to set the verbosity
+ * level of debug report messages. If not called, or if logfunc is
+ * NULL, the libdvbv5 will report error and debug messages via stderr,
+ * and will use colors for the debug messages.
+ *
+ */
+void dvb_dev_set_logpriv(struct dvb_device *dvb,
+ unsigned verbose,
+ dvb_logfunc_priv logfunc, void *logpriv);
+
/**
* @brief Sets the DVB verbosity and log function
* @ingroup dvb_device
diff --git a/lib/include/libdvbv5/dvb-log.h b/lib/include/libdvbv5/dvb-log.h
index 181a23c8..23cceede 100644
--- a/lib/include/libdvbv5/dvb-log.h
+++ b/lib/include/libdvbv5/dvb-log.h
@@ -43,61 +43,58 @@
typedef void (*dvb_logfunc)(int level, const char *fmt, ...) __attribute__ (( format( printf, 2, 3 )));
+/**
+ * @typedef void (*dvb_logfunc)(void *logpriv, int level, const char *fmt, ...)
+ * @brief typedef used by dvb_fe_open2 for the log function with private context
+ * @ingroup ancillary
+ */
+
+typedef void (*dvb_logfunc_priv)(void *logpriv, int level, const char *fmt, ...);
+
/*
* Macros used internally inside libdvbv5 frontend part, to output logs
*/
#ifndef _DOXYGEN
-#ifndef __DVB_FE_PRIV_H
+struct dvb_v5_fe_parms;
+/**
+ * @brief retrieve the logging function with private data from the private fe params.
+ */
+dvb_logfunc_priv dvb_get_log_priv(struct dvb_v5_fe_parms *, void **);
-#define dvb_log(fmt, arg...) do {\
- parms->logfunc(LOG_INFO, fmt, ##arg); \
-} while (0)
-#define dvb_logerr(fmt, arg...) do {\
- parms->logfunc(LOG_ERR, fmt, ##arg); \
-} while (0)
-#define dvb_logdbg(fmt, arg...) do {\
- parms->logfunc(LOG_DEBUG, fmt, ##arg); \
-} while (0)
-#define dvb_logwarn(fmt, arg...) do {\
- parms->logfunc(LOG_WARNING, fmt, ##arg); \
-} while (0)
-#define dvb_loginfo(fmt, arg...) do {\
- parms->logfunc(LOG_NOTICE, fmt, ##arg); \
-} while (0)
+#ifndef __DVB_FE_PRIV_H
-#define dvb_perror(msg) do {\
- parms->logfunc(LOG_ERR, "%s: %s", msg, strerror(errno)); \
+#define dvb_loglevel(level, fmt, arg...) do {\
+ void *priv;\
+ dvb_logfunc_priv f = dvb_get_log_priv(parms, &priv);\
+ if (f) {\
+ f(priv, level, fmt, ##arg);\
+ } else {\
+ parms->logfunc(level, fmt, ##arg); \
+ }\
} while (0)
#else
-#define dvb_log(fmt, arg...) do {\
- parms->p.logfunc(LOG_INFO, fmt, ##arg); \
-} while (0)
-#define dvb_logerr(fmt, arg...) do {\
- parms->p.logfunc(LOG_ERR, fmt, ##arg); \
-} while (0)
-#define dvb_logdbg(fmt, arg...) do {\
- parms->p.logfunc(LOG_DEBUG, fmt, ##arg); \
-} while (0)
-#define dvb_logwarn(fmt, arg...) do {\
- parms->p.logfunc(LOG_WARNING, fmt, ##arg); \
-} while (0)
-#define dvb_loginfo(fmt, arg...) do {\
- parms->p.logfunc(LOG_NOTICE, fmt, ##arg); \
-} while (0)
#define dvb_loglevel(level, fmt, arg...) do {\
- parms->p.logfunc(level, fmt, ##arg); \
-} while (0)
-
-#define dvb_perror(msg) do {\
- parms->p.logfunc(LOG_ERR, "%s: %s", msg, strerror(errno)); \
+ if (parms->logfunc_priv) {\
+ parms->logfunc_priv(parms->logpriv, level, fmt, ##arg);\
+ } else {\
+ parms->p.logfunc(level, fmt, ##arg); \
+ }\
} while (0)
#endif
+#define dvb_log(fmt, arg...) dvb_loglevel(LOG_INFO, fmt, ##arg)
+#define dvb_logerr(fmt, arg...) dvb_loglevel(LOG_ERR, fmt, ##arg)
+#define dvb_logdbg(fmt, arg...) dvb_loglevel(LOG_DEBUG, fmt, ##arg)
+#define dvb_logwarn(fmt, arg...) dvb_loglevel(LOG_WARNING, fmt, ##arg)
+#define dvb_loginfo(fmt, arg...) dvb_loglevel(LOG_NOTICE, fmt, ##arg)
+
+#define dvb_perror(msg) dvb_logerr("%s: %s", msg, strerror(errno))
+
#endif /* _DOXYGEN */
/**
diff --git a/lib/libdvbv5/dvb-dev.c b/lib/libdvbv5/dvb-dev.c
index e6a8fc76..9a0952b4 100644
--- a/lib/libdvbv5/dvb-dev.c
+++ b/lib/libdvbv5/dvb-dev.c
@@ -162,6 +162,19 @@ struct dvb_dev_list *dvb_dev_seek_by_adapter(struct dvb_device *d,
return ops->seek_by_adapter(dvb, adapter, num, type);
}
+void dvb_dev_set_logpriv(struct dvb_device *dvb, unsigned verbose,
+ dvb_logfunc_priv logfunc_priv, void *logpriv)
+{
+ struct dvb_v5_fe_parms_priv *parms = (void *)dvb->fe_parms;
+
+ /* FIXME: how to get remote logs and set verbosity? */
+ parms->p.verbose = verbose;
+ parms->logpriv = logpriv;
+
+ if (logfunc_priv != NULL)
+ parms->logfunc_priv = logfunc_priv;
+}
+
void dvb_dev_set_log(struct dvb_device *dvb, unsigned verbose,
dvb_logfunc logfunc)
{
diff --git a/lib/libdvbv5/dvb-fe-priv.h b/lib/libdvbv5/dvb-fe-priv.h
index 5bf2b22b..239c48f8 100644
--- a/lib/libdvbv5/dvb-fe-priv.h
+++ b/lib/libdvbv5/dvb-fe-priv.h
@@ -75,6 +75,9 @@ struct dvb_v5_fe_parms_priv {
/* Satellite specific stuff */
int high_band;
unsigned freq_offset;
+
+ dvb_logfunc_priv logfunc_priv;
+ void *logpriv;
};
/* Functions used internally by dvb-dev.c. Aren't part of the API */
diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c
index 39923fe4..5327df29 100644
--- a/lib/libdvbv5/dvb-fe.c
+++ b/lib/libdvbv5/dvb-fe.c
@@ -28,6 +28,7 @@
#include <stddef.h>
#include <time.h>
#include <unistd.h>
+#include <stdarg.h>
#include <config.h>
@@ -1899,3 +1900,10 @@ int dvb_fe_set_default_country(struct dvb_v5_fe_parms *p, const char *cc)
parms->country = dvb_country_a2_to_id(cc);
return (parms->country == COUNTRY_UNKNOWN) ? -EINVAL : 0;
}
+
+dvb_logfunc_priv dvb_get_log_priv(struct dvb_v5_fe_parms *p, void **priv)
+{
+ struct dvb_v5_fe_parms_priv *parms = (void *)p;
+ *priv = parms->logpriv;
+ return parms->logfunc_priv;
+}
diff --git a/utils/dvb/dvbv5-daemon.c b/utils/dvb/dvbv5-daemon.c
index f0098c2b..c26886dd 100644
--- a/utils/dvb/dvbv5-daemon.c
+++ b/utils/dvb/dvbv5-daemon.c
@@ -553,12 +553,13 @@ static ssize_t scan_data(char *buf, int buf_size, const char *fmt, ...)
/*
* Remote log
*/
-void dvb_remote_log(int level, const char *fmt, ...)
+void dvb_remote_log(void *priv, int level, const char *fmt, ...)
{
int ret;
char *buf;
va_list ap;
+ int fd = *(int*)priv;
va_start(ap, fmt);
ret = vasprintf(&buf, fmt, ap);
@@ -569,8 +570,8 @@ void dvb_remote_log(int level, const char *fmt, ...)
va_end(ap);
- if (dvb_fd >= 0)
- send_data(dvb_fd, "%i%s%i%s", 0, "log", level, buf);
+ if (fd >= 0)
+ send_data(fd, "%i%s%i%s", 0, "log", level, buf);
else
local_log(level, buf);
@@ -1486,7 +1487,7 @@ int main(int argc, char *argv[])
}
/* FIXME: should allow the caller to set the verbosity */
- dvb_dev_set_log(dvb, 1, dvb_remote_log);
+ dvb_dev_set_logpriv(dvb, 1, dvb_remote_log, &dvb_fd);
/* Listen up to 5 connections */
listen(sockfd, 5);
--
2.14.1
prev parent reply other threads:[~2017-11-16 16:36 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-15 11:33 [PATCH 1/2] dvb_logfunc: add a user private parameter Rafaël Carré
2017-11-15 11:33 ` [PATCH 2/2] dvbv5-daemon: 0 is a valid fd Rafaël Carré
2017-11-16 11:25 ` Mauro Carvalho Chehab
2017-11-16 11:36 ` Rafaël Carré
2017-11-16 11:47 ` Mauro Carvalho Chehab
2017-11-16 11:23 ` [PATCH 1/2] dvb_logfunc: add a user private parameter Mauro Carvalho Chehab
2017-11-16 16:36 ` Rafaël Carré [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171116163642.15716-1-funman@videolan.org \
--to=funman@videolan.org \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.