#include "lib-config/iconfig.h"
#include "settings.h"
-#define DEFAULT_LOG_FILE_CREATE_MODE 644
+#define DEFAULT_LOG_FILE_CREATE_MODE 600
#ifdef HAVE_FCNTL
static struct flock lock;
const char *log_timestamp;
static int log_file_create_mode;
+static int log_dir_create_mode;
static int rotate_tag;
static int log_item_str2type(const char *type)
int log_start_logging(LOG_REC *log)
{
+ char *dir;
+
g_return_val_if_fail(log != NULL, FALSE);
if (log->handle != -1)
/* Append/create log file */
g_free_not_null(log->real_fname);
log->real_fname = log_filename(log);
+
+ if (log->real_fname != NULL &&
+ strcmp(log->real_fname, log->fname) != 0) {
+ /* path may contain variables (%time, $vars),
+ make sure the directory is created */
+ dir = g_dirname(log->real_fname);
+ mkpath(dir, log_dir_create_mode);
+ g_free(dir);
+ }
+
log->handle = log->real_fname == NULL ? -1 :
open(log->real_fname, O_WRONLY | O_APPEND | O_CREAT,
log_file_create_mode);
if (strcmp(new_fname, log->real_fname) != 0) {
/* rotate log */
log_stop_logging(log);
+ signal_emit("log rotated", 1, log);
+
log_start_logging(log);
}
g_free(new_fname);
void log_write_rec(LOG_REC *log, const char *str, int level)
{
+ char *colorstr;
struct tm *tm;
time_t now;
int hour, day;
log->last = now;
+ if (log->colorizer == NULL)
+ colorstr = NULL;
+ else
+ str = colorstr = log->colorizer(str);
+
if ((level & MSGLEVEL_LASTLOG) == 0)
log_write_timestamp(log->handle, log_timestamp, str, now);
else
write_buffer(log->handle, "\n", 1);
signal_emit("log written", 2, log, str);
+
+ g_free_not_null(colorstr);
}
LOG_ITEM_REC *log_item_find(LOG_REC *log, int type, const char *item,
return NULL;
}
-void log_file_write(SERVER_REC *server, const char *item, int level,
+void log_file_write(const char *server_tag, const char *item, int level,
const char *str, int no_fallbacks)
{
GSList *tmp, *fallbacks;
- char *tmpstr, *servertag;
+ char *tmpstr;
int found;
g_return_if_fail(str != NULL);
if (logs == NULL)
return;
- servertag = server == NULL ? NULL : server->tag;
fallbacks = NULL; found = FALSE;
for (tmp = logs; tmp != NULL; tmp = tmp->next) {
fallbacks = g_slist_append(fallbacks, rec);
else if (item != NULL &&
log_item_find(rec, LOG_ITEM_TARGET, item,
- servertag) != NULL)
+ server_tag) != NULL)
log_write_rec(rec, str, level);
}
if (!found && !no_fallbacks && fallbacks != NULL) {
/* not found from any items, so write it to all main logs */
- tmpstr = (level & MSGLEVEL_PUBLIC) ?
+ tmpstr = (level & MSGLEVEL_PUBLIC) && item != NULL ?
g_strconcat(item, ": ", str, NULL) :
g_strdup(str);
if (log->items != NULL)
log_items_update_config(log, node);
+
+ signal_emit("log config save", 2, log, node);
}
static void log_remove_config(LOG_REC *log)
char *item;
int type;
- for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
+ tmp = config_node_first(node->value);
+ for (; tmp != NULL; tmp = config_node_next(tmp)) {
node = tmp->data;
if (node->type != NODE_TYPE_BLOCK)
node = iconfig_node_traverse("logs", FALSE);
if (node == NULL) return;
- for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
+ tmp = config_node_first(node->value);
+ for (; tmp != NULL; tmp = config_node_next(tmp)) {
node = tmp->data;
if (node->type != NODE_TYPE_BLOCK)
log->autoopen = config_node_get_bool(node, "auto_open", FALSE);
log->level = level2bits(config_node_get_str(node, "level", 0));
+ signal_emit("log config read", 2, log, node);
+
node = config_node_section(node, "items", -1);
if (node != NULL)
log_items_read_config(node, log);
{
log_timestamp = settings_get_str("log_timestamp");
log_file_create_mode = octal2dec(settings_get_int("log_create_mode"));
+
+ log_dir_create_mode = log_file_create_mode;
+ if (log_file_create_mode & 0400) log_dir_create_mode |= 0100;
+ if (log_file_create_mode & 0040) log_dir_create_mode |= 0010;
+ if (log_file_create_mode & 0004) log_dir_create_mode |= 0001;
}
void log_init(void)
"--- Day changed %a %b %d %Y");
read_settings();
- log_read_config();
signal_add("setup changed", (SIGNAL_FUNC) read_settings);
signal_add("setup reread", (SIGNAL_FUNC) log_read_config);
+ signal_add("irssi init finished", (SIGNAL_FUNC) log_read_config);
}
void log_deinit(void)
signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
signal_remove("setup reread", (SIGNAL_FUNC) log_read_config);
+ signal_remove("irssi init finished", (SIGNAL_FUNC) log_read_config);
}