From fd2c6b8a4b059bd810ca8511fa8f66001843284c Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 29 Nov 2014 22:33:30 +0100 Subject: fs/Charset: return Error on SetFSCharset() failure Don't abort the process, let the caller decide instead. --- src/Main.cxx | 5 ++++- src/fs/Charset.cxx | 27 +++++++++++++++++++-------- src/fs/Charset.hxx | 6 ++++-- src/fs/Config.cxx | 10 ++++++---- src/fs/Config.hxx | 6 ++++-- 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 @@ -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 +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 #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 -- cgit v1.2.3