Blame src/debug.h

Packit d7e8d0
/* debug.h - interface to debugging functions
Packit d7e8d0
   Copyright (C) 2002, 2004, 2005, 2007 g10 Code GmbH
Packit d7e8d0
Packit d7e8d0
   This file is part of GPGME.
Packit d7e8d0
Packit d7e8d0
   GPGME is free software; you can redistribute it and/or modify it
Packit d7e8d0
   under the terms of the GNU Lesser General Public License as
Packit d7e8d0
   published by the Free Software Foundation; either version 2.1 of
Packit d7e8d0
   the License, or (at your option) any later version.
Packit d7e8d0
Packit d7e8d0
   GPGME is distributed in the hope that it will be useful, but
Packit d7e8d0
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d7e8d0
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit d7e8d0
   Lesser General Public License for more details.
Packit d7e8d0
Packit d7e8d0
   You should have received a copy of the GNU Lesser General Public
Packit d7e8d0
   License along with this program; if not, write to the Free Software
Packit d7e8d0
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
Packit d7e8d0
   02111-1307, USA.  */
Packit d7e8d0
Packit d7e8d0
#ifndef DEBUG_H
Packit d7e8d0
#define DEBUG_H
Packit d7e8d0
Packit d7e8d0
#include <string.h>
Packit d7e8d0
#ifdef HAVE_STDINT_H
Packit d7e8d0
#include <stdint.h>
Packit d7e8d0
#endif
Packit d7e8d0
Packit d7e8d0
#include "gpgme.h"  /* Required for gpgme_error stuff.  */
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Indirect stringification, requires __STDC__ to work.  */
Packit d7e8d0
#define STRINGIFY(v) #v
Packit d7e8d0
#define XSTRINGIFY(v) STRINGIFY(v)
Packit d7e8d0
Packit d7e8d0

Packit d7e8d0
/* The debug levels.  */
Packit d7e8d0
Packit d7e8d0
#define DEBUG_INIT	1
Packit d7e8d0
#define DEBUG_GLOBAL    2
Packit d7e8d0
#define DEBUG_CTX	3
Packit d7e8d0
#define DEBUG_ENGINE	4
Packit d7e8d0
#define DEBUG_DATA	5
Packit d7e8d0
#define DEBUG_ASSUAN	6
Packit d7e8d0
#define DEBUG_SYSIO	7
Packit d7e8d0
Packit d7e8d0

Packit d7e8d0
/* Remove path components from filenames (i.e. __FILE__) for cleaner
Packit d7e8d0
   logs. */
Packit d7e8d0
static inline const char *_gpgme_debug_srcname (const char *file)
Packit d7e8d0
                                                GPGME_GCC_A_PURE;
