Blame MacOSX/debuglog.h

Packit 9f0df5
/*
Packit 9f0df5
 * MUSCLE SmartCard Development ( http://pcsclite.alioth.debian.org/pcsclite.html )
Packit 9f0df5
 *
Packit 9f0df5
 * Copyright (C) 1999-2004
Packit 9f0df5
 *  David Corcoran <corcoran@musclecard.com>
Packit 9f0df5
 * Copyright (C) 1999-2011
Packit 9f0df5
 *  Ludovic Rousseau <ludovic.rousseau@free.fr>
Packit 9f0df5
 *
Packit 9f0df5
Redistribution and use in source and binary forms, with or without
Packit 9f0df5
modification, are permitted provided that the following conditions
Packit 9f0df5
are met:
Packit 9f0df5
Packit 9f0df5
1. Redistributions of source code must retain the above copyright
Packit 9f0df5
   notice, this list of conditions and the following disclaimer.
Packit 9f0df5
2. Redistributions in binary form must reproduce the above copyright
Packit 9f0df5
   notice, this list of conditions and the following disclaimer in the
Packit 9f0df5
   documentation and/or other materials provided with the distribution.
Packit 9f0df5
3. The name of the author may not be used to endorse or promote products
Packit 9f0df5
   derived from this software without specific prior written permission.
Packit 9f0df5
Packit 9f0df5
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
Packit 9f0df5
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Packit 9f0df5
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Packit 9f0df5
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit 9f0df5
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit 9f0df5
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 9f0df5
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 9f0df5
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 9f0df5
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Packit 9f0df5
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 9f0df5
 */
Packit 9f0df5
Packit 9f0df5
/**
Packit 9f0df5
 * @file
Packit 9f0df5
 * @brief This handles debugging.
Packit 9f0df5
 *
Packit 9f0df5
 * @note log message is sent to syslog or stderr depending on --foreground
Packit 9f0df5
 * command line argument
Packit 9f0df5
 *
Packit 9f0df5
 * @code
Packit 9f0df5
 * Log1(priority, "text");
Packit 9f0df5
 *  log "text" with priority level priority
Packit 9f0df5
 * Log2(priority, "text: %d", 1234);
Packit 9f0df5
 *  log "text: 1234"
Packit 9f0df5
 * the format string can be anything printf() can understand
Packit 9f0df5
 * Log3(priority, "text: %d %d", 1234, 5678);
Packit 9f0df5
 *  log "text: 1234 5678"
Packit 9f0df5
 * the format string can be anything printf() can understand
Packit 9f0df5
 * LogXxd(priority, msg, buffer, size);
Packit 9f0df5
 *  log "msg" + a hex dump of size bytes of buffer[]
Packit 9f0df5
 * @endcode
Packit 9f0df5
 */
