summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorArnavion <arnavion@gmail.com>2014-04-21 01:39:28 -0700
committerArnavion <arnavion@gmail.com>2014-04-21 01:39:28 -0700
commitdc27640265dcbe480ad137831f3a22f35bd07b51 (patch)
treed80b5b4cbe641d094a6ee71f4fd1f25b8154fd1d
parent41c209bf45ce1a926c526959cae2dc94fec7c0b9 (diff)
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
-rw-r--r--src/common/text.c4
-rw-r--r--src/common/util.c34
-rw-r--r--src/common/util.h1
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