From dc27640265dcbe480ad137831f3a22f35bd07b51 Mon Sep 17 00:00:00 2001 From: Arnavion Date: Mon, 21 Apr 2014 01:39:28 -0700 Subject: [PATCH] Use utf-8 variant of strftime to format log file paths. strftime assumes the format string is in locale encoding, which mangles log file paths that are in utf-8. Fixes #767 Fixes #945 --- src/common/text.c | 4 +--- src/common/util.c | 34 +++++++++++++++++++++++++--------- src/common/util.h | 1 + 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/common/text.c b/src/common/text.c index 00f311c0..efd8fba2 100644 --- a/src/common/text.c +++ b/src/common/text.c @@ -540,7 +540,6 @@ log_create_pathname (char *servname, char *channame, char *netname) { char fname[384]; char fnametime[384]; - struct tm *tm; time_t now; if (!netname) @@ -568,8 +567,7 @@ log_create_pathname (char *servname, char *channame, char *netname) /* insert time/date */ now = time (NULL); - tm = localtime (&now); - strftime_validated (fnametime, sizeof (fnametime), fname, tm); + strftime_utf8 (fnametime, sizeof (fnametime), fname, now); /* create final path/filename */ if (logmask_is_fullpath ()) diff --git a/src/common/util.c b/src/common/util.c index dec9d4df..0549bd6e 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -2203,15 +2203,17 @@ challengeauth_response (char *username, char *password, char *challenge) #endif /** -* \brief Wrapper around strftime for Windows -* -* Prevents crashing when using an invalid format by escaping them. -* -* Behaves the same as strftime with the addition that -* it returns 0 if the escaped format string is too large. -* -* Based upon work from znc-msvc project. -*/ + * \brief Wrapper around strftime for Windows + * + * Prevents crashing when using an invalid format by escaping them. + * + * Behaves the same as strftime with the addition that + * it returns 0 if the escaped format string is too large. + * + * Based upon work from znc-msvc project. + * + * This assumes format is a locale-encoded string. For utf-8 strings, use strftime_utf8 + */ size_t strftime_validated (char *dest, size_t destsize, const char *format, const struct tm *time) { @@ -2278,3 +2280,17 @@ strftime_validated (char *dest, size_t destsize, const char *format, const struc return strftime (dest, destsize, safe_format, time); #endif } + +/** + * \brief Similar to strftime except it works with utf-8 formats, since strftime treats the format as locale-encoded. + */ +gsize +strftime_utf8 (char *dest, gsize destsize, const char *format, time_t time) +{ + gsize result; + GDate* date = g_date_new (); + g_date_set_time_t (date, time); + result = g_date_strftime (dest, destsize, format, date); + g_date_free (date); + return result; +} diff --git a/src/common/util.h b/src/common/util.h index ffa5a066..f2fe2ecb 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -82,4 +82,5 @@ char *encode_sasl_pass_blowfish (char *user, char *pass, char *data); char *encode_sasl_pass_aes (char *user, char *pass, char *data); char *challengeauth_response (char *username, char *password, char *challenge); size_t strftime_validated (char *dest, size_t destsize, const char *format, const struct tm *time); +size_t strftime_utf8 (char *dest, size_t destsize, const char *format, time_t time); #endif