1 /* logging.c - Useful logging functions
2 * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
3 * 2009, 2010 Free Software Foundation, Inc.
5 * This file is part of GnuPG.
7 * GnuPG is free software; you can redistribute it and/or modify it
8 * under the terms of either
10 * - the GNU Lesser General Public License as published by the Free
11 * Software Foundation; either version 3 of the License, or (at
12 * your option) any later version.
16 * - the GNU General Public License as published by the Free
17 * Software Foundation; either version 2 of the License, or (at
18 * your option) any later version.
20 * or both in parallel, as here.
22 * GnuPG is distributed in the hope that it will be useful, but
23 * WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * General Public License for more details.
27 * You should have received a copies of the GNU General Public License
28 * and the GNU Lesser General Public License along with this program;
29 * if not, see <http://www.gnu.org/licenses/>.
41 #include <sys/types.h>
43 #ifdef HAVE_W32_SYSTEM
44 # ifdef HAVE_WINSOCK2_H
45 # include <winsock2.h>
48 #else /*!HAVE_W32_SYSTEM*/
49 # include <sys/socket.h>
51 # include <netinet/in.h>
52 # include <arpa/inet.h>
53 #endif /*!HAVE_W32_SYSTEM*/
57 /* #include <execinfo.h> */
59 #define GNUPG_COMMON_NEED_AFLOCAL 1
62 #include "common-defs.h"
65 #ifdef HAVE_W32_SYSTEM
66 # define S_IRGRP S_IRUSR
67 # define S_IROTH S_IRUSR
68 # define S_IWGRP S_IWUSR
69 # define S_IWOTH S_IWUSR
73 #ifdef HAVE_W32CE_SYSTEM
74 # define isatty(a) (0)
78 #if defined (AF_INET6) && defined(PF_INET) \
79 && defined (INET6_ADDRSTRLEN) && defined(HAVE_INET_PTON)
84 # define EAFNOSUPPORT EINVAL
86 #ifndef INADDR_NONE /* Slowaris is missing that. */
87 #define INADDR_NONE ((unsigned long)(-1))
88 #endif /*INADDR_NONE*/
90 #ifdef HAVE_W32_SYSTEM
91 #define sock_close(a) closesocket(a)
93 #define sock_close(a) close(a)
97 static estream_t logstream;
98 static int log_socket = -1;
99 static char prefix_buffer[80];
100 static int with_time;
101 static int with_prefix;
103 #ifdef HAVE_W32_SYSTEM
104 static int no_registry;
106 static int (*get_pid_suffix_cb)(unsigned long *r_value);
107 static int running_detached;
108 static int force_prefixes;
110 static int missing_lf;
111 static int errorcount;
115 log_get_errorcount (int clear)
124 log_inc_errorcount (void)
130 /* The following 3 functions are used by es_fopencookie to write logs
138 #ifdef HAVE_W32CE_SYSTEM
145 /* Write NBYTES of BUFFER to file descriptor FD. */
147 writen (int fd, const void *buffer, size_t nbytes, int is_socket)
149 const char *buf = buffer;
150 size_t nleft = nbytes;
152 #ifndef HAVE_W32_SYSTEM
153 (void)is_socket; /* Not required. */
158 #ifdef HAVE_W32_SYSTEM
160 nwritten = send (fd, buf, nleft, 0);
163 nwritten = write (fd, buf, nleft);
165 if (nwritten < 0 && errno == EINTR)
170 buf = buf + nwritten;
177 /* Returns true if STR represents a valid port number in decimal
178 notation and no garbage is following. */
180 parse_portno (const char *str, unsigned short *r_port)
184 for (value=0; *str && (*str >= '0' && *str <= '9'); str++)
186 value = value * 10 + (*str - '0');
199 fun_writer (void *cookie_arg, const void *buffer, size_t size)
201 struct fun_cookie_s *cookie = cookie_arg;
203 /* FIXME: Use only estream with a callback for socket writing. This
204 avoids the ugly mix of fd and estream code. */
206 /* Note that we always try to reconnect to the socket but print
207 error messages only the first time an error occurred. If
208 RUNNING_DETACHED is set we don't fall back to stderr and even do
209 not print any error messages. This is needed because detached
210 processes often close stderr and by writing to file descriptor 2
211 we might send the log message to a file not intended for logging
212 (e.g. a pipe or network connection). */
213 if (cookie->want_socket && cookie->fd == -1)
216 struct sockaddr_in6 srvr_addr_in6;
218 struct sockaddr_in srvr_addr_in;
219 #ifndef HAVE_W32_SYSTEM
220 struct sockaddr_un srvr_addr_un;
223 struct sockaddr *srvr_addr = NULL;
224 unsigned short port = 0;
227 const char *name = cookie->name;
229 /* Not yet open or meanwhile closed due to an error. */
230 cookie->is_socket = 0;
232 /* Check whether this is a TCP socket or a local socket. */
233 if (!strncmp (name, "tcp://", 6) && name[6])
239 #ifndef HAVE_W32_SYSTEM
240 else if (!strncmp (name, "socket://", 9) && name[9])
246 #ifdef HAVE_W32_SYSTEM
249 memset (&srvr_addr, 0, sizeof srvr_addr);
250 srvr_addr_un.sun_family = af;
251 strncpy (srvr_addr_un.sun_path,
252 name, sizeof (srvr_addr_un.sun_path)-1);
253 srvr_addr_un.sun_path[sizeof (srvr_addr_un.sun_path)-1] = 0;
254 srvr_addr = (struct sockaddr *)&srvr_addr_un;
255 addrlen = SUN_LEN (&srvr_addr_un);
261 #ifdef HAVE_INET_PTON
262 void *addrbuf = NULL;
263 #endif /*HAVE_INET_PTON*/
265 addrstr = xtrymalloc (strlen (name) + 1);
267 addrlen = 0; /* This indicates an error. */
268 else if (*name == '[')
270 /* Check for IPv6 literal address. */
271 strcpy (addrstr, name+1);
272 p = strchr (addrstr, ']');
273 if (!p || p[1] != ':' || !parse_portno (p+2, &port))
275 gpg_err_set_errno (EINVAL);
284 memset (&srvr_addr_in6, 0, sizeof srvr_addr_in6);
285 srvr_addr_in6.sin6_family = af;
286 srvr_addr_in6.sin6_port = htons (port);
287 #ifdef HAVE_INET_PTON
288 addrbuf = &srvr_addr_in6.sin6_addr;
289 #endif /*HAVE_INET_PTON*/
290 srvr_addr = (struct sockaddr *)&srvr_addr_in6;
291 addrlen = sizeof srvr_addr_in6;
293 gpg_err_set_errno (EAFNOSUPPORT);
300 /* Check for IPv4 literal address. */
301 strcpy (addrstr, name);
302 p = strchr (addrstr, ':');
303 if (!p || !parse_portno (p+1, &port))
305 gpg_err_set_errno (EINVAL);
311 memset (&srvr_addr_in, 0, sizeof srvr_addr_in);
312 srvr_addr_in.sin_family = af;
313 srvr_addr_in.sin_port = htons (port);
314 #ifdef HAVE_INET_PTON
315 addrbuf = &srvr_addr_in.sin_addr;
316 #endif /*HAVE_INET_PTON*/
317 srvr_addr = (struct sockaddr *)&srvr_addr_in;
318 addrlen = sizeof srvr_addr_in;
324 #ifdef HAVE_INET_PTON
325 if (inet_pton (af, addrstr, addrbuf) != 1)
327 #else /*!HAVE_INET_PTON*/
328 /* We need to use the old function. If we are here v6
329 support isn't enabled anyway and thus we can do fine
330 without. Note that Windows has a compatible inet_pton
331 function named inetPton, but only since Vista. */
332 srvr_addr_in.sin_addr.s_addr = inet_addr (addrstr);
333 if (srvr_addr_in.sin_addr.s_addr == INADDR_NONE)
335 #endif /*!HAVE_INET_PTON*/
341 cookie->fd = addrlen? socket (pf, SOCK_STREAM, 0) : -1;
342 if (cookie->fd == -1)
344 if (!cookie->quiet && !running_detached
345 && isatty (es_fileno (es_stderr)))
346 es_fprintf (es_stderr, "failed to create socket for logging: %s\n",
351 if (connect (cookie->fd, srvr_addr, addrlen) == -1)
353 if (!cookie->quiet && !running_detached
354 && isatty (es_fileno (es_stderr)))
355 es_fprintf (es_stderr, "can't connect to '%s': %s\n",
356 cookie->name, strerror(errno));
357 sock_close (cookie->fd);
362 if (cookie->fd == -1)
364 if (!running_detached)
366 /* Due to all the problems with apps not running
367 detached but being called with stderr closed or used
368 for a different purposes, it does not make sense to
369 switch to stderr. We therefore disable it. */
372 /* fputs ("switching logging to stderr\n", stderr);*/
375 cookie->fd = -1; /*fileno (stderr);*/
378 else /* Connection has been established. */
381 cookie->is_socket = 1;
385 log_socket = cookie->fd;
386 if (cookie->fd != -1)
388 #ifdef HAVE_W32CE_SYSTEM
389 if (cookie->use_writefile)
393 WriteFile ((HANDLE)cookie->fd, buffer, size, &nwritten, NULL);
394 return (gpgrt_ssize_t)size; /* Okay. */
397 if (!writen (cookie->fd, buffer, size, cookie->is_socket))
398 return (gpgrt_ssize_t)size; /* Okay. */
401 if (!running_detached && cookie->fd != -1
402 && isatty (es_fileno (es_stderr)))
405 es_fprintf (es_stderr, "error writing to '%s': %s\n",
406 cookie->name, strerror(errno));
408 es_fprintf (es_stderr, "error writing to file descriptor %d: %s\n",
409 cookie->fd, strerror(errno));
411 if (cookie->is_socket && cookie->fd != -1)
413 sock_close (cookie->fd);
418 return (gpgrt_ssize_t)size;
423 fun_closer (void *cookie_arg)
425 struct fun_cookie_s *cookie = cookie_arg;
427 if (cookie->fd != -1 && cookie->fd != 2)
428 sock_close (cookie->fd);
435 /* Common function to either set the logging to a file or a file
438 set_file_fd (const char *name, int fd)
442 #ifdef HAVE_W32CE_SYSTEM
443 int use_writefile = 0;
445 struct fun_cookie_s *cookie;
447 /* Close an open log stream. */
450 es_fclose (logstream);
454 /* Figure out what kind of logging we want. */
455 if (name && !strcmp (name, "-"))
458 fd = es_fileno (es_stderr);
462 if (name && !strncmp (name, "tcp://", 6) && name[6])
464 #ifndef HAVE_W32_SYSTEM
465 else if (name && !strncmp (name, "socket://", 9) && name[9])
467 #endif /*HAVE_W32_SYSTEM*/
468 #ifdef HAVE_W32CE_SYSTEM
469 else if (name && !strcmp (name, "GPG2:"))
473 ActivateDevice (L"Drivers\\"GNUPG_NAME"_Log", 0);
474 /* Ignore a filename and write the debug output to the GPG2:
476 hd = CreateFile (L"GPG2:", GENERIC_WRITE,
477 FILE_SHARE_READ | FILE_SHARE_WRITE,
478 NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
479 fd = (hd == INVALID_HANDLE_VALUE)? -1 : (int)hd;
484 #endif /*HAVE_W32CE_SYSTEM*/
486 /* Setup a new stream. */
488 /* The xmalloc below is justified because we can expect that this
489 function is called only during initialization and there is no
490 easy way out of this error condition. */
491 cookie = xmalloc (sizeof *cookie + (name? strlen (name):0));
492 strcpy (cookie->name, name? name:"");
494 cookie->is_socket = 0;
495 cookie->want_socket = want_socket;
496 #ifdef HAVE_W32CE_SYSTEM
497 cookie->use_writefile = use_writefile;
501 else if (want_socket)
506 cookie->fd = open (name, O_WRONLY|O_APPEND|O_CREAT,
507 (S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR|S_IWGRP|S_IWOTH));
508 while (cookie->fd == -1 && errno == EINTR);
510 log_socket = cookie->fd;
513 es_cookie_io_functions_t io = { NULL };
514 io.func_write = fun_writer;
515 io.func_close = fun_closer;
517 fp = es_fopencookie (cookie, "w", io);
520 /* On error default to a stderr based estream. */
524 es_setvbuf (fp, NULL, _IOLBF, 0);
528 /* We always need to print the prefix and the pid for socket mode,
529 so that the server reading the socket can do something
531 force_prefixes = want_socket;
537 /* Set the file to write log to. The special names NULL and "-" may
538 be used to select stderr and names formatted like
539 "socket:///home/foo/mylogs" may be used to write the logging to the
540 socket "/home/foo/mylogs". If the connection to the socket fails
541 or a write error is detected, the function writes to stderr and
542 tries the next time again to connect the socket.
545 log_set_file (const char *name)
547 set_file_fd (name? name: "-", -1);
553 set_file_fd (NULL, fd);
558 log_set_pid_suffix_cb (int (*cb)(unsigned long *r_value))
560 get_pid_suffix_cb = cb;
565 log_set_prefix (const char *text, unsigned int flags)
569 strncpy (prefix_buffer, text, sizeof (prefix_buffer)-1);
570 prefix_buffer[sizeof (prefix_buffer)-1] = 0;
573 with_prefix = (flags & GPGRT_LOG_WITH_PREFIX);
574 with_time = (flags & GPGRT_LOG_WITH_TIME);
575 with_pid = (flags & GPGRT_LOG_WITH_PID);
576 running_detached = (flags & GPGRT_LOG_RUN_DETACHED);
577 #ifdef HAVE_W32_SYSTEM
578 no_registry = (flags & GPGRT_LOG_NO_REGISTRY);
584 log_get_prefix (unsigned int *flags)
590 *flags |= GPGRT_LOG_WITH_PREFIX;
592 *flags |= GPGRT_LOG_WITH_TIME;
594 *flags |= GPGRT_LOG_WITH_PID;
595 if (running_detached)
596 *flags |= GPGRT_LOG_RUN_DETACHED;
597 #ifdef HAVE_W32_SYSTEM
599 *flags |= GPGRT_LOG_NO_REGISTRY;
602 return prefix_buffer;
605 /* This function returns true if the file descriptor FD is in use for
606 logging. This is preferable over a test using log_get_fd in that
607 it allows the logging code to use more then one file descriptor. */
613 int tmp = es_fileno (logstream);
614 if ( tmp != -1 && tmp == fd)
617 if (log_socket != -1 && log_socket == fd)
625 return logstream? es_fileno(logstream) : -1;
633 log_set_file (NULL); /* Make sure a log stream has been set. */
640 do_logv (int level, int ignore_arg_ptr, const char *fmt, va_list arg_ptr)
644 #ifdef HAVE_W32_SYSTEM
649 : read_w32_registry_string (NULL, GNUPG_REGISTRY_DIR,
651 log_set_file (tmp && *tmp? tmp : NULL);
654 log_set_file (NULL); /* Make sure a log stream has been set. */
659 es_flockfile (logstream);
660 if (missing_lf && level != GPGRT_LOG_CONT)
661 es_putc_unlocked ('\n', logstream );
664 if (level != GPGRT_LOG_CONT)
665 { /* Note this does not work for multiple line logging as we would
666 * need to print to a buffer first */
667 if (with_time && !force_prefixes)
670 time_t atime = time (NULL);
672 tp = localtime (&atime);
673 es_fprintf_unlocked (logstream, "%04d-%02d-%02d %02d:%02d:%02d ",
674 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
675 tp->tm_hour, tp->tm_min, tp->tm_sec );
677 if (with_prefix || force_prefixes)
678 es_fputs_unlocked (prefix_buffer, logstream);
679 if (with_pid || force_prefixes)
681 unsigned long pidsuf;
684 if (get_pid_suffix_cb && (pidfmt=get_pid_suffix_cb (&pidsuf)))
685 es_fprintf_unlocked (logstream, pidfmt == 1? "[%u.%lu]":"[%u.%lx]",
686 (unsigned int)getpid (), pidsuf);
688 es_fprintf_unlocked (logstream, "[%u]", (unsigned int)getpid ());
690 if (!with_time || force_prefixes)
691 es_putc_unlocked (':', logstream);
692 /* A leading backspace suppresses the extra space so that we can
693 correctly output, programname, filename and linenumber. */
694 if (fmt && *fmt == '\b')
697 es_putc_unlocked (' ', logstream);
702 case GPGRT_LOG_BEGIN: break;
703 case GPGRT_LOG_CONT: break;
704 case GPGRT_LOG_INFO: break;
705 case GPGRT_LOG_WARN: break;
706 case GPGRT_LOG_ERROR: break;
707 case GPGRT_LOG_FATAL: es_fputs_unlocked ("Fatal: ",logstream ); break;
708 case GPGRT_LOG_BUG: es_fputs_unlocked ("Ohhhh jeeee: ", logstream); break;
709 case GPGRT_LOG_DEBUG: es_fputs_unlocked ("DBG: ", logstream ); break;
711 es_fprintf_unlocked (logstream,"[Unknown log level %d]: ", level);
718 { /* This is used by log_string and comes with the extra
719 * feature that after a LF the next line is indent at the
720 * length of the prefix. Note that we do not yet include
721 * the length of the timestamp and pid in the indent
723 const char *p, *pend;
725 for (p = fmt; (pend = strchr (p, '\n')); p = pend+1)
726 es_fprintf_unlocked (logstream, "%*s%.*s",
728 && (with_prefix || force_prefixes))
729 ?strlen (prefix_buffer)+2:0), "",
730 (int)(pend - p)+1, p);
731 es_fputs_unlocked (p, logstream);
734 es_vfprintf_unlocked (logstream, fmt, arg_ptr);
735 if (*fmt && fmt[strlen(fmt)-1] != '\n')
739 if (level == GPGRT_LOG_FATAL)
742 es_putc_unlocked ('\n', logstream);
743 es_funlockfile (logstream);
746 else if (level == GPGRT_LOG_BUG)
749 es_putc_unlocked ('\n', logstream );
750 es_funlockfile (logstream);
751 /* Using backtrace requires a configure test and to pass
752 * -rdynamic to gcc. Thus we do not enable it now. */
754 /* void *btbuf[20]; */
755 /* int btidx, btlen; */
758 /* btlen = backtrace (btbuf, DIM (btbuf)); */
759 /* btstr = backtrace_symbols (btbuf, btlen); */
761 /* for (btidx=0; btidx < btlen; btidx++) */
762 /* log_debug ("[%d] %s\n", btidx, btstr[btidx]); */
767 es_funlockfile (logstream);
772 log_log (int level, const char *fmt, ...)
776 va_start (arg_ptr, fmt) ;
777 do_logv (level, 0, fmt, arg_ptr);
783 log_logv (int level, const char *fmt, va_list arg_ptr)
785 do_logv (level, 0, fmt, arg_ptr);
790 do_log_ignore_arg (int level, const char *str, ...)
793 va_start (arg_ptr, str);
794 do_logv (level, 1, str, arg_ptr);
799 /* Log STRING at LEVEL but indent from the second line on by the
800 * length of the prefix. */
802 log_string (int level, const char *string)
804 /* We need a dummy arg_ptr, but there is no portable way to create
805 * one. So we call the do_logv function through a variadic wrapper. */
806 do_log_ignore_arg (level, string);
811 log_info (const char *fmt, ...)
815 va_start (arg_ptr, fmt);
816 do_logv (GPGRT_LOG_INFO, 0, fmt, arg_ptr);
822 log_error (const char *fmt, ...)
826 va_start (arg_ptr, fmt);
827 do_logv (GPGRT_LOG_ERROR, 0, fmt, arg_ptr);
829 /* Protect against counter overflow. */
830 if (errorcount < 30000)
836 log_fatal (const char *fmt, ...)
840 va_start (arg_ptr, fmt);
841 do_logv (GPGRT_LOG_FATAL, 0, fmt, arg_ptr);
843 abort (); /* Never called; just to make the compiler happy. */
848 log_bug (const char *fmt, ...)
852 va_start (arg_ptr, fmt);
853 do_logv (GPGRT_LOG_BUG, 0, fmt, arg_ptr);
855 abort (); /* Never called; just to make the compiler happy. */
860 log_debug (const char *fmt, ...)
864 va_start (arg_ptr, fmt);
865 do_logv (GPGRT_LOG_DEBUG, 0, fmt, arg_ptr);
871 log_printf (const char *fmt, ...)
875 va_start (arg_ptr, fmt);
876 do_logv (fmt ? GPGRT_LOG_CONT : GPGRT_LOG_BEGIN, 0, fmt, arg_ptr);
881 /* Flush the log - this is useful to make sure that the trailing
882 linefeed has been printed. */
886 do_log_ignore_arg (GPGRT_LOG_CONT, NULL);
890 /* Print a hexdump of BUFFER. With TEXT of NULL print just the raw
891 dump, with TEXT just an empty string, print a trailing linefeed,
892 otherwise print an entire debug line. */
894 log_printhex (const char *text, const void *buffer, size_t length)
897 log_debug ("%s ", text);
900 const unsigned char *p = buffer;
901 log_printf ("%02X", *p);
902 for (length--, p++; length--; p++)
903 log_printf (" %02X", *p);
913 is found in sexputils.c
919 is found in sexputils.c
924 log_clock (const char *string)
927 static unsigned long long initial;
929 unsigned long long now;
931 if (clock_gettime (CLOCK_REALTIME, &tv))
933 log_debug ("error getting the realtime clock value\n");
936 now = tv.tv_sec * 1000000000ull;
942 log_debug ("[%6llu] %s", (now - initial)/1000, string);
944 /* You need to link with -ltr to enable the above code. */
945 log_debug ("[not enabled in the source] %s", string);
950 #ifdef GPGRT_HAVE_MACRO_FUNCTION
952 bug_at( const char *file, int line, const char *func )
954 log_log (GPGRT_LOG_BUG, "... this is a bug (%s:%d:%s)\n", file, line, func);
955 abort (); /* Never called; just to make the compiler happy. */
957 #else /*!GPGRT_HAVE_MACRO_FUNCTION*/
959 bug_at( const char *file, int line )
961 log_log (GPGRT_LOG_BUG, "you found a bug ... (%s:%d)\n", file, line);
962 abort (); /* Never called; just to make the compiler happy. */
964 #endif /*!GPGRT_HAVE_MACRO_FUNCTION*/
967 #ifdef GPGRT_HAVE_MACRO_FUNCTION
969 _log_assert (const char *expr, const char *file, int line, const char *func)
971 log_log (GPGRT_LOG_BUG, "Assertion \"%s\" in %s failed (%s:%d)\n",
972 expr, func, file, line);
973 abort (); /* Never called; just to make the compiler happy. */
975 #else /*!GPGRT_HAVE_MACRO_FUNCTION*/
977 _log_assert (const char *expr, const char *file, int line)
979 log_log (GPGRT_LOG_BUG, "Assertion \"%s\" failed (%s:%d)\n",
981 abort (); /* Never called; just to make the compiler happy. */
983 #endif /*!GPGRT_HAVE_MACRO_FUNCTION*/