pcsc-lite  1.7.4
debug.c
Go to the documentation of this file.
00001 /*
00002  * MUSCLE SmartCard Development ( http://www.linuxnet.com )
00003  *
00004  * Copyright (C) 1999-2002
00005  *  David Corcoran <corcoran@linuxnet.com>
00006  * Copyright (C) 2002-2009
00007  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
00008  *
00009  * $Id: debug.c 5196 2010-08-27 12:52:27Z rousseau $
00010  */
00011 
00017 #include "config.h"
00018 #include <stdarg.h>
00019 #include <stdlib.h>
00020 #include <unistd.h>
00021 #include <string.h>
00022 #include <stdio.h>
00023 
00024 #include "debuglog.h"
00025 #include "strlcpycat.h"
00026 
00027 #define DEBUG_BUF_SIZE 2048
00028 
00029 #ifdef NO_LOG
00030 
00031 void log_msg(const int priority, const char *fmt, ...)
00032 {
00033     (void)priority;
00034     (void)fmt;
00035 }
00036 
00037 void log_xxd(const int priority, const char *msg, const unsigned char *buffer,
00038     const int len)
00039 {
00040     (void)priority;
00041     (void)msg;
00042     (void)buffer;
00043     (void)len;
00044 }
00045 
00046 #else
00047 
00049 static char LogLevel = PCSC_LOG_CRITICAL+1;
00050 
00051 static signed char LogDoColor = 0;  
00053 static void log_init(void)
00054 {
00055     char *e;
00056 
00057 #ifdef LIBPCSCLITE
00058     e = getenv("PCSCLITE_DEBUG");
00059 #else
00060     e = getenv("MUSCLECARD_DEBUG");
00061 #endif
00062     if (e)
00063         LogLevel = atoi(e);
00064 
00065     /* log to stderr and stderr is a tty? */
00066     if (isatty(fileno(stderr)))
00067     {
00068         const char *terms[] = { "linux", "xterm", "xterm-color", "Eterm", "rxvt", "rxvt-unicode" };
00069         char *term;
00070 
00071         term = getenv("TERM");
00072         if (term)
00073         {
00074             unsigned int i;
00075 
00076             /* for each known color terminal */
00077             for (i = 0; i < sizeof(terms) / sizeof(terms[0]); i++)
00078             {
00079                 /* we found a supported term? */
00080                 if (0 == strcmp(terms[i], term))
00081                 {
00082                     LogDoColor = 1;
00083                     break;
00084                 }
00085             }
00086         }
00087     }
00088 } /* log_init */
00089 
00090 void log_msg(const int priority, const char *fmt, ...)
00091 {
00092     char DebugBuffer[DEBUG_BUF_SIZE];
00093     va_list argptr;
00094     static int is_initialized = 0;
00095 
00096     if (!is_initialized)
00097     {
00098         log_init();
00099         is_initialized = 1;
00100     }
00101 
00102     if (priority < LogLevel) /* log priority lower than threshold? */
00103         return;
00104 
00105     va_start(argptr, fmt);
00106     (void)vsnprintf(DebugBuffer, DEBUG_BUF_SIZE, fmt, argptr);
00107     va_end(argptr);
00108 
00109     {
00110         if (LogDoColor)
00111         {
00112             const char *color_pfx = "", *color_sfx = "\33[0m";
00113 
00114             switch (priority)
00115             {
00116                 case PCSC_LOG_CRITICAL:
00117                     color_pfx = "\33[01;31m"; /* bright + Red */
00118                     break;
00119 
00120                 case PCSC_LOG_ERROR:
00121                     color_pfx = "\33[35m"; /* Magenta */
00122                     break;
00123 
00124                 case PCSC_LOG_INFO:
00125                     color_pfx = "\33[34m"; /* Blue */
00126                     break;
00127 
00128                 case PCSC_LOG_DEBUG:
00129                     color_pfx = ""; /* normal (black) */
00130                     color_sfx = "";
00131                     break;
00132             }
00133             fprintf(stderr, "%s%s%s\n", color_pfx, DebugBuffer, color_sfx);
00134         }
00135         else
00136             fprintf(stderr, "%s\n", DebugBuffer);
00137     }
00138 } /* log_msg */
00139 
00140 void log_xxd(const int priority, const char *msg, const unsigned char *buffer,
00141     const int len)
00142 {
00143     char DebugBuffer[DEBUG_BUF_SIZE];
00144     int i;
00145     char *c;
00146     char *debug_buf_end;
00147 
00148     if (priority < LogLevel) /* log priority lower than threshold? */
00149         return;
00150 
00151     debug_buf_end = DebugBuffer + DEBUG_BUF_SIZE - 5;
00152 
00153     (void)strlcpy(DebugBuffer, msg, sizeof(DebugBuffer));
00154     c = DebugBuffer + strlen(DebugBuffer);
00155 
00156     for (i = 0; (i < len) && (c < debug_buf_end); ++i)
00157     {
00158         sprintf(c, "%02X ", buffer[i]);
00159         c += strlen(c);
00160     }
00161 
00162     fprintf(stderr, "%s\n", DebugBuffer);
00163 } /* log_xxd */
00164 
00165 #endif
00166