aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-11-29 22:33:30 +0100
committerMax Kellermann <max@duempel.org>2014-11-29 23:36:44 +0100
commitfd2c6b8a4b059bd810ca8511fa8f66001843284c (patch)
tree3244bbfa951be5bb79094067c0f816e6c84f7f12 /src
parent5b1db917bc63fcacfc503ebc02251a2905bc2f8f (diff)
downloadmpd-fd2c6b8a4b059bd810ca8511fa8f66001843284c.tar.gz
mpd-fd2c6b8a4b059bd810ca8511fa8f66001843284c.tar.xz
mpd-fd2c6b8a4b059bd810ca8511fa8f66001843284c.zip
fs/Charset: return Error on SetFSCharset() failure
Don't abort the process, let the caller decide instead.
Diffstat (limited to 'src')
-rw-r--r--src/Main.cxx5
-rw-r--r--src/fs/Charset.cxx27
-rw-r--r--src/fs/Charset.hxx6
-rw-r--r--src/fs/Config.cxx10
-rw-r--r--src/fs/Config.hxx6
5 files changed, 37 insertions, 17 deletions
diff --git a/src/Main.cxx b/src/Main.cxx
index b1960b5f2..418e69644 100644
--- a/src/Main.cxx
+++ b/src/Main.cxx
@@ -551,7 +551,10 @@ static int mpd_main_after_fork(struct options options)
GlobalEvents::Register(GlobalEvents::SHUTDOWN, shutdown_event_emitted);
#endif
- ConfigureFS();
+ if (!ConfigureFS(error)) {
+ LogError(error);
+ return EXIT_FAILURE;
+ }
if (!glue_mapper_init(error)) {
LogError(error);
diff --git a/src/fs/Charset.cxx b/src/fs/Charset.cxx
index abf4d8287..113f04cc8 100644
--- a/src/fs/Charset.cxx
+++ b/src/fs/Charset.cxx
@@ -21,9 +21,10 @@
#include "Charset.hxx"
#include "Domain.hxx"
#include "Limits.hxx"
-#include "system/FatalError.hxx"
#include "Log.hxx"
#include "Traits.hxx"
+#include "util/Error.hxx"
+#include "util/Domain.hxx"
#ifdef HAVE_GLIB
#include <glib.h>
@@ -36,6 +37,8 @@
#ifdef HAVE_GLIB
+static constexpr Domain convert_domain("convert");
+
/**
* Maximal number of bytes required to represent path name in UTF-8
* (including nul-terminator).
@@ -50,29 +53,37 @@ static std::string fs_charset;
gcc_pure
static bool
-IsSupportedCharset(const char *charset)
+CheckCharset(const char *charset, Error &error)
{
/* convert a space to check if the charset is valid */
- char *test = g_convert(" ", 1, charset, "UTF-8", nullptr, nullptr, nullptr);
- if (test == nullptr)
+ GError *error2 = nullptr;
+ char *test = g_convert(" ", 1, charset, "UTF-8", nullptr, nullptr, &error2);
+ if (test == nullptr) {
+ error.Set(convert_domain, error2->code, error2->message);
+ g_error_free(error2);
return false;
+ }
g_free(test);
return true;
}
-void
-SetFSCharset(const char *charset)
+bool
+SetFSCharset(const char *charset, Error &error)
{
assert(charset != nullptr);
- if (!IsSupportedCharset(charset))
- FormatFatalError("invalid filesystem charset: %s", charset);
+ if (!CheckCharset(charset, error)) {
+ error.FormatPrefix("Failed to initialize filesystem charset '%s': ",
+ charset);
+ return false;
+ }
fs_charset = charset;
FormatDebug(path_domain,
"SetFSCharset: fs charset is: %s", fs_charset.c_str());
+ return true;
}
#endif
diff --git a/src/fs/Charset.hxx b/src/fs/Charset.hxx
index 0a71d7c58..5a24e8d4b 100644
--- a/src/fs/Charset.hxx
+++ b/src/fs/Charset.hxx
@@ -25,6 +25,8 @@
#include <string>
+class Error;
+
/**
* Gets file system character set name.
*/
@@ -32,8 +34,8 @@ gcc_const
const char *
GetFSCharset();
-void
-SetFSCharset(const char *charset);
+bool
+SetFSCharset(const char *charset, Error &error);
/**
* Convert the path to UTF-8.
diff --git a/src/fs/Config.cxx b/src/fs/Config.cxx
index 0034ecc61..cf789fcb7 100644
--- a/src/fs/Config.cxx
+++ b/src/fs/Config.cxx
@@ -29,8 +29,8 @@
#include <glib.h>
#endif
-void
-ConfigureFS()
+bool
+ConfigureFS(Error &error)
{
#ifdef HAVE_GLIB
const char *charset = nullptr;
@@ -55,7 +55,9 @@ ConfigureFS()
#endif
}
- if (charset != nullptr)
- SetFSCharset(charset);
+ return charset == nullptr || SetFSCharset(charset, error);
+#else
+ (void)error;
+ return true;
#endif
}
diff --git a/src/fs/Config.hxx b/src/fs/Config.hxx
index d4f1709f5..d2cde4a66 100644
--- a/src/fs/Config.hxx
+++ b/src/fs/Config.hxx
@@ -22,10 +22,12 @@
#include "check.h"
+class Error;
+
/**
* Performs global one-time initialization of this class.
*/
-void
-ConfigureFS();
+bool
+ConfigureFS(Error &error);
#endif