path: root/src
diff options
authorRich Felker <>2017-07-31 23:08:27 -0400
committerRich Felker <>2017-07-31 23:08:27 -0400
commit947d330f68c49680dcc54439f56da2a297228962 (patch)
treedb501c0de78202bee078e418c5b9a9a47ece0712 /src
parenta08910fc2cc739f631b75b2d09b8d72a0d64d285 (diff)
add _NL_LOCALE_NAME extension to nl_langinfo
since setlocale(cat, NULL) is required to return the setting for the global locale, there is no standard mechanism to obtain the name of the currently active thread-local locale set by uselocale. this makes it impossible for application/library software to load appropriate translations, etc. unless using the gettext implementation provided by libc, which has privileged access to libc internals. to fill this gap, glibc introduced the _NL_LOCALE_NAME macro which can be used with nl_langinfo to obtain the name. GNU gettext/gnulib code already use this functionality on glibc, and can easily be adapted to make use of it on non-glibc systems if it's available; for other systems they poke at locale implementation internals, which we want to avoid. this patch provides a compatible interface to the one glibc introduced.
Diffstat (limited to 'src')
1 files changed, 4 insertions, 0 deletions
diff --git a/src/locale/langinfo.c b/src/locale/langinfo.c
index b2c8569e..b16caf44 100644
--- a/src/locale/langinfo.c
+++ b/src/locale/langinfo.c
@@ -34,6 +34,10 @@ char *__nl_langinfo_l(nl_item item, locale_t loc)
const char *str;
if (item == CODESET) return MB_CUR_MAX==1 ? "ASCII" : "UTF-8";
+ /* _NL_LOCALE_NAME extension */
+ if (idx == 65535 && cat < LC_ALL)
+ return loc->cat[cat] ? (char *)loc->cat[cat]->name : "C";
switch (cat) {