/* Our working struct -- at the moment we keep it private, but this could
* change in the future */
struct SilcLogStruct {
- char *filename;
+ char filename[256];
FILE *fp;
SilcUInt32 maxsize;
- char *typename;
+ const char *typename;
SilcLogType type;
SilcLogCb cb;
void *context;
/* 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},
- {NULL, NULL, 0, "Error", SILC_LOG_ERROR, NULL, NULL},
- {NULL, NULL, 0, "Fatal", SILC_LOG_FATAL, NULL, NULL},
+ {"", NULL, 0, "Info", SILC_LOG_INFO, NULL, NULL},
+ {"", NULL, 0, "Warning", SILC_LOG_WARNING, NULL, NULL},
+ {"", NULL, 0, "Error", SILC_LOG_ERROR, NULL, NULL},
+ {"", NULL, 0, "Fatal", SILC_LOG_FATAL, NULL, NULL},
};
+/* Causes logging output to contain timestamps */
+bool silc_log_timestamp = TRUE;
+
/* If TRUE, log files will be flushed for each log input */
bool silc_log_quick = FALSE;
fflush(log->fp);
fclose(log->fp);
}
- if (!log->filename) return FALSE;
+ if (!log->filename[0]) 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)));
void silc_log_output(SilcLogType type, char *string)
{
- char *typename = NULL;
+ const char *typename = NULL;
FILE *fp;
SilcLog log;
goto end;
found:
- fprintf(fp, "[%s] [%s] %s\n", silc_get_time(), typename, string);
+ /* writes the logging string to the selected channel */
+ if (silc_log_timestamp)
+ fprintf(fp, "[%s] [%s] %s\n", silc_get_time(), typename, string);
+ else
+ fprintf(fp, "[%s] %s\n", typename, string);
+
if (silc_log_quick || silc_log_starting) {
fflush(fp);
if (log) /* we may have been redirected to stderr */
}
/* clean the logging channel */
- if (log->filename) {
+ if (strlen(log->filename)) {
if (log->fp)
fclose(log->fp);
- silc_free(log->filename);
- log->filename = NULL;
+ memset(log->filename, 0, sizeof(log->filename));
log->fp = NULL;
}
if (fp) {
- log->filename = strdup(filename);
+ memset(log->filename, 0, sizeof(log->filename));
+ strncpy(log->filename, filename,
+ strlen(filename) < sizeof(log->filename) ? strlen(filename) :
+ sizeof(log->filename) - 1);
log->fp = fp;
log->maxsize = maxsize;
}
void silc_log_set_debug_string(const char *debug_string)
{
char *string;
+ int len;
if ((strchr(debug_string, '(') && strchr(debug_string, ')')) ||
strchr(debug_string, '$'))
string = strdup(debug_string);
else
string = silc_string_regexify(debug_string);
- strncpy(silc_log_debug_string, string, strlen(string));
+ len = strlen(string);
+ if (len >= sizeof(silc_log_debug_string))
+ len = sizeof(silc_log_debug_string) - 1;
+ memset(silc_log_debug_string, 0, sizeof(silc_log_debug_string));
+ strncpy(silc_log_debug_string, string, len);
silc_free(string);
}