Packit d7e8d0
Packit d7e8d0
static inline const char *
Packit d7e8d0
_gpgme_debug_srcname (const char *file)
Packit d7e8d0
{
Packit d7e8d0
  const char *s = strrchr (file, '/');
Packit d7e8d0
  return s? s+1:file;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
/* Initialization helper function; see debug.c.  */
Packit d7e8d0
int _gpgme_debug_set_debug_envvar (const char *value);
Packit d7e8d0
Packit d7e8d0
/* Called early to initialize the logging.  */
Packit d7e8d0
void _gpgme_debug_subsystem_init (void);
Packit d7e8d0
Packit d7e8d0
/* Log the formatted string FORMAT at debug level LEVEL or higher.  */
Packit d7e8d0
int  _gpgme_debug (int level, const char *format, ...);
Packit d7e8d0
Packit d7e8d0
/* Start a new debug line in *LINE, logged at level LEVEL or higher,
Packit d7e8d0
   and starting with the formatted string FORMAT.  */
Packit d7e8d0
void _gpgme_debug_begin (void **helper, int level, const char *format, ...);
Packit d7e8d0
Packit d7e8d0
/* Add the formatted string FORMAT to the debug line *LINE.  */
Packit d7e8d0
void _gpgme_debug_add (void **helper, const char *format, ...);
Packit d7e8d0
Packit d7e8d0
/* Finish construction of *LINE and send it to the debug output
Packit d7e8d0
   stream.  */
Packit d7e8d0
void _gpgme_debug_end (void **helper);
Packit d7e8d0
Packit d7e8d0
void _gpgme_debug_buffer (int lvl, const char *const fmt,
Packit d7e8d0
			  const char *const func, const char *const buffer,
Packit d7e8d0
			  size_t len);
Packit d7e8d0
Packit d7e8d0
void _gpgme_debug_frame_begin (void);
Packit d7e8d0
int  _gpgme_debug_frame_end (void);
Packit d7e8d0
Packit d7e8d0
static inline gpgme_error_t
Packit d7e8d0
_gpgme_trace_gpgme_error (gpgme_error_t err, const char *file, int line)
Packit d7e8d0
{
Packit d7e8d0
  _gpgme_debug (DEBUG_ENGINE, "%s:%d: returning error: %s\n",
Packit d7e8d0
                _gpgme_debug_srcname (file), line, gpgme_strerror (err));
Packit d7e8d0
  return err;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0

Packit d7e8d0
/* Trace support.  */
Packit d7e8d0
Packit d7e8d0
/* FIXME: For now.  */
Packit d7e8d0
#define _gpgme_debug_trace() 1
Packit d7e8d0
Packit d7e8d0
#define _TRACE(lvl, name, tag)					\
Packit d7e8d0
  int _gpgme_trace_level = lvl;					\
Packit d7e8d0
  const char *const _gpgme_trace_func = name;			\
Packit d7e8d0
  const char *const _gpgme_trace_tagname = STRINGIFY (tag);	\
Packit d7e8d0
  void *_gpgme_trace_tag = (void *) (uintptr_t) tag; \
Packit d7e8d0
  _gpgme_debug_frame_begin ()
Packit d7e8d0
Packit d7e8d0
#define TRACE_BEG(lvl, name, tag)			   \
Packit d7e8d0
  _TRACE (lvl, name, tag);				   \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag)
Packit d7e8d0
#define TRACE_BEG0(lvl, name, tag, fmt)					\
Packit d7e8d0
  _TRACE (lvl, name, tag);						\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag)
Packit d7e8d0
#define TRACE_BEG1(lvl, name, tag, fmt, arg1)				\
Packit d7e8d0
  _TRACE (lvl, name, tag);						\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1)
Packit d7e8d0
#define TRACE_BEG2(lvl, name, tag, fmt, arg1, arg2)		    \
Packit d7e8d0
  _TRACE (lvl, name, tag);					    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2)
Packit d7e8d0
#define TRACE_BEG3(lvl, name, tag, fmt, arg1, arg2, arg3)	    \
Packit d7e8d0
  _TRACE (lvl, name, tag);					    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3)
Packit d7e8d0
#define TRACE_BEG4(lvl, name, tag, fmt, arg1, arg2, arg3, arg4)	    \
Packit d7e8d0
  _TRACE (lvl, name, tag);					    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3, arg4)
Packit d7e8d0
#define TRACE_BEG5(lvl, name, tag, fmt, arg1, arg2, arg3, arg4, arg5) \
Packit d7e8d0
  _TRACE (lvl, name, tag);					    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3, arg4, arg5)
Packit d7e8d0
#define TRACE_BEG7(lvl, name, tag, fmt, arg1, arg2, arg3, arg4,	    \
Packit d7e8d0
		   arg5, arg6, arg7)				    \
Packit d7e8d0
  _TRACE (lvl, name, tag);					    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3, arg4, arg5, arg6, arg7)
Packit d7e8d0
#define TRACE_BEG8(lvl, name, tag, fmt, arg1, arg2, arg3, arg4,	    \
Packit d7e8d0
		   arg5, arg6, arg7, arg8)			    \
Packit d7e8d0
  _TRACE (lvl, name, tag);					    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: enter: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
Packit d7e8d0
Packit d7e8d0
#define TRACE(lvl, name, tag)						\
Packit d7e8d0
  _gpgme_debug_frame_begin (),						\
Packit d7e8d0
  _gpgme_debug (lvl, "%s: call: %s=%p\n",				\
Packit d7e8d0
		name, STRINGIFY (tag), (void *) (uintptr_t) tag),	\
