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 Service 30b792
#include <errno.h>
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 Service 30b792
/*
Packit Service 30b792
 * The debug levels.
Packit Service 30b792
 *
Packit Service 30b792
 * Note that TRACE_LOGBUFX uses the current debug level + 1.
Packit Service 30b792
 */
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 Service 30b792
int  _gpgme_debug (void **line, int level, int mode,
Packit Service 30b792
                   const char *func, const char *tagname, const char *tagvalue,
Packit Service 30b792
                   const char *format, ...) GPGRT_ATTR_PRINTF(7,8);
Packit d7e8d0
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 Service 30b792
  _gpgme_debug (NULL, DEBUG_ENGINE, -1, NULL, NULL, NULL,
Packit Service 30b792
                "%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 Service 30b792
/* Note: We can't protect this with a do-while block.  */
Packit Service 30b792
#define TRACE_BEG(lvl, name, tag, ...)                                  \
Packit d7e8d0
  _TRACE (lvl, name, tag);						\
Packit Service 30b792
  _gpgme_debug (NULL, _gpgme_trace_level, 1,                             \
Packit Service 30b792
                _gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit Service 30b792
                __VA_ARGS__)
Packit Service 30b792
Packit Service 30b792
#define TRACE(lvl, name, tag, ...) do {                                 \
Packit Service 30b792
    _gpgme_debug_frame_begin ();					\
Packit Service 30b792
    _gpgme_debug (NULL, lvl, 0, name, STRINGIFY (tag), (void *)(uintptr_t)tag, \
Packit Service 30b792
                  __VA_ARGS__);                                         \
Packit Service 30b792
    _gpgme_debug_frame_end ();                                          \
Packit Service 30b792
  } while (0)
Packit Service 30b792
Packit Service 30b792
Packit Service 30b792
/* Trace a gpg-error and return it.  */
Packit Service 30b792
#define TRACE_ERR(err) \
Packit Service 30b792
    _trace_err ((err), _gpgme_trace_level, _gpgme_trace_func, __LINE__)
Packit Service 30b792
static inline gpg_error_t
Packit Service 30b792
_trace_err (gpg_error_t err, int lvl, const char *func, int line)
Packit Service 30b792
{
Packit Service 30b792
  if (!err)
Packit Service 30b792
    _gpgme_debug (NULL, lvl, 3, func, NULL, NULL, "");
Packit Service 30b792
  else
Packit Service 30b792
    _gpgme_debug (NULL, lvl, -1, NULL, NULL, NULL,
Packit Service 30b792
                  "%s:%d: error: %s <%s>\n",
Packit Service 30b792
                  func, line,  gpgme_strerror (err), gpgme_strsource (err));
Packit Service 30b792
  _gpgme_debug_frame_end ();
Packit Service 30b792
  return err;
Packit Service 30b792
}
Packit Service 30b792
Packit Service 30b792
/* Trace a system call result and return it.  */
Packit Service 30b792
#define TRACE_SYSRES(res) \
Packit Service 30b792
    _trace_sysres ((res), _gpgme_trace_level, _gpgme_trace_func, __LINE__)
Packit Service 30b792
static inline int
Packit Service 30b792
_trace_sysres (int res, int lvl, const char *func, int line)
Packit Service 30b792
{
Packit Service 30b792
  if (res >= 0)
Packit Service 30b792
    _gpgme_debug (NULL, lvl, 3, func, NULL, NULL, "result=%d", res);
Packit Service 30b792
  else
Packit Service 30b792
    _gpgme_debug (NULL, lvl, -1, NULL, NULL, NULL,
Packit Service 30b792
                  "%s:%d: error: %s (%d)\n",
Packit Service 30b792
                  func, line,  strerror (errno), errno);
Packit Service 30b792
  _gpgme_debug_frame_end ();
Packit Service 30b792
  return res;
Packit Service 30b792
}
Packit Service 30b792
Packit Service 30b792
/* Trace a system call error and return it.  */
Packit Service 30b792
#define TRACE_SYSERR(rc) \
Packit Service 30b792
    _trace_syserr ((rc), _gpgme_trace_level, _gpgme_trace_func, __LINE__)
Packit Service 30b792
static inline int
Packit Service 30b792
_trace_syserr (int rc, int lvl, const char *func, int line)
Packit Service 30b792
{
Packit Service 30b792
  if (!rc)
Packit Service 30b792
    _gpgme_debug (NULL, lvl, 3, func, NULL, NULL, "result=0");
Packit Service 30b792
  else
Packit Service 30b792
    _gpgme_debug (NULL, lvl, -1, NULL, NULL, NULL,
Packit Service 30b792
                  "%s:%d: error: %s (%d)\n",
Packit Service 30b792
                  func, line, strerror (rc), rc);
Packit Service 30b792
  _gpgme_debug_frame_end ();
Packit Service 30b792
  return rc;
Packit Service 30b792
}
Packit Service 30b792
Packit Service 30b792
#define TRACE_SUC(...) do {                                             \
Packit Service 30b792
    _gpgme_debug (NULL, _gpgme_trace_level, 3, _gpgme_trace_func, NULL, NULL, \
Packit Service 30b792
                  __VA_ARGS__);                                         \
Packit Service 30b792
    _gpgme_debug_frame_end ();                                          \
Packit Service 30b792
  } while (0)
Packit Service 30b792
Packit Service 30b792
#define TRACE_LOG(...) do {                                             \
Packit Service 30b792
    _gpgme_debug (NULL, _gpgme_trace_level, 2,                           \
Packit Service 30b792
                  _gpgme_trace_func, _gpgme_trace_tagname, _gpgme_trace_tag, \
Packit Service 30b792
                  __VA_ARGS__);                                         \
Packit Service 30b792
  } while (0)
Packit Service 30b792
Packit Service 30b792
#define TRACE_LOGBUF(buf, len) do {                             \
Packit Service 30b792
    _gpgme_debug_buffer (_gpgme_trace_level, "%s: check: %s",	\
Packit Service 30b792
                         _gpgme_trace_func, buf, len);          \
Packit Service 30b792
  } while (0)
Packit Service 30b792
Packit Service 30b792
#define TRACE_LOGBUFX(buf, len) do {                                    \
Packit Service 30b792
    _gpgme_debug_buffer (_gpgme_trace_level+1, "%s: check: %s",         \
Packit Service 30b792
                         _gpgme_trace_func, buf, len); \
Packit Service 30b792
  } while (0)
Packit Service 30b792
Packit Service 30b792
#define TRACE_SEQ(hlp,...) do {						      \
Packit Service 30b792
    _gpgme_debug (&(hlp), _gpgme_trace_level, 2, _gpgme_trace_func,            \
Packit Service 30b792
                         _gpgme_trace_tagname, _gpgme_trace_tag, __VA_ARGS__); \
Packit Service 30b792
  } while (0)
Packit Service 30b792
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 Service 30b792
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 */