Added SILC Thread Queue API
[runtime.git] / apps / irssi / src / fe-common / core / fe-log.c
index a0967e1ab7f0165626428f6f1c7478d0d9c68fb2..5b2a7780c59065f34d58f6a3597b2bb6cb02c0a1 100644 (file)
@@ -48,6 +48,8 @@ static THEME_REC *log_theme;
 static int skip_next_printtext;
 static const char *log_theme_name;
 
+static int log_dir_create_mode;
+
 static char *log_colorizer_strip(const char *str)
 {
         return strip_codes(str);
@@ -107,6 +109,8 @@ static void cmd_log_open(const char *data)
                targetarg = g_hash_table_lookup(optlist, "targets");
                if (targetarg != NULL && *targetarg != '\0')
                        log_add_targets(log, targetarg, servertag);
+               else if (servertag != NULL)
+                       log_add_targets(log, "*", servertag);
        }
 
        if (g_hash_table_lookup(optlist, "autoopen"))
@@ -187,17 +191,20 @@ static char *log_items_get_list(LOG_REC *log)
        GSList *tmp;
        GString *str;
        char *ret;
+       LOG_ITEM_REC *rec = NULL;
 
        g_return_val_if_fail(log != NULL, NULL);
        g_return_val_if_fail(log->items != NULL, NULL);
 
        str = g_string_new(NULL);
        for (tmp = log->items; tmp != NULL; tmp = tmp->next) {
-               LOG_ITEM_REC *rec = tmp->data;
+               rec = tmp->data;
 
                 g_string_sprintfa(str, "%s, ", rec->name);
        }
        g_string_truncate(str, str->len-2);
+       if(rec->servertag != NULL)
+               g_string_sprintfa(str, " (%s)", rec->servertag);
 
        ret = str->str;
        g_string_free(str, FALSE);
@@ -278,7 +285,7 @@ static void cmd_window_log(const char *data)
                 open_log = log == NULL;
                 close_log = log != NULL;
        } else {
-               printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_NOT_TOGGLE);
+               printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_NOT_TOGGLE);
                cmd_params_free(free_arg);
                return;
        }
