2002-05-08 03:57:42 +00:00
|
|
|
|
/* debug.c - helpful output in desperate situations
|
2018-11-16 12:27:33 +00:00
|
|
|
|
* Copyright (C) 2000 Werner Koch (dd9jn)
|
2019-06-05 11:10:52 +00:00
|
|
|
|
* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2019 g10 Code GmbH
|
2018-11-16 12:27:33 +00:00
|
|
|
|
*
|
|
|
|
|
* This file is part of GPGME.
|
|
|
|
|
*
|
|
|
|
|
* GPGME is free software; you can redistribute it and/or modify it
|
|
|
|
|
* under the terms of the GNU Lesser General Public License as
|
|
|
|
|
* published by the Free Software Foundation; either version 2.1 of
|
|
|
|
|
* the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* GPGME is distributed in the hope that it will be useful, but
|
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
* License along with this program; if not, see <https://gnu.org/licenses/>.
|
|
|
|
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
|
*/
|
2003-01-29 19:50:43 +00:00
|
|
|
|
|
|
|
|
|
#if HAVE_CONFIG_H
|
2001-01-30 11:01:41 +00:00
|
|
|
|
#include <config.h>
|
2003-01-29 19:50:43 +00:00
|
|
|
|
#endif
|
2001-01-30 11:01:41 +00:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdarg.h>
|
2010-11-02 16:27:46 +00:00
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
|
# include <unistd.h>
|
|
|
|
|
#endif
|
2001-04-02 08:40:32 +00:00
|
|
|
|
#include <ctype.h>
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
#include <errno.h>
|
2009-11-04 18:13:44 +00:00
|
|
|
|
#include <time.h>
|
2001-06-12 07:37:15 +00:00
|
|
|
|
#ifndef HAVE_DOSISH_SYSTEM
|
2010-11-03 09:56:27 +00:00
|
|
|
|
# ifdef HAVE_SYS_TYPES_H
|
2007-08-02 14:59:01 +00:00
|
|
|
|
# include <sys/types.h>
|
2010-11-03 09:56:27 +00:00
|
|
|
|
# endif
|
|
|
|
|
# ifdef HAVE_SYS_STAT_H
|
2007-08-02 14:59:01 +00:00
|
|
|
|
# include <sys/stat.h>
|
2010-11-03 09:56:27 +00:00
|
|
|
|
# endif
|
|
|
|
|
# include <fcntl.h>
|
2001-06-12 07:37:15 +00:00
|
|
|
|
#endif
|
2001-01-30 11:01:41 +00:00
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
|
|
#include "util.h"
|
2009-11-04 18:13:44 +00:00
|
|
|
|
#include "ath.h"
|
2001-01-30 11:01:41 +00:00
|
|
|
|
#include "sema.h"
|
2015-08-24 13:03:20 +00:00
|
|
|
|
#include "sys-util.h"
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
#include "debug.h"
|
2001-01-30 11:01:41 +00:00
|
|
|
|
|
2002-05-08 03:57:42 +00:00
|
|
|
|
|
|
|
|
|
/* The amount of detail requested by the user, per environment
|
|
|
|
|
variable GPGME_DEBUG. */
|
|
|
|
|
static int debug_level;
|
2001-01-30 11:01:41 +00:00
|
|
|
|
|
2002-05-08 03:57:42 +00:00
|
|
|
|
/* The output stream for the debug messages. */
|
|
|
|
|
static FILE *errfp;
|
2001-04-02 08:40:32 +00:00
|
|
|
|
|
2012-09-25 13:38:26 +00:00
|
|
|
|
/* If not NULL, this malloced string is used instead of the
|
|
|
|
|
GPGME_DEBUG envvar. It must have been set before the debug
|
|
|
|
|
subsystem has been initialized. Using it later may or may not have
|
|
|
|
|
any effect. */
|
|
|
|
|
static char *envvar_override;
|
|
|
|
|
|
2009-11-04 18:13:44 +00:00
|
|
|
|
|
2009-12-22 13:00:30 +00:00
|
|
|
|
#ifdef HAVE_TLS
|
2009-11-04 18:13:44 +00:00
|
|
|
|
#define FRAME_NR
|
|
|
|
|
static __thread int frame_nr = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
_gpgme_debug_frame_begin (void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef FRAME_NR
|
|
|
|
|
frame_nr++;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-08 09:08:08 +00:00
|
|
|
|
int _gpgme_debug_frame_end (void)
|
2009-11-04 18:13:44 +00:00
|
|
|
|
{
|
|
|
|
|
#ifdef FRAME_NR
|
|
|
|
|
frame_nr--;
|
|
|
|
|
#endif
|
2015-06-08 09:08:08 +00:00
|
|
|
|
return 0;
|
2009-11-04 18:13:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-05-08 03:57:42 +00:00
|
|
|
|
|
|
|
|
|
/* Remove leading and trailing white spaces. */
|
2001-04-02 08:40:32 +00:00
|
|
|
|
static char *
|
2002-05-08 03:57:42 +00:00
|
|
|
|
trim_spaces (char *str)
|
2001-04-02 08:40:32 +00:00
|
|
|
|
{
|
2002-05-08 03:57:42 +00:00
|
|
|
|
char *string, *p, *mark;
|
|
|
|
|
|
|
|
|
|
string = str;
|
|
|
|
|
/* Find first non space character. */
|
2003-01-29 19:50:43 +00:00
|
|
|
|
for (p = string; *p && isspace (*(unsigned char *) p); p++)
|
2002-05-08 03:57:42 +00:00
|
|
|
|
;
|
|
|
|
|
/* Move characters. */
|
|
|
|
|
for (mark = NULL; (*string = *p); string++, p++)
|
2003-01-29 19:50:43 +00:00
|
|
|
|
if (isspace (*(unsigned char *) p))
|
2002-05-08 03:57:42 +00:00
|
|
|
|
{
|
|
|
|
|
if (!mark)
|
|
|
|
|
mark = string;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
mark = NULL;
|
|
|
|
|
if (mark)
|
|
|
|
|
*mark = '\0'; /* Remove trailing spaces. */
|
|
|
|
|
|
|
|
|
|
return str;
|
2001-04-02 08:40:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-01-30 11:01:41 +00:00
|
|
|
|
|
2012-09-25 13:38:26 +00:00
|
|
|
|
/* This is an internal function to set debug info. The caller must
|
|
|
|
|
assure that this function is called only by one thread at a time.
|
|
|
|
|
The function may have no effect if called after the debug system
|
|
|
|
|
has been initialized. Returns 0 on success. */
|
|
|
|
|
int
|
|
|
|
|
_gpgme_debug_set_debug_envvar (const char *value)
|
|
|
|
|
{
|
|
|
|
|
free (envvar_override);
|
|
|
|
|
envvar_override = strdup (value);
|
|
|
|
|
return !envvar_override;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-01-30 11:01:41 +00:00
|
|
|
|
static void
|
|
|
|
|
debug_init (void)
|
|
|
|
|
{
|
2002-05-08 03:57:42 +00:00
|
|
|
|
static int initialized;
|
|
|
|
|
|
|
|
|
|
if (!initialized)
|
|
|
|
|
{
|
2003-09-13 17:45:04 +00:00
|
|
|
|
gpgme_error_t err;
|
2003-10-06 14:50:19 +00:00
|
|
|
|
char *e;
|
2002-05-08 03:57:42 +00:00
|
|
|
|
const char *s1, *s2;;
|
|
|
|
|
|
2012-09-25 13:38:26 +00:00
|
|
|
|
if (envvar_override)
|
|
|
|
|
{
|
|
|
|
|
e = strdup (envvar_override);
|
|
|
|
|
free (envvar_override);
|
|
|
|
|
envvar_override = NULL;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
err = _gpgme_getenv ("GPGME_DEBUG", &e);
|
|
|
|
|
if (err)
|
2019-06-05 11:10:52 +00:00
|
|
|
|
return;
|
2012-09-25 13:38:26 +00:00
|
|
|
|
}
|
2003-09-13 17:45:04 +00:00
|
|
|
|
|
2002-05-08 03:57:42 +00:00
|
|
|
|
initialized = 1;
|
|
|
|
|
errfp = stderr;
|
|
|
|
|
if (e)
|
|
|
|
|
{
|
|
|
|
|
debug_level = atoi (e);
|
2005-08-26 12:38:57 +00:00
|
|
|
|
s1 = strchr (e, PATHSEP_C);
|
2002-05-08 03:57:42 +00:00
|
|
|
|
if (s1)
|
|
|
|
|
{
|
2001-04-02 08:40:32 +00:00
|
|
|
|
#ifndef HAVE_DOSISH_SYSTEM
|
2009-12-10 09:49:47 +00:00
|
|
|
|
if (getuid () == geteuid ()
|
|
|
|
|
#if defined(HAVE_GETGID) && defined(HAVE_GETEGID)
|
|
|
|
|
&& getgid () == getegid ()
|
|
|
|
|
#endif
|
|
|
|
|
)
|
2002-05-08 03:57:42 +00:00
|
|
|
|
{
|
2001-04-02 08:40:32 +00:00
|
|
|
|
#endif
|
2002-05-08 03:57:42 +00:00
|
|
|
|
char *p;
|
|
|
|
|
FILE *fp;
|
|
|
|
|
|
|
|
|
|
s1++;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
if (!(s2 = strchr (s1, PATHSEP_C)))
|
2002-05-08 03:57:42 +00:00
|
|
|
|
s2 = s1 + strlen (s1);
|
2002-10-08 Marcus Brinkmann <marcus@g10code.de>
* util.h (_gpgme_malloc, _gpgme_realloc, _gpgme_calloc,
_gpgme_strdup, _gpgme_free): Remove prototypes.
(xtrymalloc, xtrycalloc, xtryrealloc, xtrystrdup, xfree): Remove
macros.
* util.c: File removed.
* Makefile.am (libgpgme_la_SOURCES): Remove util.h.
* conversion.c (_gpgme_decode_c_string): Use malloc instead of
xtrymalloc, realloc instead of xtryrealloc, calloc instead of
xtrycalloc, free instead of xfree.
(_gpgme_data_append_percentstring_for_xml): Likewise.
* data.c (_gpgme_data_new, _gpgme_data_release): Likewise.
* data-compat.c (gpgme_data_new_from_filepart): Likewise.
* data-mem.c (mem_write, mem_release, gpgme_data_new_from_mem,
_gpgme_data_get_as_string): Likewise.
* debug.c (debug_init): Likewise.
* decrypt.c (_gpgme_release_decrypt_result): Likewise.
* delete.c (_gpgme_release_delete_result): Likewise.
* edit.c (_gpgme_release_edit_result, _gpgme_op_edit_start):
Likewise.
* encrypt.c (_gpgme_release_encrypt_result): Likewise.
* engine.c (_gpgme_engine_get_info, _gpgme_engine_new,
_gpgme_engine_release): Likewise.
* engine-gpgsm.c (_gpgme_gpgsm_new, _gpgme_gpgsm_release,
_gpgme_gpgsm_op_decrypt, _gpgme_gpgsm_op_delete,
gpgsm_set_recipients, _gpgme_gpgsm_op_encrypt,
_gpgme_gpgsm_op_export, _gpgme_gpgsm_op_genkey,
_gpgme_gpgsm_op_import, _gpgme_gpgsm_op_keylist,
_gpgme_gpgsm_op_keylist_ext, _gpgme_gpgsm_op_sign,
_gpgme_gpgsm_op_verify, gpgsm_status_handler): Likewise.
* genkey.c (_gpgme_release_genkey_result): Likewise.
* gpgme.c (gpgme_new, gpgme_release): Likewise.
* import.c (_gpgme_release_import_result): Likewise.
* key.c (_gpgme_key_cache_init, _gpgme_key_cache_add, key_new,
add_subkey, gpgme_key_release, _gpgme_key_append_name): Likewise.
* keylist.c (_gpgme_release_keylist_result, keylist_colon_handler,
_gpgme_op_keylist_event_cb, gpgme_op_keylist_next): Likewise.
* ops.h (test_and_allocate_result): Likewise.
* passphrase.c (_gpgme_release_passphrase_result,
_gpgme_passphrase_status_handler,
_gpgme_passphrase_command_handler): Likewise.
* progress.c (_gpgme_progress_status_handler): Likewise.
* recipient.c (gpgme_recipients_new, gpgme_recipients_release,
gpgme_recipients_add_name_with_validity): Likewise.
* rungpg.c (_gpgme_gpg_new, _gpgme_gpg_release,
_gpgme_gpg_add_arg, _gpgme_gpg_add_data,
_gpgme_gpg_set_colon_line_handler, free_argv, free_fd_data_map,
build_argv, _gpgme_gpg_spawn, read_status, read_colon_line):
Likewise.
* sign.c (_gpgme_release_sign_result): Likewise.
* signers.c (_gpgme_signers_add): Likewise.
* trustlist.c (trust_item_new, trustlist_colon_handler,
_gpgme_op_trustlist_event_cb, gpgme_op_trustlist_next,
gpgme_trustitem_release): Likewise.
* verify.c (_gpgme_release_verify_result, finish_sig): Likewise.
* version.c (gpgme_get_engine_info, _gpgme_get_program_version):
Likewise.
* w32-io.c (create_reader, create_writer, destroy_reader,
destroy_writer, build_commandline, _gpgme_io_spawn): Likewise.
* w32-sema.c (critsect_init, _gpgme_sema_cs_destroy): Likewise.
* w32-util.c (read_w32_registry_string): Likewise.
* wait.c (_gpgme_fd_table_deinit, _gpgme_fd_table_put,
_gpgme_wait_event_cb, _gpgme_add_io_cb, _gpgme_remove_io_cb)
* data-compat.c: Include <stdlib.h>.
2002-10-09 01:08:21 +00:00
|
|
|
|
p = malloc (s2 - s1 + 1);
|
2002-05-08 03:57:42 +00:00
|
|
|
|
if (p)
|
|
|
|
|
{
|
|
|
|
|
memcpy (p, s1, s2 - s1);
|
|
|
|
|
p[s2-s1] = 0;
|
|
|
|
|
trim_spaces (p);
|
|
|
|
|
fp = fopen (p,"a");
|
|
|
|
|
if (fp)
|
|
|
|
|
{
|
|
|
|
|
setvbuf (fp, NULL, _IOLBF, 0);
|
|
|
|
|
errfp = fp;
|
|
|
|
|
}
|
2002-10-08 Marcus Brinkmann <marcus@g10code.de>
* util.h (_gpgme_malloc, _gpgme_realloc, _gpgme_calloc,
_gpgme_strdup, _gpgme_free): Remove prototypes.
(xtrymalloc, xtrycalloc, xtryrealloc, xtrystrdup, xfree): Remove
macros.
* util.c: File removed.
* Makefile.am (libgpgme_la_SOURCES): Remove util.h.
* conversion.c (_gpgme_decode_c_string): Use malloc instead of
xtrymalloc, realloc instead of xtryrealloc, calloc instead of
xtrycalloc, free instead of xfree.
(_gpgme_data_append_percentstring_for_xml): Likewise.
* data.c (_gpgme_data_new, _gpgme_data_release): Likewise.
* data-compat.c (gpgme_data_new_from_filepart): Likewise.
* data-mem.c (mem_write, mem_release, gpgme_data_new_from_mem,
_gpgme_data_get_as_string): Likewise.
* debug.c (debug_init): Likewise.
* decrypt.c (_gpgme_release_decrypt_result): Likewise.
* delete.c (_gpgme_release_delete_result): Likewise.
* edit.c (_gpgme_release_edit_result, _gpgme_op_edit_start):
Likewise.
* encrypt.c (_gpgme_release_encrypt_result): Likewise.
* engine.c (_gpgme_engine_get_info, _gpgme_engine_new,
_gpgme_engine_release): Likewise.
* engine-gpgsm.c (_gpgme_gpgsm_new, _gpgme_gpgsm_release,
_gpgme_gpgsm_op_decrypt, _gpgme_gpgsm_op_delete,
gpgsm_set_recipients, _gpgme_gpgsm_op_encrypt,
_gpgme_gpgsm_op_export, _gpgme_gpgsm_op_genkey,
_gpgme_gpgsm_op_import, _gpgme_gpgsm_op_keylist,
_gpgme_gpgsm_op_keylist_ext, _gpgme_gpgsm_op_sign,
_gpgme_gpgsm_op_verify, gpgsm_status_handler): Likewise.
* genkey.c (_gpgme_release_genkey_result): Likewise.
* gpgme.c (gpgme_new, gpgme_release): Likewise.
* import.c (_gpgme_release_import_result): Likewise.
* key.c (_gpgme_key_cache_init, _gpgme_key_cache_add, key_new,
add_subkey, gpgme_key_release, _gpgme_key_append_name): Likewise.
* keylist.c (_gpgme_release_keylist_result, keylist_colon_handler,
_gpgme_op_keylist_event_cb, gpgme_op_keylist_next): Likewise.
* ops.h (test_and_allocate_result): Likewise.
* passphrase.c (_gpgme_release_passphrase_result,
_gpgme_passphrase_status_handler,
_gpgme_passphrase_command_handler): Likewise.
* progress.c (_gpgme_progress_status_handler): Likewise.
* recipient.c (gpgme_recipients_new, gpgme_recipients_release,
gpgme_recipients_add_name_with_validity): Likewise.
* rungpg.c (_gpgme_gpg_new, _gpgme_gpg_release,
_gpgme_gpg_add_arg, _gpgme_gpg_add_data,
_gpgme_gpg_set_colon_line_handler, free_argv, free_fd_data_map,
build_argv, _gpgme_gpg_spawn, read_status, read_colon_line):
Likewise.
* sign.c (_gpgme_release_sign_result): Likewise.
* signers.c (_gpgme_signers_add): Likewise.
* trustlist.c (trust_item_new, trustlist_colon_handler,
_gpgme_op_trustlist_event_cb, gpgme_op_trustlist_next,
gpgme_trustitem_release): Likewise.
* verify.c (_gpgme_release_verify_result, finish_sig): Likewise.
* version.c (gpgme_get_engine_info, _gpgme_get_program_version):
Likewise.
* w32-io.c (create_reader, create_writer, destroy_reader,
destroy_writer, build_commandline, _gpgme_io_spawn): Likewise.
* w32-sema.c (critsect_init, _gpgme_sema_cs_destroy): Likewise.
* w32-util.c (read_w32_registry_string): Likewise.
* wait.c (_gpgme_fd_table_deinit, _gpgme_fd_table_put,
_gpgme_wait_event_cb, _gpgme_add_io_cb, _gpgme_remove_io_cb)
* data-compat.c: Include <stdlib.h>.
2002-10-09 01:08:21 +00:00
|
|
|
|
free (p);
|
2002-05-08 03:57:42 +00:00
|
|
|
|
}
|
|
|
|
|
#ifndef HAVE_DOSISH_SYSTEM
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
2003-09-13 17:45:04 +00:00
|
|
|
|
free (e);
|
2001-04-02 08:40:32 +00:00
|
|
|
|
}
|
2001-01-30 11:01:41 +00:00
|
|
|
|
}
|
2009-11-04 18:13:44 +00:00
|
|
|
|
|
|
|
|
|
if (debug_level > 0)
|
2015-08-24 13:03:20 +00:00
|
|
|
|
{
|
2019-06-05 13:48:33 +00:00
|
|
|
|
_gpgme_debug (NULL, DEBUG_INIT, -1, NULL, NULL, NULL,
|
2018-11-16 15:39:26 +00:00
|
|
|
|
"gpgme_debug: level=%d\n", debug_level);
|
2015-08-24 13:03:20 +00:00
|
|
|
|
#ifdef HAVE_W32_SYSTEM
|
|
|
|
|
{
|
|
|
|
|
const char *name = _gpgme_get_inst_dir ();
|
2019-06-05 13:48:33 +00:00
|
|
|
|
_gpgme_debug (NULL, DEBUG_INIT, -1, NULL, NULL, NULL,
|
2018-11-16 15:39:26 +00:00
|
|
|
|
"gpgme_debug: gpgme='%s'\n", name? name: "?");
|
2015-08-24 13:03:20 +00:00
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
2001-04-02 08:40:32 +00:00
|
|
|
|
}
|
2001-01-30 11:01:41 +00:00
|
|
|
|
|
2007-08-02 14:59:01 +00:00
|
|
|
|
|
|
|
|
|
|
2019-06-05 11:10:52 +00:00
|
|
|
|
/* This should be called as soon as possible. It is required so that
|
|
|
|
|
* the assuan logging gets connected to the gpgme log stream as early
|
|
|
|
|
* as possible. */
|
2007-08-02 14:59:01 +00:00
|
|
|
|
void
|
|
|
|
|
_gpgme_debug_subsystem_init (void)
|
|
|
|
|
{
|
|
|
|
|
debug_init ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2002-05-08 03:57:42 +00:00
|
|
|
|
|
2018-11-16 15:25:49 +00:00
|
|
|
|
/* Log the formatted string FORMAT prefixed with additional info
|
|
|
|
|
* depending on MODE:
|
|
|
|
|
*
|
|
|
|
|
* -1 = Do not print any additional args.
|
|
|
|
|
* 0 = standalone (used by macro TRACE)
|
|
|
|
|
* 1 = enter a function (used by macro TRACE_BEG)
|
|
|
|
|
* 2 = debug a function (used by macro TRACE_LOG)
|
|
|
|
|
* 3 = leave a function (used by macro TRACE_SUC)
|
|
|
|
|
*
|
2019-06-05 13:48:33 +00:00
|
|
|
|
* If LINE is not NULL the output will be stored in that variabale but
|
|
|
|
|
* without a LF. _gpgme_debug_add can be used to add more and
|
|
|
|
|
* _gpgme_debug_end to finally output it.
|
|
|
|
|
*
|
2018-11-16 15:25:49 +00:00
|
|
|
|
* Returns: 0
|
|
|
|
|
*
|
|
|
|
|
* Note that we always return 0 because the old TRACE macro evaluated
|
|
|
|
|
* to 0 which issues a warning with newer gcc version about an unused
|
|
|
|
|
* values. By using a return value of this function this can be
|
|
|
|
|
* avoided. Fixme: It might be useful to check whether the return
|
|
|
|
|
* value from the TRACE macros are actually used somewhere.
|
|
|
|
|
*/
|
|
|
|
|
int
|
2019-06-05 13:48:33 +00:00
|
|
|
|
_gpgme_debug (void **line, int level, int mode,
|
|
|
|
|
const char *func, const char *tagname,
|
2018-11-16 15:39:26 +00:00
|
|
|
|
const char *tagvalue, const char *format, ...)
|
2018-11-16 15:25:49 +00:00
|
|
|
|
{
|
|
|
|
|
va_list arg_ptr;
|
|
|
|
|
int saved_errno;
|
2018-11-16 17:15:22 +00:00
|
|
|
|
int need_lf;
|
2019-06-05 11:10:52 +00:00
|
|
|
|
int indent;
|
|
|
|
|
char *prefix, *stdinfo, *userinfo;
|
2019-06-05 13:48:33 +00:00
|
|
|
|
const char *modestr;
|
2019-06-05 14:37:59 +00:00
|
|
|
|
int no_userinfo = 0;
|
2018-11-16 15:25:49 +00:00
|
|
|
|
|
|
|
|
|
if (debug_level < level)
|
|
|
|
|
return 0;
|
|
|
|
|
|
2019-06-05 11:10:52 +00:00
|
|
|
|
#ifdef FRAME_NR
|
|
|
|
|
indent = frame_nr > 0? (2 * (frame_nr - 1)):0;
|
|
|
|
|
#else
|
|
|
|
|
indent = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
2018-11-16 17:15:22 +00:00
|
|
|
|
saved_errno = errno;
|
2018-11-16 15:25:49 +00:00
|
|
|
|
va_start (arg_ptr, format);
|
|
|
|
|
{
|
|
|
|
|
struct tm *tp;
|
|
|
|
|
time_t atime = time (NULL);
|
|
|
|
|
|
|
|
|
|
tp = localtime (&atime);
|
2019-06-05 11:10:52 +00:00
|
|
|
|
prefix = gpgrt_bsprintf ("GPGME %04d%02d%02dT%02d%02d%02d %04llX %*s",
|
|
|
|
|
1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
|
|
|
|
|
tp->tm_hour, tp->tm_min, tp->tm_sec,
|
|
|
|
|
(unsigned long long) ath_self (),
|
|
|
|
|
indent < 40? indent : 40, "");
|
2018-11-16 15:25:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (mode)
|
|
|
|
|
{
|
2019-06-05 13:48:33 +00:00
|
|
|
|
case -1: modestr = NULL; break; /* Do nothing. */
|
|
|
|
|
case 0: modestr = "call"; break;
|
|
|
|
|
case 1: modestr = "enter"; break;
|
|
|
|
|
case 2: modestr = "check"; break;
|
|
|
|
|
case 3: modestr = "leave"; break;
|
|
|
|
|
default: modestr = "mode?"; break;
|
2018-11-16 15:25:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-05 13:48:33 +00:00
|
|
|
|
if (!modestr)
|
|
|
|
|
stdinfo = NULL;
|
|
|
|
|
else if (tagname && strcmp (tagname, XSTRINGIFY (NULL)))
|
|
|
|
|
stdinfo = gpgrt_bsprintf ("%s: %s: %s=%p ", func,modestr,tagname,tagvalue);
|
|
|
|
|
else
|
|
|
|
|
stdinfo = gpgrt_bsprintf ("%s: %s: ", func, modestr);
|
|
|
|
|
|
2019-06-05 14:37:59 +00:00
|
|
|
|
if (format && *format)
|
|
|
|
|
userinfo = gpgrt_vbsprintf (format, arg_ptr);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
userinfo = NULL;
|
|
|
|
|
no_userinfo = 1;
|
|
|
|
|
}
|
2018-11-16 15:25:49 +00:00
|
|
|
|
va_end (arg_ptr);
|
2019-06-05 11:10:52 +00:00
|
|
|
|
|
|
|
|
|
if (mode != -1 && (!format || !*format))
|
|
|
|
|
need_lf = 1;
|
|
|
|
|
else if (userinfo && *userinfo && userinfo[strlen (userinfo) - 1] != '\n')
|
|
|
|
|
need_lf = 1;
|
|
|
|
|
else
|
|
|
|
|
need_lf = 0;
|
|
|
|
|
|
2019-06-05 13:48:33 +00:00
|
|
|
|
if (line)
|
|
|
|
|
*line = gpgrt_bsprintf ("%s%s%s",
|
|
|
|
|
prefix? prefix : "GPGME out-of-core ",
|
|
|
|
|
!modestr? "" : stdinfo? stdinfo :
|
|
|
|
|
(!format || !*format)? "" :"out-of-core ",
|
|
|
|
|
userinfo? userinfo : "out-of-core");
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
fprintf (errfp, "%s%s%s%s",
|
|
|
|
|
prefix? prefix : "GPGME out-of-core ",
|
|
|
|
|
!modestr? "" : stdinfo? stdinfo :
|
|
|
|
|
(!format || !*format)? "" :"out-of-core ",
|
2019-06-05 14:37:59 +00:00
|
|
|
|
userinfo? userinfo : no_userinfo? "" : "out-of-core",
|
2019-06-05 13:48:33 +00:00
|
|
|
|
need_lf? "\n":"");
|
|
|
|
|
fflush (errfp);
|
|
|
|
|
}
|
2018-11-16 15:25:49 +00:00
|
|
|
|
|
2019-06-05 11:10:52 +00:00
|
|
|
|
gpgrt_free (userinfo);
|
|
|
|
|
gpgrt_free (stdinfo);
|
|
|
|
|
gpgrt_free (prefix);
|
2018-11-16 15:25:49 +00:00
|
|
|
|
gpg_err_set_errno (saved_errno);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-05-08 03:57:42 +00:00
|
|
|
|
/* Add the formatted string FORMAT to the debug line *LINE. */
|
2001-01-30 11:01:41 +00:00
|
|
|
|
void
|
2002-05-08 03:57:42 +00:00
|
|
|
|
_gpgme_debug_add (void **line, const char *format, ...)
|
2001-01-30 11:01:41 +00:00
|
|
|
|
{
|
2002-05-08 03:57:42 +00:00
|
|
|
|
va_list arg_ptr;
|
|
|
|
|
char *toadd;
|
|
|
|
|
char *result;
|
2009-06-22 14:50:17 +00:00
|
|
|
|
int res;
|
2002-05-08 03:57:42 +00:00
|
|
|
|
|
2002-09-02 12:29:53 +00:00
|
|
|
|
if (!*line)
|
2002-05-08 03:57:42 +00:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
va_start (arg_ptr, format);
|
2017-02-02 11:35:59 +00:00
|
|
|
|
res = gpgrt_vasprintf (&toadd, format, arg_ptr);
|
2002-05-08 03:57:42 +00:00
|
|
|
|
va_end (arg_ptr);
|
2009-06-22 14:50:17 +00:00
|
|
|
|
if (res < 0)
|
|
|
|
|
{
|
2017-02-02 11:35:59 +00:00
|
|
|
|
gpgrt_free (*line);
|
2009-06-22 14:50:17 +00:00
|
|
|
|
*line = NULL;
|
|
|
|
|
}
|
2017-02-02 11:35:59 +00:00
|
|
|
|
res = gpgrt_asprintf (&result, "%s%s", *(char **) line, toadd);
|
|
|
|
|
gpgrt_free (toadd);
|
|
|
|
|
gpgrt_free (*line);
|
2009-06-22 14:50:17 +00:00
|
|
|
|
if (res < 0)
|
|
|
|
|
*line = NULL;
|
|
|
|
|
else
|
|
|
|
|
*line = result;
|
2001-01-30 11:01:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-05-08 03:57:42 +00:00
|
|
|
|
|
|
|
|
|
/* Finish construction of *LINE and send it to the debug output
|
|
|
|
|
stream. */
|
2001-01-30 11:01:41 +00:00
|
|
|
|
void
|
2002-05-08 03:57:42 +00:00
|
|
|
|
_gpgme_debug_end (void **line)
|
2001-01-30 11:01:41 +00:00
|
|
|
|
{
|
2019-06-05 14:37:59 +00:00
|
|
|
|
const char *string;
|
|
|
|
|
|
2002-09-02 12:29:53 +00:00
|
|
|
|
if (!*line)
|
2002-05-08 03:57:42 +00:00
|
|
|
|
return;
|
2019-06-05 14:37:59 +00:00
|
|
|
|
string = *line;
|
2002-05-08 03:57:42 +00:00
|
|
|
|
|
2019-06-05 14:37:59 +00:00
|
|
|
|
fprintf (errfp, "%s%s",
|
|
|
|
|
string,
|
|
|
|
|
(*string && string[strlen (string)-1] != '\n')? "\n":"");
|
|
|
|
|
fflush (errfp);
|
2017-02-02 11:35:59 +00:00
|
|
|
|
gpgrt_free (*line);
|
2002-05-08 03:57:42 +00:00
|
|
|
|
*line = NULL;
|
2001-01-30 11:01:41 +00:00
|
|
|
|
}
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define TOHEX(val) (((val) < 10) ? ((val) + '0') : ((val) - 10 + 'a'))
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
_gpgme_debug_buffer (int lvl, const char *const fmt,
|
2009-11-04 18:13:44 +00:00
|
|
|
|
const char *const func, const char *const buffer,
|
2009-11-02 17:18:48 +00:00
|
|
|
|
size_t len)
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
{
|
|
|
|
|
int idx = 0;
|
|
|
|
|
int j;
|
|
|
|
|
|
|
|
|
|
if (!_gpgme_debug_trace ())
|
|
|
|
|
return;
|
|
|
|
|
|
2018-10-18 14:50:18 +00:00
|
|
|
|
if (!buffer)
|
|
|
|
|
return;
|
|
|
|
|
|
2019-06-12 10:31:44 +00:00
|
|
|
|
if (lvl > 9)
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
{
|
2019-06-12 10:31:44 +00:00
|
|
|
|
while (idx < len)
|
|
|
|
|
{
|
|
|
|
|
char str[51];
|
|
|
|
|
char *strp = str;
|
|
|
|
|
char *strp2 = &str[34];
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < 16; j++)
|
|
|
|
|
{
|
|
|
|
|
unsigned char val;
|
|
|
|
|
if (idx < len)
|
|
|
|
|
{
|
|
|
|
|
val = buffer[idx++];
|
|
|
|
|
*(strp++) = TOHEX (val >> 4);
|
|
|
|
|
*(strp++) = TOHEX (val % 16);
|
|
|
|
|
*(strp2++) = isprint (val)? val : '.';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*(strp++) = ' ';
|
|
|
|
|
*(strp++) = ' ';
|
|
|
|
|
}
|
|
|
|
|
if (j == 7)
|
|
|
|
|
*(strp++) = ' ';
|
|
|
|
|
}
|
|
|
|
|
*(strp++) = ' ';
|
|
|
|
|
*(strp2) = '\0';
|
|
|
|
|
|
|
|
|
|
_gpgme_debug (NULL, lvl, -1, NULL, NULL, NULL, fmt, func, str);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
while (idx < len)
|
|
|
|
|
{
|
|
|
|
|
char str[48+4+1];
|
|
|
|
|
char *strp = str;
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < 48; j++)
|
|
|
|
|
{
|
|
|
|
|
unsigned char val;
|
|
|
|
|
if (idx < len)
|
|
|
|
|
{
|
|
|
|
|
val = buffer[idx++];
|
|
|
|
|
if (val == '\n')
|
|
|
|
|
{
|
|
|
|
|
*strp++ = '<';
|
|
|
|
|
*strp++ = 'L';
|
|
|
|
|
*strp++ = 'F';
|
|
|
|
|
*strp++ = '>';
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
*strp++ = (val > 31 && val < 127)? val : '.';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*strp = 0;
|
|
|
|
|
|
|
|
|
|
_gpgme_debug (NULL, lvl, -1, NULL, NULL, NULL, fmt, func, str);
|
|
|
|
|
}
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
}
|
|
|
|
|
}
|