From ae25925a1fdceeddff25076b5ff557e14f1aa4cb Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 18 May 2000 08:46:56 +0000 Subject: [PATCH] Some logging fixes. Flood checking had a memory leak. Query had a small memory leak. Text buffer fixes. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@226 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- docs/signals.txt | 1 + src/core/log.c | 10 ++- src/fe-common/core/fe-log.c | 23 ++++-- src/fe-common/core/module-formats.c | 2 +- src/fe-text/gui-printtext.c | 17 +++- src/fe-text/gui-windows.c | 120 ++++++++++++++-------------- src/irc/core/ignore.c | 1 - src/irc/core/irc-log.c | 19 ++--- src/irc/core/query.c | 1 + src/irc/flood/flood.c | 28 +++++-- 10 files changed, 131 insertions(+), 91 deletions(-) diff --git a/docs/signals.txt b/docs/signals.txt index ad9b329f..8acbe419 100644 --- a/docs/signals.txt +++ b/docs/signals.txt @@ -160,6 +160,7 @@ log.c: "log new", LOG_REC "log remove", LOG_REC + "log open failed", LOG_REC "log locked", LOG_REC "log started", LOG_REC "log stopped", LOG_REC diff --git a/src/core/log.c b/src/core/log.c index 15d0a3f1..863c5f79 100644 --- a/src/core/log.c +++ b/src/core/log.c @@ -45,6 +45,9 @@ static void log_write_timestamp(int handle, const char *format, const char *suff struct tm *tm; char str[256]; + g_return_if_fail(format != NULL); + if (*format == '\0') return; + tm = localtime(&t); str[sizeof(str)-1] = '\0'; @@ -74,7 +77,10 @@ int log_start_logging(LOG_REC *log) log->handle = open(fname, O_WRONLY | O_APPEND | O_CREAT, log_file_create_mode); g_free(str); - if (log->handle == -1) return FALSE; + if (log->handle == -1) { + signal_emit("log create failed", 1, log); + return FALSE; + } #ifdef HAVE_FCNTL memset(&lock, 0, sizeof(lock)); lock.l_type = F_WRLCK; @@ -317,7 +323,7 @@ void log_close(LOG_REC *log) g_free(log); } -static void sig_printtext_stripped(void *server, const char *item, gpointer levelp, const char *str) +static void sig_printtext_stripped(void *window, void *server, const char *item, gpointer levelp, const char *str) { int level; diff --git a/src/fe-common/core/fe-log.c b/src/fe-common/core/fe-log.c index 58cd28fe..6dcf7e40 100644 --- a/src/fe-common/core/fe-log.c +++ b/src/fe-common/core/fe-log.c @@ -48,7 +48,7 @@ static void cmd_log_open(const char *data) char *params, *args, *targetarg, *rotatearg, *fname, *levels; char window[MAX_INT_STRLEN]; LOG_REC *log; - int opened, level, rotate; + int level, rotate; args = "targets rotate"; params = cmd_get_params(data, 5 | PARAM_FLAG_MULTIARGS | PARAM_FLAG_GETREST, @@ -73,12 +73,15 @@ static void cmd_log_open(const char *data) log = log_create_rec(fname, level, targetarg); if (log != NULL && log->handle == -1 && stristr(args, "-noopen") == NULL) { /* start logging */ - opened = log_start_logging(log); - printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, - opened ? IRCTXT_LOG_OPENED : - IRCTXT_LOG_CREATE_FAILED, fname); - if (!opened) log_close(log); + if (log_start_logging(log)) { + printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, + IRCTXT_LOG_OPENED, fname); + } else { + log_close(log); + log = NULL; + } } + if (log != NULL) { if (stristr(args, "-autoopen")) log->autoopen = TRUE; @@ -366,6 +369,12 @@ static void sig_log_locked(LOG_REC *log) IRCTXT_LOG_LOCKED, log->fname); } +static void sig_log_create_failed(LOG_REC *log) +{ + printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, + IRCTXT_LOG_CREATE_FAILED, log->fname, g_strerror(errno)); +} + static void read_settings(void) { int old_autolog = autolog_level; @@ -401,6 +410,7 @@ void fe_log_init(void) signal_add("window item remove", (SIGNAL_FUNC) sig_window_item_remove); signal_add("window refnum changed", (SIGNAL_FUNC) sig_window_refnum_changed); signal_add("log locked", (SIGNAL_FUNC) sig_log_locked); + signal_add("log create failed", (SIGNAL_FUNC) sig_log_create_failed); signal_add("setup changed", (SIGNAL_FUNC) read_settings); } @@ -420,5 +430,6 @@ void fe_log_deinit(void) signal_remove("window item remove", (SIGNAL_FUNC) sig_window_item_remove); signal_remove("window refnum changed", (SIGNAL_FUNC) sig_window_refnum_changed); signal_remove("log locked", (SIGNAL_FUNC) sig_log_locked); + signal_remove("log create failed", (SIGNAL_FUNC) sig_log_create_failed); signal_remove("setup changed", (SIGNAL_FUNC) read_settings); } diff --git a/src/fe-common/core/module-formats.c b/src/fe-common/core/module-formats.c index 5ddb5f7e..abbf0f46 100644 --- a/src/fe-common/core/module-formats.c +++ b/src/fe-common/core/module-formats.c @@ -73,7 +73,7 @@ FORMAT_REC fecommon_core_formats[] = { { "log_opened", "Log file %W$0%n opened", 1, { 0 } }, { "log_closed", "Log file %W$0%n closed", 1, { 0 } }, - { "log_create_failed", "Couldn't create log file %W$0", 1, { 0 } }, + { "log_create_failed", "Couldn't create log file %_$0%_: $1", 2, { 0, 0 } }, { "log_locked", "Log file %W$0%n is locked, probably by another running Irssi", 1, { 0 } }, { "log_not_open", "Log file %W$0%n not open", 1, { 0 } }, { "log_started", "Started logging to file %W$0", 1, { 0 } }, diff --git a/src/fe-text/gui-printtext.c b/src/fe-text/gui-printtext.c index c68b257d..d94d9302 100644 --- a/src/fe-text/gui-printtext.c +++ b/src/fe-text/gui-printtext.c @@ -220,7 +220,7 @@ static void gui_printtext(WINDOW_REC *window, gpointer fgcolor, gpointer bgcolor { GUI_WINDOW_REC *gui; LINE_REC *line; - int fg, bg, flags, new_lines, n, visible, ypos; + int fg, bg, flags, new_lines, n, visible, ypos, subline; g_return_if_fail(window != NULL); @@ -265,12 +265,21 @@ static void gui_printtext(WINDOW_REC *window, gpointer fgcolor, gpointer bgcolor if (visible) { /* draw the line to screen. */ - ypos = gui->parent->first_line+gui->ypos-new_lines; + ypos = gui->ypos-new_lines; if (new_lines > 0) { set_color(0); - move(ypos, 0); clrtoeol(); + move(gui->parent->first_line+ypos, 0); clrtoeol(); } - gui_window_line_draw(gui, line, ypos, gui->last_subline, -1); + + if (ypos >= 0) + subline = gui->last_subline; + else { + /* *LONG* line - longer than screen height */ + subline = -ypos+gui->last_subline; + ypos = 0; + } + ypos += gui->parent->first_line; + gui_window_line_draw(gui, line, ypos, subline, -1); } gui->last_subline += new_lines; diff --git a/src/fe-text/gui-windows.c b/src/fe-text/gui-windows.c index 64d06e98..58301d1c 100644 --- a/src/fe-text/gui-windows.c +++ b/src/fe-text/gui-windows.c @@ -173,7 +173,6 @@ static int gui_window_update_bottom(GUI_WINDOW_REC *gui, int lines) break; gui->bottom_startline = gui->bottom_startline->next; } - lines--; } return last_linecount; @@ -471,81 +470,84 @@ void gui_window_redraw(WINDOW_REC *window) screen_refresh(); } -static void gui_window_scroll_up(GUI_WINDOW_REC *gui, gint lines) +#define is_window_bottom(gui) \ + ((gui)->startline == (gui)->bottom_startline && \ + (gui)->subline >= (gui)->bottom_subline) + +static void gui_window_scroll_up(GUI_WINDOW_REC *gui, int lines) { - LINE_REC *line; - gint count, linecount; + LINE_REC *line; + gint count, linecount; - if (gui->startline == NULL) - return; + if (gui->startline == NULL) + return; - count = lines-gui->subline; gui->ypos += gui->subline; - gui->subline = 0; + count = lines-gui->subline; gui->ypos += gui->subline; + gui->subline = 0; - while (gui->startline->prev != NULL && count > 0) - { - gui->startline = gui->startline->prev; + while (gui->startline->prev != NULL && count > 0) { + gui->startline = gui->startline->prev; - line = gui->startline->data; - linecount = gui_window_get_linecount(gui, line); - count -= linecount; - gui->ypos += linecount; - } + line = gui->startline->data; + linecount = gui_window_get_linecount(gui, line); + count -= linecount; + gui->ypos += linecount; + } - if (count < 0) - { - gui->subline = -count; - gui->ypos -= -count; - } + if (count < 0) { + gui->subline = -count; + gui->ypos -= -count; + } - gui->bottom = (gui->ypos >= -1 && gui->ypos <= gui->parent->last_line-gui->parent->first_line); + gui->bottom = is_window_bottom(gui); } -static void gui_window_scroll_down(GUI_WINDOW_REC *gui, gint lines) +static void gui_window_scroll_down(GUI_WINDOW_REC *gui, int lines) { - LINE_REC *line; - gint count, linecount; + LINE_REC *line; + int count, linecount; - if (gui->startline == gui->bottom_startline && gui->subline == gui->bottom_subline) - return; + if (is_window_bottom(gui)) + return; - count = lines+gui->subline; gui->ypos += gui->subline; - gui->subline = 0; + count = lines+gui->subline; gui->ypos += gui->subline; + gui->subline = 0; - while (count > 0) - { - line = gui->startline->data; + while (count > 0) { + line = gui->startline->data; - linecount = gui_window_get_linecount(gui, line); - count -= linecount; - gui->ypos -= linecount; + linecount = gui_window_get_linecount(gui, line); + count -= linecount; + gui->ypos -= linecount; - if (gui->startline == gui->bottom_startline && - linecount+count > gui->bottom_subline) - { - /* reached the last screenful of text */ - gui->subline = gui->bottom_subline; - gui->ypos += linecount; - gui->ypos -= gui->subline; - break; + if (gui->startline == gui->bottom_startline && + linecount+count > gui->bottom_subline) { + /* reached the last screenful of text */ + gui->subline = gui->bottom_subline; + gui->ypos += linecount; + gui->ypos -= gui->subline; + break; + } + + if (count == 0) { + gui->startline = gui->startline->next; + break; + } + + if (count < 0) { + gui->subline = linecount+count; + gui->ypos += -count; + break; + } + + if (gui->startline->next == NULL) { + gui->subline = linecount; + break; + } + gui->startline = gui->startline->next; } - if (count <= 0) - { - gui->subline = linecount+count; - gui->ypos += -count; - break; - } - - if (gui->startline->next == NULL) - { - gui->subline = linecount; - break; - } - gui->startline = gui->startline->next; - } - - gui->bottom = (gui->ypos >= -1 && gui->ypos <= gui->parent->last_line-gui->parent->first_line); + gui->bottom = is_window_bottom(gui); } void gui_window_scroll(WINDOW_REC *window, int lines) diff --git a/src/irc/core/ignore.c b/src/irc/core/ignore.c index 76c1d368..ac4f67ca 100644 --- a/src/irc/core/ignore.c +++ b/src/irc/core/ignore.c @@ -251,7 +251,6 @@ static void read_ignores(void) IGNORE_REC *rec; CONFIG_NODE *node; GSList *tmp; - char *str; while (ignores != NULL) ignore_destroy(ignores->data); diff --git a/src/irc/core/irc-log.c b/src/irc/core/irc-log.c index accf6014..9773a29a 100644 --- a/src/irc/core/irc-log.c +++ b/src/irc/core/irc-log.c @@ -40,20 +40,15 @@ static void event_away(const char *data, IRC_SERVER_REC *server) if (level == 0) return; log = log_find(fname); - if (log != NULL) { - /* awaylog already created */ - if (log->handle == -1) { - /* ..but not open, open it. */ - log_start_logging(log); - } - return; - } - - log = log_create_rec(fname, level, NULL); - if (log != NULL) { + if (log == NULL) { + log = log_create_rec(fname, level, NULL); log->temp = TRUE; log_update(log); - log_start_logging(log); + } + + if (!log_start_logging(log)) { + /* creating log file failed? close it. */ + log_close(log); } } diff --git a/src/irc/core/query.c b/src/irc/core/query.c index cce333af..4f85b3f1 100644 --- a/src/irc/core/query.c +++ b/src/irc/core/query.c @@ -63,6 +63,7 @@ void query_destroy(QUERY_REC *query) signal_emit("query destroyed", 1, query); MODULE_DATA_DEINIT(query); + g_free_not_null(query->address); g_free(query->nick); g_free(query->server_tag); g_free(query); diff --git a/src/irc/flood/flood.c b/src/irc/flood/flood.c index b1648f5f..b9617157 100644 --- a/src/irc/flood/flood.c +++ b/src/irc/flood/flood.c @@ -46,7 +46,7 @@ typedef struct { static int flood_tag; static int flood_max_msgs, flood_timecheck; -static int flood_hash_deinit(const char *key, FLOOD_REC *flood, gpointer nowp) +static int flood_hash_check_remove(const char *key, FLOOD_REC *flood, gpointer nowp) { GSList *tmp, *next; time_t now; @@ -59,8 +59,11 @@ static int flood_hash_deinit(const char *key, FLOOD_REC *flood, gpointer nowp) FLOOD_ITEM_REC *rec = tmp->data; next = tmp->next; - if (now-rec->first >= flood_timecheck) + if (now-rec->first >= flood_timecheck) { flood->items = g_slist_remove(flood->items, rec); + g_free(rec->target); + g_free(rec); + } } if (flood->items != NULL) @@ -83,7 +86,7 @@ static int flood_timeout(void) IRC_SERVER_REC *rec = tmp->data; mserver = MODULE_DATA(rec); - g_hash_table_foreach_remove(mserver->floodlist, (GHRFunc) flood_hash_deinit, GINT_TO_POINTER((int) now)); + g_hash_table_foreach_remove(mserver->floodlist, (GHRFunc) flood_hash_check_remove, GINT_TO_POINTER((int) now)); } return 1; } @@ -101,6 +104,21 @@ static void flood_init_server(IRC_SERVER_REC *server) rec->floodlist = g_hash_table_new((GHashFunc) g_istr_hash, (GCompareFunc) g_istr_equal); } +static void flood_hash_destroy(const char *key, FLOOD_REC *flood) +{ + while (flood->items != NULL) { + FLOOD_ITEM_REC *rec = flood->items->data; + + g_free(rec->target); + g_free(rec); + + flood->items = g_slist_remove(flood->items, rec); + } + + g_free(flood->nick); + g_free(flood); +} + /* Deinitialize flood protection */ static void flood_deinit_server(IRC_SERVER_REC *server) { @@ -112,9 +130,7 @@ static void flood_deinit_server(IRC_SERVER_REC *server) if (mserver != NULL && mserver->floodlist != NULL) { flood_timecheck = 0; - g_hash_table_freeze(mserver->floodlist); - g_hash_table_foreach(mserver->floodlist, (GHFunc) flood_hash_deinit, NULL); - g_hash_table_thaw(mserver->floodlist); + g_hash_table_foreach(mserver->floodlist, (GHFunc) flood_hash_destroy, NULL); g_hash_table_destroy(mserver->floodlist); } g_free(mserver);