@@ -407,7 +414,7 @@ static void autolog_open(SERVER_REC *server, const char *server_tag,
                         const char *target)
 {
        LOG_REC *log;
-       char *fname, *dir, *fixed_target;
+       char *fname, *dir, *fixed_target, *params;
 
        log = logs_find_item(LOG_ITEM_TARGET, target, server_tag, NULL);
        if (log != NULL && !log->failed) {
@@ -423,10 +430,14 @@ static void autolog_open(SERVER_REC *server, const char *server_tag,
        if (CHAT_PROTOCOL(server)->case_insensitive)
                g_strdown(fixed_target);
 
-       fname = parse_special_string(autolog_path, server, NULL,
-                                    fixed_target, NULL, 0);
+        /* $0 = target, $1 = server tag */
+        params = g_strconcat(fixed_target, " ", server_tag, NULL);
        g_free(fixed_target);
 
+       fname = parse_special_string(autolog_path, server, NULL,
+                                    params, NULL, 0);
+       g_free(params);
+
        if (log_find(fname) == NULL) {
                log = log_create_rec(fname, autolog_level);
                 if (!settings_get_bool("autolog_colors"))
@@ -434,7 +445,7 @@ static void autolog_open(SERVER_REC *server, const char *server_tag,
                log_item_add(log, LOG_ITEM_TARGET, target, server_tag);
 
                dir = g_dirname(log->real_fname);
-               mkpath(dir, LOG_DIR_CREATE_MODE);
+               mkpath(dir, log_dir_create_mode);
                g_free(dir);
 
                log->temp = TRUE;
@@ -471,12 +482,13 @@ static void log_single_line(WINDOW_REC *window, const char *server_tag,
        char **targets, **tmp;
        LOG_REC *log;
 
-       /* save to log created with /WINDOW LOG */
-       ltoa(windownum, window->refnum);
-       log = logs_find_item(LOG_ITEM_WINDOW_REFNUM,
-                            windownum, NULL, NULL);
-       if (log != NULL) {
-               log_write_rec(log, text, level);
+       if (window != NULL) {
+               /* save to log created with /WINDOW LOG */
+               ltoa(windownum, window->refnum);
+               log = logs_find_item(LOG_ITEM_WINDOW_REFNUM,
+                                    windownum, NULL, NULL);
+               if (log != NULL)
+                       log_write_rec(log, text, level);
        }
 
        if (target == NULL)
@@ -587,11 +599,11 @@ static int sig_autoremove(void)
        return 1;
 }
 
-static void sig_window_item_destroy(WINDOW_REC *window, WI_ITEM_REC *item)
+static void sig_window_item_remove(WINDOW_REC *window, WI_ITEM_REC *item)
 {
        LOG_REC *log;
 
-       log = logs_find_item(LOG_ITEM_TARGET, item->name,
+       log = logs_find_item(LOG_ITEM_TARGET, item->visible_name,
                             item->server == NULL ? NULL :
                             item->server->tag, NULL);
        if (log != NULL && log->temp)
@@ -600,13 +612,13 @@ static void sig_window_item_destroy(WINDOW_REC *window, WI_ITEM_REC *item)
 
 static void sig_log_locked(LOG_REC *log)
 {
-       printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
                    TXT_LOG_LOCKED, log->fname);
 }
 
 static void sig_log_create_failed(LOG_REC *log)
 {
-       printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
+       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
                    TXT_LOG_CREATE_FAILED,
                    log->real_fname, g_strerror(errno));
 }
@@ -660,10 +672,11 @@ static void sig_theme_destroyed(THEME_REC *theme)
 static void read_settings(void)
 {
        int old_autolog = autolog_level;
+        int log_file_create_mode;
 
        autolog_path = settings_get_str("autolog_path");
        autolog_level = !settings_get_bool("autolog") ? 0 :
-               level2bits(settings_get_str("autolog_level"));
+               settings_get_level("autolog_level");
 
        if (old_autolog && !autolog_level)
                autologs_close_all();
@@ -679,6 +692,12 @@ static void read_settings(void)
 
        log_theme = log_theme_name == NULL ? NULL :
                theme_load(log_theme_name);
+
+       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 fe_log_init(void)
@@ -690,7 +709,7 @@ void fe_log_init(void)
         settings_add_bool("log", "autolog", FALSE);
        settings_add_bool("log", "autolog_colors", FALSE);
         settings_add_str("log", "autolog_path", "~/irclogs/$tag/$0.log");
-       settings_add_str("log", "autolog_level", "all -crap -clientcrap -ctcps");
+       settings_add_level("log", "autolog_level", "all -crap -clientcrap -ctcps");
         settings_add_str("log", "log_theme", "");
 
        autolog_level = 0;
@@ -705,7 +724,7 @@ void fe_log_init(void)
        command_bind("window log", NULL, (SIGNAL_FUNC) cmd_window_log);
        command_bind("window logfile", NULL, (SIGNAL_FUNC) cmd_window_logfile);
        signal_add_first("print text", (SIGNAL_FUNC) sig_printtext);
-       signal_add("window item destroy", (SIGNAL_FUNC) sig_window_item_destroy);
+       signal_add("window item remove", (SIGNAL_FUNC) sig_window_item_remove);
        signal_add("window refnum changed", (SIGNAL_FUNC) sig_window_refnum_changed);
        signal_add("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
        signal_add("log locked", (SIGNAL_FUNC) sig_log_locked);
@@ -734,7 +753,7 @@ void fe_log_deinit(void)
        command_unbind("window log", (SIGNAL_FUNC) cmd_window_log);
        command_unbind("window logfile", (SIGNAL_FUNC) cmd_window_logfile);
        signal_remove("print text", (SIGNAL_FUNC) sig_printtext);
-       signal_remove("window item destroy", (SIGNAL_FUNC) sig_window_item_destroy);
+       signal_remove("window item remove", (SIGNAL_FUNC) sig_window_item_remove);
        signal_remove("window refnum changed", (SIGNAL_FUNC) sig_window_refnum_changed);
        signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected);
        signal_remove("log locked", (SIGNAL_FUNC) sig_log_locked);