Packit 9f0df5
Packit 9f0df5
#ifndef __debuglog_h__
Packit 9f0df5
#define __debuglog_h__
Packit 9f0df5
Packit 9f0df5
#ifndef PCSC_API
Packit 9f0df5
#define PCSC_API
Packit 9f0df5
#endif
Packit 9f0df5
Packit 9f0df5
enum {
Packit 9f0df5
	DEBUGLOG_NO_DEBUG = 0,
Packit 9f0df5
	DEBUGLOG_SYSLOG_DEBUG,
Packit 9f0df5
	DEBUGLOG_STDOUT_DEBUG,
Packit 9f0df5
	DEBUGLOG_STDOUT_COLOR_DEBUG
Packit 9f0df5
};
Packit 9f0df5
Packit 9f0df5
#define DEBUG_CATEGORY_NOTHING  0
Packit 9f0df5
#define DEBUG_CATEGORY_APDU     1
Packit 9f0df5
#define DEBUG_CATEGORY_SW       2
Packit 9f0df5
Packit 9f0df5
enum {
Packit 9f0df5
	PCSC_LOG_DEBUG = 0,
Packit 9f0df5
	PCSC_LOG_INFO,
Packit 9f0df5
	PCSC_LOG_ERROR,
Packit 9f0df5
	PCSC_LOG_CRITICAL
Packit 9f0df5
};
Packit 9f0df5
Packit 9f0df5
/* You can't do #ifndef __FUNCTION__ */
Packit 9f0df5
#if !defined(__GNUC__) && !defined(__IBMC__)
Packit 9f0df5
#define __FUNCTION__ ""
Packit 9f0df5
#endif
Packit 9f0df5
Packit 9f0df5
#ifndef __GNUC__
Packit 9f0df5
#define __attribute__(x) /*nothing*/
Packit 9f0df5
#endif
Packit 9f0df5
Packit 9f0df5
#ifdef NO_LOG
Packit 9f0df5
Packit 9f0df5
#define Log0(priority) do { } while(0)
Packit 9f0df5
#define Log1(priority, fmt) do { } while(0)
Packit 9f0df5
#define Log2(priority, fmt, data) do { } while(0)
Packit 9f0df5
#define Log3(priority, fmt, data1, data2) do { } while(0)
Packit 9f0df5
#define Log4(priority, fmt, data1, data2, data3) do { } while(0)
Packit 9f0df5
#define Log5(priority, fmt, data1, data2, data3, data4) do { } while(0)
Packit 9f0df5
#define Log9(priority, fmt, data1, data2, data3, data4, data5, data6, data7, data8) do { } while(0)
Packit 9f0df5
#define LogXxd(priority, msg, buffer, size) do { } while(0)
Packit 9f0df5
Packit 9f0df5
#define DebugLogA(a)
Packit 9f0df5
#define DebugLogB(a, b)
Packit 9f0df5
#define DebugLogC(a, b,c)
Packit 9f0df5
Packit 9f0df5
#else
Packit 9f0df5
Packit 9f0df5
#define Log0(priority) log_msg(priority, "%s:%d:%s()", __FILE__, __LINE__, __FUNCTION__)
Packit 9f0df5
#define Log1(priority, fmt) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__)
Packit 9f0df5
#define Log2(priority, fmt, data) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data)
Packit 9f0df5
#define Log3(priority, fmt, data1, data2) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2)
Packit 9f0df5
#define Log4(priority, fmt, data1, data2, data3) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2, data3)
Packit 9f0df5
#define Log5(priority, fmt, data1, data2, data3, data4) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2, data3, data4)
Packit 9f0df5
#define Log9(priority, fmt, data1, data2, data3, data4, data5, data6, data7, data8) log_msg(priority, "%s:%d:%s() " fmt, __FILE__, __LINE__, __FUNCTION__, data1, data2, data3, data4, data5, data6, data7, data8)
Packit 9f0df5
#define LogXxd(priority, msg, buffer, size) log_xxd(priority, msg, buffer, size)
Packit 9f0df5
Packit 9f0df5
#define DebugLogA(a) Log1(PCSC_LOG_INFO, a)
Packit 9f0df5
#define DebugLogB(a, b) Log2(PCSC_LOG_INFO, a, b)
Packit 9f0df5
#define DebugLogC(a, b,c) Log3(PCSC_LOG_INFO, a, b, c)
Packit 9f0df5
Packit 9f0df5
#endif	/* NO_LOG */
Packit 9f0df5
Packit 9f0df5
PCSC_API void log_msg(const int priority, const char *fmt, ...)
Packit 9f0df5
	__attribute__((format(printf, 2, 3)));
Packit 9f0df5
Packit 9f0df5
PCSC_API void log_xxd(const int priority, const char *msg,
Packit 9f0df5
	const unsigned char *buffer, const int size);
Packit 9f0df5
Packit 9f0df5
void DebugLogSuppress(const int);
Packit 9f0df5
void DebugLogSetLogType(const int);
Packit 9f0df5
int DebugLogSetCategory(const int);
Packit 9f0df5
void DebugLogCategory(const int, const unsigned char *, const int);
Packit 9f0df5
PCSC_API void DebugLogSetLevel(const int level);
Packit 9f0df5
Packit 9f0df5
#endif							/* __debuglog_h__ */
Packit 9f0df5