/*
This file is part of GNUnet.
- (C) 2006-2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2006-2013 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
You should have received a copy of the GNU General Public License
along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
/**
* @author Christian Grothoff
*/
#include "platform.h"
-#include "gnunet_util_lib.h"
+#include "gnunet_crypto_lib.h"
+#include "gnunet_disk_lib.h"
+#include "gnunet_strings_lib.h"
#include <regex.h>
/**
* Number of log calls to ignore.
*/
-int skip_log = 0;
+static int skip_log = 0;
/**
* File descriptor to use for "stderr", or NULL for none.
return GNUNET_ERROR_TYPE_DEBUG;
if (0 == strcasecmp (log, _("INFO")))
return GNUNET_ERROR_TYPE_INFO;
+ if (0 == strcasecmp (log, _("MESSAGE")))
+ return GNUNET_ERROR_TYPE_MESSAGE;
if (0 == strcasecmp (log, _("WARNING")))
return GNUNET_ERROR_TYPE_WARNING;
if (0 == strcasecmp (log, _("ERROR")))
* Abort the process, generate a core dump if possible.
*/
void
-GNUNET_abort ()
+GNUNET_abort_ ()
{
#if WINDOWS
DebugBreak ();
{
static char last_fn[PATH_MAX + 1];
char fn[PATH_MAX + 1];
- int dirwarn;
int altlog_fd;
int dup_return;
FILE *altlog;
if ( (NULL != leftsquare) && (']' == leftsquare[1]) )
{
char *logfile_copy = GNUNET_strdup (fn);
+
logfile_copy[leftsquare - fn] = '\0';
logfile_copy[leftsquare - fn + 1] = '\0';
- snprintf (fn, PATH_MAX, "%s%d%s",
- logfile_copy, getpid (), &logfile_copy[leftsquare - fn + 2]);
+ snprintf (fn,
+ PATH_MAX,
+ "%s%d%s",
+ logfile_copy,
+ getpid (),
+ &logfile_copy[leftsquare - fn + 2]);
GNUNET_free (logfile_copy);
}
if (0 == strcmp (fn, last_fn))
return GNUNET_OK; /* no change */
log_rotate (last_fn);
strcpy (last_fn, fn);
- dirwarn = (GNUNET_OK != GNUNET_DISK_directory_create_for_file (fn));
+ if (GNUNET_SYSERR ==
+ GNUNET_DISK_directory_create_for_file (fn))
+ {
+ fprintf (stderr,
+ "Failed to create directory for `%s': %s\n",
+ fn,
+ STRERROR (errno));
+ return GNUNET_SYSERR;
+ }
#if WINDOWS
altlog_fd = OPEN (fn, O_APPEND |
O_BINARY |
if (-1 == altlog_fd)
{
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "open", fn);
- if (dirwarn)
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _("Failed to create or access directory for log file `%s'\n"),
- fn);
return GNUNET_SYSERR;
}
GNUNET_stderr = altlog;
return GNUNET_OK;
}
+
/**
* Utility function - adds a parsed definition to logdefs array.
*
* @return 0 on success, regex-specific error otherwise
*/
static int
-add_definition (char *component, char *file, char *function, int from_line,
- int to_line, int level, int force)
+add_definition (const char *component,
+ const char *file,
+ const char *function,
+ int from_line,
+ int to_line,
+ int level,
+ int force)
{
struct LogDef n;
int r;
* @return 0 to disallow the call, 1 to allow it
*/
int
-GNUNET_get_log_call_status (int caller_level, const char *comp,
- const char *file, const char *function, int line)
+GNUNET_get_log_call_status (int caller_level,
+ const char *comp,
+ const char *file,
+ const char *function,
+ int line)
{
struct LogDef *ld;
int i;
if (min_level >= 0)
return caller_level <= min_level;
/* All programs/services previously defaulted to WARNING.
- * Now WE default to WARNING, and THEY default to NULL.
+ * Now *we* default to WARNING, and THEY default to NULL.
+ * Or rather we default to MESSAGE, since things aren't always bad.
*/
- return caller_level <= GNUNET_ERROR_TYPE_WARNING;
+ return caller_level <= GNUNET_ERROR_TYPE_MESSAGE;
}
/**
- * Add a custom logger.
+ * Add a custom logger. Note that installing any custom logger
+ * will disable the standard logger. When multiple custom loggers
+ * are installed, all will be called. The standard logger will
+ * only be used if no custom loggers are present.
*
* @param logger log function
* @param logger_cls closure for @a logger
*/
void
-GNUNET_logger_add (GNUNET_Logger logger, void *logger_cls)
+GNUNET_logger_add (GNUNET_Logger logger,
+ void *logger_cls)
{
struct CustomLogger *entry;
* @param logger_cls closure for @a logger
*/
void
-GNUNET_logger_remove (GNUNET_Logger logger, void *logger_cls)
+GNUNET_logger_remove (GNUNET_Logger logger,
+ void *logger_cls)
{
struct CustomLogger *pos;
struct CustomLogger *prev;
* @param msg the actual message
*/
static void
-output_message (enum GNUNET_ErrorType kind, const char *comp,
- const char *datestr, const char *msg)
+output_message (enum GNUNET_ErrorType kind,
+ const char *comp,
+ const char *datestr,
+ const char *msg)
{
struct CustomLogger *pos;
+
#if WINDOWS
EnterCriticalSection (&output_message_cs);
#endif
- if (NULL != GNUNET_stderr)
+ /* only use the standard logger if no custom loggers are present */
+ if ( (NULL != GNUNET_stderr) &&
+ (NULL == loggers) )
{
- FPRINTF (GNUNET_stderr, "%s %s %s %s", datestr, comp,
- GNUNET_error_type_to_string (kind), msg);
+ if (kind == GNUNET_ERROR_TYPE_MESSAGE) {
+ /* The idea here is to produce "normal" output messages
+ * for end users while still having the power of the
+ * logging engine for developer needs. So ideally this
+ * is what it should look like when CLI tools are used
+ * interactively, yet the same message shouldn't look
+ * this way if the output is going to logfiles or robots
+ * instead. Is this the right place to do this? --lynX
+ */
+ FPRINTF (GNUNET_stderr,
+ "* %s",
+ msg);
+ } else {
+ FPRINTF (GNUNET_stderr,
+ "%s %s %s %s",
+ datestr,
+ comp,
+ GNUNET_error_type_to_string (kind),
+ msg);
+ }
fflush (GNUNET_stderr);
}
pos = loggers;
return _("ERROR");
if ((kind & GNUNET_ERROR_TYPE_WARNING) > 0)
return _("WARNING");
+ if ((kind & GNUNET_ERROR_TYPE_MESSAGE) > 0)
+ return _("MESSAGE");
if ((kind & GNUNET_ERROR_TYPE_INFO) > 0)
return _("INFO");
if ((kind & GNUNET_ERROR_TYPE_DEBUG) > 0)
* will be overwritten by next call to #GNUNET_a2s.
*/
const char *
-GNUNET_a2s (const struct sockaddr *addr, socklen_t addrlen)
+GNUNET_a2s (const struct sockaddr *addr,
+ socklen_t addrlen)
{
#ifndef WINDOWS
#define LEN GNUNET_MAX ((INET6_ADDRSTRLEN + 8), \
- (sizeof (struct sockaddr_un) - sizeof (sa_family_t)))
+ (1 + sizeof (struct sockaddr_un) - sizeof (sa_family_t)))
#else
#define LEN (INET6_ADDRSTRLEN + 8)
#endif
if ('\0' == un->sun_path[0])
off++;
memset (buf, 0, sizeof (buf));
- snprintf (buf, sizeof (buf) - 1, "%s%.*s", (off == 1) ? "@" : "",
- (int) (addrlen - sizeof (sa_family_t) - 1 - off),
- &un->sun_path[off]);
+ GNUNET_snprintf (buf,
+ sizeof (buf),
+ "%s%.*s",
+ (1 == off) ? "@" : "",
+ (int) (addrlen - sizeof (sa_family_t) - off),
+ &un->sun_path[off]);
return buf;
default:
return _("invalid address");
#endif
#if WINDOWS
if (!InitializeCriticalSectionAndSpinCount (&output_message_cs, 0x00000400))
- GNUNET_abort ();
+ GNUNET_abort_ ();
#endif
}