Packit d7e8d0
  _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE0(lvl, name, tag, fmt)					\
Packit d7e8d0
  _gpgme_debug_frame_begin (),						\
Packit d7e8d0
  _gpgme_debug (lvl, "%s: call: %s=%p, " fmt "\n",			\
Packit d7e8d0
		name, STRINGIFY (tag), (void *) (uintptr_t) tag),	\
Packit d7e8d0
  _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE1(lvl, name, tag, fmt, arg1)			       \
Packit d7e8d0
  _gpgme_debug_frame_begin (),						\
Packit d7e8d0
  _gpgme_debug (lvl, "%s: call: %s=%p, " fmt "\n",		       \
Packit d7e8d0
		name, STRINGIFY (tag), (void *) (uintptr_t) tag, arg1), \
Packit d7e8d0
  _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE2(lvl, name, tag, fmt, arg1, arg2)			       \
Packit d7e8d0
  _gpgme_debug_frame_begin (),						\
Packit d7e8d0
  _gpgme_debug (lvl, "%s: call: %s=%p, " fmt "\n",		       \
Packit d7e8d0
		name, STRINGIFY (tag), (void *) (uintptr_t) tag, arg1, \
Packit d7e8d0
		arg2), _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE3(lvl, name, tag, fmt, arg1, arg2, arg3)		       \
Packit d7e8d0
  _gpgme_debug_frame_begin (),						\
Packit d7e8d0
  _gpgme_debug (lvl, "%s: call: %s=%p, " fmt "\n",		       \
Packit d7e8d0
		name, STRINGIFY (tag), (void *) (uintptr_t) tag, arg1, \
Packit d7e8d0
		arg2, arg3), _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE6(lvl, name, tag, fmt, arg1, arg2, arg3, arg4, arg5, arg6)	\
Packit d7e8d0
  _gpgme_debug_frame_begin (),						\
Packit d7e8d0
  _gpgme_debug (lvl, "%s: call: %s=%p, " fmt "\n",			\
Packit d7e8d0
		name, STRINGIFY (tag), (void *) (uintptr_t) tag, arg1, \
Packit d7e8d0
		arg2, arg3, arg4, arg5, arg6),			       \
Packit d7e8d0
  _gpgme_debug_frame_end ()
Packit d7e8d0
Packit d7e8d0
#define TRACE_ERR(err)							\
Packit d7e8d0
  err == 0 ? (TRACE_SUC ()) :						\
Packit d7e8d0
    (_gpgme_debug (_gpgme_trace_level, "%s:%d: error: %s <%s>\n",	\
Packit d7e8d0
		   _gpgme_trace_func, __LINE__,  gpgme_strerror (err),  \
Packit d7e8d0
		   gpgme_strsource (err)), _gpgme_debug_frame_end (), (err))
Packit d7e8d0
/* The cast to void suppresses GCC warnings.  */
Packit d7e8d0
#define TRACE_SYSRES(res)						\
Packit d7e8d0
  res >= 0 ? ((void) (TRACE_SUC1 ("result=%i", res)), (res)) :		\
Packit d7e8d0
    (_gpgme_debug (_gpgme_trace_level, "%s: error: %s\n",	\
Packit d7e8d0
		   _gpgme_trace_func, strerror (errno)), _gpgme_debug_frame_end (), (res))
Packit d7e8d0
#define TRACE_SYSERR(res)						\
Packit d7e8d0
  res == 0 ? ((void) (TRACE_SUC1 ("result=%i", res)), (res)) :		\
Packit d7e8d0
    (_gpgme_debug (_gpgme_trace_level, "%s: error: %s\n",		\
Packit d7e8d0
		   _gpgme_trace_func, strerror (res)),			\
Packit d7e8d0
     _gpgme_debug_frame_end (), (res))
