some more internall structure changes
[gnupg.git] / util / logger.c
1 /* logger.c  -  log functions
2  *      Copyright (C) 1998 Free Software Foundation, Inc.
3  *
4  * This file is part of GNUPG.
5  *
6  * GNUPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GNUPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <stdarg.h>
25
26 #include "util.h"
27
28 static char pidstring[15];
29 static char *pgm_name;
30 static int errorcount;
31
32 void
33 log_set_name( const char *name )
34 {
35     m_free(pgm_name);
36     if( name )
37         pgm_name = m_strdup(name);
38     else
39         pgm_name = NULL;
40 }
41
42 const char *
43 log_get_name(void)
44 {
45     return pgm_name? pgm_name : "";
46 }
47
48
49 void
50 log_set_pid( int pid )
51 {
52     if( pid )
53         sprintf(pidstring,"[%u]", (unsigned)pid );
54     else
55         *pidstring = 0;
56 }
57
58 int
59 log_get_errorcount( int clear)
60 {
61     int n = errorcount;
62     if( clear )
63         errorcount = 0;
64     return n;
65 }
66
67 static void
68 print_prefix(const char *text)
69 {
70     if( pgm_name )
71         fprintf(stderr, "%s%s: %s", pgm_name, pidstring, text );
72     else
73         fprintf(stderr, "?%s: %s", pidstring, text );
74 }
75
76 void
77 g10_log_info( const char *fmt, ... )
78 {
79     va_list arg_ptr ;
80
81     print_prefix("");
82     va_start( arg_ptr, fmt ) ;
83     vfprintf(stderr,fmt,arg_ptr) ;
84     va_end(arg_ptr);
85 }
86
87 void
88 g10_log_error( const char *fmt, ... )
89 {
90     va_list arg_ptr ;
91
92     print_prefix("");
93     va_start( arg_ptr, fmt ) ;
94     vfprintf(stderr,fmt,arg_ptr) ;
95     va_end(arg_ptr);
96     errorcount++;
97 }
98
99 void
100 g10_log_fatal( const char *fmt, ... )
101 {
102     va_list arg_ptr ;
103
104     print_prefix("fatal: ");
105     va_start( arg_ptr, fmt ) ;
106     vfprintf(stderr,fmt,arg_ptr) ;
107     va_end(arg_ptr);
108     secmem_dump_stats();
109     exit(2);
110 }
111
112 void
113 g10_log_bug( const char *fmt, ... )
114 {
115     va_list arg_ptr ;
116
117     putc('\n', stderr );
118     print_prefix("Ooops: ");
119     va_start( arg_ptr, fmt ) ;
120     vfprintf(stderr,fmt,arg_ptr) ;
121     va_end(arg_ptr);
122     fflush(stderr);
123     secmem_dump_stats();
124     abort();
125 }
126
127 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
128 void
129 g10_log_bug0( const char *file, int line, const char *func )
130 {
131     log_bug("Ohhhh jeeee ... (%s:%d:%s)\n", file, line, func );
132 }
133 #else
134 void
135 g10_log_bug0( const char *file, int line )
136 {
137     log_bug("Ohhhh jeeee ... (%s:%d)\n", file, line);
138 }
139 #endif
140
141 void
142 g10_log_debug( const char *fmt, ... )
143 {
144     va_list arg_ptr ;
145
146     print_prefix("DBG: ");
147     va_start( arg_ptr, fmt ) ;
148     vfprintf(stderr,fmt,arg_ptr) ;
149     va_end(arg_ptr);
150 }
151
152
153
154 void
155 g10_log_hexdump( const char *text, char *buf, size_t len )
156 {
157     int i;
158
159     print_prefix(text);
160     for(i=0; i < len; i++ )
161         fprintf(stderr, " %02X", ((byte*)buf)[i] );
162     fputc('\n', stderr);
163 }
164
165
166 void
167 g10_log_mpidump( const char *text, MPI a )
168 {
169     print_prefix(text);
170     mpi_print(stderr, a, 1 );
171     fputc('\n', stderr);
172 }
173