logger: fix write in log file if it has been deleted or renamed (closes #123)

v2.8-utf8proc
Sébastien Helleu 2019-10-06 13:36:35 +02:00
parent 529af39612
commit 53360a7909
17 changed files with 205 additions and 87 deletions

View File

@ -39,6 +39,7 @@ Bug fixes::
* buflist: fix extra spaces between buffers when conditions are used to hide buffers (regression introduced in version 2.6) (issue #1403)
* irc: remove option irc.network.channel_encode, add server option "charset_message" to control which part of the IRC message is decoded/encoded to the target charset (issue #832)
* irc: use path from option xfer.file.upload_path to complete filename in command "/dcc send" (issue #60)
* logger: fix write in log file if it has been deleted or renamed (issue #123)
* xfer: fix memory leak when a xfer is freed and when the plugin is unloaded
Tests::

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-05-13 21:31+0200\n"
"Last-Translator: Ondřej Súkup <mimi.vx@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -9742,6 +9742,10 @@ msgstr "%s%s: nemohu vytvořit adresář pro logy (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: nemůžu zapsat log soubor \"%s\""
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: nemůžu zapsat log soubor \"%s\""
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** Začátek logu ****"

View File

@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-10-03 15:25+0200\n"
"Last-Translator: Nils Görs <weechatter@arcor.de>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
@ -11559,6 +11559,10 @@ msgstr ""
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: Protokoll-Datei \"%s\" kann nicht geschrieben werden: %s"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: Protokoll-Datei \"%s\" kann nicht geschrieben werden: %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** Beginn der Protokoll-Datei ****"

View File

@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-05-13 21:31+0200\n"
"Last-Translator: Elián Hanisch <lambdae2@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -10052,6 +10052,10 @@ msgstr "%s%s: imposible crear directorio para registros (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: imposible escribir en el registro \"%s\": %s"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: imposible escribir en el registro \"%s\": %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** Comienzo del registro ****"

View File

@ -21,8 +21,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"PO-Revision-Date: 2019-10-06 09:22+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-10-06 13:25+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: fr\n"
@ -11288,6 +11288,10 @@ msgstr "%s%s : impossible de créer le répertoire pour les logs (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s : impossible d'écrire le fichier log \"%s\" : %s"
#, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s : impossible de récupérer le statut du fichier de log \"%s\" : %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** Début du log ****"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-05-13 21:31+0200\n"
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -9122,6 +9122,10 @@ msgstr "%s nem sikerült a szervert létrehozni\n"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "Nem sikerült a(z) \"%s\" naplófájlt írni\n"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "Nem sikerült a(z) \"%s\" naplófájlt írni\n"
#, fuzzy, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "**** Naplófájl kezdete "

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-05-13 21:31+0200\n"
"Last-Translator: Esteban I. Ruiz Moreno <exio4.com@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -10237,6 +10237,10 @@ msgstr "%s%s: impossibile creare la directory per i log (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: impossibile scrivere il file di log \"%s\": %s"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: impossibile scrivere il file di log \"%s\": %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** Inizio del log ****"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-09-22 18:54+0200\n"
"Last-Translator: AYANOKOUZI, Ryuunosuke <i38w7i3@yahoo.co.jp>\n"
"Language-Team: Japanese <https://github.com/l/weechat/tree/master/"
@ -10869,6 +10869,10 @@ msgstr "%s%s: ログ用のディレクトリを作成できません (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: ログファイル \"%s\" の書き込みに失敗: %s"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: ログファイル \"%s\" の書き込みに失敗: %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** ログの最初 ****"

View File

@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-09-22 18:54+0200\n"
"Last-Translator: Krzysztof Korościk <soltys@soltys.info>\n"
"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
@ -11035,6 +11035,10 @@ msgstr "%s%s: nie można utworzyć katalogu dla logów (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: nie można zapisać pliku z logiem \"%s\": %s"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: nie można zapisać pliku z logiem \"%s\": %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** Początek logu ****"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-09-22 18:54+0200\n"
"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
"Language-Team: Portuguese <>\n"
@ -10704,6 +10704,10 @@ msgstr "%s%s: não foi possível criar diretório para registos (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: não foi possível escrever o ficheiro de registo \"%s\": %s"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: não foi possível escrever o ficheiro de registo \"%s\": %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t**** Início do registo ****"

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-05-13 21:32+0200\n"
"Last-Translator: Eduardo Elias <camponez@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -9570,6 +9570,10 @@ msgstr "%s%s: não foi possível criar diretório para registros (\"%s\")"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%s%s: não foi possível escrever arquivo de registro \"%s\": %s"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%s%s: não foi possível escrever arquivo de registro \"%s\": %s"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "%s\t*** Início do registro ****"

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-05-13 21:32+0200\n"
"Last-Translator: Aleksey V Zapparov AKA ixti <ixti@member.fsf.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -9159,6 +9159,10 @@ msgstr "%s не могу создать сервер \"%s\"\n"
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "Не могу записать лог-файл \"%s\"\n"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "Не могу записать лог-файл \"%s\"\n"
#, fuzzy, c-format
msgid "%s\t**** Beginning of log ****"
msgstr "**** Начало log-файла"

View File

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2019-05-13 21:32+0200\n"
"Last-Translator: Hasan Kiran <sunder67@hotmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -8329,6 +8329,10 @@ msgstr ""
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr "%sHata: dosya \"%s\" oluşturulamaz"
#, fuzzy, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr "%sHata: dosya \"%s\" oluşturulamaz"
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr ""

View File

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2019-10-06 09:20+0200\n"
"POT-Creation-Date: 2019-10-06 13:24+0200\n"
"PO-Revision-Date: 2014-08-16 10:27+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@ -8192,6 +8192,10 @@ msgstr ""
msgid "%s%s: unable to write log file \"%s\": %s"
msgstr ""
#, c-format
msgid "%s%s: unable to get file status of log file \"%s\": %s"
msgstr ""
#, c-format
msgid "%s\t**** Beginning of log ****"
msgstr ""

View File

@ -91,6 +91,7 @@ logger_buffer_add (struct t_gui_buffer *buffer, int log_level)
new_logger_buffer->buffer = buffer;
new_logger_buffer->log_filename = NULL;
new_logger_buffer->log_file = NULL;
new_logger_buffer->log_file_inode = 0;
new_logger_buffer->log_enabled = 1;
new_logger_buffer->log_level = log_level;
new_logger_buffer->write_start_info_line = 1;
@ -234,6 +235,8 @@ logger_buffer_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_pointer (ptr_item, "log_file", logger_buffer->log_file))
return 0;
if (!weechat_infolist_new_var_buffer (ptr_item, "log_file_inode", &(logger_buffer->log_file_inode), sizeof(logger_buffer->log_file_inode)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "log_enabled", logger_buffer->log_enabled))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "log_level", logger_buffer->log_level))

View File

@ -21,6 +21,9 @@
#define WEECHAT_PLUGIN_LOGGER_BUFFER_H
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
struct t_infolist;
@ -29,6 +32,7 @@ struct t_logger_buffer
struct t_gui_buffer *buffer; /* pointer to buffer */
char *log_filename; /* log filename */
FILE *log_file; /* log file */
ino_t log_file_inode; /* inode of log file */
int log_enabled; /* log enabled ? */
int log_level; /* log level (0..9) */
int write_start_info_line; /* 1 if start info line must be */

View File

@ -515,6 +515,132 @@ logger_set_log_filename (struct t_logger_buffer *logger_buffer)
logger_buffer->log_filename = log_filename;
}
/*
* Creates a log file.
*
* Returns:
* 1: OK
* 0: error
*/
int
logger_create_log_file (struct t_logger_buffer *logger_buffer)
{
char *charset, *message, buf_time[256], buf_beginning[1024];
int log_level, rc;
time_t seconds;
struct tm *date_tmp;
struct stat statbuf;
if (logger_buffer->log_file)
{
/*
* check that the inode has not changed, otherwise that means the file
* was deleted, and we must reopen it
*/
rc = stat (logger_buffer->log_filename, &statbuf);
if ((rc == 0) && (statbuf.st_ino == logger_buffer->log_file_inode))
{
/* inode has not changed, we can write in this file */
return 1;
}
fclose (logger_buffer->log_file);
logger_buffer->log_file = NULL;
logger_buffer->log_file_inode = 0;
}
/* get log level */
log_level = logger_get_level_for_buffer (logger_buffer->buffer);
if (log_level == 0)
{
logger_buffer_free (logger_buffer);
return 0;
}
/* create directory */
if (!logger_create_directory ())
{
weechat_printf_date_tags (
NULL, 0, "no_log",
_("%s%s: unable to create directory for logs "
"(\"%s\")"),
weechat_prefix ("error"), LOGGER_PLUGIN_NAME,
weechat_config_string (logger_config_file_path));
logger_buffer_free (logger_buffer);
return 0;
}
if (!logger_buffer->log_filename)
logger_set_log_filename (logger_buffer);
if (!logger_buffer->log_filename)
{
logger_buffer_free (logger_buffer);
return 0;
}
/* create or append to log file */
logger_buffer->log_file =
fopen (logger_buffer->log_filename, "a");
if (!logger_buffer->log_file)
{
weechat_printf_date_tags (
NULL, 0, "no_log",
_("%s%s: unable to write log file \"%s\": %s"),
weechat_prefix ("error"), LOGGER_PLUGIN_NAME,
logger_buffer->log_filename, strerror (errno));
logger_buffer_free (logger_buffer);
return 0;
}
/* get file inode */
rc = stat (logger_buffer->log_filename, &statbuf);
if (rc != 0)
{
weechat_printf_date_tags (
NULL, 0, "no_log",
_("%s%s: unable to get file status of log file \"%s\": %s"),
weechat_prefix ("error"), LOGGER_PLUGIN_NAME,
logger_buffer->log_filename, strerror (errno));
fclose (logger_buffer->log_file);
logger_buffer->log_file = NULL;
logger_buffer->log_file_inode = 0;
logger_buffer_free (logger_buffer);
return 0;
}
logger_buffer->log_file_inode = statbuf.st_ino;
/* write info line */
if (weechat_config_boolean (logger_config_file_info_lines)
&& logger_buffer->write_start_info_line)
{
buf_time[0] = '\0';
seconds = time (NULL);
date_tmp = localtime (&seconds);
if (date_tmp)
{
if (strftime (buf_time, sizeof (buf_time) - 1,
weechat_config_string (logger_config_file_time_format),
date_tmp) == 0)
buf_time[0] = '\0';
}
snprintf (buf_beginning, sizeof (buf_beginning),
_("%s\t**** Beginning of log ****"),
buf_time);
charset = weechat_info_get ("charset_terminal", "");
message = (charset) ?
weechat_iconv_from_internal (charset, buf_beginning) : NULL;
fprintf (logger_buffer->log_file,
"%s\n", (message) ? message : buf_beginning);
if (charset)
free (charset);
if (message)
free (message);
logger_buffer->flush_needed = 1;
}
logger_buffer->write_start_info_line = 0;
return 1;
}
/*
* Writes a line to log file.
*/
@ -523,80 +649,10 @@ void
logger_write_line (struct t_logger_buffer *logger_buffer,
const char *format, ...)
{
char *message, buf_time[256], buf_beginning[1024], *charset;
time_t seconds;
struct tm *date_tmp;
int log_level;
char *charset, *message;
if (!logger_buffer->log_file)
{
log_level = logger_get_level_for_buffer (logger_buffer->buffer);
if (log_level == 0)
{
logger_buffer_free (logger_buffer);
return;
}
if (!logger_create_directory ())
{
weechat_printf_date_tags (
NULL, 0, "no_log",
_("%s%s: unable to create directory for logs "
"(\"%s\")"),
weechat_prefix ("error"), LOGGER_PLUGIN_NAME,
weechat_config_string (logger_config_file_path));
logger_buffer_free (logger_buffer);
return;
}
if (!logger_buffer->log_filename)
logger_set_log_filename (logger_buffer);
if (!logger_buffer->log_filename)
{
logger_buffer_free (logger_buffer);
return;
}
logger_buffer->log_file =
fopen (logger_buffer->log_filename, "a");
if (!logger_buffer->log_file)
{
weechat_printf_date_tags (
NULL, 0, "no_log",
_("%s%s: unable to write log file \"%s\": %s"),
weechat_prefix ("error"), LOGGER_PLUGIN_NAME,
logger_buffer->log_filename, strerror (errno));
logger_buffer_free (logger_buffer);
return;
}
if (weechat_config_boolean (logger_config_file_info_lines)
&& logger_buffer->write_start_info_line)
{
buf_time[0] = '\0';
seconds = time (NULL);
date_tmp = localtime (&seconds);
if (date_tmp)
{
if (strftime (buf_time, sizeof (buf_time) - 1,
weechat_config_string (logger_config_file_time_format),
date_tmp) == 0)
buf_time[0] = '\0';
}
snprintf (buf_beginning, sizeof (buf_beginning),
_("%s\t**** Beginning of log ****"),
buf_time);
charset = weechat_info_get ("charset_terminal", "");
message = (charset) ?
weechat_iconv_from_internal (charset, buf_beginning) : NULL;
fprintf (logger_buffer->log_file,
"%s\n", (message) ? message : buf_beginning);
if (charset)
free (charset);
if (message)
free (message);
logger_buffer->flush_needed = 1;
}
logger_buffer->write_start_info_line = 0;
}
if (!logger_create_log_file (logger_buffer))
return;
weechat_va_format (format);
if (vbuffer)
@ -656,6 +712,7 @@ logger_stop (struct t_logger_buffer *logger_buffer, int write_info_line)
}
fclose (logger_buffer->log_file);
logger_buffer->log_file = NULL;
logger_buffer->log_file_inode = 0;
}
logger_buffer_free (logger_buffer);
}
@ -716,6 +773,7 @@ logger_start_buffer (struct t_gui_buffer *buffer, int write_info_line)
{
fclose (ptr_logger_buffer->log_file);
ptr_logger_buffer->log_file = NULL;
ptr_logger_buffer->log_file_inode = 0;
}
}
}