Packit d7e8d0
Packit d7e8d0
#define TRACE_SUC()						 \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: leave\n",       \
Packit d7e8d0
		_gpgme_trace_func), _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE_SUC0(fmt)							\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: leave: " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func), _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE_SUC1(fmt, arg1)						\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: leave: " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, arg1), _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE_SUC2(fmt, arg1, arg2)					\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: leave: " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, arg1, arg2), _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE_SUC5(fmt, arg1, arg2, arg3, arg4, arg5)			\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: leave: " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, arg1, arg2, arg3, arg4, arg5), \
Packit d7e8d0
    _gpgme_debug_frame_end ()
Packit d7e8d0
#define TRACE_SUC6(fmt, arg1, arg2, arg3, arg4, arg5, arg6)	\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: leave: " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, arg1, arg2, arg3, arg4, arg5, arg6),	\
Packit d7e8d0
    _gpgme_debug_frame_end ()
Packit d7e8d0
Packit d7e8d0
#define TRACE_LOG(fmt)							\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: check: %s=%p, " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag)
Packit d7e8d0
#define TRACE_LOG1(fmt, arg1)						\
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: check: %s=%p, " fmt "\n",	\
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1)
Packit d7e8d0
#define TRACE_LOG2(fmt, arg1, arg2)				    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: check: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2)
Packit d7e8d0
#define TRACE_LOG3(fmt, arg1, arg2, arg3)			    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: check: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3)
Packit d7e8d0
#define TRACE_LOG4(fmt, arg1, arg2, arg3, arg4)			    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: check: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3, arg4)
Packit d7e8d0
#define TRACE_LOG5(fmt, arg1, arg2, arg3, arg4, arg5)		    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: check: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3, arg4, arg5)
Packit d7e8d0
#define TRACE_LOG6(fmt, arg1, arg2, arg3, arg4, arg5, arg6)	    \
Packit d7e8d0
  _gpgme_debug (_gpgme_trace_level, "%s: check: %s=%p, " fmt "\n", \
Packit d7e8d0
		_gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit d7e8d0
		arg1, arg2, arg3, arg4, arg5, arg6)
Packit d7e8d0
Packit d7e8d0
#define TRACE_LOGBUF(buf, len)					\
Packit d7e8d0
  _gpgme_debug_buffer (_gpgme_trace_level, "%s: check: %s",	\
Packit d7e8d0
		       _gpgme_trace_func, buf, len)
Packit d7e8d0
Packit d7e8d0
#define TRACE_SEQ(hlp,fmt)						\
Packit d7e8d0
  _gpgme_debug_begin (&(hlp), _gpgme_trace_level,			\
Packit d7e8d0
                      "%s: check: %s=%p, " fmt, _gpgme_trace_func,	\
Packit d7e8d0
                      _gpgme_trace_tagname, _gpgme_trace_tag)
Packit d7e8d0
#define TRACE_ADD0(hlp,fmt) \
Packit d7e8d0
  _gpgme_debug_add (&(hlp), fmt)
Packit d7e8d0
#define TRACE_ADD1(hlp,fmt,a) \
Packit d7e8d0
  _gpgme_debug_add (&(hlp), fmt, (a))
Packit d7e8d0
#define TRACE_ADD2(hlp,fmt,a,b) \
Packit d7e8d0
  _gpgme_debug_add (&(hlp), fmt, (a), (b))
Packit d7e8d0
#define TRACE_ADD3(hlp,fmt,a,b,c) \
Packit d7e8d0
  _gpgme_debug_add (&(hlp), fmt, (a), (b), (c))
Packit d7e8d0
#define TRACE_END(hlp,fmt) \
Packit d7e8d0
  _gpgme_debug_add (&(hlp), fmt); \
Packit d7e8d0
  _gpgme_debug_end (&(hlp))
Packit d7e8d0
#define TRACE_ENABLED(hlp) (!!(hlp))
Packit d7e8d0
Packit d7e8d0
/* And finally a simple macro to trace the location of an error code.
Packit d7e8d0
   This macro is independent of the other trace macros and may be used
Packit d7e8d0
   without any preconditions.  */
Packit d7e8d0
#define trace_gpg_error(e) \
Packit d7e8d0
  _gpgme_trace_gpgme_error (gpg_error (e), __FILE__, __LINE__)
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
#endif	/* DEBUG_H */