static void log_single_line(WINDOW_REC *window, const char *server_tag, const char *target, int level, const char *text) { char windownum[MAX_INT_STRLEN]; char **targets, **tmp; LOG_REC *log; 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) log_file_write(server_tag, NULL, level, text, FALSE); else { /* there can be multiple items separated with comma */ targets = g_strsplit(target, ",", -1); for (tmp = targets; *tmp != NULL; tmp++) log_file_write(server_tag, *tmp, level, text, FALSE); g_strfreev(targets); } }
static void sig_window_item_remove(WINDOW_REC *window, WI_ITEM_REC *item) { LOG_REC *log; log = logs_find_item(LOG_ITEM_TARGET, item->visible_name, item->server == NULL ? NULL : item->server->tag, NULL); if (log != NULL && log->temp) log_close(log); }
static void autolog_open(SERVER_REC *server, const char *server_tag, const char *target) { LOG_REC *log; char *fname, *dir, *fixed_target, *params; log = logs_find_item(LOG_ITEM_TARGET, target, server_tag, NULL); if (log != NULL && !log->failed) { log_start_logging(log); return; } /* '/' -> '_' - don't even accidentally try to log to #../../../file if you happen to join to such channel.. similar for some characters that are metacharacters and/or illegal in Windows filenames. '%' -> '%%' - so strftime() won't mess with them */ fixed_target = escape_target(target); if (CHAT_PROTOCOL(server)->case_insensitive) ascii_strdown(fixed_target); /* $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")) log->colorizer = log_colorizer_strip; log_item_add(log, LOG_ITEM_TARGET, target, server_tag); dir = g_path_get_dirname(log->real_fname); #ifdef HAVE_CAPSICUM capsicum_mkdir_with_parents_wrapper(dir, log_dir_create_mode); #else g_mkdir_with_parents(dir, log_dir_create_mode); #endif g_free(dir); log->temp = TRUE; log_update(log); log_start_logging(log); } g_free(fname); }
/* SYNTAX: WINDOW LOG on|off|toggle [<filename>] */ static void cmd_window_log(const char *data) { LOG_REC *log; char *set, *fname, window[MAX_INT_STRLEN]; void *free_arg; int open_log, close_log; if (!cmd_get_params(data, &free_arg, 2, &set, &fname)) return; ltoa(window, active_win->refnum); log = logs_find_item(LOG_ITEM_WINDOW_REFNUM, window, NULL, NULL); open_log = close_log = FALSE; if (g_ascii_strcasecmp(set, "ON") == 0) open_log = TRUE; else if (g_ascii_strcasecmp(set, "OFF") == 0) { close_log = TRUE; } else if (g_ascii_strcasecmp(set, "TOGGLE") == 0) { open_log = log == NULL; close_log = log != NULL; } else { printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, TXT_NOT_TOGGLE); cmd_params_free(free_arg); return; } if (open_log && log == NULL) { /* irc.log.<windowname> or irc.log.Window<ref#> */ fname = *fname != '\0' ? g_strdup(fname) : g_strdup_printf("~/irc.log.%s%s", active_win->name != NULL ? active_win->name : "Window", active_win->name != NULL ? "" : window); log = log_create_rec(fname, MSGLEVEL_ALL); log->colorizer = log_colorizer_strip; log_item_add(log, LOG_ITEM_WINDOW_REFNUM, window, NULL); log_update(log); g_free(fname); } if (open_log && log != NULL) { log_start_logging(log); printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_LOG_OPENED, log->fname); } else if (close_log && log != NULL && log->handle != -1) { log_stop_logging(log); printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_LOG_CLOSED, log->fname); } cmd_params_free(free_arg); }
/* window's refnum changed - update the logs to log the new window refnum */ static void sig_window_refnum_changed(WINDOW_REC *window, gpointer old_refnum) { char winnum[MAX_INT_STRLEN]; LOG_REC *log; LOG_ITEM_REC *item; ltoa(winnum, GPOINTER_TO_INT(old_refnum)); log = logs_find_item(LOG_ITEM_WINDOW_REFNUM, winnum, NULL, &item); if (log != NULL) { ltoa(winnum, window->refnum); g_free(item->name); item->name = g_strdup(winnum); } }
static void log_single_line(WINDOW_REC *window, const char *server_tag, const char *target, int level, const char *text) { char windownum[MAX_INT_STRLEN]; LOG_REC *log; 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); } log_file_write(server_tag, target, level, text, FALSE); }
/* SYNTAX: WINDOW LOGFILE <file> */ static void cmd_window_logfile(const char *data) { LOG_REC *log; char window[MAX_INT_STRLEN]; ltoa(window, active_win->refnum); log = logs_find_item(LOG_ITEM_WINDOW_REFNUM, window, NULL, NULL); if (log != NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_WINDOWLOG_FILE_LOGGING); return; } log = log_create_rec(data, MSGLEVEL_ALL); log->colorizer = log_colorizer_strip; log_item_add(log, LOG_ITEM_WINDOW_REFNUM, window, NULL); log_update(log); printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_WINDOWLOG_FILE, data); }