Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2005 Pekka Riikonen
+ Copyright (C) 1997 - 2007 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
*/
/* $Id$ */
-#include "silcincludes.h"
+#include "silc.h"
/* SilcLogSettings context */
typedef struct {
void *context;
} *SilcLog, SilcLogStruct;
+#ifndef SILC_SYMBIAN
+
/* Default settings */
static SilcLogSettingsStruct silclog =
{
TRUE,
};
+#endif /* !SILC_SYMBIAN */
+
/* Default log contexts */
+#ifndef SILC_SYMBIAN
static SilcLogStruct silclogs[4] =
+#else
+const SilcLogStruct silclogs[4] =
+#endif /* !SILC_SYMBIAN */
{
{"", NULL, 0, "Info", SILC_LOG_INFO, NULL, NULL},
{"", NULL, 0, "Warning", SILC_LOG_WARNING, NULL, NULL},
{
if (type < 1 || type > 4)
return NULL;
- return &silclogs[(int)type - 1];
+ return (SilcLog)&silclogs[(int)type - 1];
}
/* Check log file site and cycle log file if it is over max size. */
/* Cycle log file */
fprintf(log->fp,
"[%s] [%s] Cycling log file, over max log size (%lu kilobytes)\n",
- silc_get_time(0), log->typename, (unsigned long)log->maxsize / 1024);
+ silc_time_string(0), log->typename,
+ (unsigned long)log->maxsize / 1024);
fflush(log->fp);
fclose(log->fp);
memset(newname, 0, sizeof(newname));
- snprintf(newname, sizeof(newname) - 1, "%s.old", log->filename);
+ silc_snprintf(newname, sizeof(newname) - 1, "%s.old", log->filename);
unlink(newname);
rename(log->filename, newname);
SILC_TASK_CALLBACK(silc_log_fflush_callback)
{
+#ifndef SILC_SYMBIAN
SilcLog log;
if (!silclog.quick) {
silclog.flushdelay = 2;
silc_schedule_task_add_timeout(context, silc_log_fflush_callback, context,
silclog.flushdelay, 0);
+#endif /* !SILC_SYMBIAN */
}
/* Output log message to log file */
typename = log->typename;
+#ifndef SILC_SYMBIAN
if (!silclog.scheduled) {
if (silclog.no_init == FALSE) {
fprintf(stderr,
- "Warning, trying to output without log files initialization, "
+ "Warning, log files not initialized, "
"log output is going to stderr\n");
silclog.no_init = TRUE;
}
log = NULL;
goto found;
}
+#endif /* !SILC_SYMBIAN */
/* Find open log file */
while (log) {
if (!log || !log->fp)
goto end;
+#ifndef SILC_SYMBIAN
found:
if (silclog.timestamp)
- fprintf(fp, "[%s] [%s] %s\n", silc_get_time(0), typename, string);
+ fprintf(fp, "[%s] [%s] %s\n", silc_time_string(0), typename, string);
else
fprintf(fp, "[%s] %s\n", typename, string);
if (log)
silc_log_checksize(log);
}
+#endif /* !SILC_SYMBIAN */
end:
+#ifndef SILC_SYMBIAN
/* Output log to stderr if debugging */
if (typename && silclog.debug) {
fprintf(stderr, "[Logging] [%s] %s\n", typename, string);
fflush(stderr);
}
+#else
+ fprintf(stderr, "[Logging] [%s] %s\n", typename, string);
+#endif /* !SILC_SYMBIAN */
+
silc_free(string);
}
/* Set and initialize the specified log file. */
-SilcBool silc_log_set_file(SilcLogType type, char *filename, SilcUInt32 maxsize,
- SilcSchedule scheduler)
+SilcBool silc_log_set_file(SilcLogType type, char *filename,
+ SilcUInt32 maxsize, SilcSchedule scheduler)
{
+#ifndef SILC_SYMBIAN
FILE *fp = NULL;
SilcLog log;
+ if (!scheduler)
+ scheduler = silc_schedule_get_global();
+
log = silc_log_get_context(type);
if (!log)
return FALSE;
silclog.scheduled = TRUE;
}
+#endif /* !SILC_SYMBIAN */
return TRUE;
}
void silc_log_set_callback(SilcLogType type, SilcLogCb cb, void *context)
{
+#ifndef SILC_SYMBIAN
SilcLog log = silc_log_get_context(type);
if (log) {
log->cb = cb;
log->context = context;
}
+#endif /* !SILC_SYMBIAN */
}
/* Reset log callbacks */
void silc_log_reset_callbacks(void)
{
+#ifndef SILC_SYMBIAN
SilcLog log;
log = silc_log_get_context(SILC_LOG_INFO);
log->cb = log->context = NULL;
log->cb = log->context = NULL;
log = silc_log_get_context(SILC_LOG_FATAL);
log->cb = log->context = NULL;
+#endif /* !SILC_SYMBIAN */
}
/* Flush all log files */
SilcLogHexdumpCb hexdump_cb,
void *hexdump_context)
{
+#ifndef SILC_SYMBIAN
silclog.debug_cb = debug_cb;
silclog.debug_context = debug_context;
silclog.hexdump_cb = hexdump_cb;
silclog.hexdump_context = hexdump_context;
+#endif /* !SILC_SYMBIAN */
}
/* Resets debug callbacks */
void silc_log_reset_debug_callbacks()
{
+#ifndef SILC_SYMBIAN
silclog.debug_cb = NULL;
silclog.debug_context = NULL;
silclog.hexdump_cb = NULL;
silclog.hexdump_context = NULL;
+#endif /* !SILC_SYMBIAN */
}
/* Set current debug string */
void silc_log_set_debug_string(const char *debug_string)
{
+#ifndef SILC_SYMBIAN
char *string;
int len;
if ((strchr(debug_string, '(') && strchr(debug_string, ')')) ||
strchr(debug_string, '$'))
- string = strdup(debug_string);
+ string = silc_strdup(debug_string);
else
string = silc_string_regexify(debug_string);
len = strlen(string);
memset(silclog.debug_string, 0, sizeof(silclog.debug_string));
strncpy(silclog.debug_string, string, len);
silc_free(string);
+#endif /* !SILC_SYMBIAN */
}
/* Set timestamp */
void silc_log_timestamp(SilcBool enable)
{
+#ifndef SILC_SYMBIAN
silclog.timestamp = enable;
+#endif /* !SILC_SYMBIAN */
}
/* Set flushdelay */
void silc_log_flushdelay(SilcUInt32 flushdelay)
{
+#ifndef SILC_SYMBIAN
silclog.flushdelay = flushdelay;
+#endif /* !SILC_SYMBIAN */
}
/* Set quick logging */
void silc_log_quick(SilcBool enable)
{
+#ifndef SILC_SYMBIAN
silclog.quick = enable;
+#endif /* !SILC_SYMBIAN */
}
/* Set debugging */
void silc_log_debug(SilcBool enable)
{
+#ifndef SILC_SYMBIAN
silclog.debug = enable;
+#endif /* !SILC_SYMBIAN */
}
/* Set debug hexdump */
void silc_log_debug_hexdump(SilcBool enable)
{
+#ifndef SILC_SYMBIAN
silclog.debug_hexdump = enable;
+#endif /* !SILC_SYMBIAN */
}
/* Outputs the debug message to stderr. */
void silc_log_output_debug(char *file, const char *function,
int line, char *string)
{
+ SilcTimeStruct curtime;
+
+#ifndef SILC_SYMBIAN
if (!silclog.debug)
goto end;
silclog.debug_context))
goto end;
}
+#endif /* !SILC_SYMBIAN */
- fprintf(stderr, "%s:%d: %s\n", function, line, string);
+ silc_time_value(0, &curtime);
+
+#ifdef SILC_WIN32
+ if (strrchr(function, '\\'))
+ fprintf(stderr, "%s:%d: %s\n", strrchr(function, '\\') + 1, line, string);
+ else
+#endif /* SILC_WIN32 */
+#ifdef SILC_SYMBIAN
+ silc_symbian_debug(function, line, string);
+#else
+ fprintf(stderr, "%02d:%02d:%02d %s:%d: %s\n", curtime.hour,
+ curtime.minute, curtime.second, function, line,
+ string);
fflush(stderr);
+#endif /* SILC_SYMBIAN */
end:
silc_free(string);
int line, void *data_in,
SilcUInt32 len, char *string)
{
- int i, k;
- int off, pos, count;
- unsigned char *data = (unsigned char *)data_in;
-
+#ifndef SILC_SYMBIAN
if (!silclog.debug_hexdump)
goto end;
data_in, len, string, silclog.hexdump_context))
goto end;
}
+#endif /* !SILC_SYMBIAN */
fprintf(stderr, "%s:%d: %s\n", function, line, string);
- k = 0;
- pos = 0;
- count = 16;
- off = len % 16;
- while (1) {
- if (off) {
- if ((len - pos) < 16 && (len - pos <= len - off))
- count = off;
- } else {
- if (pos == len)
- count = 0;
- }
- if (off == len)
- count = len;
-
- if (count)
- fprintf(stderr, "%08X ", k++ * 16);
-
- for (i = 0; i < count; i++) {
- fprintf(stderr, "%02X ", data[pos + i]);
-
- if ((i + 1) % 4 == 0)
- fprintf(stderr, " ");
- }
-
- if (count && count < 16) {
- int j;
-
- for (j = 0; j < 16 - count; j++) {
- fprintf(stderr, " ");
-
- if ((j + count + 1) % 4 == 0)
- fprintf(stderr, " ");
- }
- }
-
- for (i = 0; i < count; i++) {
- char ch;
-
- if (data[pos] < 32 || data[pos] >= 127)
- ch = '.';
- else
- ch = data[pos];
-
- fprintf(stderr, "%c", ch);
- pos++;
- }
-
- if (count)
- fprintf(stderr, "\n");
-
- if (count < 16)
- break;
- }
+ silc_hexdump(data_in, len, stderr);
end:
silc_free(string);