silc_debug is TRUE. Some typo fixes in the documentation.
call silc_log_flush_all() at the end of silc_log_reset_all().
changed var new to proto_new in silcprotocol.c
+Sun Mar 10 23:34:48 CET 2002 Johnny Mnemonic <johnny@themnemonic.org>
+
+ * If silc_debug is TRUE, also output standard logging messages
+ to stderr with the debug output.
+
+ Made silc_log_reset_all() flushing all channels before returning.
+ Also fixed some documentation typos.
+
+ Affected files are lib/silcutil/silclog.[ch].
+
Sun Mar 10 20:07:49 EET 2002 Pekka Riikonen <priikone@silcnet.org>
* Fixed the server to check correctly the amount of connections
Sun Mar 10 20:07:49 EET 2002 Pekka Riikonen <priikone@silcnet.org>
* Fixed the server to check correctly the amount of connections
};
typedef struct SilcLogStruct *SilcLog;
};
typedef struct SilcLogStruct *SilcLog;
-/* These are the known logging channels */
+/* These are the known logging channels. We initialize this struct with most
+ * of the fields set to NULL, because we'll fill in those values at runtime. */
static struct SilcLogStruct silclogs[SILC_LOG_MAX] = {
{NULL, NULL, 0, "Info", SILC_LOG_INFO, NULL, NULL},
{NULL, NULL, 0, "Warning", SILC_LOG_WARNING, NULL, NULL},
static struct SilcLogStruct silclogs[SILC_LOG_MAX] = {
{NULL, NULL, 0, "Info", SILC_LOG_INFO, NULL, NULL},
{NULL, NULL, 0, "Warning", SILC_LOG_WARNING, NULL, NULL},
bool silc_debug = FALSE;
bool silc_debug_hexdump = FALSE;
bool silc_debug = FALSE;
bool silc_debug_hexdump = FALSE;
+/* Flush delay (in seconds) */
long silc_log_flushdelay = 300;
/* Regular pattern matching expression for the debug output */
char *silc_log_debug_string = NULL;
long silc_log_flushdelay = 300;
/* Regular pattern matching expression for the debug output */
char *silc_log_debug_string = NULL;
-/* Debug callbacks. If set these are used instead of default ones. */
+/* Debug callbacks. If set, these are triggered for each specific output. */
static SilcLogDebugCb silc_log_debug_cb = NULL;
static void *silc_log_debug_context = NULL;
static SilcLogHexdumpCb silc_log_hexdump_cb = NULL;
static SilcLogDebugCb silc_log_debug_cb = NULL;
static void *silc_log_debug_context = NULL;
static SilcLogHexdumpCb silc_log_hexdump_cb = NULL;
static bool silc_log_scheduled = FALSE;
static bool silc_log_no_init = FALSE;
static bool silc_log_scheduled = FALSE;
static bool silc_log_no_init = FALSE;
-/* This is only needed during starting up -- don't lose any logging */
+/* This is only needed during starting up -- don't lose any logging message */
static bool silc_log_starting = TRUE;
/* The type wrapper utility. Translates a SilcLogType id to the corresponding
static bool silc_log_starting = TRUE;
/* The type wrapper utility. Translates a SilcLogType id to the corresponding
if (!log->filename) return FALSE;
if (!(log->fp = fopen(log->filename, "a+"))) {
SILC_LOG_WARNING(("Couldn't reset logfile %s for type \"%s\": %s",
if (!log->filename) return FALSE;
if (!(log->fp = fopen(log->filename, "a+"))) {
SILC_LOG_WARNING(("Couldn't reset logfile %s for type \"%s\": %s",
- log->filename, log->typename, strerror(errno)));
+ log->filename, log->typename, strerror(errno)));
return FALSE;
}
return TRUE;
return FALSE;
}
return TRUE;
/* Outputs the log message to the first available channel. Channels are
* ordered by importance (see SilcLogType documentation).
/* Outputs the log message to the first available channel. Channels are
* ordered by importance (see SilcLogType documentation).
- * More importants channels can be printed on less important ones, but not
+ * More important channels can be printed on less important ones, but not
* vice-versa. */
void silc_log_output(SilcLogType type, char *string)
{
* vice-versa. */
void silc_log_output(SilcLogType type, char *string)
{
FILE *fp;
SilcLog log;
if ((type > SILC_LOG_MAX) || !(log = silc_log_find_by_type(type)))
goto end;
FILE *fp;
SilcLog log;
if ((type > SILC_LOG_MAX) || !(log = silc_log_find_by_type(type)))
goto end;
+ /* Save the original typename, because even if we redirect the message
+ * to another channel we'll keep however the original channel name */
+ typename = log->typename;
+
/* If there is a custom callback set, use it and return. */
if (log->cb) {
if ((*log->cb)(type, string, log->context))
goto end;
}
/* If there is a custom callback set, use it and return. */
if (log->cb) {
if ((*log->cb)(type, string, log->context))
goto end;
}
- /* save the original typename, because if we redirect the channel we
- * keep however the original destination channel name */
- typename = log->typename;
-
if (!silc_log_scheduled) {
if (silc_log_no_init == FALSE) {
fprintf(stderr,
if (!silc_log_scheduled) {
if (silc_log_no_init == FALSE) {
fprintf(stderr,
+ /* If debugging, also output the logging message to the console */
+ if (typename && silc_debug) {
+ fprintf(stderr, "[Logging] [%s] %s\n", typename, string);
+ fflush(stderr);
+ }
SILC_LOG_DEBUG(("Resetting all logs"));
SILC_FOREACH_LOG(u)
silc_log_reset(&silclogs[u]);
SILC_LOG_DEBUG(("Resetting all logs"));
SILC_FOREACH_LOG(u)
silc_log_reset(&silclogs[u]);
+ /* Immediately flush any possible warning message */
+ silc_log_flush_all();
}
/* Outputs the debug message to stderr. */
}
/* Outputs the debug message to stderr. */
/* This should be used for warnings and non critical failures */
SILC_LOG_WARNING,
/* This should be used for warnings and non critical failures */
SILC_LOG_WARNING,
- /* Generic error and critical failures messages */
+ /* Generic error and critical failure messages */
SILC_LOG_ERROR,
/* Fatal messages (usually situations that will lead to a program crash */
SILC_LOG_ERROR,
/* Fatal messages (usually situations that will lead to a program crash */
*
* Forces all logging channels to close and reopen their streams. Useful
* for example after a SIGHUP signal.
*
* Forces all logging channels to close and reopen their streams. Useful
* for example after a SIGHUP signal.
- * Please note that this function could cause some warning messages if
- * some logging channel points to an illegal filename.
+ * Please note that this function could generate some warning messages if
+ * one or more logging channels point to an illegal filename.
*
***/
void silc_log_reset_all();
*
***/
void silc_log_reset_all();
Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
- Copyright (C) 1997 - 2000 Pekka Riikonen
+ Copyright (C) 1997 - 2002 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* $Id$ */
#include "silcincludes.h"
/* $Id$ */
#include "silcincludes.h"
-#include "silcprotocol.h"
/* Dynamically registered protocols */
SilcProtocolObject *silc_protocol_list = NULL;
/* Dynamically registered protocols */
SilcProtocolObject *silc_protocol_list = NULL;
void silc_protocol_register(SilcProtocolType type,
SilcProtocolCallback callback)
{
void silc_protocol_register(SilcProtocolType type,
SilcProtocolCallback callback)
{
- SilcProtocolObject *new;
+ SilcProtocolObject *proto_new;
- new = silc_calloc(1, sizeof(*new));
- new->type = type;
- new->callback = callback;
+ proto_new = silc_calloc(1, sizeof(*proto_new));
+ proto_new->type = type;
+ proto_new->callback = callback;
- silc_protocol_list = new;
+ silc_protocol_list = proto_new;
- new->next = silc_protocol_list;
- silc_protocol_list = new;
+ proto_new->next = silc_protocol_list;
+ silc_protocol_list = proto_new;