From: Lennart Poettering Date: Thu, 30 Apr 2020 16:30:56 +0000 (+0200) Subject: locale-util: add new helper locale_is_installed() X-Git-Tag: v246-rc1~407^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=23fa786ca67ed3a32930ff1a7b175ac823db187c;p=thirdparty%2Fsystemd.git locale-util: add new helper locale_is_installed() This new helper checks whether the specified locale is installed. It's distinct from locale_is_valid() which just superficially checks if a string looks like something that could be a valid locale. Heavily inspired by @jsynacek's #13964. Replaces: #13964 --- diff --git a/src/basic/locale-util.c b/src/basic/locale-util.c index e4ce289c519..ab5f86f54a3 100644 --- a/src/basic/locale-util.c +++ b/src/basic/locale-util.c @@ -254,6 +254,21 @@ bool locale_is_valid(const char *name) { return true; } +int locale_is_installed(const char *name) { + if (!locale_is_valid(name)) + return false; + + if (STR_IN_SET(name, "C", "POSIX")) /* These ones are always OK */ + return true; + + _cleanup_(freelocalep) locale_t loc = + newlocale(LC_ALL_MASK, name, 0); + if (loc == (locale_t) 0) + return errno == ENOMEM ? -ENOMEM : false; + + return true; +} + void init_gettext(void) { setlocale(LC_ALL, ""); textdomain(GETTEXT_PACKAGE); diff --git a/src/basic/locale-util.h b/src/basic/locale-util.h index 7d77fa2bdae..6bd37720596 100644 --- a/src/basic/locale-util.h +++ b/src/basic/locale-util.h @@ -31,6 +31,7 @@ typedef enum LocaleVariable { int get_locales(char ***l); bool locale_is_valid(const char *name); +int locale_is_installed(const char *name); #define _(String) gettext(String) #define N_(String) String