libdvbv5: log levels
authorAndré Roth <neolynx@gmail.com>
Sat, 19 May 2012 22:38:54 +0000 (19:38 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 20 May 2012 18:23:13 +0000 (15:23 -0300)
Signed-off-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
lib/include/dvb-fe.h
lib/libdvbv5/dvb-fe.c

index 9f91bd9..5045f6c 100644 (file)
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <string.h>
+#include <syslog.h>
 #include "dvb-frontend.h"
 #include "dvb-sat.h"
 
 #define dvb_log(fmt, arg...) do {\
-        parms->logfunc(fmt, ##arg); \
+       parms->logfunc(LOG_INFO, fmt, ##arg); \
 } while (0)
-
 #define dvb_logerr(fmt, arg...) do {\
-       parms->logerrfunc(fmt, ##arg); \
+       parms->logfunc(LOG_ERR, fmt, ##arg); \
 } while (0)
 
 #define dvb_perror(msg) do {\
-       parms->logerrfunc("%s: %s", msg, strerror(errno)); \
+       parms->logfunc(LOG_ERR, "%s: %s", msg, strerror(errno)); \
 } while (0)
 
 #define ARRAY_SIZE(x)  (sizeof(x)/sizeof((x)[0]))
@@ -73,7 +73,7 @@ struct dvb_v5_stats {
        struct dtv_property             prop[DTV_MAX_STATS];
 };
 
-typedef void (*dvb_logfunc)(const char *fmt, ...);
+typedef void (*dvb_logfunc)(int level, const char *fmt, ...);
 
 struct dvb_v5_fe_parms {
        int                             fd;
@@ -100,8 +100,7 @@ struct dvb_v5_fe_parms {
        unsigned                        diseqc_wait;
        unsigned                        freq_offset;
 
-       dvb_logfunc                     logfunc;
-       dvb_logfunc                     logerrfunc;
+        dvb_logfunc                     logfunc;
 };
 
 
@@ -115,8 +114,7 @@ struct dvb_v5_fe_parms *dvb_fe_open(int adapter, int frontend,
                                    unsigned verbose, unsigned use_legacy_call);
 struct dvb_v5_fe_parms *dvb_fe_open2(int adapter, int frontend,
                                    unsigned verbose, unsigned use_legacy_call,
-                                   dvb_logfunc logfunc,
-                                   dvb_logfunc logerrfunc);
+                                    dvb_logfunc logfunc);
 void dvb_fe_close(struct dvb_v5_fe_parms *parms);
 
 /* Get/set delivery system parameters */
index 2ffe315..9c28166 100644 (file)
 #include <unistd.h>
 #include <stdarg.h>
 
-void dvb_default_log(const char *fmt, ...)
-{
-       va_list ap;
-
-       va_start(ap, fmt);
-       printf("libdvbv5: ");
-       vprintf(fmt, ap);
-       printf("\n");
-       va_end(ap);
-}
+static const struct loglevel {
+       const char *name;
+       const char *color;
+       int fd;
+} loglevels[9] = {
+       {"EMERG   ", "\033[31m", STDERR_FILENO },
+       {"ALERT   ", "\033[31m", STDERR_FILENO },
+       {"CRITICAL", "\033[31m", STDERR_FILENO },
+       {"ERROR   ", "\033[31m", STDERR_FILENO },
+       {"WARNING ", "\033[33m", STDOUT_FILENO },
+       {"NOTICE  ", "\033[36m", STDOUT_FILENO },
+       {"INFO    ", "\033[36m", STDOUT_FILENO },
+       {"DEBUG   ", "\033[32m", STDOUT_FILENO },
+       {"",         "\033[0m",  STDOUT_FILENO },
+};
+#define LOG_COLOROFF 8
 
-void dvb_default_logerr(const char *fmt, ...)
+void dvb_default_log(int level, const char *fmt, ...)
 {
+       if(level > sizeof(loglevels) / sizeof(struct loglevel) - 2) // ignore LOG_COLOROFF as well
+               level = LOG_INFO;
        va_list ap;
-
        va_start(ap, fmt);
-       fprintf(stderr, "libdvbv5: ");
-       vfprintf(stderr, fmt, ap);
-       fprintf(stderr, "\n");
+       FILE *out = stdout;
+       if(STDERR_FILENO == loglevels[level].fd)
+               out = stderr;
+       if(isatty(loglevels[level].fd))
+               fprintf(out, loglevels[level].color);
+       fprintf(out, "%s ", loglevels[level].name);
+       vfprintf(out, fmt, ap);
+       fprintf(out, "\n");
+       if(isatty(loglevels[level].fd))
+               fprintf(out, loglevels[LOG_COLOROFF].color);
        va_end(ap);
 }
 
@@ -60,12 +74,11 @@ struct dvb_v5_fe_parms *dvb_fe_open(int adapter, int frontend, unsigned verbose,
                                    unsigned use_legacy_call)
 {
   return dvb_fe_open2(adapter, frontend, verbose, use_legacy_call,
-                     dvb_default_log, dvb_default_logerr);
+                      dvb_default_log);
 }
 
 struct dvb_v5_fe_parms *dvb_fe_open2(int adapter, int frontend, unsigned verbose,
-                                   unsigned use_legacy_call, dvb_logfunc logfunc,
-                                   dvb_logfunc logerrfunc)
+                                   unsigned use_legacy_call, dvb_logfunc logfunc)
 {
        int fd, i;
        char *fname;
@@ -74,18 +87,18 @@ struct dvb_v5_fe_parms *dvb_fe_open2(int adapter, int frontend, unsigned verbose
 
        asprintf(&fname, "/dev/dvb/adapter%i/frontend%i", adapter, frontend);
        if (!fname) {
-               logerrfunc("fname calloc: %s", strerror(errno));
+               logfunc(LOG_ERR, "fname calloc: %s", strerror(errno));
                return NULL;
        }
 
        fd = open(fname, O_RDWR, 0);
        if (fd == -1) {
-               logerrfunc("%s while opening %s", strerror(errno), fname);
+               logfunc(LOG_ERR, "%s while opening %s", strerror(errno), fname);
                return NULL;
        }
        parms = calloc(sizeof(*parms), 1);
        if (!parms) {
-               logerrfunc("parms calloc: %s", strerror(errno));
+               logfunc(LOG_ERR, "parms calloc: %s", strerror(errno));
                close(fd);
                return NULL;
        }
@@ -93,8 +106,7 @@ struct dvb_v5_fe_parms *dvb_fe_open2(int adapter, int frontend, unsigned verbose
        parms->verbose = verbose;
        parms->fd = fd;
        parms->sat_number = -1;
-       parms->logfunc = logfunc;
-       parms->logerrfunc = logerrfunc;
+        parms->logfunc = logfunc;
 
        if (ioctl(fd, FE_GET_INFO, &parms->info) == -1) {
                dvb_perror("FE_GET_INFO");