static void awaylog_open(void) { const char *fname, *levelstr; LOG_REC *log; int level; fname = settings_get_str("awaylog_file"); levelstr = settings_get_str("awaylog_level"); if (*fname == '\0' || *levelstr == '\0') return; level = level2bits(levelstr); if (level == 0) return; log = log_find(fname); if (log != NULL && log->handle != -1) return; /* already open */ if (log == NULL) { log = log_create_rec(fname, level); log->temp = TRUE; log_update(log); } if (!log_start_logging(log)) { /* creating log file failed? close it. */ log_close(log); return; } awaylog = log; away_filepos = lseek(log->handle, 0, SEEK_CUR); away_msgs = 0; }
static void autolog_log(void *server, const char *target) { LOG_REC *log; char *fname, *dir, *str; log = log_find_item(target); if (log != NULL) return; fname = parse_special_string(autolog_path, server, NULL, target, NULL); if (log_find(fname) == NULL) { str = convert_home(fname); dir = g_dirname(str); g_free(str); mkdir(dir, LOG_DIR_CREATE_MODE); g_free(dir); log = log_create_rec(fname, autolog_level, target); if (log != NULL) { log->temp = TRUE; log_update(log); log_start_logging(log); } } g_free(fname); }
static LOG_REC *log_find_from_data(const char *data) { GSList *tmp; if (!is_numeric(data, ' ')) return log_find(data); /* with index number */ tmp = g_slist_nth(logs, atoi(data)-1); return tmp == NULL ? NULL : tmp->data; }
void log_update(LOG_REC *log) { g_return_if_fail(log != NULL); if (log_find(log->fname) == NULL) { logs = g_slist_append(logs, log); log->handle = -1; } log_update_config(log); signal_emit("log new", 1, 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); }
LOG_REC *log_create_rec(const char *fname, int level) { LOG_REC *rec; g_return_val_if_fail(fname != NULL, NULL); rec = log_find(fname); if (rec == NULL) { rec = g_new0(LOG_REC, 1); rec->fname = g_strdup(fname); rec->real_fname = log_filename(rec); rec->handle = -1; } rec->level = level; return rec; }
static void awaylog_close(void) { const char *fname; LOG_REC *log; fname = settings_get_str("awaylog_file"); if (*fname == '\0') return; log = log_find(fname); if (log == NULL || log->handle == -1) { /* awaylog not open */ return; } if (awaylog == log) awaylog = NULL; signal_emit("awaylog show", 3, log, GINT_TO_POINTER(away_msgs), GINT_TO_POINTER(away_filepos)); log_close(log); }