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
This commit is contained in:
Arnavion 2014-04-21 01:39:28 -07:00
parent 41c209bf45
commit dc27640265
3 changed files with 27 additions and 12 deletions

View File

@ -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 ())

View File

@ -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;
}

View File

@ -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