log: store duplicated path string
Don't free the string right after calling log_init_file(). Add a new function log_deinit() that frees the string on shutdown. This fixes cycling the log file after SIGHUP (Mantis ticket 0003524).
This commit is contained in:
parent
c9aaabb5d4
commit
dc22846d58
56
src/log.c
56
src/log.c
@ -55,7 +55,7 @@ static const char *log_charset;
|
|||||||
|
|
||||||
static bool stdout_mode = true;
|
static bool stdout_mode = true;
|
||||||
static int out_fd;
|
static int out_fd;
|
||||||
static const char *out_filename;
|
static char *out_filename;
|
||||||
|
|
||||||
static void redirect_logs(int fd)
|
static void redirect_logs(int fd)
|
||||||
{
|
{
|
||||||
@ -134,14 +134,15 @@ open_log_file(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
log_init_file(const char *path, unsigned line, GError **error_r)
|
log_init_file(unsigned line, GError **error_r)
|
||||||
{
|
{
|
||||||
out_filename = path;
|
assert(out_filename != NULL);
|
||||||
|
|
||||||
out_fd = open_log_file();
|
out_fd = open_log_file();
|
||||||
if (out_fd < 0) {
|
if (out_fd < 0) {
|
||||||
g_set_error(error_r, log_quark(), errno,
|
g_set_error(error_r, log_quark(), errno,
|
||||||
"failed to open log file \"%s\" (config line %u): %s",
|
"failed to open log file \"%s\" (config line %u): %s",
|
||||||
path, line, g_strerror(errno));
|
out_filename, line, g_strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,22 +272,33 @@ log_init(bool verbose, bool use_stdout, GError **error_r)
|
|||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
GError *error = NULL;
|
out_filename = config_dup_path(CONF_LOG_FILE, error_r);
|
||||||
char *path = config_dup_path(CONF_LOG_FILE, &error);
|
return out_filename != NULL &&
|
||||||
if (path == NULL) {
|
log_init_file(param->line, error_r);
|
||||||
assert(error != NULL);
|
|
||||||
g_propagate_error(error_r, error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool success = log_init_file(path, param->line,
|
|
||||||
error_r);
|
|
||||||
g_free(path);
|
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
close_log_files(void)
|
||||||
|
{
|
||||||
|
if (stdout_mode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef HAVE_SYSLOG
|
||||||
|
if (out_filename == NULL)
|
||||||
|
closelog();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
log_deinit(void)
|
||||||
|
{
|
||||||
|
close_log_files();
|
||||||
|
g_free(out_filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void setup_log_output(bool use_stdout)
|
void setup_log_output(bool use_stdout)
|
||||||
{
|
{
|
||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
@ -327,15 +339,3 @@ int cycle_log_files(void)
|
|||||||
g_debug("Done cycling log files\n");
|
g_debug("Done cycling log files\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void close_log_files(void)
|
|
||||||
{
|
|
||||||
if (stdout_mode)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG
|
|
||||||
if (out_filename == NULL)
|
|
||||||
closelog();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -44,10 +44,11 @@ log_early_init(bool verbose);
|
|||||||
bool
|
bool
|
||||||
log_init(bool verbose, bool use_stdout, GError **error_r);
|
log_init(bool verbose, bool use_stdout, GError **error_r);
|
||||||
|
|
||||||
|
void
|
||||||
|
log_deinit(void);
|
||||||
|
|
||||||
void setup_log_output(bool use_stdout);
|
void setup_log_output(bool use_stdout);
|
||||||
|
|
||||||
int cycle_log_files(void);
|
int cycle_log_files(void);
|
||||||
|
|
||||||
void close_log_files(void);
|
|
||||||
|
|
||||||
#endif /* LOG_H */
|
#endif /* LOG_H */
|
||||||
|
@ -536,6 +536,6 @@ int mpd_main(int argc, char *argv[])
|
|||||||
WSACleanup();
|
WSACleanup();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
close_log_files();
|
log_deinit();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user