Hi, my impression is there are two totally independent topics in this thread.
1. Whether and how to make things safer, ideally terminating the program in a controlled manner, if it uses functions that are not thread-safe in an invalid manner. I'm not addressing that topic in this mail. 2. Whether we want additional non-standard xlocale.h functions in our libc. Regarding topic 2, let me say up front that i do not feel strongly either way. It seems to me this is mostly a question for porters. If some functions are widely used - even if non-standard - and help avoid porting hassle, then sure, let's have them unless they cause excessive fuss. But the latter does not seem likely here. There are a number of functions that seem likely useful to me off the top of my head, for example: querylocale, nl_langinfo_l, MB_CUR_MAX_L, wcwidth_l In general, i must say i like the whole xlocale.h business not all that much: in a nutshell, it is doubling the number of half the functions under the sun, which usually indicates poor design in the first place, and then the vast majority of these additional functions are almost useless on any operating system and totally useless on OpenBSD. Like, i mean, btowc_l(3)? Or even the isdigit_l(3) which we already have? You must be choking, Mr. Chisnall! I don't think stuff should be added because it is out there, but only if there is at least some porting benefit. Regarding the FreeBSD headers, i like them even less. There are both terrible design choices and terrible implementation choices. Regarding design, it appears that you *must* #include <xlocale.h> after other headers - if you include it before, it won't work. Regarding implementation, there is quite repulsive macro abuse in xlocale/_ctype.h; but probably that can be unrolled in LibreSSL style. Either way, none of that hinders providing them if doing so yields benefit. See below for a list of functions that i drafted extremely quickly, so beware of errors and omissions. The point isn't to present a definite plan. The point is merely to demonstrate the sheer fatness of the animal and to give a first impression of the degree to which it stinks and grunts from most of its ends. If any of this is needed, do porters already know which functions are in particularly high demand? Do you have any idea how to find out which ones are actually useful for porting purposes? Yours, Ingo Functions we already have marked are with a '*'. <xlocale/_locale.h> useful: querylocale <xlocale/_langinfo.h> useful: nl_langinfo_l* <xlocale/_stdlib.h> useful: MB_CUR_MAX_L marginally useful: mbtowc_l mbstowcs_l wctomb_l wcstombs_l useless: atof_l atoi_l atol_l atoll_l strtod_l strtof_l strtol_l strtold_l strtoll_l strtoul_l strtoull_l mblen_l <xlocale/_wchar.h> useful: wcwidth_l wcswidth_l marginally useful: fgetwc_l fgetws_l fputwc_l fputws_l getwc_l getwchar_l putwc_l putwchar_l ungetwc_l fwprintf_l fwscanf_l swprintf_l swscanf_l vfwprintf_l vswprintf_l vwprintf_l wprintf_l wscanf_l vfwscanf_l vswscanf_l vwscanf_l mbrlen_l mbrtowc_l mbsinit_l mbsrtowcs_l wcrtomb_l wcsrtombs_l wctob_l mbsnrtowcs_l wcsnrtombs_l useless: btowc_l wcsftime_l wcstod_l wcstol_l wcstoul_l wcstof_l wcstold_l wcstoll_l wcstoull_l <xlocale/_string.h> useless: strcasestr_l strcoll_l* strxfrm_l* <xlocale/_strings.h> useless: strcasecmp_l* strncasecmp_l* <xlocale/_inttypes.h> useless: strtoimax_l strtoumax_l wcstoimax_l wcstoumax_l <xlocale/_monetary.h> useless: strfmon_l <xlocale/_time.h> useless: strftime_l* strptime_l <xlocale/_ctype.h> marginally useful: towlower_l* towupper_l* iswctype_l* towctrans_l* not sure: nextwctype_l wctype_l wctrans_l* digittoint_l useless: isalnum_l* etc. tolower_l* toupper_l* include <xlocale/_stdio.h> useless: asprintf_l dprintf_l fprintf_l fscanf_l printf_l scanf_l snprintf_l sprintf_l sscanf_l vfprintf_l vprintf_l vsprintf_l vfscanf_l vscanf_l vsnprintf_l vsscanf_l vdprintf_l vasprintf_l <xlocale/uchar.h> not sure: c16rtomb_l c32rtomb_l mbrtoc16_l mbrtoc32_l