<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.os.netbsd.devel.userlevel">
    <title>gmane.os.netbsd.devel.userlevel</title>
    <link>http://blog.gmane.org/gmane.os.netbsd.devel.userlevel</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16717"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16716"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16715"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16714"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16713"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16712"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16711"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16710"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16709"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16708"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16707"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16706"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16705"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16704"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16703"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16702"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16701"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16700"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16699"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16698"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16717">
    <title>Re: [PATCH] Support for mbsnrtowcs and wcsnrtomb</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16717</link>
    <description>&lt;pre&gt;
Attached is an updated and simplified version.

Joerg
Index: distrib/sets/lists/debug/mi
===================================================================
RCS file: /home/joerg/repo/netbsd/src/distrib/sets/lists/debug/mi,v
retrieving revision 1.22
diff -u -p -r1.22 mi
--- distrib/sets/lists/debug/mi8 May 2013 17:41:31 -00001.22
+++ distrib/sets/lists/debug/mi17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1543,6 +1543,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 ./usr/libdata/debug/usr/tests/lib/libc/locale/t_io.debugtests-lib-debugdebug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbrtowc.debugtests-lib-debugdebug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbstowcs.debugtests-lib-debugdebug,atf
+./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbsnrtowcs.debugtests-lib-debugdebug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbtowc.debugtests-lib-debugdebug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/locale/t_wcscspn.debugtests-lib-debugdebug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/locale/t_wcspbrk.debugtests-lib-debugdebug,atf
Index: distrib/sets/lists/tests/mi
===================================================================
RCS file: /home/joerg/repo/netbsd/src/distrib/sets/lists/tests/mi,v
retrieving revision 1.535
diff -u -p -r1.535 mi
--- distrib/sets/lists/tests/mi22 Apr 2013 21:06:28 -00001.535
+++ distrib/sets/lists/tests/mi17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1942,6 +1942,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 ./usr/tests/lib/libc/locale/t_iotests-lib-testsatf
 ./usr/tests/lib/libc/locale/t_mbrtowctests-lib-testsatf
 ./usr/tests/lib/libc/locale/t_mbstowcstests-lib-testsatf
+./usr/tests/lib/libc/locale/t_mbsnrtowcstests-lib-testsatf
 ./usr/tests/lib/libc/locale/t_mbtowctests-lib-testsatf
 ./usr/tests/lib/libc/locale/t_wcscspntests-lib-testsatf
 ./usr/tests/lib/libc/locale/t_wcspbrktests-lib-testsatf
Index: include/wchar.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/include/wchar.h,v
retrieving revision 1.37
diff -u -p -r1.37 wchar.h
--- include/wchar.h19 Apr 2013 23:45:15 -00001.37
+++ include/wchar.h17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -212,6 +212,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct _locale*locale_t;
 #  define __LOCALE_T_DECLARED
 #  endif
 __BEGIN_DECLS
+size_tmbsnrtowcs(wchar_t * __restrict, const char ** __restrict, size_t,
+    size_t, mbstate_t * __restrict);
+size_twcsnrtombs(char * __restrict, const wchar_t ** __restrict, size_t,
+    size_t, mbstate_t * __restrict);
+
 intwcscoll_l(const wchar_t *, const wchar_t *, locale_t);
 size_twcsxfrm_l(wchar_t *, const wchar_t *, size_t, locale_t);
 int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -246,9 +251,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; size_tmbrtowc_l(wchar_t * __restrict, c
 intmbsinit_l(const mbstate_t *, locale_t);
 size_tmbsrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t,
     mbstate_t * __restrict, locale_t);
+size_tmbsnrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t,
+    size_t, mbstate_t * __restrict, locale_t);
 size_twcrtomb_l(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t);
 size_twcsrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t,
     mbstate_t * __restrict, locale_t);
+size_twcsnrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t,
+    size_t, mbstate_t * __restrict, locale_t);
 intwctob_l(wint_t, locale_t);
 
 int fwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, ...);
Index: lib/libc/citrus/citrus_ctype.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/citrus_ctype.c,v
retrieving revision 1.6
diff -u -p -r1.6 citrus_ctype.c
--- lib/libc/citrus/citrus_ctype.c19 Nov 2011 18:34:21 -00001.6
+++ lib/libc/citrus/citrus_ctype.c21 May 2013 17:46:29 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -92,6 +92,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _initctypemodule(_citrus_ctype_t cc, cha
 cc-&amp;gt;cc_ops-&amp;gt;co_wctob = &amp;amp;_citrus_ctype_wctob_fallback;
 /* FALLTHROUGH */
 case 0x00000002:
+cc-&amp;gt;cc_ops-&amp;gt;co_mbsnrtowcs = &amp;amp;_citrus_ctype_mbsnrtowcs_fallback;
+cc-&amp;gt;cc_ops-&amp;gt;co_wcsnrtombs = &amp;amp;_citrus_ctype_wcsnrtombs_fallback;
 /* FALLTHROUGH */
 default:
 break;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -106,10 +108,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _initctypemodule(_citrus_ctype_t cc, cha
     cc-&amp;gt;cc_ops-&amp;gt;co_mbrtowc == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_mbsinit == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_mbsrtowcs == NULL ||
+    cc-&amp;gt;cc_ops-&amp;gt;co_mbsnrtowcs == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_mbstowcs == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_mbtowc == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_wcrtomb == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_wcsrtombs == NULL ||
+    cc-&amp;gt;cc_ops-&amp;gt;co_wcsnrtombs == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_wcstombs == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_wctomb == NULL ||
     cc-&amp;gt;cc_ops-&amp;gt;co_btowc == NULL ||
Index: lib/libc/citrus/citrus_ctype.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/citrus_ctype.h,v
retrieving revision 1.2
diff -u -p -r1.2 citrus_ctype.h
--- lib/libc/citrus/citrus_ctype.h5 Mar 2003 20:18:15 -00001.2
+++ lib/libc/citrus/citrus_ctype.h17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -95,6 +95,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _citrus_ctype_mbsrtowcs(_citrus_ctype_t 
 }
 
 static __inline int
+_citrus_ctype_mbsnrtowcs(_citrus_ctype_t cc, wchar_t *pwcs, const char **s,
+size_t in, size_t n, void *pspriv, size_t *nresult)
+{
+
+_DIAGASSERT(cc &amp;amp;&amp;amp; cc-&amp;gt;cc_ops &amp;amp;&amp;amp; cc-&amp;gt;cc_ops-&amp;gt;co_mbsnrtowcs &amp;amp;&amp;amp; nresult);
+return (*cc-&amp;gt;cc_ops-&amp;gt;co_mbsnrtowcs)(cc, pwcs, s, in, n,
+   pspriv, nresult);
+}
+
+static __inline int
 _citrus_ctype_mbstowcs(_citrus_ctype_t cc, wchar_t *pwcs, const char *s,
        size_t n, size_t *nresult)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -133,6 +143,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _citrus_ctype_wcsrtombs(_citrus_ctype_t 
 }
 
 static __inline int
+_citrus_ctype_wcsnrtombs(_citrus_ctype_t cc, char *s, const wchar_t **ppwcs,
+size_t in, size_t n, void *pspriv, size_t *nresult)
+{
+
+_DIAGASSERT(cc &amp;amp;&amp;amp; cc-&amp;gt;cc_ops &amp;amp;&amp;amp; cc-&amp;gt;cc_ops-&amp;gt;co_wcsnrtombs &amp;amp;&amp;amp; nresult);
+return (*cc-&amp;gt;cc_ops-&amp;gt;co_wcsnrtombs)(cc, s, ppwcs, in, n,
+   pspriv, nresult);
+}
+
+static __inline int
 _citrus_ctype_wcstombs(_citrus_ctype_t cc, char *s, const wchar_t *wcs,
        size_t n, size_t *nresult)
 {
Index: lib/libc/citrus/citrus_ctype_fallback.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/citrus_ctype_fallback.c,v
retrieving revision 1.2
diff -u -p -r1.2 citrus_ctype_fallback.c
--- lib/libc/citrus/citrus_ctype_fallback.c27 Jun 2003 14:52:25 -00001.2
+++ lib/libc/citrus/citrus_ctype_fallback.c20 May 2013 19:33:44 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,6 +35,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __RCSID("$NetBSD: citrus_ctype_fallback.
 
 #include &amp;lt;sys/types.h&amp;gt;
 #include &amp;lt;assert.h&amp;gt;
+#include &amp;lt;errno.h&amp;gt;
 #include &amp;lt;wchar.h&amp;gt;
 #include &amp;lt;stdio.h&amp;gt;
 #include &amp;lt;string.h&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -108,3 +109,121 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _citrus_ctype_wctob_fallback(_citrus_cty
 
 return 0;
 }
+
+/*
+ * for ABI version &amp;gt;= 0x00000003
+ */ 
+
+int
+_citrus_ctype_mbsnrtowcs_fallback(_citrus_ctype_rec_t * __restrict cc,
+    wchar_t * __restrict pwcs, const char ** __restrict s, size_t in,
+    size_t n, void * __restrict psenc, size_t * __restrict nresult)
+{
+int err;
+size_t cnt, siz;
+const char *s0, *se;
+
+_DIAGASSERT(nresult != 0);
+_DIAGASSERT(psenc != NULL);
+_DIAGASSERT(s != NULL);
+_DIAGASSERT(*s != NULL);
+
+/* if pwcs is NULL, ignore n */
+if (pwcs == NULL)
+n = 1; /* arbitrary &amp;gt;0 value */
+
+err = 0;
+cnt = 0;
+se = *s + in;
+s0 = *s; /* to keep *s unchanged for now, use copy instead. */
+while (s0 &amp;lt; se &amp;amp;&amp;amp; n &amp;gt; 0) {
+err = _citrus_ctype_mbrtowc(cc, pwcs, s0, (size_t)(se - s0),
+    psenc, &amp;amp;siz);
+if (err) {
+cnt = (size_t)-1;
+goto bye;
+}
+if (siz == (size_t)-2) {
+s0 = se;
+goto bye;
+}
+switch (siz) {
+case 0:
+if (pwcs) {
+size_t dum;
+_citrus_ctype_mbrtowc(cc, NULL, NULL, 0, psenc,
+    &amp;amp;dum);
+}
+s0 = 0;
+goto bye;
+default:
+if (pwcs) {
+pwcs++;
+n--;
+}
+s0 += siz;
+cnt++;
+break;
+}
+}
+bye:
+if (pwcs)
+*s = s0;
+
+*nresult = cnt;
+
+return err;
+}
+
+int
+_citrus_ctype_wcsnrtombs_fallback(_citrus_ctype_rec_t * __restrict cc,
+    char * __restrict s, const wchar_t ** __restrict pwcs, size_t in,
+    size_t n, void * __restrict psenc, size_t * __restrict nresult)
+{
+size_t cnt = 0;
+int err;
+char buf[MB_LEN_MAX];
+size_t siz;
+const wchar_t* pwcs0;
+mbstate_t state;
+
+pwcs0 = *pwcs;
+
+if (!s)
+n = 1;
+
+while (in &amp;gt; 0 &amp;amp;&amp;amp; n &amp;gt; 0) {
+memcpy(&amp;amp;state, psenc, sizeof(state));
+err = _citrus_ctype_wcrtomb(cc, buf, *pwcs0, psenc, &amp;amp;siz);
+if (siz == (size_t)-1) {
+*nresult = siz;
+return (err);
+}
+
+if (s) {
+if (n &amp;lt; siz) {
+memcpy(psenc, &amp;amp;state, sizeof(state));
+break;
+}
+memcpy(s, buf, siz);
+s += siz;
+n -= siz;
+}
+cnt += siz;
+if (!*pwcs0) {
+if (s) {
+memset(psenc, 0, sizeof(state));
+}
+pwcs0 = 0;
+cnt--; /* don't include terminating null */
+break;
+}
+pwcs0++;
+--in;
+}
+if (s)
+*pwcs = pwcs0;
+
+*nresult = cnt;
+return (0);
+}
Index: lib/libc/citrus/citrus_ctype_fallback.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/citrus_ctype_fallback.h,v
retrieving revision 1.1
diff -u -p -r1.1 citrus_ctype_fallback.h
--- lib/libc/citrus/citrus_ctype_fallback.h5 Mar 2003 20:18:15 -00001.1
+++ lib/libc/citrus/citrus_ctype_fallback.h17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,4 +35,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int _citrus_ctype_btowc_fallback(_citrus
 int _citrus_ctype_wctob_fallback(_citrus_ctype_rec_t * __restrict,
  wint_t, int * __restrict);
 
+/* fallback functions for 0x00000003 */
+int _citrus_ctype_mbsnrtowcs_fallback(_citrus_ctype_rec_t * __restrict,
+      wchar_t * __restrict,
+      const char ** __restrict, size_t,
+      size_t, void * __restrict,
+      size_t * __restrict);
+int _citrus_ctype_wcsnrtombs_fallback(_citrus_ctype_rec_t * __restrict,
+     char * __restrict,
+     const wchar_t ** __restrict, size_t,
+     size_t, void * __restrict,
+     size_t * __restrict);
+
 #endif
Index: lib/libc/citrus/citrus_ctype_local.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/citrus_ctype_local.h,v
retrieving revision 1.3
diff -u -p -r1.3 citrus_ctype_local.h
--- lib/libc/citrus/citrus_ctype_local.h9 Feb 2008 14:56:20 -00001.3
+++ lib/libc/citrus/citrus_ctype_local.h17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,6 +60,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int_citrus_##_e_##_ctype_mbsrtow
  const char ** __restrict,      \
  size_t, void * __restrict,      \
  size_t * __restrict);      \
+static int_citrus_##_e_##_ctype_mbsnrtowcs(_citrus_ctype_rec_t * __restrict, \
+ wchar_t * __restrict,      \
+ const char ** __restrict,      \
+ size_t, size_t, void * __restrict,   \
+ size_t * __restrict);      \
 static int_citrus_##_e_##_ctype_mbstowcs(void * __restrict,      \
 wchar_t * __restrict,      \
 const char * __restrict,      \
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,6 +82,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int_citrus_##_e_##_ctype_wcsrtom
  const wchar_t ** __restrict,      \
  size_t, void * __restrict,      \
  size_t * __restrict);      \
+static int_citrus_##_e_##_ctype_wcsnrtombs(_citrus_ctype_rec_t * __restrict, \
+ char * __restrict,      \
+ const wchar_t ** __restrict,      \
+ size_t, size_t, void * __restrict,   \
+ size_t * __restrict);      \
 static int_citrus_##_e_##_ctype_wcstombs(void * __restrict,      \
 char * __restrict,      \
 const wchar_t * __restrict,      \
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,7 +117,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _citrus_ctype_ops_rec_t _citrus_##_e_##_
 /* co_wcstombs */&amp;amp;_citrus_##_e_##_ctype_wcstombs,\
 /* co_wctomb */&amp;amp;_citrus_##_e_##_ctype_wctomb,\
 /* co_btowc */&amp;amp;_citrus_##_e_##_ctype_btowc,\
-/* co_wctob */&amp;amp;_citrus_##_e_##_ctype_wctob\
+/* co_wctob */&amp;amp;_citrus_##_e_##_ctype_wctob,\
+/* co_mbsnrtowcs */&amp;amp;_citrus_##_e_##_ctype_mbsnrtowcs,\
+/* co_wcsnrtombs */&amp;amp;_citrus_##_e_##_ctype_wcsnrtombs,\
 }
 
 typedef struct _citrus_ctype_ops_rec_citrus_ctype_ops_rec_t;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -129,7 +141,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef int(*_citrus_ctype_mbsinit_t)
 (void * __restrict, const void * __restrict, int * __restrict);
 typedef int(*_citrus_ctype_mbsrtowcs_t)
 (void * __restrict, wchar_t * __restrict, const char ** __restrict,
- size_t, void * __restrict,
+ size_t, void * __restrict, size_t * __restrict);
+typedef int(*_citrus_ctype_mbsnrtowcs_t)
+(_citrus_ctype_rec_t * __restrict, wchar_t * __restrict,
+ const char ** __restrict, size_t, size_t, void * __restrict,
  size_t * __restrict);
 typedef int(*_citrus_ctype_mbstowcs_t)
 (void * __restrict, wchar_t * __restrict, const char * __restrict,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -143,6 +158,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef int(*_citrus_ctype_wcrtomb_t)
 typedef int(*_citrus_ctype_wcsrtombs_t)
 (void * __restrict, char * __restrict, const wchar_t ** __restrict,
  size_t, void * __restrict, size_t * __restrict);
+typedef int(*_citrus_ctype_wcsnrtombs_t)
+(_citrus_ctype_rec_t * __restrict, char * __restrict,
+ const wchar_t ** __restrict, size_t, size_t, void * __restrict,
+ size_t * __restrict);
 typedef int(*_citrus_ctype_wcstombs_t)
 (void * __restrict, char * __restrict, const wchar_t * __restrict,
  size_t, size_t * __restrict);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -152,16 +171,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef int(*_citrus_ctype_btowc_t)
 (_citrus_ctype_rec_t * __restrict, int, wint_t * __restrict);
 typedef int(*_citrus_ctype_wctob_t)
 (_citrus_ctype_rec_t * __restrict, wint_t, int * __restrict);
+#include "citrus_ctype_fallback.h"
 
 /*
  * ABI Version change log:
  *   0x00000001
  *     initial version
  *   0x00000002
- *     ops record:btowc and wctob are added.
+ *     ops record:btowc and wctob added.
+ *     ctype record:unchanged.
+ *   0x00000003
+ *     ops record:mbsnrtowcs and wcsnrtombs added.
  *     ctype record:unchanged.
  */
-#define _CITRUS_CTYPE_ABI_VERSION0x00000002
+#define _CITRUS_CTYPE_ABI_VERSION0x00000003
 struct _citrus_ctype_ops_rec {
 uint32_tco_abi_version;
 /* version 0x00000001 */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -182,6 +205,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _citrus_ctype_ops_rec {
 /* version 0x00000002 */
 _citrus_ctype_btowc_tco_btowc;
 _citrus_ctype_wctob_tco_wctob;
+/* version 0x00000003 */
+_citrus_ctype_mbsnrtowcs_tco_mbsnrtowcs;
+_citrus_ctype_wcsnrtombs_tco_wcsnrtombs;
 };
 
 #define _CITRUS_DEFAULT_CTYPE_NAME"NONE"
Index: lib/libc/citrus/citrus_ctype_template.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/citrus_ctype_template.h,v
retrieving revision 1.35
diff -u -p -r1.35 citrus_ctype_template.h
--- lib/libc/citrus/citrus_ctype_template.h9 Feb 2008 14:56:20 -00001.35
+++ lib/libc/citrus/citrus_ctype_template.h21 May 2013 16:03:37 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,8 +85,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  *           mbrtowc
  *           mbtowc
  *           mbsrtowcs
+ *           mbsnrtowcs
  *           wcrtomb
  *           wcsrtombs
+ *           wcsnrtombs
  *           wctomb
  *     These need to be keeped in the ctype encoding information structure,
  *     pointed by "cei".
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -238,8 +240,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _FUNCNAME(mbsrtowcs_priv)(_ENCODING_INFO
 _DIAGASSERT(nresult != 0);
 _DIAGASSERT(ei != NULL);
 _DIAGASSERT(psenc != NULL);
-_DIAGASSERT(s == NULL);
-_DIAGASSERT(*s == NULL);
+_DIAGASSERT(s != NULL);
+_DIAGASSERT(*s != NULL);
 
 /* if pwcs is NULL, ignore n */
 if (pwcs == NULL)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -282,6 +284,66 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bye:
 return err;
 }
 
+static int
+_FUNCNAME(mbsnrtowcs_priv)(_ENCODING_INFO * __restrict ei,
+  wchar_t * __restrict pwcs,
+  const char ** __restrict s, size_t in,
+  size_t n, _ENCODING_STATE * __restrict psenc,
+  size_t * __restrict nresult)
+{
+int err;
+size_t cnt, siz;
+const char *s0, *se;
+
+_DIAGASSERT(nresult != 0);
+_DIAGASSERT(ei != NULL);
+_DIAGASSERT(psenc != NULL);
+_DIAGASSERT(s != NULL);
+_DIAGASSERT(*s != NULL);
+
+/* if pwcs is NULL, ignore n */
+if (pwcs == NULL)
+n = 1; /* arbitrary &amp;gt;0 value */
+
+err = 0;
+cnt = 0;
+se = *s + in;
+s0 = *s; /* to keep *s unchanged for now, use copy instead. */
+while (s0 &amp;lt; se &amp;amp;&amp;amp; n &amp;gt; 0) {
+err = _FUNCNAME(mbrtowc_priv)(ei, pwcs, &amp;amp;s0, se - s0,
+      psenc, &amp;amp;siz);
+if (err) {
+cnt = (size_t)-1;
+goto bye;
+}
+if (siz == (size_t)-2) {
+s0 = se;
+goto bye;
+}
+switch (siz) {
+case 0:
+if (pwcs) {
+_FUNCNAME(init_state)(ei, psenc);
+}
+s0 = 0;
+goto bye;
+default:
+if (pwcs) {
+pwcs++;
+n--;
+}
+cnt++;
+break;
+}
+}
+bye:
+if (pwcs)
+*s = s0;
+
+*nresult = cnt;
+
+return err;
+}
 
 static int
 _FUNCNAME(wcsrtombs_priv)(_ENCODING_INFO * __restrict ei, char * __restrict s,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -289,6 +351,66 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _FUNCNAME(wcsrtombs_priv)(_ENCODING_INFO
   size_t n, _ENCODING_STATE * __restrict psenc,
   size_t * __restrict nresult)
 {
+int err;
+char buf[MB_LEN_MAX];
+size_t cnt, siz;
+const wchar_t* pwcs0;
+#if _ENCODING_IS_STATE_DEPENDENT
+_ENCODING_STATE state;
+#endif
+
+pwcs0 = *pwcs;
+
+cnt = 0;
+if (!s)
+n = 1;
+
+while (n &amp;gt; 0) {
+#if _ENCODING_IS_STATE_DEPENDENT
+state = *psenc;
+#endif
+err = _FUNCNAME(wcrtomb_priv)(ei, buf, sizeof(buf),
+      *pwcs0, psenc, &amp;amp;siz);
+if (siz == (size_t)-1) {
+*nresult = siz;
+return (err);
+}
+
+if (s) {
+if (n &amp;lt; siz) {
+#if _ENCODING_IS_STATE_DEPENDENT
+*psenc = state;
+#endif
+break;
+}
+memcpy(s, buf, siz);
+s += siz;
+n -= siz;
+}
+cnt += siz;
+if (!*pwcs0) {
+if (s) {
+_FUNCNAME(init_state)(ei, psenc);
+}
+pwcs0 = 0;
+cnt--; /* don't include terminating null */
+break;
+}
+pwcs0++;
+}
+if (s)
+*pwcs = pwcs0;
+
+*nresult = cnt;
+return (0);
+}
+
+static int
+_FUNCNAME(wcsnrtombs_priv)(_ENCODING_INFO * __restrict ei, char * __restrict s,
+  const wchar_t ** __restrict pwcs, size_t in,
+  size_t n, _ENCODING_STATE * __restrict psenc,
+  size_t * __restrict nresult)
+{
 int cnt = 0, err;
 char buf[MB_LEN_MAX];
 size_t siz;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -302,7 +424,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _FUNCNAME(wcsrtombs_priv)(_ENCODING_INFO
 if (!s)
 n = 1;
 
-while (n &amp;gt; 0) {
+while (in &amp;gt; 0 &amp;amp;&amp;amp; n &amp;gt; 0) {
 #if _ENCODING_IS_STATE_DEPENDENT
 state = *psenc;
 #endif
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -334,6 +456,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _FUNCNAME(wcsrtombs_priv)(_ENCODING_INFO
 break;
 }
 pwcs0++;
+--in;
 }
 if (s)
 *pwcs = pwcs0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -525,6 +648,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _FUNCNAME(ctype_mbsrtowcs)(void * __rest
 return (err);
 }
 
+static int __used
+_FUNCNAME(ctype_mbsnrtowcs)(_citrus_ctype_rec_t * __restrict cc, wchar_t * __restrict pwcs,
+   const char ** __restrict s, size_t in, size_t n,
+   void * __restrict pspriv,
+   size_t * __restrict nresult)
+{
+void *cl = cc-&amp;gt;cc_closure;
+_ENCODING_STATE *psenc;
+_ENCODING_INFO *ei;
+int err = 0;
+
+_DIAGASSERT(cl != NULL);
+
+ei = _CEI_TO_EI(_TO_CEI(cl));
+_RESTART_BEGIN(mbsnrtowcs, _TO_CEI(cl), pspriv, psenc);
+err = _FUNCNAME(mbsnrtowcs_priv)(ei, pwcs, s, in, n, psenc, nresult);
+_RESTART_END(mbsnrtowcs, _TO_CEI(cl), pspriv, psenc);
+
+return (err);
+}
+
 static int
 _FUNCNAME(ctype_mbstowcs)(void * __restrict cl, wchar_t * __restrict pwcs,
   const char * __restrict s, size_t n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -637,6 +781,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _FUNCNAME(ctype_wcsrtombs)(void * __rest
 return err;
 }
 
+static int __used
+/*ARGSUSED*/
+_FUNCNAME(ctype_wcsnrtombs)(_citrus_ctype_rec_t * __restrict cc,
+   char * __restrict s,
+   const wchar_t ** __restrict pwcs, size_t in,
+   size_t n, void * __restrict pspriv,
+   size_t * __restrict nresult)
+{
+void *cl = cc-&amp;gt;cc_closure;
+_ENCODING_STATE *psenc;
+_ENCODING_INFO *ei;
+int err = 0;
+
+_DIAGASSERT(cl != NULL);
+
+ei = _CEI_TO_EI(_TO_CEI(cl));
+_RESTART_BEGIN(wcsnrtombs, _TO_CEI(cl), pspriv, psenc);
+err = _FUNCNAME(wcsnrtombs_priv)(ei, s, pwcs, in, n, psenc, nresult);
+_RESTART_END(wcsnrtombs, _TO_CEI(cl), pspriv, psenc);
+
+return err;
+}
+
 static int
 /*ARGSUSED*/
 _FUNCNAME(ctype_wcstombs)(void * __restrict cl, char * __restrict s,
Index: lib/libc/citrus/citrus_none.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/citrus_none.c,v
retrieving revision 1.18
diff -u -p -r1.18 citrus_none.c
--- lib/libc/citrus/citrus_none.c14 Jun 2008 16:01:07 -00001.18
+++ lib/libc/citrus/citrus_none.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -185,6 +185,47 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _citrus_NONE_ctype_mbsrtowcs(void * __re
 }
 
 static int
+/*ARGSUSED*/
+_citrus_NONE_ctype_mbsnrtowcs(_citrus_ctype_rec_t * __restrict cc,
+     wchar_t * __restrict pwcs,
+     const char ** __restrict s, size_t in, size_t n,
+     void * __restrict pspriv,
+     size_t * __restrict nresult)
+{
+int cnt;
+const char *s0;
+
+/* if pwcs is NULL, ignore n */
+if (pwcs == NULL)
+n = 1; /* arbitrary &amp;gt;0 value */
+
+cnt = 0;
+s0 = *s; /* to keep *s unchanged for now, use copy instead. */
+while (in &amp;gt; 0 &amp;amp;&amp;amp; n &amp;gt; 0) {
+if (pwcs != NULL) {
+*pwcs = (wchar_t)(unsigned char)*s0;
+}
+if (*s0 == '\0') {
+s0 = NULL;
+break;
+}
+s0++;
+--in;
+if (pwcs != NULL) {
+pwcs++;
+n--;
+}
+cnt++;
+}
+if (pwcs)
+*s = s0;
+
+*nresult = (size_t)cnt;
+
+return (0);
+}
+
+static int
 _citrus_NONE_ctype_mbstowcs(void * __restrict cl, wchar_t * __restrict wcs,
     const char * __restrict s, size_t n,
     size_t * __restrict nresult)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -282,6 +323,48 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _citrus_NONE_ctype_wcsrtombs(void * __re
 }
 
 static int
+/*ARGSUSED*/
+_citrus_NONE_ctype_wcsnrtombs(_citrus_ctype_rec_t * __restrict cc,
+     char * __restrict s,
+     const wchar_t ** __restrict pwcs, size_t in,
+     size_t n, void * __restrict pspriv,
+     size_t * __restrict nresult)
+{
+size_t count;
+const wchar_t *pwcs0;
+
+pwcs0 = *pwcs;
+count = 0;
+
+if (s == NULL)
+n = 1;
+
+while (in &amp;gt; 0 &amp;amp;&amp;amp; n &amp;gt; 0) {
+if ((*pwcs0 &amp;amp; ~0xFFU) != 0) {
+*nresult = (size_t)-1;
+return (EILSEQ);
+}
+if (s != NULL) {
+*s++ = (char)*pwcs0;
+n--;
+}
+if (*pwcs0 == L'\0') {
+pwcs0 = NULL;
+break;
+}
+count++;
+pwcs0++;
+--in;
+}
+if (s != NULL)
+*pwcs = pwcs0;
+
+*nresult = count;
+
+return (0);
+}
+
+static int
 _citrus_NONE_ctype_wcstombs(void * __restrict cl, char * __restrict s,
     const wchar_t * __restrict pwcs, size_t n,
     size_t * __restrict nresult)
Index: lib/libc/citrus/modules/citrus_big5.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_big5.c,v
retrieving revision 1.13
diff -u -p -r1.13 citrus_big5.c
--- lib/libc/citrus/modules/citrus_big5.c23 May 2011 14:53:46 -00001.13
+++ lib/libc/citrus/modules/citrus_big5.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -115,8 +115,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _BIG5States_mbrtowc;
 _BIG5States_mbtowc;
 _BIG5States_mbsrtowcs;
+_BIG5States_mbsnrtowcs;
 _BIG5States_wcrtomb;
 _BIG5States_wcsrtombs;
+_BIG5States_wcsnrtombs;
 _BIG5States_wctomb;
 } states;
 } _BIG5CTypeInfo;
Index: lib/libc/citrus/modules/citrus_dechanyu.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_dechanyu.c,v
retrieving revision 1.4
diff -u -p -r1.4 citrus_dechanyu.c
--- lib/libc/citrus/modules/citrus_dechanyu.c19 Nov 2011 18:20:13 -00001.4
+++ lib/libc/citrus/modules/citrus_dechanyu.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -71,8 +71,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _DECHanyuStates_mbrtowc;
 _DECHanyuStates_mbtowc;
 _DECHanyuStates_mbsrtowcs;
+_DECHanyuStates_mbsnrtowcs;
 _DECHanyuStates_wcrtomb;
 _DECHanyuStates_wcsrtombs;
+_DECHanyuStates_wcsnrtombs;
 _DECHanyuStates_wctomb;
 } states;
 } _DECHanyuCTypeInfo;
Index: lib/libc/citrus/modules/citrus_euc.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_euc.c,v
retrieving revision 1.14
diff -u -p -r1.14 citrus_euc.c
--- lib/libc/citrus/modules/citrus_euc.c11 Jan 2009 02:46:24 -00001.14
+++ lib/libc/citrus/modules/citrus_euc.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,8 +107,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _EUCStates_mbrtowc;
 _EUCStates_mbtowc;
 _EUCStates_mbsrtowcs;
+_EUCStates_mbsnrtowcs;
 _EUCStates_wcrtomb;
 _EUCStates_wcsrtombs;
+_EUCStates_wcsnrtombs;
 _EUCStates_wctomb;
 } states;
 } _EUCCTypeInfo;
Index: lib/libc/citrus/modules/citrus_euctw.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_euctw.c,v
retrieving revision 1.11
diff -u -p -r1.11 citrus_euctw.c
--- lib/libc/citrus/modules/citrus_euctw.c14 Jun 2008 16:01:07 -00001.11
+++ lib/libc/citrus/modules/citrus_euctw.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -98,8 +98,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _EUCTWStates_mbrtowc;
 _EUCTWStates_mbtowc;
 _EUCTWStates_mbsrtowcs;
+_EUCTWStates_mbsnrtowcs;
 _EUCTWStates_wcrtomb;
 _EUCTWStates_wcsrtombs;
+_EUCTWStates_wcsnrtombs;
 _EUCTWStates_wctomb;
 } states;
 } _EUCTWCTypeInfo;
Index: lib/libc/citrus/modules/citrus_gbk2k.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_gbk2k.c,v
retrieving revision 1.7
diff -u -p -r1.7 citrus_gbk2k.c
--- lib/libc/citrus/modules/citrus_gbk2k.c14 Jun 2008 16:01:07 -00001.7
+++ lib/libc/citrus/modules/citrus_gbk2k.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -72,8 +72,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _GBK2KStates_mbrtowc;
 _GBK2KStates_mbtowc;
 _GBK2KStates_mbsrtowcs;
+_GBK2KStates_mbsnrtowcs;
 _GBK2KStates_wcrtomb;
 _GBK2KStates_wcsrtombs;
+_GBK2KStates_wcsnrtombs;
 _GBK2KStates_wctomb;
 } states;
 } _GBK2KCTypeInfo;
Index: lib/libc/citrus/modules/citrus_hz.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_hz.c,v
retrieving revision 1.2
diff -u -p -r1.2 citrus_hz.c
--- lib/libc/citrus/modules/citrus_hz.c14 Jun 2008 16:01:07 -00001.2
+++ lib/libc/citrus/modules/citrus_hz.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -143,8 +143,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _HZStates_mbrtowc;
 _HZStates_mbtowc;
 _HZStates_mbsrtowcs;
+_HZStates_mbsnrtowcs;
 _HZStates_wcrtomb;
 _HZStates_wcsrtombs;
+_HZStates_wcsnrtombs;
 _HZStates_wctomb;
 } states;
 } _HZCTypeInfo;
Index: lib/libc/citrus/modules/citrus_iso2022.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_iso2022.c,v
retrieving revision 1.22
diff -u -p -r1.22 citrus_iso2022.c
--- lib/libc/citrus/modules/citrus_iso2022.c10 Oct 2011 22:45:45 -00001.22
+++ lib/libc/citrus/modules/citrus_iso2022.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -133,8 +133,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _ISO2022States_mbrtowc;
 _ISO2022States_mbtowc;
 _ISO2022States_mbsrtowcs;
+_ISO2022States_mbsnrtowcs;
 _ISO2022States_wcrtomb;
 _ISO2022States_wcsrtombs;
+_ISO2022States_wcsnrtombs;
 _ISO2022States_wctomb;
 } states;
 } _ISO2022CTypeInfo;
Index: lib/libc/citrus/modules/citrus_johab.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_johab.c,v
retrieving revision 1.4
diff -u -p -r1.4 citrus_johab.c
--- lib/libc/citrus/modules/citrus_johab.c14 Jun 2008 16:01:07 -00001.4
+++ lib/libc/citrus/modules/citrus_johab.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -71,8 +71,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _JOHABStates_mbrtowc;
 _JOHABStates_mbtowc;
 _JOHABStates_mbsrtowcs;
+_JOHABStates_mbsnrtowcs;
 _JOHABStates_wcrtomb;
 _JOHABStates_wcsrtombs;
+_JOHABStates_wcsnrtombs;
 _JOHABStates_wctomb;
 } states;
 } _JOHABCTypeInfo;
Index: lib/libc/citrus/modules/citrus_mskanji.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_mskanji.c,v
retrieving revision 1.13
diff -u -p -r1.13 citrus_mskanji.c
--- lib/libc/citrus/modules/citrus_mskanji.c14 Jun 2008 16:01:08 -00001.13
+++ lib/libc/citrus/modules/citrus_mskanji.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,8 +107,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _MSKanjiStates_mbrtowc;
 _MSKanjiStates_mbtowc;
 _MSKanjiStates_mbsrtowcs;
+_MSKanjiStates_mbsnrtowcs;
 _MSKanjiStates_wcrtomb;
 _MSKanjiStates_wcsrtombs;
+_MSKanjiStates_wcsnrtombs;
 _MSKanjiStates_wctomb;
 } states;
 } _MSKanjiCTypeInfo;
Index: lib/libc/citrus/modules/citrus_ues.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_ues.c,v
retrieving revision 1.3
diff -u -p -r1.3 citrus_ues.c
--- lib/libc/citrus/modules/citrus_ues.c12 Feb 2012 13:51:29 -00001.3
+++ lib/libc/citrus/modules/citrus_ues.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -68,8 +68,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _UESStates_mbrtowc;
 _UESStates_mbtowc;
 _UESStates_mbsrtowcs;
+_UESStates_mbsnrtowcs;
 _UESStates_wcrtomb;
 _UESStates_wcsrtombs;
+_UESStates_wcsnrtombs;
 _UESStates_wctomb;
 } states;
 } _UESCTypeInfo;
Index: lib/libc/citrus/modules/citrus_utf7.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_utf7.c,v
retrieving revision 1.5
diff -u -p -r1.5 citrus_utf7.c
--- lib/libc/citrus/modules/citrus_utf7.c23 Aug 2006 12:57:24 -00001.5
+++ lib/libc/citrus/modules/citrus_utf7.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -79,8 +79,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _UTF7States_mbrtowc;
 _UTF7States_mbtowc;
 _UTF7States_mbsrtowcs;
+_UTF7States_mbsnrtowcs;
 _UTF7States_wcrtomb;
 _UTF7States_wcsrtombs;
+_UTF7States_wcsnrtombs;
 _UTF7States_wctomb;
 } states;
 } _UTF7CTypeInfo;
Index: lib/libc/citrus/modules/citrus_utf8.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_utf8.c,v
retrieving revision 1.17
diff -u -p -r1.17 citrus_utf8.c
--- lib/libc/citrus/modules/citrus_utf8.c14 Jun 2008 16:01:08 -00001.17
+++ lib/libc/citrus/modules/citrus_utf8.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -111,8 +111,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _UTF8States_mbrtowc;
 _UTF8States_mbtowc;
 _UTF8States_mbsrtowcs;
+_UTF8States_mbsnrtowcs;
 _UTF8States_wcrtomb;
 _UTF8States_wcsrtombs;
+_UTF8States_wcsnrtombs;
 _UTF8States_wctomb;
 } states;
 } _UTF8CTypeInfo;
Index: lib/libc/citrus/modules/citrus_viqr.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_viqr.c,v
retrieving revision 1.5
diff -u -p -r1.5 citrus_viqr.c
--- lib/libc/citrus/modules/citrus_viqr.c19 Nov 2011 18:20:13 -00001.5
+++ lib/libc/citrus/modules/citrus_viqr.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -234,8 +234,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _VIQRStates_mbrtowc;
 _VIQRStates_mbtowc;
 _VIQRStates_mbsrtowcs;
+_VIQRStates_mbsnrtowcs;
 _VIQRStates_wcrtomb;
 _VIQRStates_wcsrtombs;
+_VIQRStates_wcsnrtombs;
 _VIQRStates_wctomb;
 } states;
 } _VIQRCTypeInfo;
Index: lib/libc/citrus/modules/citrus_zw.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/citrus/modules/citrus_zw.c,v
retrieving revision 1.4
diff -u -p -r1.4 citrus_zw.c
--- lib/libc/citrus/modules/citrus_zw.c14 Jun 2008 16:01:08 -00001.4
+++ lib/libc/citrus/modules/citrus_zw.c17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,8 +77,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 _ZWStates_mbrtowc;
 _ZWStates_mbtowc;
 _ZWStates_mbsrtowcs;
+_ZWStates_mbsnrtowcs;
 _ZWStates_wcrtomb;
 _ZWStates_wcsrtombs;
+_ZWStates_wcsnrtombs;
 _ZWStates_wctomb;
 } states;
 } _ZWCTypeInfo;
Index: lib/libc/locale/multibyte_amd1.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_amd1.c,v
retrieving revision 1.12
diff -u -p -r1.12 multibyte_amd1.c
--- lib/libc/locale/multibyte_amd1.c17 May 2013 12:55:57 -00001.12
+++ lib/libc/locale/multibyte_amd1.c17 May 2013 13:11:57 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -151,6 +151,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsrtowcs(wchar_t *pwcs, const char **s,
 }
 
 size_t
+mbsnrtowcs_l(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps,
+    locale_t loc)
+{
+size_t ret;
+int err0;
+
+_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+err0 = _citrus_ctype_mbsnrtowcs(_ps_to_ctype(ps), pwcs, s, in, n,
+_ps_to_private(ps), &amp;amp;ret);
+if (err0)
+errno = err0;
+
+return ret;
+}
+
+size_t
+mbsnrtowcs(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps)
+{
+return mbsnrtowcs_l(pwcs, s, in, n, ps, _current_locale());
+}
+
+size_t
 wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
 {
 size_t ret;
Index: lib/libc/locale/multibyte_c90.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_c90.c,v
retrieving revision 1.10
diff -u -p -r1.10 multibyte_c90.c
--- lib/libc/locale/multibyte_c90.c17 May 2013 12:55:57 -00001.10
+++ lib/libc/locale/multibyte_c90.c17 May 2013 14:14:19 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,6 +45,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __RCSID("$NetBSD: multibyte_c90.c,v 1.10
 #include "citrus_module.h"
 #include "citrus_ctype.h"
 #include "runetype_local.h"
+#include "multibyte.h"
+
+#define _RUNE_LOCALE(loc) \
+    ((_RuneLocale *)((loc)-&amp;gt;part_impl[(size_t)LC_CTYPE]))
 
 #define _CITRUS_CTYPE(loc) \
     (((_RuneLocale *)((loc)-&amp;gt;part_impl[(size_t)LC_CTYPE]))-&amp;gt;rl_citrus_ctype)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -126,6 +130,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcstombs(char *s, const wchar_t *wcs, si
 return wcstombs_l(s, wcs, n, _current_locale());
 }
 
+size_t
+wcsnrtombs_l(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps,
+    locale_t loc)
+{
+size_t ret;
+int err0;
+
+_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+err0 = _citrus_ctype_wcsnrtombs(_ps_to_ctype(ps), s, ppwcs, in, n,
+_ps_to_private(ps), &amp;amp;ret);
+if (err0)
+errno = err0;
+
+return ret;
+}
+
+size_t
+wcsnrtombs(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps)
+{
+return wcsnrtombs_l(s, ppwcs, in, n, ps, _current_locale());
+}
+
 int
 wctomb_l(char *s, wchar_t wc, locale_t loc)
 {
Index: tests/lib/libc/locale/Makefile
===================================================================
RCS file: /home/joerg/repo/netbsd/src/tests/lib/libc/locale/Makefile,v
retrieving revision 1.5
diff -u -p -r1.5 Makefile
--- tests/lib/libc/locale/Makefile28 Feb 2013 21:52:02 -00001.5
+++ tests/lib/libc/locale/Makefile17 May 2013 13:08:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6,6 +6,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; TESTSDIR=${TESTSBASE}/lib/libc/locale
 
 TESTS_C+=t_mbrtowc
 TESTS_C+=t_mbstowcs
+TESTS_C+=t_mbsnrtowcs
 TESTS_C+=t_mbtowc
 TESTS_C+=t_wcscspn
 TESTS_C+=t_wcspbrk
Index: tests/lib/libc/locale/t_mbsnrtowcs.c
===================================================================
RCS file: tests/lib/libc/locale/t_mbsnrtowcs.c
diff -N tests/lib/libc/locale/t_mbsnrtowcs.c
--- /dev/null1 Jan 1970 00:00:00 -0000
+++ tests/lib/libc/locale/t_mbsnrtowcs.c21 May 2013 15:59:07 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,97 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/* $NetBSD$ */
+
+/*-
+ * Copyright (c) 2013 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &amp;lt;sys/cdefs.h&amp;gt;
+__RCSID("$NetBSD$");
+
+#include &amp;lt;locale.h&amp;gt;
+#include &amp;lt;wchar.h&amp;gt;
+
+#include &amp;lt;atf-c.h&amp;gt;
+
+static const struct test {
+const char *locale;
+const char *data;
+size_t limit;
+const wchar_t output1[64];
+size_t output1_len;
+const wchar_t output2[64];
+size_t output2_len;
+} tests[] = {
+{ "C", "ABCD0123", 4, { 0x41, 0x42, 0x43, 0x44 }, 4,
+    { 0x30, 0x31, 0x32, 0x33, 0x0 }, 5 },
+{ "en_US.UTF-8", "ABCD0123", 4, { 0x41, 0x42, 0x43, 0x44 }, 4,
+    { 0x30, 0x31, 0x32, 0x33, 0x0 }, 5 },
+{ "en_US.UTF-8", "ABC\303\2440123", 4, { 0x41, 0x42, 0x43, }, 3,
+    { 0xe4, 0x30, 0x31, 0x32, 0x33, 0x0 }, 6 },
+};
+
+ATF_TC(mbsnrtowcs);
+ATF_TC_HEAD(mbsnrtowcs, tc)
+{
+atf_tc_set_md_var(tc, "descr",
+"Checks mbsnrtowc(3) with different locales");
+}
+ATF_TC_BODY(mbsnrtowcs, tc)
+{
+size_t i;
+const struct test *t;
+mbstate_t state;
+wchar_t buf[64];
+const char *src;
+size_t len;
+
+for (i = 0; i &amp;lt; __arraycount(tests); ++i) {
+t = &amp;amp;tests[i];
+ATF_REQUIRE_STREQ(setlocale(LC_ALL, "C"), "C");
+ATF_REQUIRE(setlocale(LC_CTYPE, t-&amp;gt;locale) != NULL);
+memset(&amp;amp;state, 0, sizeof(state));
+src = t-&amp;gt;data;
+len = mbsnrtowcs(buf, &amp;amp;src, t-&amp;gt;limit,
+    __arraycount(buf), &amp;amp;state);
+ATF_REQUIRE_EQ(src, t-&amp;gt;data + t-&amp;gt;limit);
+ATF_REQUIRE_EQ(len, t-&amp;gt;output1_len);
+ATF_REQUIRE(wmemcmp(t-&amp;gt;output1, buf, len) == 0);
+len = mbsnrtowcs(buf, &amp;amp;src, strlen(src) + 1,
+    __arraycount(buf), &amp;amp;state);
+ATF_REQUIRE_EQ(len, strlen(t-&amp;gt;data) - t-&amp;gt;limit);
+ATF_REQUIRE(wmemcmp(t-&amp;gt;output2, buf, len + 1) == 0);
+ATF_REQUIRE_EQ(src, NULL);
+}
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ATF_TP_ADD_TC(tp, mbsnrtowcs);
+
+return atf_no_error();
+}
&lt;/pre&gt;</description>
    <dc:creator>Joerg Sonnenberger</dc:creator>
    <dc:date>2013-05-21T18:12:21</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16716">
    <title>libldap/libldap_r confusion</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16716</link>
    <description>&lt;pre&gt;The more I think about it, the more fundamental the problem appears to be.

If a library uses LDAP, i.e. libldap{,_r}, it can't know whether it will be
used in a threaded or non-threaded world. Should it link to libldap or to
libldap_r?

&lt;/pre&gt;</description>
    <dc:creator>Edgar Fuß</dc:creator>
    <dc:date>2013-05-21T14:26:59</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16715">
    <title>Re: Forcing PLT resolution (was: libldap/libldap_r confusion)</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16715</link>
    <description>&lt;pre&gt;
I wouldn't have thought it caused that much grief - unless someone
is using RTLD_GLOBAL...

David

&lt;/pre&gt;</description>
    <dc:creator>David Laight</dc:creator>
    <dc:date>2013-05-20T21:22:54</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16714">
    <title>Re: Incompat change (6 weeks ago) in stdio breaks formail (from procmail)</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16714</link>
    <description>&lt;pre&gt;    Date:        Sun, 19 May 2013 02:56:06 +0000
    From:        David Holland &amp;lt;dholland-tech&amp;lt; at &amp;gt;NetBSD.org&amp;gt;
    Message-ID:  &amp;lt;20130519025606.GA3700&amp;lt; at &amp;gt;netbsd.org&amp;gt;

  | I'd vote for explicitly testing for ESPIPE; it's the Right Thing (tm).

When I started sending the previous message, that was how I had expected
it to end - I even had a patch prepared which does that, which I had
intended including.   By the time I finished the message, I had pretty
much convinced myself that the simplicity of just ignoring the error
(and leaving the code the way it has been for a long long time) was
better, so, I didn't bother including the patch in the message.

But, here it is, in case others decide this is the better way.   I think
the problem needs to be fixed, one way or the other - I am not a developer,
so I don't get a vote, and either change works OK for me.

kre

Index: stdio.c
===================================================================
RCS file: /cvsroot/NetBSD/src/lib/libc/stdio/stdio.c,v
retrieving revision 1.21
diff -u -r1.21 stdio.c
--- stdio.c27 Mar 2012 15:05:42 -00001.21
+++ stdio.c19 May 2013 01:40:55 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,8 +86,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 _DIAGASSERT(buf != NULL);
 
 if (fp-&amp;gt;_flags &amp;amp; __SAPP)
-if (lseek(__sfileno(fp), (off_t)0, SEEK_END) == (off_t)-1)
-return -1;
+if (lseek(__sfileno(fp), (off_t)0, SEEK_END) == (off_t)-1) {
+if (errno == ESPIPE)/* if unseekable, OK, */
+fp-&amp;gt;_flags &amp;amp;= ~__SAPP;/* all writes append. */
+else
+return -1;
+}
 fp-&amp;gt;_flags &amp;amp;= ~__SOFF;/* in case FAPPEND mode is set */
 return write(__sfileno(fp), buf, n);
 }

&lt;/pre&gt;</description>
    <dc:creator>Robert Elz</dc:creator>
    <dc:date>2013-05-19T11:18:58</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16713">
    <title>Re: Incompat change (6 weeks ago) in stdio breaks formail (from procmail)</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16713</link>
    <description>&lt;pre&gt; &amp;gt; A seemingly inoccuous change in the latest version of lib;libc/stdio/stdio.c
 &amp;gt; made in late March ...
 &amp;gt; [snip]

I'd vote for explicitly testing for ESPIPE; it's the Right Thing (tm).

&lt;/pre&gt;</description>
    <dc:creator>David Holland</dc:creator>
    <dc:date>2013-05-19T02:56:06</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16712">
    <title>Incompat change (6 weeks ago) in stdio breaks formail (from procmail)</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16712</link>
    <description>&lt;pre&gt;A seemingly inoccuous change in the latest version of lib;libc/stdio/stdio.c
made in late March ...

--- stdio.c2012/03/20 01:42:591.20
+++ stdio.c2012/03/27 15:05:421.21

-(void) lseek(__sfileno(fp), (off_t)0, SEEK_END);
+if (lseek(__sfileno(fp), (off_t)0, SEEK_END) == (off_t)-1)
+return -1;

which looks like it should obviously be the correct thing to do
(as after all, we should always check syscall errors...) but turns
out to cause problems.

This seek is done only if the (internal) __SAPP flag is set, which is
only ever set in the case of fdopen(fd, "a").   The problem for formail
is that it does this precise operation on a fd that (in the way I use
it anyway) had fd being the (write half of) the result from pipe(2).

I am not sure why formail is using "a" mode, rather than "w" but it might
be that the same fdopen() is also used where the fd came from different
origins, and append mode is actually wanted (formail is absurdly difficult
to decipher...).   In any case, this code has worked (and still works on all
NetBSD except current) for ages, and apparently works on all other systems
(the procmail stuff seems to have hacks to deal with just about every quirk in
every system ever seen, but it has nothing for this one).

Two solutions (other than a possible patch to formail - which would take some
investigation to validate the correctness of) seem possible to me.

One would be to simply revert that change, and ignore errors from the lseek()
like was always done before.

Another possibility would be to check for ESPIPE errno, and ignore that
particular error (anything that gives ESPIPE is unseekable, hence by
definition, all writes must be at the end - nothing else makes sense - and
so the lseek() is just a waste of time in that case).   If that's the
solution, I'd check for ESPIPE, if the lseek() fails, and if that's
the error, clear __SAPP (no point ever trying the lseek() again on
that fd) and continue - return the error for other errors (though I am
not sure what other errors lseek() could ever happen - the man page
mentions just ESPIPE, EBADF (which would be detected by the immediately
following write() sys call, so ignoring that one harms nothing) and
EINVAL, which cannot happen for this particular call.

That suggests that perhaps just reverting the change, and simply ignoring
the error is a better change.

Opinions?

kre

&lt;/pre&gt;</description>
    <dc:creator>Robert Elz</dc:creator>
    <dc:date>2013-05-19T02:11:30</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16711">
    <title>Re: Forcing PLT resolution</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16711</link>
    <description>&lt;pre&gt;
Look for LD_BIND_NOW in ld.elf_so(1).

Nick



&lt;/pre&gt;</description>
    <dc:creator>Nick Hudson</dc:creator>
    <dc:date>2013-05-16T15:40:49</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16710">
    <title>Forcing PLT resolution (was: libldap/libldap_r confusion)</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16710</link>
    <description>&lt;pre&gt;Is there a method of forcing resolution of a PLT entry other then calling the
function in question?

As stated earlier in this thread, my problem is that pam_ldap loads libldap,
doesn't resolve ldap_ld_free until libldap_r has been loaded, causing havoc.

&lt;/pre&gt;</description>
    <dc:creator>Edgar Fuß</dc:creator>
    <dc:date>2013-05-16T14:21:07</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16709">
    <title>Re: libldap/libldap_r confusion</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16709</link>
    <description>&lt;pre&gt;Do we have something a la nscd so one can confine the dynamic linking
to just one process?

&lt;/pre&gt;</description>
    <dc:creator>Edgar Fuß</dc:creator>
    <dc:date>2013-05-14T10:25:28</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16708">
    <title>libldap/libldap_r confusion (was: radiusd: Error detected by libpthread: Invalid mutex.)</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16708</link>
    <description>&lt;pre&gt;Yes, the problem is the following:

radiusd calls initgroups() from the C library.
That, by /etc/nsswitch.conf, dynamically loads nss_ldap.
nss_ldap pulls in libldap (not libldap_r).
Later, radiusd dynamically loads rlm_ldap.
rlm_ldap pulls in libldap_r.
Later, nss_ldap, via PLT, calls ldap_ld_free(). Being linked against libldap,
it expects to call the libldap version of ldap_ld_free().
However, since the dynamic linker, in the meantime, has loaded libldap_r,
it resolves that PLT entry to the libldap_r version of ldap_ld_free().

My impression is that this is fundamentally broken and cannot easily be fixed.
We can link nss_ldap against libldap_r, but then some program may later pull in
libldap, and we get the same mess the other way round.

&lt;/pre&gt;</description>
    <dc:creator>Edgar Fuß</dc:creator>
    <dc:date>2013-05-13T16:55:37</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16707">
    <title>Re: Alternative access for C locale</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16707</link>
    <description>&lt;pre&gt;
Cleaned up version that merges storage used by global default locale and
the C locale as much as possible.

Joerg
Index: common/lib/libc/stdlib/_strtol.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/common/lib/libc/stdlib/_strtol.h,v
retrieving revision 1.6
diff -u -p -r1.6 _strtol.h
--- common/lib/libc/stdlib/_strtol.h26 Apr 2013 21:20:48 -00001.6
+++ common/lib/libc/stdlib/_strtol.h7 May 2013 11:16:04 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -192,14 +192,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; INT_FUNCNAME(_int_, _FUNCNAME, _l)(const
 __INT
 _FUNCNAME(const char *nptr, char **endptr, int base)
 {
-return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, *_current_locale());
+return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
+    LC_GLOBAL_LOCALE);
 }
 
 __INT
-INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base, locale_t loc)
+INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base,
+    locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
 }
 #endif
Index: common/lib/libc/stdlib/_strtoul.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/common/lib/libc/stdlib/_strtoul.h,v
retrieving revision 1.6
diff -u -p -r1.6 _strtoul.h
--- common/lib/libc/stdlib/_strtoul.h26 Apr 2013 21:20:48 -00001.6
+++ common/lib/libc/stdlib/_strtoul.h7 May 2013 12:23:57 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -152,14 +152,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; INT_FUNCNAME(_int_, _FUNCNAME, _l)(const
 __UINT
 _FUNCNAME(const char *nptr, char **endptr, int base)
 {
-return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, *_current_locale());
+return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
+    LC_GLOBAL_LOCALE);
 }
 
 __UINT
-INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base, locale_t loc)
+INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base,
+    locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
 }
 #endif
Index: include/locale.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/include/locale.h,v
retrieving revision 1.21
diff -u -p -r1.21 locale.h
--- include/locale.h30 Apr 2013 00:45:04 -00001.21
+++ include/locale.h7 May 2013 12:53:38 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,10 +85,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct _locale*locale_t;
 #  endif
 #endif
 
-#ifdef __SETLOCALE_SOURCE__
-#define _LC_GLOBAL_LOCALE((locale_t)-1)
-#endif
-
 __BEGIN_DECLS
 struct lconv *localeconv(void);
 char *setlocale(int, const char *) __RENAME(__setlocale50);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -109,6 +105,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; locale_tduplocale(locale_t);
 voidfreelocale(locale_t);
 struct lconv*localeconv_l(locale_t);
 locale_tnewlocale(int, const char *, locale_t);
+
+#ifndef _LIBC
+extern struct _locale_lc_global_locale;
+extern const struct _locale _lc_C_locale;
+#else
+extern __dso_protected struct _locale_lc_global_locale;
+extern __dso_protected const struct _locale _lc_C_locale;
+#endif
+#define LC_GLOBAL_LOCALE(&amp;amp;_lc_global_locale)
+#define LC_C_LOCALE((locale_t)__UNCONST(&amp;amp;_lc_C_locale))
 #endif
 __END_DECLS
 
Index: lib/libc/gdtoa/strtod.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtod.c,v
retrieving revision 1.13
diff -u -p -r1.13 strtod.c
--- lib/libc/gdtoa/strtod.c19 Apr 2013 10:41:53 -00001.13
+++ lib/libc/gdtoa/strtod.c7 May 2013 11:13:01 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1103,7 +1103,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtod_l(CONST char *s00, char **se
 double
 strtod(CONST char *s, char **sp)
 {
-return _int_strtod_l(s, sp, *_current_locale());
+return _int_strtod_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 #ifdef __weak_alias
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1113,7 +1113,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __weak_alias(strtod_l, _strtod_l)
 double
 strtod_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtod_l(s, sp, loc);
 }
Index: lib/libc/gdtoa/strtof.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtof.c,v
retrieving revision 1.6
diff -u -p -r1.6 strtof.c
--- lib/libc/gdtoa/strtof.c18 Apr 2013 21:54:11 -00001.6
+++ lib/libc/gdtoa/strtof.c7 May 2013 11:13:03 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -96,13 +96,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtof_l(CONST char *s, char **sp, 
 float
 strtof(CONST char *s, char **sp)
 {
-return _int_strtof_l(s, sp, *_current_locale());
+return _int_strtof_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 float
 strtof_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtof_l(s, sp, loc);
 }
Index: lib/libc/gdtoa/strtof_vaxf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtof_vaxf.c,v
retrieving revision 1.7
diff -u -p -r1.7 strtof_vaxf.c
--- lib/libc/gdtoa/strtof_vaxf.c18 Apr 2013 21:54:11 -00001.7
+++ lib/libc/gdtoa/strtof_vaxf.c7 May 2013 11:13:05 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -83,13 +83,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtof_l(CONST char *s, char **sp, 
 float
 strtof(CONST char *s, char **sp)
 {
-return _int_strtof_l(s, sp, *_current_locale());
+return _int_strtof_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 float
 strtof_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtof_l(s, sp, loc);
 }
Index: lib/libc/gdtoa/strtold_subr.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtold_subr.c,v
retrieving revision 1.2
diff -u -p -r1.2 strtold_subr.c
--- lib/libc/gdtoa/strtold_subr.c18 Apr 2013 21:54:11 -00001.2
+++ lib/libc/gdtoa/strtold_subr.c7 May 2013 11:13:07 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -53,13 +53,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtold_l(const char *nptr, char **
 long double
 strtold(CONST char *s, char **sp)
 {
-return _int_strtold_l(s, sp, *_current_locale());
+return _int_strtold_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 long double
 strtold_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtold_l(s, sp, loc);
 }
Index: lib/libc/gen/isctype.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gen/isctype.c,v
retrieving revision 1.23
diff -u -p -r1.23 isctype.c
--- lib/libc/gen/isctype.c16 Apr 2013 11:29:13 -00001.23
+++ lib/libc/gen/isctype.c7 May 2013 11:06:20 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,8 +57,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; is##name(int c) \
 int \
 is##name ## _l(int c, locale_t loc) \
 { \
-if (loc == NULL) \
-loc = _C_locale; \
 return (int)(((loc-&amp;gt;cache-&amp;gt;ctype_tab + 1)[c]) &amp;amp; (bit)); \
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -84,8 +82,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; toupper(int c)
 int
 toupper_l(int c, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return (int)(((loc-&amp;gt;cache-&amp;gt;toupper_tab + 1)[c]));
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -98,8 +94,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; tolower(int c)
 int
 tolower_l(int c, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return (int)(((loc-&amp;gt;cache-&amp;gt;tolower_tab + 1)[c]));
 }
 
Index: lib/libc/locale/Makefile.inc
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/Makefile.inc,v
retrieving revision 1.62
diff -u -p -r1.62 Makefile.inc
--- lib/libc/locale/Makefile.inc30 Apr 2013 00:45:05 -00001.62
+++ lib/libc/locale/Makefile.inc10 May 2013 11:07:03 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6,7 +6,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 SRCS+=_def_messages.c _def_monetary.c _def_numeric.c _def_time.c \
 setlocale.c __mb_cur_max.c \
-current_locale.c c_locale.c duplocale.c global_locale.c fix_grouping.c \
+duplocale.c global_locale.c fix_grouping.c \
 freelocale.c localeconv.c newlocale.c nl_langinfo.c \
 generic_lc_all.c dummy_lc_collate.c \
 wcstol.c wcstoll.c wcstoimax.c wcstoul.c wcstoull.c wcstoumax.c \
Index: lib/libc/locale/_wcstod.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstod.h,v
retrieving revision 1.3
diff -u -p -r1.3 _wcstod.h
--- lib/libc/locale/_wcstod.h18 Apr 2013 22:23:17 -00001.3
+++ lib/libc/locale/_wcstod.h7 May 2013 11:13:09 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -134,15 +134,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _RETURN_TYPE
 INT_NAME(, _FUNCNAME, )(const wchar_t * __restrict nptr,
     wchar_t ** __restrict endptr)
 {
-return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, *_current_locale());
+return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, LC_GLOBAL_LOCALE);
 }
 
 _RETURN_TYPE
 INT_NAME(, _FUNCNAME, _l)(const wchar_t * __restrict nptr,
     wchar_t ** __restrict endptr, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, loc);
 }
 #endif /*__WCSTOD_H_*/
Index: lib/libc/locale/_wcstol.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstol.h,v
retrieving revision 1.5
diff -u -p -r1.5 _wcstol.h
--- lib/libc/locale/_wcstol.h16 Apr 2013 16:52:13 -00001.5
+++ lib/libc/locale/_wcstol.h7 May 2013 11:13:11 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -150,14 +150,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __INT
 _FUNCNAME(const wchar_t *nptr, wchar_t **endptr, int base)
 {
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
-  *_current_locale());
+  LC_GLOBAL_LOCALE);
 }
 
 __INT
 INT_FUNCNAME(, _FUNCNAME, _l)(const wchar_t *nptr, wchar_t **endptr,
       int base, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
 }
Index: lib/libc/locale/_wcstoul.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstoul.h,v
retrieving revision 1.5
diff -u -p -r1.5 _wcstoul.h
--- lib/libc/locale/_wcstoul.h16 Apr 2013 16:52:13 -00001.5
+++ lib/libc/locale/_wcstoul.h7 May 2013 11:13:17 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -126,14 +126,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __UINT
 _FUNCNAME(const wchar_t *nptr, wchar_t **endptr, int base)
 {
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
-  *_current_locale());
+  LC_GLOBAL_LOCALE);
 }
 
 __UINT
 INT_FUNCNAME(, _FUNCNAME, _l)(const wchar_t *nptr, wchar_t **endptr,
       int base, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
 }
Index: lib/libc/locale/c_locale.c
===================================================================
RCS file: lib/libc/locale/c_locale.c
diff -N lib/libc/locale/c_locale.c
--- lib/libc/locale/c_locale.c21 Apr 2013 17:45:46 -00001.2
+++ /dev/null1 Jan 1970 00:00:00 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,176 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-/* $NetBSD: c_locale.c,v 1.2 2013/04/21 17:45:46 joerg Exp $ */
-
-/*-
- * Copyright (c)2008 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include &amp;lt;sys/cdefs.h&amp;gt;
-__RCSID("$NetBSD: c_locale.c,v 1.2 2013/04/21 17:45:46 joerg Exp $");
-
-#include &amp;lt;sys/types.h&amp;gt;
-#include &amp;lt;sys/ctype_bits.h&amp;gt;
-#include &amp;lt;sys/localedef.h&amp;gt;
-#include &amp;lt;langinfo.h&amp;gt;
-#include &amp;lt;limits.h&amp;gt;
-#define __SETLOCALE_SOURCE__
-#include &amp;lt;locale.h&amp;gt;
-#include &amp;lt;stdlib.h&amp;gt;
-
-#include "runetype_local.h"
-#include "setlocale_local.h"
-
-#ifndef NBCHAR_MAX
-#define NBCHAR_MAX (char)CHAR_MAX
-#endif
-
-static const struct lconv _C_ldata = {
-.decimal_point= __UNCONST("."),
-.thousands_sep= __UNCONST(""),
-.grouping= __UNCONST(""),
-.int_curr_symbol= __UNCONST(""),
-.currency_symbol= __UNCONST(""),
-.mon_decimal_point= __UNCONST(""),
-.mon_thousands_sep= __UNCONST(""),
-.mon_grouping= __UNCONST(""),
-.positive_sign= __UNCONST(""),
-.negative_sign= __UNCONST(""),
-.int_frac_digits= NBCHAR_MAX,
-.frac_digits= NBCHAR_MAX,
-.p_cs_precedes= NBCHAR_MAX,
-.p_sep_by_space= NBCHAR_MAX,
-.n_cs_precedes= NBCHAR_MAX,
-.n_sep_by_space= NBCHAR_MAX,
-.p_sign_posn= NBCHAR_MAX,
-.n_sign_posn= NBCHAR_MAX,
-.int_p_cs_precedes= NBCHAR_MAX,
-.int_n_cs_precedes= NBCHAR_MAX,
-.int_p_sep_by_space= NBCHAR_MAX,
-.int_n_sep_by_space= NBCHAR_MAX,
-.int_p_sign_posn= NBCHAR_MAX,
-.int_n_sign_posn= NBCHAR_MAX,
-};
-
-static const char *_C_items[(size_t)ALT_DIGITS + 1] = {
-[(size_t)D_T_FMT    ] = "%a %b %e %H:%M:%S %Y",
-[(size_t)D_FMT      ] = "%m/%d/%y",
-[(size_t)T_FMT      ] = "%H:%M:%S",
-[(size_t)T_FMT_AMPM ] = "%I:%M:%S %p",
-[(size_t)AM_STR     ] = "AM",
-[(size_t)PM_STR     ] = "PM",
-[(size_t)DAY_1      ] = "Sun",
-[(size_t)DAY_2      ] = "Mon",
-[(size_t)DAY_3      ] = "Tue",
-[(size_t)DAY_4      ] = "Wed",
-[(size_t)DAY_5      ] = "Thu",
-[(size_t)DAY_6      ] = "Fri",
-[(size_t)DAY_7      ] = "Sat",
-[(size_t)ABDAY_1    ] = "Sunday",
-[(size_t)ABDAY_2    ] = "Monday",
-[(size_t)ABDAY_3    ] = "Tuesday",
-[(size_t)ABDAY_4    ] = "Wednesday",
-[(size_t)ABDAY_5    ] = "Thursday",
-[(size_t)ABDAY_6    ] = "Friday",
-[(size_t)ABDAY_7    ] = "Saturday",
-[(size_t)MON_1      ] = "Jan",
-[(size_t)MON_2      ] = "Feb",
-[(size_t)MON_3      ] = "Mar",
-[(size_t)MON_4      ] = "Apr",
-[(size_t)MON_5      ] = "May",
-[(size_t)MON_6      ] = "Jun",
-[(size_t)MON_7      ] = "Jul",
-[(size_t)MON_8      ] = "Aug",
-[(size_t)MON_9      ] = "Sep",
-[(size_t)MON_10     ] = "Oct",
-[(size_t)MON_11     ] = "Nov",
-[(size_t)MON_12     ] = "Dec",
-[(size_t)ABMON_1    ] = "January",
-[(size_t)ABMON_2    ] = "February",
-[(size_t)ABMON_3    ] = "March",
-[(size_t)ABMON_4    ] = "April",
-[(size_t)ABMON_5    ] = "May",
-[(size_t)ABMON_6    ] = "June",
-[(size_t)ABMON_7    ] = "July",
-[(size_t)ABMON_8    ] = "August",
-[(size_t)ABMON_9    ] = "September",
-[(size_t)ABMON_10   ] = "October",
-[(size_t)ABMON_11   ] = "November",
-[(size_t)ABMON_12   ] = "December",
-[(size_t)RADIXCHAR  ] = ".",
-[(size_t)THOUSEP    ] = "",
-[(size_t)YESSTR     ] = "yes",
-[(size_t)YESEXPR    ] = "^[Yy]",
-[(size_t)NOSTR      ] = "no",
-[(size_t)NOEXPR     ] = "^[Nn]",
-[(size_t)CRNCYSTR   ] = NULL,
-[(size_t)CODESET    ] = "646",
-[(size_t)ERA        ] = NULL,
-[(size_t)ERA_D_FMT  ] = NULL,
-[(size_t)ERA_D_T_FMT] = NULL,
-[(size_t)ERA_T_FMT  ] = NULL,
-[(size_t)ALT_DIGITS ] = NULL,
-};
-
-static const struct _locale_cache_t _C_cache = {
-    .ctype_tab = (const unsigned short *)&amp;amp;_C_ctype_tab_[0],
-    .tolower_tab = (const short *)&amp;amp;_C_tolower_tab_[0],
-    .toupper_tab = (const short *)&amp;amp;_C_toupper_tab_[0],
-    .mb_cur_max = (size_t)1,
-    .ldata = __UNCONST(&amp;amp;_C_ldata),
-    .items = __UNCONST(&amp;amp;_C_items[0]),
-
-#ifdef __BUILD_LEGACY
-    .compat_bsdctype = (const unsigned char *)&amp;amp;_C_compat_bsdctype[0],
-#endif
-};
-
-static const struct _locale __C_locale = {
-    .cache = __UNCONST(&amp;amp;_C_cache),
-    .query = { _C_LOCALE },
-    .part_name = {
-[(size_t)LC_ALL     ] = _C_LOCALE,
-[(size_t)LC_COLLATE ] = _C_LOCALE,
-[(size_t)LC_CTYPE   ] = _C_LOCALE,
-[(size_t)LC_MONETARY] = _C_LOCALE,
-[(size_t)LC_NUMERIC ] = _C_LOCALE,
-[(size_t)LC_TIME    ] = _C_LOCALE,
-[(size_t)LC_MESSAGES] = _C_LOCALE,
-    },
-    .part_impl = {
-[(size_t)LC_ALL     ] = (_locale_part_t)NULL,
-[(size_t)LC_COLLATE ] = (_locale_part_t)NULL,
-[(size_t)LC_CTYPE   ] = (_locale_part_t)
-    __UNCONST(&amp;amp;_DefaultRuneLocale),
-[(size_t)LC_MONETARY] = (_locale_part_t)
-    __UNCONST(&amp;amp;_DefaultMonetaryLocale),
-[(size_t)LC_NUMERIC ] = (_locale_part_t)
-    __UNCONST(&amp;amp;_DefaultNumericLocale),
-[(size_t)LC_MESSAGES] = (_locale_part_t)
-    __UNCONST(&amp;amp;_DefaultMessagesLocale),
-[(size_t)LC_TIME] = (_locale_part_t)
-    __UNCONST(&amp;amp;_DefaultTimeLocale),
-    },
-};
-
-__dso_hidden struct _locale *_C_locale = __UNCONST(&amp;amp;__C_locale);
Index: lib/libc/locale/current_locale.c
===================================================================
RCS file: lib/libc/locale/current_locale.c
diff -N lib/libc/locale/current_locale.c
--- lib/libc/locale/current_locale.c14 Apr 2013 23:30:16 -00001.4
+++ /dev/null1 Jan 1970 00:00:00 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,49 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-/* $NetBSD: current_locale.c,v 1.4 2013/04/14 23:30:16 joerg Exp $ */
-
-/*-
- * Copyright (c)2008 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include &amp;lt;sys/cdefs.h&amp;gt;
-#if defined(LIBC_SCCS) &amp;amp;&amp;amp; !defined(lint)
-__RCSID("$NetBSD: current_locale.c,v 1.4 2013/04/14 23:30:16 joerg Exp $");
-#endif /* LIBC_SCCS and not lint */
-
-#include &amp;lt;sys/cdefs.h&amp;gt;
-#include &amp;lt;sys/types.h&amp;gt;
-#include &amp;lt;langinfo.h&amp;gt;
-#define __SETLOCALE_SOURCE__
-#include &amp;lt;locale.h&amp;gt;
-#include &amp;lt;stdlib.h&amp;gt;
-
-#include "setlocale_local.h"
-
-static struct _locale *__current_locale = &amp;amp;_global_locale;
-
-struct _locale **
-_current_locale(void)
-{
-return &amp;amp;__current_locale;
-}
Index: lib/libc/locale/freelocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/freelocale.c,v
retrieving revision 1.1
diff -u -p -r1.1 freelocale.c
--- lib/libc/locale/freelocale.c30 Apr 2013 00:45:05 -00001.1
+++ lib/libc/locale/freelocale.c7 May 2013 10:59:36 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -44,8 +44,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void
 freelocale(locale_t locale)
 {
 
-_DIAGASSERT(locale != _LC_GLOBAL_LOCALE);
+_DIAGASSERT(locale != LC_GLOBAL_LOCALE);
+_DIAGASSERT(locale != LC_C_LOCALE);
 _DIAGASSERT(locale != NULL);
-_DIAGASSERT(locale != &amp;amp;_global_locale);
 free(locale);
 }
Index: lib/libc/locale/global_locale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/global_locale.c,v
retrieving revision 1.16
diff -u -p -r1.16 global_locale.c
--- lib/libc/locale/global_locale.c21 Apr 2013 17:45:46 -00001.16
+++ lib/libc/locale/global_locale.c10 May 2013 11:31:19 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -47,7 +47,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __RCSID("$NetBSD: global_locale.c,v 1.16
 #define NBCHAR_MAX (char)CHAR_MAX
 #endif
 
-static struct lconv _global_ldata = {
+static const struct lconv _C_ldata = {
 .decimal_point= __UNCONST("."),
 .thousands_sep= __UNCONST(""),
 .grouping= __UNCONST(""),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -74,7 +74,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct lconv _global_ldata = {
 .int_n_sign_posn= NBCHAR_MAX,
 };
 
-static const char *_global_items[(size_t)ALT_DIGITS + 1] = {
+static const char * const _C_items [(size_t)ALT_DIGITS + 1] = {
 [(size_t)D_T_FMT    ] = "%a %b %e %H:%M:%S %Y",
 [(size_t)D_FMT      ] = "%m/%d/%y",
 [(size_t)T_FMT      ] = "%H:%M:%S",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -139,15 +139,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct _locale_cache_t _global_ca
     .tolower_tab = (const short *)&amp;amp;_C_tolower_tab_[0],
     .toupper_tab = (const short *)&amp;amp;_C_toupper_tab_[0],
     .mb_cur_max = (size_t)1,
-    .ldata = &amp;amp;_global_ldata,
-    .items = &amp;amp;_global_items[0],
+    .ldata = __UNCONST(&amp;amp;_C_ldata),
+    .items = __UNCONST(&amp;amp;_C_items[0]),
 
 #ifdef __BUILD_LEGACY
     .compat_bsdctype = (const unsigned char *)&amp;amp;_C_compat_bsdctype[0],
 #endif
 };
 
-struct _locale _global_locale = {
+__dso_protected struct _locale _lc_global_locale = {
     .cache = &amp;amp;_global_cache,
     .query = { _C_LOCALE },
     .part_name = {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -174,3 +174,44 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _locale _global_locale = {
     __UNCONST(&amp;amp;_DefaultTimeLocale),
     },
 };
+
+static const struct _locale_cache_t _C_cache = {
+    .ctype_tab = (const unsigned short *)&amp;amp;_C_ctype_tab_[0],
+    .tolower_tab = (const short *)&amp;amp;_C_tolower_tab_[0],
+    .toupper_tab = (const short *)&amp;amp;_C_toupper_tab_[0],
+    .mb_cur_max = (size_t)1,
+    .ldata = __UNCONST(&amp;amp;_C_ldata),
+    .items = __UNCONST(&amp;amp;_C_items[0]),
+
+#ifdef __BUILD_LEGACY
+    .compat_bsdctype = (const unsigned char *)&amp;amp;_C_compat_bsdctype[0],
+#endif
+};
+
+__dso_protected const struct _locale _lc_C_locale = {
+    .cache = __UNCONST(&amp;amp;_C_cache),
+    .query = { _C_LOCALE },
+    .part_name = {
+[(size_t)LC_ALL     ] = _C_LOCALE,
+[(size_t)LC_COLLATE ] = _C_LOCALE,
+[(size_t)LC_CTYPE   ] = _C_LOCALE,
+[(size_t)LC_MONETARY] = _C_LOCALE,
+[(size_t)LC_NUMERIC ] = _C_LOCALE,
+[(size_t)LC_TIME    ] = _C_LOCALE,
+[(size_t)LC_MESSAGES] = _C_LOCALE,
+    },
+    .part_impl = {
+[(size_t)LC_ALL     ] = (_locale_part_t)NULL,
+[(size_t)LC_COLLATE ] = (_locale_part_t)NULL,
+[(size_t)LC_CTYPE   ] = (_locale_part_t)
+    __UNCONST(&amp;amp;_DefaultRuneLocale),
+[(size_t)LC_MONETARY] = (_locale_part_t)
+    __UNCONST(&amp;amp;_DefaultMonetaryLocale),
+[(size_t)LC_NUMERIC ] = (_locale_part_t)
+    __UNCONST(&amp;amp;_DefaultNumericLocale),
+[(size_t)LC_MESSAGES] = (_locale_part_t)
+    __UNCONST(&amp;amp;_DefaultMessagesLocale),
+[(size_t)LC_TIME] = (_locale_part_t)
+    __UNCONST(&amp;amp;_DefaultTimeLocale),
+    },
+};
Index: lib/libc/locale/iswctype_mb.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/iswctype_mb.c,v
retrieving revision 1.12
diff -u -p -r1.12 iswctype_mb.c
--- lib/libc/locale/iswctype_mb.c16 Apr 2013 11:39:13 -00001.12
+++ lib/libc/locale/iswctype_mb.c7 May 2013 11:13:23 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,9 +57,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; isw##name##_l(wint_t wc, locale_t loc)
 _RuneLocale const *rl;\
 _WCTypeEntry const *te;\
 \
-if (loc == NULL)\
-loc = _C_locale;\
-\
 rl = _RUNE_LOCALE(loc);\
 te = &amp;amp;rl-&amp;gt;rl_wctype[index];\
 return _iswctype_priv(rl, wc, te);\
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -67,7 +64,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; isw##name##_l(wint_t wc, locale_t loc)
 int\
 isw##name(wint_t wc)\
 {\
-return isw##name##_l(wc, *_current_locale());\
+return isw##name##_l(wc, LC_GLOBAL_LOCALE);\
 }
 
 _ISWCTYPE_FUNC(alnum,  _WCTYPE_INDEX_ALNUM)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,9 +87,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; tow##name##_l(wint_t wc, locale_t loc)
 _RuneLocale const *rl;\
 _WCTransEntry const *te;\
 \
-if (loc == NULL)\
-loc = _C_locale;\
-\
 rl = _RUNE_LOCALE(loc);\
 te = &amp;amp;rl-&amp;gt;rl_wctrans[index];\
 return _towctrans_priv(wc, te);\
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -100,7 +94,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; tow##name##_l(wint_t wc, locale_t loc)
 wint_t\
 tow##name(wint_t wc)\
 {\
-return tow##name##_l(wc, *_current_locale());\
+return tow##name##_l(wc, LC_GLOBAL_LOCALE);\
 }
 _TOWCTRANS_FUNC(upper, _WCTRANS_INDEX_UPPER)
 _TOWCTRANS_FUNC(lower, _WCTRANS_INDEX_LOWER)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -111,9 +105,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctype_l(const char *charclass, locale_t
 _RuneLocale const *rl;
 size_t i;
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 for (i = 0; i &amp;lt; _WCTYPE_NINDEXES; ++i) {
 if (!strcmp(rl-&amp;gt;rl_wctype[i].te_name, charclass))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -125,7 +116,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctype_l(const char *charclass, locale_t
 wctype_t
 wctype(const char *charclass)
 {
-return wctype_l(charclass, *_current_locale());
+return wctype_l(charclass, LC_GLOBAL_LOCALE);
 }
 
 wctrans_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -134,9 +125,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctrans_l(const char *charmap, locale_t 
 _RuneLocale const *rl;
 size_t i;
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 for (i = 0; i &amp;lt; _WCTRANS_NINDEXES; ++i) {
 _DIAGASSERT(rl-&amp;gt;rl_wctrans[i].te_name != NULL);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -149,7 +137,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctrans_l(const char *charmap, locale_t 
 wctrans_t
 wctrans(const char *charmap)
 {
-return wctrans_l(charmap, *_current_locale());
+return wctrans_l(charmap, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -163,9 +151,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; iswctype_l(wint_t wc, wctype_t charclass
 return 0;
 }
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 te = (_WCTypeEntry const *)(void *)charclass;
 return _iswctype_priv(rl, wc, te);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -174,7 +159,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; iswctype_l(wint_t wc, wctype_t charclass
 int
 iswctype(wint_t wc, wctype_t charclass)
 {
-return iswctype_l(wc, charclass, *_current_locale());
+return iswctype_l(wc, charclass, LC_GLOBAL_LOCALE);
 }
 
 wint_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -209,9 +194,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcwidth_l(wchar_t wc, locale_t loc)
 if (wc == L'\0')
 return 0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 x = _runetype_priv(rl, wc);
 if (x &amp;amp; _RUNETYPE_R)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -222,7 +204,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcwidth_l(wchar_t wc, locale_t loc)
 int
 wcwidth(wchar_t wc)
 {
-return wcwidth_l(wc, *_current_locale());
+return wcwidth_l(wc, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -234,9 +216,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcswidth_l(const wchar_t * __restrict ws
 
 _DIAGASSERT(ws != NULL);
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 width = 0;
 while (wn &amp;gt; 0 &amp;amp;&amp;amp; *ws != L'\0') {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -252,5 +231,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcswidth_l(const wchar_t * __restrict ws
 int
 wcswidth(const wchar_t * __restrict ws, size_t wn)
 {
-return wcswidth_l(ws, wn, *_current_locale());
+return wcswidth_l(ws, wn, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/locale/localeconv.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/localeconv.c,v
retrieving revision 1.20
diff -u -p -r1.20 localeconv.c
--- lib/libc/locale/localeconv.c17 Apr 2013 20:40:13 -00001.20
+++ lib/libc/locale/localeconv.c7 May 2013 11:08:46 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -47,7 +47,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; localeconv(void)
 struct lconv *
 localeconv_l(locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return loc-&amp;gt;cache-&amp;gt;ldata;
 }
Index: lib/libc/locale/multibyte_amd1.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_amd1.c,v
retrieving revision 1.11
diff -u -p -r1.11 multibyte_amd1.c
--- lib/libc/locale/multibyte_amd1.c19 Apr 2013 14:35:33 -00001.11
+++ lib/libc/locale/multibyte_amd1.c7 May 2013 11:14:07 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,9 +59,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrlen_l(const char *s, size_t n, mbstat
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_mbrlen(_ps_to_ctype(ps), s, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -75,7 +72,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrlen_l(const char *s, size_t n, mbstat
 size_t
 mbrlen(const char *s, size_t n, mbstate_t *ps)
 {
-return mbrlen_l(s, n, ps, *_current_locale());
+return mbrlen_l(s, n, ps, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,9 +85,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsinit_l(const mbstate_t *ps, locale_t 
 if (ps == NULL)
 return 1;
 
-if (loc == NULL)
-loc = _C_locale;
-
 if (_ps_to_runelocale(ps) == NULL)
 rl = _RUNE_LOCALE(loc);
 else
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -108,7 +102,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsinit_l(const mbstate_t *ps, locale_t 
 int
 mbsinit(const mbstate_t *ps)
 {
-return mbsinit_l(ps, *_current_locale());
+return mbsinit_l(ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -117,9 +111,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrtowc_l(wchar_t *pwc, const char *s, s
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_mbrtowc(_ps_to_ctype(ps), pwc, s, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -133,7 +124,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrtowc_l(wchar_t *pwc, const char *s, s
 size_t
 mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
 {
-return mbrtowc_l(pwc, s, n, ps, *_current_locale());
+return mbrtowc_l(pwc, s, n, ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -143,9 +134,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsrtowcs_l(wchar_t *pwcs, const char **
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_mbsrtowcs(_ps_to_ctype(ps), pwcs, s, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -159,17 +147,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsrtowcs_l(wchar_t *pwcs, const char **
 size_t
 mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps)
 {
-return mbsrtowcs_l(pwcs, s, n, ps, *_current_locale());
+return mbsrtowcs_l(pwcs, s, n, ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
-wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
+mbsnrtowcs_l(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps,
+    locale_t loc)
 {
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
+_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+err0 = _citrus_ctype_mbsnrtowcs(_ps_to_ctype(ps), pwcs, s, in, n,
+_ps_to_private(ps), &amp;amp;ret);
+if (err0)
+errno = err0;
+
+return ret;
+}
+
+size_t
+mbsnrtowcs(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps)
+{
+return mbsnrtowcs_l(pwcs, s, in, n, ps, LC_GLOBAL_LOCALE);
+}
+
+size_t
+wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
+{
+size_t ret;
+int err0;
 
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -184,7 +192,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcrtomb_l(char *s, wchar_t wc, mbstate_t
 size_t
 wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
 {
-return wcrtomb_l(s, wc, ps, *_current_locale());
+return wcrtomb_l(s, wc, ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -194,9 +202,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsrtombs_l(char *s, const wchar_t **ppw
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_wcsrtombs(_ps_to_ctype(ps), s, ppwcs, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -210,7 +215,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsrtombs_l(char *s, const wchar_t **ppw
 size_t
 wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps)
 {
-return wcsrtombs_l(s, ppwcs, n, ps, *_current_locale());
+return wcsrtombs_l(s, ppwcs, n, ps, LC_GLOBAL_LOCALE);
+}
+
+size_t
+wcsnrtombs_l(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps,
+    locale_t loc)
+{
+size_t ret;
+int err0;
+
+_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+err0 = _citrus_ctype_wcsnrtombs(_ps_to_ctype(ps), s, ppwcs, in, n,
+_ps_to_private(ps), &amp;amp;ret);
+if (err0)
+errno = err0;
+
+return ret;
+}
+
+size_t
+wcsnrtombs(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps)
+{
+return wcsnrtombs_l(s, ppwcs, in, n, ps, LC_GLOBAL_LOCALE);
 }
 
 wint_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -219,9 +247,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; btowc_l(int c, locale_t loc)
 wint_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_btowc(_CITRUS_CTYPE(loc), c, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -232,7 +257,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; btowc_l(int c, locale_t loc)
 wint_t
 btowc(int c)
 {
-return btowc_l(c, *_current_locale());
+return btowc_l(c, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -241,9 +266,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctob_l(wint_t wc, locale_t loc)
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_wctob(_CITRUS_CTYPE(loc), wc, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -254,14 +276,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctob_l(wint_t wc, locale_t loc)
 int
 wctob(wint_t wc)
 {
-return wctob_l(wc, *_current_locale());
+return wctob_l(wc, LC_GLOBAL_LOCALE);
 }
 
 size_t
 _mb_cur_max_l(locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 
 return _citrus_ctype_get_mb_cur_max(_CITRUS_CTYPE(loc));
 }
Index: lib/libc/locale/multibyte_c90.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_c90.c,v
retrieving revision 1.9
diff -u -p -r1.9 multibyte_c90.c
--- lib/libc/locale/multibyte_c90.c18 Apr 2013 22:22:21 -00001.9
+++ lib/libc/locale/multibyte_c90.c7 May 2013 11:13:29 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -55,9 +55,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mblen_l(const char *s, size_t n, locale_
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_mblen(_CITRUS_CTYPE(loc), s, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,7 +66,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mblen_l(const char *s, size_t n, locale_
 int
 mblen(const char *s, size_t n)
 {
-return mblen_l(s, n, *_current_locale());
+return mblen_l(s, n, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -78,9 +75,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbstowcs_l(wchar_t *pwcs, const char *s,
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_mbstowcs(_CITRUS_CTYPE(loc), pwcs, s, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -91,7 +85,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbstowcs_l(wchar_t *pwcs, const char *s,
 size_t
 mbstowcs(wchar_t *pwcs, const char *s, size_t n)
 {
-return mbstowcs_l(pwcs, s, n, *_current_locale());
+return mbstowcs_l(pwcs, s, n, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -100,9 +94,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbtowc_l(wchar_t *pw, const char *s, siz
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_mbtowc(_CITRUS_CTYPE(loc), pw, s, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -113,7 +104,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbtowc_l(wchar_t *pw, const char *s, siz
 int
 mbtowc(wchar_t *pw, const char *s, size_t n)
 {
-return mbtowc_l(pw, s, n, *_current_locale());
+return mbtowc_l(pw, s, n, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -122,9 +113,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcstombs_l(char *s, const wchar_t *wcs, 
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_wcstombs(_CITRUS_CTYPE(loc), s, wcs, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -135,7 +123,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcstombs_l(char *s, const wchar_t *wcs, 
 size_t
 wcstombs(char *s, const wchar_t *wcs, size_t n)
 {
-return wcstombs_l(s, wcs, n, *_current_locale());
+return wcstombs_l(s, wcs, n, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -144,9 +132,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctomb_l(char *s, wchar_t wc, locale_t l
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_wctomb(_CITRUS_CTYPE(loc), s, wc, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -157,5 +142,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctomb_l(char *s, wchar_t wc, locale_t l
 int
 wctomb(char *s, wchar_t wc)
 {
-return wctomb_l(s, wc, *_current_locale());
+return wctomb_l(s, wc, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/locale/nb_lc_template.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/nb_lc_template.h,v
retrieving revision 1.5
diff -u -p -r1.5 nb_lc_template.h
--- lib/libc/locale/nb_lc_template.h14 Apr 2013 23:30:16 -00001.5
+++ lib/libc/locale/nb_lc_template.h7 May 2013 11:02:28 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -236,7 +236,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _PREFIX(setlocale)(const char * __restri
 locale-&amp;gt;part_impl[(size_t)_CATEGORY_ID]
     = part-&amp;gt;impl;
 _PREFIX(build_cache)(locale-&amp;gt;cache, part-&amp;gt;impl);
-if (locale == &amp;amp;_global_locale)
+if (locale == LC_GLOBAL_LOCALE)
 _PREFIX(fixup)(part-&amp;gt;impl);
 }
 }
Index: lib/libc/locale/newlocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/newlocale.c,v
retrieving revision 1.1
diff -u -p -r1.1 newlocale.c
--- lib/libc/locale/newlocale.c30 Apr 2013 00:45:05 -00001.1
+++ lib/libc/locale/newlocale.c7 May 2013 11:14:14 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -55,7 +55,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; newlocale(int mask, const char *name, lo
 if (dst == NULL)
 return (locale_t)NULL;
 if (src == NULL)
-src = *_current_locale();
+src = LC_GLOBAL_LOCALE;
 memcpy(dst, src, sizeof(*src));
 strlcpy(&amp;amp;head[0], name, sizeof(head));
 tokens[0] = (const char *)&amp;amp;head[0];
Index: lib/libc/locale/setlocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/setlocale.c,v
retrieving revision 1.62
diff -u -p -r1.62 setlocale.c
--- lib/libc/locale/setlocale.c30 Apr 2013 00:45:05 -00001.62
+++ lib/libc/locale/setlocale.c7 May 2013 11:14:18 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -101,7 +101,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __setlocale(int category, const char *na
 sl = _find_category(category);
 if (sl == NULL)
 return NULL;
-impl = *_current_locale();
+impl = LC_GLOBAL_LOCALE;
 return __UNCONST((*sl)(name, impl));
 }
 
Index: lib/libc/locale/setlocale_local.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/setlocale_local.h,v
retrieving revision 1.11
diff -u -p -r1.11 setlocale_local.h
--- lib/libc/locale/setlocale_local.h14 Apr 2013 23:44:54 -00001.11
+++ lib/libc/locale/setlocale_local.h7 May 2013 14:00:12 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,7 +66,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef const char *(*_locale_set_t)(con
 __BEGIN_DECLS
 _locale_set_t_find_category(int);
 const char*_get_locale_env(const char *);
-struct _locale**_current_locale(void);
 char*__setlocale(int, const char *);
 
 const char *_generic_LC_ALL_setlocale(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,14 +84,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const char *_citrus_LC_MESSAGES_setlocal
     const char * __restrict, struct _locale * __restrict);
 __END_DECLS
 
+#ifdef _LIBC
+extern __dso_protected struct _locale_lc_global_locale;
+
 static __inline struct _locale_cache_t *
 _current_cache(void)
 {
-return (*_current_locale())-&amp;gt;cache;
+return _lc_global_locale.cache;
 }
+#endif
 
-extern struct _locale_global_locale;
-extern __dso_hidden struct _locale *_C_locale;
 extern size_t __mb_len_max_runtime;
 
 #endif /*_SETLOCALE_LOCAL_H_*/
Index: lib/libc/locale/wcscoll.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/wcscoll.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcscoll.c
--- lib/libc/locale/wcscoll.c18 Apr 2013 23:24:27 -00001.3
+++ lib/libc/locale/wcscoll.c7 May 2013 11:14:00 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -44,8 +44,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __RCSID("$NetBSD: wcscoll.c,v 1.3 2013/0
 int
 wcscoll_l(const wchar_t *s1, const wchar_t *s2, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 /* XXX: LC_COLLATE should be implemented. */
 /* LINTED */ (void)loc;
 return (wcscmp(s1, s2));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,5 +52,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcscoll_l(const wchar_t *s1, const wchar
 int
 wcscoll(const wchar_t *s1, const wchar_t *s2)
 {
-return wcscoll_l(s1, s2, *_current_locale());
+return wcscoll_l(s1, s2, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/locale/wcsxfrm.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/wcsxfrm.c,v
retrieving revision 1.4
diff -u -p -r1.4 wcsxfrm.c
--- lib/libc/locale/wcsxfrm.c18 Apr 2013 23:24:27 -00001.4
+++ lib/libc/locale/wcsxfrm.c7 May 2013 11:14:02 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -46,8 +46,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsxfrm_l(wchar_t *s1, const wchar_t *s2
 {
 size_t len;
 
-if (loc == NULL)
-loc = _C_locale;
 /* XXX: LC_COLLATE should be implemented. */
 /* LINTED */(void)loc;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,5 +67,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsxfrm_l(wchar_t *s1, const wchar_t *s2
 size_t
 wcsxfrm(wchar_t *s1, const wchar_t *s2, size_t n)
 {
-return wcsxfrm_l(s1, s2, n, *_current_locale());
+return wcsxfrm_l(s1, s2, n, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/stdio/vasprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vasprintf.c,v
retrieving revision 1.15
diff -u -p -r1.15 vasprintf.c
--- lib/libc/stdio/vasprintf.c19 Apr 2013 15:22:25 -00001.15
+++ lib/libc/stdio/vasprintf.c7 May 2013 11:14:24 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,7 +88,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; err:
 int
 vasprintf(char **str, const char *fmt, va_list ap)
 {
-return vasprintf_l(str, *_current_locale(), fmt, ap);
+return vasprintf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
Index: lib/libc/stdio/vdprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vdprintf.c,v
retrieving revision 1.3
diff -u -p -r1.3 vdprintf.c
--- lib/libc/stdio/vdprintf.c19 Apr 2013 15:22:25 -00001.3
+++ lib/libc/stdio/vdprintf.c7 May 2013 11:14:26 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -121,5 +121,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vdprintf_l(int fd, locale_t loc, const c
 int
 vdprintf(int fd, const char * __restrict fmt, va_list ap)
 {
-return vdprintf_l(fd, *_current_locale(), fmt, ap);
+return vdprintf_l(fd, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/stdio/vfscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfscanf.c,v
retrieving revision 1.44
diff -u -p -r1.44 vfscanf.c
--- lib/libc/stdio/vfscanf.c19 Apr 2013 23:32:17 -00001.44
+++ lib/libc/stdio/vfscanf.c7 May 2013 11:14:28 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -132,7 +132,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __collate_range_cmp(int c1, int c2, loca
 int
 __svfscanf(FILE *fp, char const *fmt0, va_list ap)
 {
-return __svfscanf_l(fp, *_current_locale(), fmt0, ap);
+return __svfscanf_l(fp, LC_GLOBAL_LOCALE, fmt0, ap);
 }
 
 int
Index: lib/libc/stdio/vfwprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfwprintf.c,v
retrieving revision 1.31
diff -u -p -r1.31 vfwprintf.c
--- lib/libc/stdio/vfwprintf.c19 Apr 2013 15:22:25 -00001.31
+++ lib/libc/stdio/vfwprintf.c7 May 2013 11:14:55 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -552,7 +552,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; WDECL(vf,printf)(FILE * __restrict fp, c
 int ret;
 
 FLOCKFILE(fp);
-ret = WDECL(__vf,printf_unlocked_l)(fp, *_current_locale(), fmt0, ap);
+ret = WDECL(__vf,printf_unlocked_l)(fp, LC_GLOBAL_LOCALE, fmt0, ap);
 FUNLOCKFILE(fp);
 return ret;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -705,9 +705,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; WDECL(__vf,printf_unlocked_l)(FILE *fp, 
 static const char xdigs_lower[16] = "0123456789abcdef";
 static const char xdigs_upper[16] = "0123456789ABCDEF";
 
-if (loc == NULL)
-loc = _C_locale;
-
 /*
  * BEWARE, these `goto error' on error, PRINT uses `n2' and
  * PAD uses `n'.
Index: lib/libc/stdio/vfwscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfwscanf.c,v
retrieving revision 1.9
diff -u -p -r1.9 vfwscanf.c
--- lib/libc/stdio/vfwscanf.c19 Apr 2013 23:32:17 -00001.9
+++ lib/libc/stdio/vfwscanf.c7 May 2013 11:14:54 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -114,7 +114,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int parsefloat(FILE *, wchar_t *,
 int
 vfwscanf(FILE * __restrict fp, const wchar_t * __restrict fmt, va_list ap)
 {
-return vfwscanf_l(fp, *_current_locale(), fmt, ap);
+return vfwscanf_l(fp, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -171,9 +171,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __vfwscanf_unlocked_l(FILE * __restrict 
 static short basefix[17] =
 { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
 
-if (loc == NULL)
-loc = _C_locale;
-
 nassigned = 0;
 nconversions = 0;
 nread = 0;
Index: lib/libc/stdio/vsnprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsnprintf.c,v
retrieving revision 1.26
diff -u -p -r1.26 vsnprintf.c
--- lib/libc/stdio/vsnprintf.c19 Apr 2013 15:22:25 -00001.26
+++ lib/libc/stdio/vsnprintf.c7 May 2013 11:14:52 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -100,7 +100,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vsnprintf_l(char *str, size_t n, locale_
 int
 vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
 {
-return vsnprintf_l(str, n, *_current_locale(), fmt, ap);
+return vsnprintf_l(str, n, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
Index: lib/libc/stdio/vsprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsprintf.c,v
retrieving revision 1.18
diff -u -p -r1.18 vsprintf.c
--- lib/libc/stdio/vsprintf.c19 Apr 2013 15:22:25 -00001.18
+++ lib/libc/stdio/vsprintf.c7 May 2013 11:14:51 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -83,7 +83,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vsprintf_l(char *str, locale_t loc, cons
 int
 vsprintf(char *str, const char *fmt, va_list ap)
 {
-return vsprintf_l(str, *_current_locale(), fmt, ap);
+return vsprintf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
Index: lib/libc/stdio/vsscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsscanf.c,v
retrieving revision 1.20
diff -u -p -r1.20 vsscanf.c
--- lib/libc/stdio/vsscanf.c19 Apr 2013 23:32:17 -00001.20
+++ lib/libc/stdio/vsscanf.c7 May 2013 11:14:49 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,5 +85,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vsscanf_l(const char *str, locale_t loc,
 int
 vsscanf(const char *str, const char *fmt, va_list ap)
 {
-return vsscanf_l(str, *_current_locale(), fmt, ap);
+return vsscanf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/stdio/vswprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vswprintf.c,v
retrieving revision 1.4
diff -u -p -r1.4 vswprintf.c
--- lib/libc/stdio/vswprintf.c19 Apr 2013 15:22:25 -00001.4
+++ lib/libc/stdio/vswprintf.c7 May 2013 11:14:48 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -109,5 +109,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int
 vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
     va_list ap)
 {
-return vswprintf_l(s, n, *_current_locale(), fmt, ap);
+return vswprintf_l(s, n, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/stdio/vswscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vswscanf.c,v
retrieving revision 1.11
diff -u -p -r1.11 vswscanf.c
--- lib/libc/stdio/vswscanf.c22 Apr 2013 19:33:53 -00001.11
+++ lib/libc/stdio/vswscanf.c7 May 2013 11:14:46 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -115,5 +115,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int
 vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
     va_list ap)
 {
-return vswscanf_l(str, *_current_locale(), fmt, ap);
+return vswscanf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/string/strcoll.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/strcoll.c,v
retrieving revision 1.11
diff -u -p -r1.11 strcoll.c
--- lib/libc/string/strcoll.c19 Apr 2013 23:28:47 -00001.11
+++ lib/libc/string/strcoll.c7 May 2013 11:14:44 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,7 +57,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int
 strcoll(const char *s1, const char *s2)
 {
 
-return strcoll_l(s1, s2, *_current_locale());
+return strcoll_l(s1, s2, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,9 +66,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strcoll_l(const char *s1, const char *s2
 _DIAGASSERT(s1 != NULL);
 _DIAGASSERT(s2 != NULL);
 
-if (loc == NULL)
-loc = _C_locale;
-
 /* LC_COLLATE is unimplemented, hence always "C" */
 /* LINTED */ (void)loc;
 return (strcmp(s1, s2));
Index: lib/libc/string/strxfrm.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/strxfrm.c,v
retrieving revision 1.13
diff -u -p -r1.13 strxfrm.c
--- lib/libc/string/strxfrm.c19 Apr 2013 23:28:47 -00001.13
+++ lib/libc/string/strxfrm.c7 May 2013 11:14:42 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -62,8 +62,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strxfrm_l(char *dst, const char *src, si
 
 _DIAGASSERT(src != NULL);
 
-if (loc == NULL)
-loc = _C_locale;
 /* XXX: LC_COLLATE should be implemented. */
 /* LINTED */(void)loc;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -83,5 +81,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strxfrm_l(char *dst, const char *src, si
 size_t
 strxfrm(char *dst, const char *src, size_t n)
 {
-return strxfrm_l(dst, src, n, *_current_locale());
+return strxfrm_l(dst, src, n, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/string/wcscasecmp.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/wcscasecmp.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcscasecmp.c
--- lib/libc/string/wcscasecmp.c18 Apr 2013 23:24:27 -00001.3
+++ lib/libc/string/wcscasecmp.c7 May 2013 11:14:40 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,9 +33,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcscasecmp_l(const wchar_t *s1, const wc
 int lc2  = 0;
 int diff = 0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _DIAGASSERT(s1);
 _DIAGASSERT(s2);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,5 +55,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcscasecmp_l(const wchar_t *s1, const wc
 int
 wcscasecmp(const wchar_t *s1, const wchar_t *s2)
 {
-return wcscasecmp_l(s1, s2, *_current_locale());
+return wcscasecmp_l(s1, s2, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/string/wcsncasecmp.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/wcsncasecmp.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcsncasecmp.c
--- lib/libc/string/wcsncasecmp.c18 Apr 2013 23:24:27 -00001.3
+++ lib/libc/string/wcsncasecmp.c7 May 2013 11:14:39 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,9 +36,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsncasecmp_l(const wchar_t *s1, const w
 _DIAGASSERT(s1);
 _DIAGASSERT(s2);
 
-if (loc == NULL)
-loc = _C_locale;
-
 while (n--) {
 lc1 = towlower_l(*s1, loc);
 lc2 = towlower_l(*s2, loc);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,5 +57,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsncasecmp_l(const wchar_t *s1, const w
 int
 wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n)
 {
-return wcsncasecmp_l(s1, s2, n, *_current_locale());
+return wcsncasecmp_l(s1, s2, n, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/time/strftime.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/time/strftime.c,v
retrieving revision 1.25
diff -u -p -r1.25 strftime.c
--- lib/libc/time/strftime.c21 Apr 2013 17:45:46 -00001.25
+++ lib/libc/time/strftime.c7 May 2013 11:14:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -111,7 +111,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; size_t
 strftime_z(const timezone_t sp, char * __restrict s, size_t maxsize,
     const char * __restrict format, const struct tm * __restrict t)
 {
-return strftime_lz(sp, s, maxsize, format, t, *_current_locale());
+return strftime_lz(sp, s, maxsize, format, t, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -121,9 +121,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strftime_lz(const timezone_t sp, char *c
 char *p;
 intwarn;
 
-if (loc == NULL)
-loc = _C_locale;
-
 warn = IN_NONE;
 p = _fmt(sp, ((format == NULL) ? "%c" : format), t, s, s + maxsize,
     &amp;amp;warn, loc);
Index: lib/libc/time/strptime.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/time/strptime.c,v
retrieving revision 1.37
diff -u -p -r1.37 strptime.c
--- lib/libc/time/strptime.c21 Apr 2013 17:45:47 -00001.37
+++ lib/libc/time/strptime.c7 May 2013 11:14:34 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,7 +77,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const u_char *find_string(const u
 char *
 strptime(const char *buf, const char *fmt, struct tm *tm)
 {
-return strptime_l(buf, fmt, tm, *_current_locale());
+return strptime_l(buf, fmt, tm, LC_GLOBAL_LOCALE);
 }
 
 char *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,9 +88,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strptime_l(const char *buf, const char *
 int alt_format, i, split_year = 0, neg = 0, offs;
 const char *new_fmt;
 
-if (loc == NULL)
-loc = _C_locale;
-
 bp = (const u_char *)buf;
 
 while (bp != NULL &amp;amp;&amp;amp; (c = *fmt++) != '\0') {
&lt;/pre&gt;</description>
    <dc:creator>Joerg Sonnenberger</dc:creator>
    <dc:date>2013-05-10T16:51:01</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16706">
    <title>Re: radiusd: Error detected by libpthread: Invalid mutex.</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16706</link>
    <description>&lt;pre&gt;But it does use the system ldap, doesn't it? Only nss uses libldap while rlm_ldap uses libldap_r.
&lt;/pre&gt;</description>
    <dc:creator>Edgar Fuß</dc:creator>
    <dc:date>2013-05-10T21:01:51</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16705">
    <title>Re: radiusd: Error detected by libpthread: Invalid mutex.</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16705</link>
    <description>&lt;pre&gt;In article &amp;lt;20130510181446.GN27359&amp;lt; at &amp;gt;trav.math.uni-bonn.de&amp;gt;,
Edgar Fuß  &amp;lt;ef&amp;lt; at &amp;gt;math.uni-bonn.de&amp;gt; wrote:

Using 2 copies of the library is asking for trouble. I suggest that the
package should be changed to use the system ldap copy if available like
we do with openssl.

christos


&lt;/pre&gt;</description>
    <dc:creator>Christos Zoulas</dc:creator>
    <dc:date>2013-05-10T20:39:32</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16704">
    <title>Re: radiusd: Error detected by libpthread: Invalid mutex.</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16704</link>
    <description>&lt;pre&gt;I'm making some progress on this. That ldap_ld_free() is called from a
pthread_atfork (child) handler installed by nss_ldap.

However, I had a hard time setting breakpoints that where not hit despite
the corresponding function showing up in a later backtrace until I realized
that I had TWO copies of LDAP libraries in memory: One libldap pulled in by
nss_ldap and one libldap_r pulled in by FreeRADIUS' rlm_ldap module.

Question one: Is that alone (i.e. using both libldap and libldap_r) asking
for trouble?

Question two: If not, how do I set a breakpoint on a specific incarnation
of ldap_foobar?

&lt;/pre&gt;</description>
    <dc:creator>Edgar Fuß</dc:creator>
    <dc:date>2013-05-10T18:14:48</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16703">
    <title>Re: where is res_nupdate()?</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16703</link>
    <description>&lt;pre&gt;
It works fine.

&lt;/pre&gt;</description>
    <dc:creator>Emmanuel Dreyfus</dc:creator>
    <dc:date>2013-05-10T09:45:45</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16702">
    <title>Re: where is res_nupdate()?</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16702</link>
    <description>&lt;pre&gt;&lt;/pre&gt;</description>
    <dc:creator>Christos Zoulas</dc:creator>
    <dc:date>2013-05-10T02:05:53</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16701">
    <title>Re: where is res_nupdate()?</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16701</link>
    <description>&lt;pre&gt;

That builds fine. I copied the file below to a NetBSD-6.0 systelm and it
see no regression. I will test res_update functionnality later and send
the pullup.

lib/libc.so -&amp;gt; libc.so.12.181
lib/libc.so.12 -&amp;gt; libc.so.12.181
lib/libc.so.12.181  
usr/lib/libc.a  
usr/lib/libc.so -&amp;gt; ../../lib/libc.so.12.181
usr/lib/libc.so.12 -&amp;gt; ../../lib/libc.so.12.181
usr/lib/libc.so.12.181 -&amp;gt; ../../lib/libc.so.12.181
usr/lib/libresolv.a  
usr/lib/libresolv.so -&amp;gt; libresolv.so.3.0
usr/lib/libresolv.so.3 -&amp;gt; libresolv.so.3.0
usr/lib/libresolv.so.3.0  
usr/include/res_update.h 

&lt;/pre&gt;</description>
    <dc:creator>Emmanuel Dreyfus</dc:creator>
    <dc:date>2013-05-10T00:46:30</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16700">
    <title>Alternative access for C locale</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16700</link>
    <description>&lt;pre&gt;Hi all,
there was a concern about exposing the C locale via the special NULL
argument on source-changes. The attached patch provides LC_C_LOCALE and
LC_GLOBAL_LOCALE for access to the corresponding locales. Inside libc,
they are protected, so that access can avoid the GOT and use PC relative
addressing if supported by the platform. This removes the last potential
performance penality of the *_l wrapping.

The patch allows LC_GLOBAL_LOCALE for all locale functions, which is an
extension over POSIX. LC_C_LOCALE can be easily implemented using
newlocale() if necessary on platforms lacking it. I'm in the process of
getting it supported e.g. by Apple as well.

The patch contains one chunk from the mbsnrtowcs patch that is unrelated
and not for commit, but I don't want to edit that out before commit time.

Joerg
Index: include/locale.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/include/locale.h,v
retrieving revision 1.21
diff -u -p -r1.21 locale.h
--- include/locale.h30 Apr 2013 00:45:04 -00001.21
+++ include/locale.h7 May 2013 12:53:38 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,10 +85,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct _locale*locale_t;
 #  endif
 #endif
 
-#ifdef __SETLOCALE_SOURCE__
-#define _LC_GLOBAL_LOCALE((locale_t)-1)
-#endif
-
 __BEGIN_DECLS
 struct lconv *localeconv(void);
 char *setlocale(int, const char *) __RENAME(__setlocale50);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -109,6 +105,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; locale_tduplocale(locale_t);
 voidfreelocale(locale_t);
 struct lconv*localeconv_l(locale_t);
 locale_tnewlocale(int, const char *, locale_t);
+
+#ifndef _LIBC
+extern struct _locale_lc_global_locale;
+extern const struct _locale _lc_C_locale;
+#else
+extern __dso_protected struct _locale_lc_global_locale;
+extern __dso_protected const struct _locale _lc_C_locale;
+#endif
+#define LC_GLOBAL_LOCALE(&amp;amp;_lc_global_locale)
+#define LC_C_LOCALE((locale_t)__UNCONST(&amp;amp;_lc_C_locale))
 #endif
 __END_DECLS
 
Index: lib/libc/gdtoa/strtod.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtod.c,v
retrieving revision 1.13
diff -u -p -r1.13 strtod.c
--- lib/libc/gdtoa/strtod.c19 Apr 2013 10:41:53 -00001.13
+++ lib/libc/gdtoa/strtod.c7 May 2013 11:13:01 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1103,7 +1103,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtod_l(CONST char *s00, char **se
 double
 strtod(CONST char *s, char **sp)
 {
-return _int_strtod_l(s, sp, *_current_locale());
+return _int_strtod_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 #ifdef __weak_alias
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1113,7 +1113,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __weak_alias(strtod_l, _strtod_l)
 double
 strtod_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtod_l(s, sp, loc);
 }
Index: lib/libc/gdtoa/strtof.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtof.c,v
retrieving revision 1.6
diff -u -p -r1.6 strtof.c
--- lib/libc/gdtoa/strtof.c18 Apr 2013 21:54:11 -00001.6
+++ lib/libc/gdtoa/strtof.c7 May 2013 11:13:03 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -96,13 +96,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtof_l(CONST char *s, char **sp, 
 float
 strtof(CONST char *s, char **sp)
 {
-return _int_strtof_l(s, sp, *_current_locale());
+return _int_strtof_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 float
 strtof_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtof_l(s, sp, loc);
 }
Index: lib/libc/gdtoa/strtof_vaxf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtof_vaxf.c,v
retrieving revision 1.7
diff -u -p -r1.7 strtof_vaxf.c
--- lib/libc/gdtoa/strtof_vaxf.c18 Apr 2013 21:54:11 -00001.7
+++ lib/libc/gdtoa/strtof_vaxf.c7 May 2013 11:13:05 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -83,13 +83,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtof_l(CONST char *s, char **sp, 
 float
 strtof(CONST char *s, char **sp)
 {
-return _int_strtof_l(s, sp, *_current_locale());
+return _int_strtof_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 float
 strtof_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtof_l(s, sp, loc);
 }
Index: lib/libc/gdtoa/strtold_subr.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtold_subr.c,v
retrieving revision 1.2
diff -u -p -r1.2 strtold_subr.c
--- lib/libc/gdtoa/strtold_subr.c18 Apr 2013 21:54:11 -00001.2
+++ lib/libc/gdtoa/strtold_subr.c7 May 2013 11:13:07 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -53,13 +53,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _int_strtold_l(const char *nptr, char **
 long double
 strtold(CONST char *s, char **sp)
 {
-return _int_strtold_l(s, sp, *_current_locale());
+return _int_strtold_l(s, sp, LC_GLOBAL_LOCALE);
 }
 
 long double
 strtold_l(CONST char *s, char **sp, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return _int_strtold_l(s, sp, loc);
 }
Index: lib/libc/gen/isctype.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gen/isctype.c,v
retrieving revision 1.23
diff -u -p -r1.23 isctype.c
--- lib/libc/gen/isctype.c16 Apr 2013 11:29:13 -00001.23
+++ lib/libc/gen/isctype.c7 May 2013 11:06:20 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,8 +57,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; is##name(int c) \
 int \
 is##name ## _l(int c, locale_t loc) \
 { \
-if (loc == NULL) \
-loc = _C_locale; \
 return (int)(((loc-&amp;gt;cache-&amp;gt;ctype_tab + 1)[c]) &amp;amp; (bit)); \
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -84,8 +82,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; toupper(int c)
 int
 toupper_l(int c, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return (int)(((loc-&amp;gt;cache-&amp;gt;toupper_tab + 1)[c]));
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -98,8 +94,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; tolower(int c)
 int
 tolower_l(int c, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return (int)(((loc-&amp;gt;cache-&amp;gt;tolower_tab + 1)[c]));
 }
 
Index: lib/libc/locale/Makefile.inc
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/Makefile.inc,v
retrieving revision 1.62
diff -u -p -r1.62 Makefile.inc
--- lib/libc/locale/Makefile.inc30 Apr 2013 00:45:05 -00001.62
+++ lib/libc/locale/Makefile.inc7 May 2013 11:03:43 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6,7 +6,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 SRCS+=_def_messages.c _def_monetary.c _def_numeric.c _def_time.c \
 setlocale.c __mb_cur_max.c \
-current_locale.c c_locale.c duplocale.c global_locale.c fix_grouping.c \
+c_locale.c duplocale.c global_locale.c fix_grouping.c \
 freelocale.c localeconv.c newlocale.c nl_langinfo.c \
 generic_lc_all.c dummy_lc_collate.c \
 wcstol.c wcstoll.c wcstoimax.c wcstoul.c wcstoull.c wcstoumax.c \
Index: lib/libc/locale/_wcstod.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstod.h,v
retrieving revision 1.3
diff -u -p -r1.3 _wcstod.h
--- lib/libc/locale/_wcstod.h18 Apr 2013 22:23:17 -00001.3
+++ lib/libc/locale/_wcstod.h7 May 2013 11:13:09 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -134,15 +134,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _RETURN_TYPE
 INT_NAME(, _FUNCNAME, )(const wchar_t * __restrict nptr,
     wchar_t ** __restrict endptr)
 {
-return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, *_current_locale());
+return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, LC_GLOBAL_LOCALE);
 }
 
 _RETURN_TYPE
 INT_NAME(, _FUNCNAME, _l)(const wchar_t * __restrict nptr,
     wchar_t ** __restrict endptr, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, loc);
 }
 #endif /*__WCSTOD_H_*/
Index: lib/libc/locale/_wcstol.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstol.h,v
retrieving revision 1.5
diff -u -p -r1.5 _wcstol.h
--- lib/libc/locale/_wcstol.h16 Apr 2013 16:52:13 -00001.5
+++ lib/libc/locale/_wcstol.h7 May 2013 11:13:11 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -150,14 +150,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __INT
 _FUNCNAME(const wchar_t *nptr, wchar_t **endptr, int base)
 {
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
-  *_current_locale());
+  LC_GLOBAL_LOCALE);
 }
 
 __INT
 INT_FUNCNAME(, _FUNCNAME, _l)(const wchar_t *nptr, wchar_t **endptr,
       int base, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
 }
Index: lib/libc/locale/_wcstoul.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstoul.h,v
retrieving revision 1.5
diff -u -p -r1.5 _wcstoul.h
--- lib/libc/locale/_wcstoul.h16 Apr 2013 16:52:13 -00001.5
+++ lib/libc/locale/_wcstoul.h7 May 2013 11:13:17 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -126,14 +126,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __UINT
 _FUNCNAME(const wchar_t *nptr, wchar_t **endptr, int base)
 {
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
-  *_current_locale());
+  LC_GLOBAL_LOCALE);
 }
 
 __UINT
 INT_FUNCNAME(, _FUNCNAME, _l)(const wchar_t *nptr, wchar_t **endptr,
       int base, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
 }
Index: lib/libc/locale/c_locale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/c_locale.c,v
retrieving revision 1.2
diff -u -p -r1.2 c_locale.c
--- lib/libc/locale/c_locale.c21 Apr 2013 17:45:46 -00001.2
+++ lib/libc/locale/c_locale.c7 May 2013 12:24:56 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -145,7 +145,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct _locale_cache_t _C_c
 #endif
 };
 
-static const struct _locale __C_locale = {
+__dso_protected const struct _locale _lc_C_locale = {
     .cache = __UNCONST(&amp;amp;_C_cache),
     .query = { _C_LOCALE },
     .part_name = {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -172,5 +172,3 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct _locale __C_locale =
     __UNCONST(&amp;amp;_DefaultTimeLocale),
     },
 };
-
-__dso_hidden struct _locale *_C_locale = __UNCONST(&amp;amp;__C_locale);
Index: lib/libc/locale/current_locale.c
===================================================================
RCS file: lib/libc/locale/current_locale.c
diff -N lib/libc/locale/current_locale.c
--- lib/libc/locale/current_locale.c14 Apr 2013 23:30:16 -00001.4
+++ /dev/null1 Jan 1970 00:00:00 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,49 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-/* $NetBSD: current_locale.c,v 1.4 2013/04/14 23:30:16 joerg Exp $ */
-
-/*-
- * Copyright (c)2008 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include &amp;lt;sys/cdefs.h&amp;gt;
-#if defined(LIBC_SCCS) &amp;amp;&amp;amp; !defined(lint)
-__RCSID("$NetBSD: current_locale.c,v 1.4 2013/04/14 23:30:16 joerg Exp $");
-#endif /* LIBC_SCCS and not lint */
-
-#include &amp;lt;sys/cdefs.h&amp;gt;
-#include &amp;lt;sys/types.h&amp;gt;
-#include &amp;lt;langinfo.h&amp;gt;
-#define __SETLOCALE_SOURCE__
-#include &amp;lt;locale.h&amp;gt;
-#include &amp;lt;stdlib.h&amp;gt;
-
-#include "setlocale_local.h"
-
-static struct _locale *__current_locale = &amp;amp;_global_locale;
-
-struct _locale **
-_current_locale(void)
-{
-return &amp;amp;__current_locale;
-}
Index: lib/libc/locale/freelocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/freelocale.c,v
retrieving revision 1.1
diff -u -p -r1.1 freelocale.c
--- lib/libc/locale/freelocale.c30 Apr 2013 00:45:05 -00001.1
+++ lib/libc/locale/freelocale.c7 May 2013 10:59:36 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -44,8 +44,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void
 freelocale(locale_t locale)
 {
 
-_DIAGASSERT(locale != _LC_GLOBAL_LOCALE);
+_DIAGASSERT(locale != LC_GLOBAL_LOCALE);
+_DIAGASSERT(locale != LC_C_LOCALE);
 _DIAGASSERT(locale != NULL);
-_DIAGASSERT(locale != &amp;amp;_global_locale);
 free(locale);
 }
Index: lib/libc/locale/global_locale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/global_locale.c,v
retrieving revision 1.16
diff -u -p -r1.16 global_locale.c
--- lib/libc/locale/global_locale.c21 Apr 2013 17:45:46 -00001.16
+++ lib/libc/locale/global_locale.c7 May 2013 11:03:15 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -147,7 +147,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct _locale_cache_t _global_ca
 #endif
 };
 
-struct _locale _global_locale = {
+__dso_protected struct _locale _lc_global_locale = {
     .cache = &amp;amp;_global_cache,
     .query = { _C_LOCALE },
     .part_name = {
Index: lib/libc/locale/iswctype_mb.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/iswctype_mb.c,v
retrieving revision 1.12
diff -u -p -r1.12 iswctype_mb.c
--- lib/libc/locale/iswctype_mb.c16 Apr 2013 11:39:13 -00001.12
+++ lib/libc/locale/iswctype_mb.c7 May 2013 11:13:23 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,9 +57,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; isw##name##_l(wint_t wc, locale_t loc)
 _RuneLocale const *rl;\
 _WCTypeEntry const *te;\
 \
-if (loc == NULL)\
-loc = _C_locale;\
-\
 rl = _RUNE_LOCALE(loc);\
 te = &amp;amp;rl-&amp;gt;rl_wctype[index];\
 return _iswctype_priv(rl, wc, te);\
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -67,7 +64,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; isw##name##_l(wint_t wc, locale_t loc)
 int\
 isw##name(wint_t wc)\
 {\
-return isw##name##_l(wc, *_current_locale());\
+return isw##name##_l(wc, LC_GLOBAL_LOCALE);\
 }
 
 _ISWCTYPE_FUNC(alnum,  _WCTYPE_INDEX_ALNUM)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,9 +87,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; tow##name##_l(wint_t wc, locale_t loc)
 _RuneLocale const *rl;\
 _WCTransEntry const *te;\
 \
-if (loc == NULL)\
-loc = _C_locale;\
-\
 rl = _RUNE_LOCALE(loc);\
 te = &amp;amp;rl-&amp;gt;rl_wctrans[index];\
 return _towctrans_priv(wc, te);\
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -100,7 +94,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; tow##name##_l(wint_t wc, locale_t loc)
 wint_t\
 tow##name(wint_t wc)\
 {\
-return tow##name##_l(wc, *_current_locale());\
+return tow##name##_l(wc, LC_GLOBAL_LOCALE);\
 }
 _TOWCTRANS_FUNC(upper, _WCTRANS_INDEX_UPPER)
 _TOWCTRANS_FUNC(lower, _WCTRANS_INDEX_LOWER)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -111,9 +105,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctype_l(const char *charclass, locale_t
 _RuneLocale const *rl;
 size_t i;
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 for (i = 0; i &amp;lt; _WCTYPE_NINDEXES; ++i) {
 if (!strcmp(rl-&amp;gt;rl_wctype[i].te_name, charclass))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -125,7 +116,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctype_l(const char *charclass, locale_t
 wctype_t
 wctype(const char *charclass)
 {
-return wctype_l(charclass, *_current_locale());
+return wctype_l(charclass, LC_GLOBAL_LOCALE);
 }
 
 wctrans_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -134,9 +125,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctrans_l(const char *charmap, locale_t 
 _RuneLocale const *rl;
 size_t i;
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 for (i = 0; i &amp;lt; _WCTRANS_NINDEXES; ++i) {
 _DIAGASSERT(rl-&amp;gt;rl_wctrans[i].te_name != NULL);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -149,7 +137,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctrans_l(const char *charmap, locale_t 
 wctrans_t
 wctrans(const char *charmap)
 {
-return wctrans_l(charmap, *_current_locale());
+return wctrans_l(charmap, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -163,9 +151,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; iswctype_l(wint_t wc, wctype_t charclass
 return 0;
 }
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 te = (_WCTypeEntry const *)(void *)charclass;
 return _iswctype_priv(rl, wc, te);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -174,7 +159,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; iswctype_l(wint_t wc, wctype_t charclass
 int
 iswctype(wint_t wc, wctype_t charclass)
 {
-return iswctype_l(wc, charclass, *_current_locale());
+return iswctype_l(wc, charclass, LC_GLOBAL_LOCALE);
 }
 
 wint_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -209,9 +194,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcwidth_l(wchar_t wc, locale_t loc)
 if (wc == L'\0')
 return 0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 x = _runetype_priv(rl, wc);
 if (x &amp;amp; _RUNETYPE_R)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -222,7 +204,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcwidth_l(wchar_t wc, locale_t loc)
 int
 wcwidth(wchar_t wc)
 {
-return wcwidth_l(wc, *_current_locale());
+return wcwidth_l(wc, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -234,9 +216,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcswidth_l(const wchar_t * __restrict ws
 
 _DIAGASSERT(ws != NULL);
 
-if (loc == NULL)
-loc = _C_locale;
-
 rl = _RUNE_LOCALE(loc);
 width = 0;
 while (wn &amp;gt; 0 &amp;amp;&amp;amp; *ws != L'\0') {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -252,5 +231,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcswidth_l(const wchar_t * __restrict ws
 int
 wcswidth(const wchar_t * __restrict ws, size_t wn)
 {
-return wcswidth_l(ws, wn, *_current_locale());
+return wcswidth_l(ws, wn, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/locale/localeconv.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/localeconv.c,v
retrieving revision 1.20
diff -u -p -r1.20 localeconv.c
--- lib/libc/locale/localeconv.c17 Apr 2013 20:40:13 -00001.20
+++ lib/libc/locale/localeconv.c7 May 2013 11:08:46 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -47,7 +47,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; localeconv(void)
 struct lconv *
 localeconv_l(locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 return loc-&amp;gt;cache-&amp;gt;ldata;
 }
Index: lib/libc/locale/multibyte_amd1.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_amd1.c,v
retrieving revision 1.11
diff -u -p -r1.11 multibyte_amd1.c
--- lib/libc/locale/multibyte_amd1.c19 Apr 2013 14:35:33 -00001.11
+++ lib/libc/locale/multibyte_amd1.c7 May 2013 11:14:07 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,9 +59,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrlen_l(const char *s, size_t n, mbstat
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_mbrlen(_ps_to_ctype(ps), s, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -75,7 +72,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrlen_l(const char *s, size_t n, mbstat
 size_t
 mbrlen(const char *s, size_t n, mbstate_t *ps)
 {
-return mbrlen_l(s, n, ps, *_current_locale());
+return mbrlen_l(s, n, ps, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,9 +85,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsinit_l(const mbstate_t *ps, locale_t 
 if (ps == NULL)
 return 1;
 
-if (loc == NULL)
-loc = _C_locale;
-
 if (_ps_to_runelocale(ps) == NULL)
 rl = _RUNE_LOCALE(loc);
 else
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -108,7 +102,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsinit_l(const mbstate_t *ps, locale_t 
 int
 mbsinit(const mbstate_t *ps)
 {
-return mbsinit_l(ps, *_current_locale());
+return mbsinit_l(ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -117,9 +111,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrtowc_l(wchar_t *pwc, const char *s, s
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_mbrtowc(_ps_to_ctype(ps), pwc, s, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -133,7 +124,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbrtowc_l(wchar_t *pwc, const char *s, s
 size_t
 mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
 {
-return mbrtowc_l(pwc, s, n, ps, *_current_locale());
+return mbrtowc_l(pwc, s, n, ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -143,9 +134,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsrtowcs_l(wchar_t *pwcs, const char **
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_mbsrtowcs(_ps_to_ctype(ps), pwcs, s, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -159,17 +147,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbsrtowcs_l(wchar_t *pwcs, const char **
 size_t
 mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps)
 {
-return mbsrtowcs_l(pwcs, s, n, ps, *_current_locale());
+return mbsrtowcs_l(pwcs, s, n, ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
-wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
+mbsnrtowcs_l(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps,
+    locale_t loc)
 {
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
+_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+err0 = _citrus_ctype_mbsnrtowcs(_ps_to_ctype(ps), pwcs, s, in, n,
+_ps_to_private(ps), &amp;amp;ret);
+if (err0)
+errno = err0;
+
+return ret;
+}
+
+size_t
+mbsnrtowcs(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps)
+{
+return mbsnrtowcs_l(pwcs, s, in, n, ps, LC_GLOBAL_LOCALE);
+}
+
+size_t
+wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
+{
+size_t ret;
+int err0;
 
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -184,7 +192,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcrtomb_l(char *s, wchar_t wc, mbstate_t
 size_t
 wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
 {
-return wcrtomb_l(s, wc, ps, *_current_locale());
+return wcrtomb_l(s, wc, ps, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -194,9 +202,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsrtombs_l(char *s, const wchar_t **ppw
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
 
 err0 = _citrus_ctype_wcsrtombs(_ps_to_ctype(ps), s, ppwcs, n,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -210,7 +215,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsrtombs_l(char *s, const wchar_t **ppw
 size_t
 wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps)
 {
-return wcsrtombs_l(s, ppwcs, n, ps, *_current_locale());
+return wcsrtombs_l(s, ppwcs, n, ps, LC_GLOBAL_LOCALE);
+}
+
+size_t
+wcsnrtombs_l(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps,
+    locale_t loc)
+{
+size_t ret;
+int err0;
+
+_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+err0 = _citrus_ctype_wcsnrtombs(_ps_to_ctype(ps), s, ppwcs, in, n,
+_ps_to_private(ps), &amp;amp;ret);
+if (err0)
+errno = err0;
+
+return ret;
+}
+
+size_t
+wcsnrtombs(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps)
+{
+return wcsnrtombs_l(s, ppwcs, in, n, ps, LC_GLOBAL_LOCALE);
 }
 
 wint_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -219,9 +247,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; btowc_l(int c, locale_t loc)
 wint_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_btowc(_CITRUS_CTYPE(loc), c, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -232,7 +257,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; btowc_l(int c, locale_t loc)
 wint_t
 btowc(int c)
 {
-return btowc_l(c, *_current_locale());
+return btowc_l(c, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -241,9 +266,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctob_l(wint_t wc, locale_t loc)
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_wctob(_CITRUS_CTYPE(loc), wc, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -254,14 +276,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctob_l(wint_t wc, locale_t loc)
 int
 wctob(wint_t wc)
 {
-return wctob_l(wc, *_current_locale());
+return wctob_l(wc, LC_GLOBAL_LOCALE);
 }
 
 size_t
 _mb_cur_max_l(locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 
 return _citrus_ctype_get_mb_cur_max(_CITRUS_CTYPE(loc));
 }
Index: lib/libc/locale/multibyte_c90.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_c90.c,v
retrieving revision 1.9
diff -u -p -r1.9 multibyte_c90.c
--- lib/libc/locale/multibyte_c90.c18 Apr 2013 22:22:21 -00001.9
+++ lib/libc/locale/multibyte_c90.c7 May 2013 11:13:29 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -55,9 +55,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mblen_l(const char *s, size_t n, locale_
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_mblen(_CITRUS_CTYPE(loc), s, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,7 +66,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mblen_l(const char *s, size_t n, locale_
 int
 mblen(const char *s, size_t n)
 {
-return mblen_l(s, n, *_current_locale());
+return mblen_l(s, n, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -78,9 +75,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbstowcs_l(wchar_t *pwcs, const char *s,
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_mbstowcs(_CITRUS_CTYPE(loc), pwcs, s, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -91,7 +85,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbstowcs_l(wchar_t *pwcs, const char *s,
 size_t
 mbstowcs(wchar_t *pwcs, const char *s, size_t n)
 {
-return mbstowcs_l(pwcs, s, n, *_current_locale());
+return mbstowcs_l(pwcs, s, n, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -100,9 +94,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbtowc_l(wchar_t *pw, const char *s, siz
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_mbtowc(_CITRUS_CTYPE(loc), pw, s, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -113,7 +104,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mbtowc_l(wchar_t *pw, const char *s, siz
 int
 mbtowc(wchar_t *pw, const char *s, size_t n)
 {
-return mbtowc_l(pw, s, n, *_current_locale());
+return mbtowc_l(pw, s, n, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -122,9 +113,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcstombs_l(char *s, const wchar_t *wcs, 
 size_t ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_wcstombs(_CITRUS_CTYPE(loc), s, wcs, n, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -135,7 +123,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcstombs_l(char *s, const wchar_t *wcs, 
 size_t
 wcstombs(char *s, const wchar_t *wcs, size_t n)
 {
-return wcstombs_l(s, wcs, n, *_current_locale());
+return wcstombs_l(s, wcs, n, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -144,9 +132,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctomb_l(char *s, wchar_t wc, locale_t l
 int ret;
 int err0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 err0 = _citrus_ctype_wctomb(_CITRUS_CTYPE(loc), s, wc, &amp;amp;ret);
 if (err0)
 errno = err0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -157,5 +142,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wctomb_l(char *s, wchar_t wc, locale_t l
 int
 wctomb(char *s, wchar_t wc)
 {
-return wctomb_l(s, wc, *_current_locale());
+return wctomb_l(s, wc, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/locale/nb_lc_template.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/nb_lc_template.h,v
retrieving revision 1.5
diff -u -p -r1.5 nb_lc_template.h
--- lib/libc/locale/nb_lc_template.h14 Apr 2013 23:30:16 -00001.5
+++ lib/libc/locale/nb_lc_template.h7 May 2013 11:02:28 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -236,7 +236,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _PREFIX(setlocale)(const char * __restri
 locale-&amp;gt;part_impl[(size_t)_CATEGORY_ID]
     = part-&amp;gt;impl;
 _PREFIX(build_cache)(locale-&amp;gt;cache, part-&amp;gt;impl);
-if (locale == &amp;amp;_global_locale)
+if (locale == LC_GLOBAL_LOCALE)
 _PREFIX(fixup)(part-&amp;gt;impl);
 }
 }
Index: lib/libc/locale/newlocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/newlocale.c,v
retrieving revision 1.1
diff -u -p -r1.1 newlocale.c
--- lib/libc/locale/newlocale.c30 Apr 2013 00:45:05 -00001.1
+++ lib/libc/locale/newlocale.c7 May 2013 11:14:14 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -55,7 +55,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; newlocale(int mask, const char *name, lo
 if (dst == NULL)
 return (locale_t)NULL;
 if (src == NULL)
-src = *_current_locale();
+src = LC_GLOBAL_LOCALE;
 memcpy(dst, src, sizeof(*src));
 strlcpy(&amp;amp;head[0], name, sizeof(head));
 tokens[0] = (const char *)&amp;amp;head[0];
Index: lib/libc/locale/setlocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/setlocale.c,v
retrieving revision 1.62
diff -u -p -r1.62 setlocale.c
--- lib/libc/locale/setlocale.c30 Apr 2013 00:45:05 -00001.62
+++ lib/libc/locale/setlocale.c7 May 2013 11:14:18 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -101,7 +101,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __setlocale(int category, const char *na
 sl = _find_category(category);
 if (sl == NULL)
 return NULL;
-impl = *_current_locale();
+impl = LC_GLOBAL_LOCALE;
 return __UNCONST((*sl)(name, impl));
 }
 
Index: lib/libc/locale/setlocale_local.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/setlocale_local.h,v
retrieving revision 1.11
diff -u -p -r1.11 setlocale_local.h
--- lib/libc/locale/setlocale_local.h14 Apr 2013 23:44:54 -00001.11
+++ lib/libc/locale/setlocale_local.h7 May 2013 14:00:12 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,7 +66,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef const char *(*_locale_set_t)(con
 __BEGIN_DECLS
 _locale_set_t_find_category(int);
 const char*_get_locale_env(const char *);
-struct _locale**_current_locale(void);
 char*__setlocale(int, const char *);
 
 const char *_generic_LC_ALL_setlocale(
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,14 +84,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const char *_citrus_LC_MESSAGES_setlocal
     const char * __restrict, struct _locale * __restrict);
 __END_DECLS
 
+#ifdef _LIBC
+extern __dso_protected struct _locale_lc_global_locale;
+
 static __inline struct _locale_cache_t *
 _current_cache(void)
 {
-return (*_current_locale())-&amp;gt;cache;
+return _lc_global_locale.cache;
 }
+#endif
 
-extern struct _locale_global_locale;
-extern __dso_hidden struct _locale *_C_locale;
 extern size_t __mb_len_max_runtime;
 
 #endif /*_SETLOCALE_LOCAL_H_*/
Index: lib/libc/locale/wcscoll.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/wcscoll.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcscoll.c
--- lib/libc/locale/wcscoll.c18 Apr 2013 23:24:27 -00001.3
+++ lib/libc/locale/wcscoll.c7 May 2013 11:14:00 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -44,8 +44,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __RCSID("$NetBSD: wcscoll.c,v 1.3 2013/0
 int
 wcscoll_l(const wchar_t *s1, const wchar_t *s2, locale_t loc)
 {
-if (loc == NULL)
-loc = _C_locale;
 /* XXX: LC_COLLATE should be implemented. */
 /* LINTED */ (void)loc;
 return (wcscmp(s1, s2));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,5 +52,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcscoll_l(const wchar_t *s1, const wchar
 int
 wcscoll(const wchar_t *s1, const wchar_t *s2)
 {
-return wcscoll_l(s1, s2, *_current_locale());
+return wcscoll_l(s1, s2, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/locale/wcsxfrm.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/wcsxfrm.c,v
retrieving revision 1.4
diff -u -p -r1.4 wcsxfrm.c
--- lib/libc/locale/wcsxfrm.c18 Apr 2013 23:24:27 -00001.4
+++ lib/libc/locale/wcsxfrm.c7 May 2013 11:14:02 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -46,8 +46,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsxfrm_l(wchar_t *s1, const wchar_t *s2
 {
 size_t len;
 
-if (loc == NULL)
-loc = _C_locale;
 /* XXX: LC_COLLATE should be implemented. */
 /* LINTED */(void)loc;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,5 +67,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsxfrm_l(wchar_t *s1, const wchar_t *s2
 size_t
 wcsxfrm(wchar_t *s1, const wchar_t *s2, size_t n)
 {
-return wcsxfrm_l(s1, s2, n, *_current_locale());
+return wcsxfrm_l(s1, s2, n, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/stdio/vasprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vasprintf.c,v
retrieving revision 1.15
diff -u -p -r1.15 vasprintf.c
--- lib/libc/stdio/vasprintf.c19 Apr 2013 15:22:25 -00001.15
+++ lib/libc/stdio/vasprintf.c7 May 2013 11:14:24 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,7 +88,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; err:
 int
 vasprintf(char **str, const char *fmt, va_list ap)
 {
-return vasprintf_l(str, *_current_locale(), fmt, ap);
+return vasprintf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
Index: lib/libc/stdio/vdprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vdprintf.c,v
retrieving revision 1.3
diff -u -p -r1.3 vdprintf.c
--- lib/libc/stdio/vdprintf.c19 Apr 2013 15:22:25 -00001.3
+++ lib/libc/stdio/vdprintf.c7 May 2013 11:14:26 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -121,5 +121,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vdprintf_l(int fd, locale_t loc, const c
 int
 vdprintf(int fd, const char * __restrict fmt, va_list ap)
 {
-return vdprintf_l(fd, *_current_locale(), fmt, ap);
+return vdprintf_l(fd, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/stdio/vfscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfscanf.c,v
retrieving revision 1.44
diff -u -p -r1.44 vfscanf.c
--- lib/libc/stdio/vfscanf.c19 Apr 2013 23:32:17 -00001.44
+++ lib/libc/stdio/vfscanf.c7 May 2013 11:14:28 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -132,7 +132,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __collate_range_cmp(int c1, int c2, loca
 int
 __svfscanf(FILE *fp, char const *fmt0, va_list ap)
 {
-return __svfscanf_l(fp, *_current_locale(), fmt0, ap);
+return __svfscanf_l(fp, LC_GLOBAL_LOCALE, fmt0, ap);
 }
 
 int
Index: lib/libc/stdio/vfwprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfwprintf.c,v
retrieving revision 1.31
diff -u -p -r1.31 vfwprintf.c
--- lib/libc/stdio/vfwprintf.c19 Apr 2013 15:22:25 -00001.31
+++ lib/libc/stdio/vfwprintf.c7 May 2013 11:14:55 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -552,7 +552,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; WDECL(vf,printf)(FILE * __restrict fp, c
 int ret;
 
 FLOCKFILE(fp);
-ret = WDECL(__vf,printf_unlocked_l)(fp, *_current_locale(), fmt0, ap);
+ret = WDECL(__vf,printf_unlocked_l)(fp, LC_GLOBAL_LOCALE, fmt0, ap);
 FUNLOCKFILE(fp);
 return ret;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -705,9 +705,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; WDECL(__vf,printf_unlocked_l)(FILE *fp, 
 static const char xdigs_lower[16] = "0123456789abcdef";
 static const char xdigs_upper[16] = "0123456789ABCDEF";
 
-if (loc == NULL)
-loc = _C_locale;
-
 /*
  * BEWARE, these `goto error' on error, PRINT uses `n2' and
  * PAD uses `n'.
Index: lib/libc/stdio/vfwscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfwscanf.c,v
retrieving revision 1.9
diff -u -p -r1.9 vfwscanf.c
--- lib/libc/stdio/vfwscanf.c19 Apr 2013 23:32:17 -00001.9
+++ lib/libc/stdio/vfwscanf.c7 May 2013 11:14:54 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -114,7 +114,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int parsefloat(FILE *, wchar_t *,
 int
 vfwscanf(FILE * __restrict fp, const wchar_t * __restrict fmt, va_list ap)
 {
-return vfwscanf_l(fp, *_current_locale(), fmt, ap);
+return vfwscanf_l(fp, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -171,9 +171,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __vfwscanf_unlocked_l(FILE * __restrict 
 static short basefix[17] =
 { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
 
-if (loc == NULL)
-loc = _C_locale;
-
 nassigned = 0;
 nconversions = 0;
 nread = 0;
Index: lib/libc/stdio/vsnprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsnprintf.c,v
retrieving revision 1.26
diff -u -p -r1.26 vsnprintf.c
--- lib/libc/stdio/vsnprintf.c19 Apr 2013 15:22:25 -00001.26
+++ lib/libc/stdio/vsnprintf.c7 May 2013 11:14:52 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -100,7 +100,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vsnprintf_l(char *str, size_t n, locale_
 int
 vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
 {
-return vsnprintf_l(str, n, *_current_locale(), fmt, ap);
+return vsnprintf_l(str, n, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
Index: lib/libc/stdio/vsprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsprintf.c,v
retrieving revision 1.18
diff -u -p -r1.18 vsprintf.c
--- lib/libc/stdio/vsprintf.c19 Apr 2013 15:22:25 -00001.18
+++ lib/libc/stdio/vsprintf.c7 May 2013 11:14:51 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -83,7 +83,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vsprintf_l(char *str, locale_t loc, cons
 int
 vsprintf(char *str, const char *fmt, va_list ap)
 {
-return vsprintf_l(str, *_current_locale(), fmt, ap);
+return vsprintf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
 
 int
Index: lib/libc/stdio/vsscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsscanf.c,v
retrieving revision 1.20
diff -u -p -r1.20 vsscanf.c
--- lib/libc/stdio/vsscanf.c19 Apr 2013 23:32:17 -00001.20
+++ lib/libc/stdio/vsscanf.c7 May 2013 11:14:49 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,5 +85,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; vsscanf_l(const char *str, locale_t loc,
 int
 vsscanf(const char *str, const char *fmt, va_list ap)
 {
-return vsscanf_l(str, *_current_locale(), fmt, ap);
+return vsscanf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/stdio/vswprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vswprintf.c,v
retrieving revision 1.4
diff -u -p -r1.4 vswprintf.c
--- lib/libc/stdio/vswprintf.c19 Apr 2013 15:22:25 -00001.4
+++ lib/libc/stdio/vswprintf.c7 May 2013 11:14:48 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -109,5 +109,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int
 vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
     va_list ap)
 {
-return vswprintf_l(s, n, *_current_locale(), fmt, ap);
+return vswprintf_l(s, n, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/stdio/vswscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vswscanf.c,v
retrieving revision 1.11
diff -u -p -r1.11 vswscanf.c
--- lib/libc/stdio/vswscanf.c22 Apr 2013 19:33:53 -00001.11
+++ lib/libc/stdio/vswscanf.c7 May 2013 11:14:46 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -115,5 +115,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int
 vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
     va_list ap)
 {
-return vswscanf_l(str, *_current_locale(), fmt, ap);
+return vswscanf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
 }
Index: lib/libc/string/strcoll.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/strcoll.c,v
retrieving revision 1.11
diff -u -p -r1.11 strcoll.c
--- lib/libc/string/strcoll.c19 Apr 2013 23:28:47 -00001.11
+++ lib/libc/string/strcoll.c7 May 2013 11:14:44 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,7 +57,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int
 strcoll(const char *s1, const char *s2)
 {
 
-return strcoll_l(s1, s2, *_current_locale());
+return strcoll_l(s1, s2, LC_GLOBAL_LOCALE);
 }
 
 int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,9 +66,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strcoll_l(const char *s1, const char *s2
 _DIAGASSERT(s1 != NULL);
 _DIAGASSERT(s2 != NULL);
 
-if (loc == NULL)
-loc = _C_locale;
-
 /* LC_COLLATE is unimplemented, hence always "C" */
 /* LINTED */ (void)loc;
 return (strcmp(s1, s2));
Index: lib/libc/string/strxfrm.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/strxfrm.c,v
retrieving revision 1.13
diff -u -p -r1.13 strxfrm.c
--- lib/libc/string/strxfrm.c19 Apr 2013 23:28:47 -00001.13
+++ lib/libc/string/strxfrm.c7 May 2013 11:14:42 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -62,8 +62,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strxfrm_l(char *dst, const char *src, si
 
 _DIAGASSERT(src != NULL);
 
-if (loc == NULL)
-loc = _C_locale;
 /* XXX: LC_COLLATE should be implemented. */
 /* LINTED */(void)loc;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -83,5 +81,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strxfrm_l(char *dst, const char *src, si
 size_t
 strxfrm(char *dst, const char *src, size_t n)
 {
-return strxfrm_l(dst, src, n, *_current_locale());
+return strxfrm_l(dst, src, n, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/string/wcscasecmp.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/wcscasecmp.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcscasecmp.c
--- lib/libc/string/wcscasecmp.c18 Apr 2013 23:24:27 -00001.3
+++ lib/libc/string/wcscasecmp.c7 May 2013 11:14:40 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,9 +33,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcscasecmp_l(const wchar_t *s1, const wc
 int lc2  = 0;
 int diff = 0;
 
-if (loc == NULL)
-loc = _C_locale;
-
 _DIAGASSERT(s1);
 _DIAGASSERT(s2);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,5 +55,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcscasecmp_l(const wchar_t *s1, const wc
 int
 wcscasecmp(const wchar_t *s1, const wchar_t *s2)
 {
-return wcscasecmp_l(s1, s2, *_current_locale());
+return wcscasecmp_l(s1, s2, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/string/wcsncasecmp.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/wcsncasecmp.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcsncasecmp.c
--- lib/libc/string/wcsncasecmp.c18 Apr 2013 23:24:27 -00001.3
+++ lib/libc/string/wcsncasecmp.c7 May 2013 11:14:39 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,9 +36,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsncasecmp_l(const wchar_t *s1, const w
 _DIAGASSERT(s1);
 _DIAGASSERT(s2);
 
-if (loc == NULL)
-loc = _C_locale;
-
 while (n--) {
 lc1 = towlower_l(*s1, loc);
 lc2 = towlower_l(*s2, loc);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,5 +57,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wcsncasecmp_l(const wchar_t *s1, const w
 int
 wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n)
 {
-return wcsncasecmp_l(s1, s2, n, *_current_locale());
+return wcsncasecmp_l(s1, s2, n, LC_GLOBAL_LOCALE);
 }
Index: lib/libc/time/strftime.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/time/strftime.c,v
retrieving revision 1.25
diff -u -p -r1.25 strftime.c
--- lib/libc/time/strftime.c21 Apr 2013 17:45:46 -00001.25
+++ lib/libc/time/strftime.c7 May 2013 11:14:32 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -111,7 +111,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; size_t
 strftime_z(const timezone_t sp, char * __restrict s, size_t maxsize,
     const char * __restrict format, const struct tm * __restrict t)
 {
-return strftime_lz(sp, s, maxsize, format, t, *_current_locale());
+return strftime_lz(sp, s, maxsize, format, t, LC_GLOBAL_LOCALE);
 }
 
 size_t
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -121,9 +121,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strftime_lz(const timezone_t sp, char *c
 char *p;
 intwarn;
 
-if (loc == NULL)
-loc = _C_locale;
-
 warn = IN_NONE;
 p = _fmt(sp, ((format == NULL) ? "%c" : format), t, s, s + maxsize,
     &amp;amp;warn, loc);
Index: lib/libc/time/strptime.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/time/strptime.c,v
retrieving revision 1.37
diff -u -p -r1.37 strptime.c
--- lib/libc/time/strptime.c21 Apr 2013 17:45:47 -00001.37
+++ lib/libc/time/strptime.c7 May 2013 11:14:34 -0000
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,7 +77,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const u_char *find_string(const u
 char *
 strptime(const char *buf, const char *fmt, struct tm *tm)
 {
-return strptime_l(buf, fmt, tm, *_current_locale());
+return strptime_l(buf, fmt, tm, LC_GLOBAL_LOCALE);
 }
 
 char *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,9 +88,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strptime_l(const char *buf, const char *
 int alt_format, i, split_year = 0, neg = 0, offs;
 const char *new_fmt;
 
-if (loc == NULL)
-loc = _C_locale;
-
 bp = (const u_char *)buf;
 
 while (bp != NULL &amp;amp;&amp;amp; (c = *fmt++) != '\0') {
&lt;/pre&gt;</description>
    <dc:creator>Joerg Sonnenberger</dc:creator>
    <dc:date>2013-05-09T20:27:15</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16699">
    <title>Re: radiusd: Error detected by libpthread: Invalid mutex.</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16699</link>
    <description>&lt;pre&gt;Eh, no. But the backtrace shows it's happening inside fork(), isn't it?

&lt;/pre&gt;</description>
    <dc:creator>Edgar Fuß</dc:creator>
    <dc:date>2013-05-09T20:22:57</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16698">
    <title>Re: radiusd: Error detected by libpthread: Invalid mutex.</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16698</link>
    <description>&lt;pre&gt;In article &amp;lt;20130509193437.GL21387&amp;lt; at &amp;gt;trav.math.uni-bonn.de&amp;gt;,
Edgar Fuß  &amp;lt;ef&amp;lt; at &amp;gt;math.uni-bonn.de&amp;gt; wrote:

Could be a double free. Why don't you rebuild your system with MKDEBUG=yes
and then we can better see what's going on?

christos


&lt;/pre&gt;</description>
    <dc:creator>Christos Zoulas</dc:creator>
    <dc:date>2013-05-09T20:22:02</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16697">
    <title>Re: radiusd: Error detected by libpthread: Invalid mutex.</title>
    <link>http://permalink.gmane.org/gmane.os.netbsd.devel.userlevel/16697</link>
    <description>&lt;pre&gt;
Are you sure this isn't a double free?

Joerg

&lt;/pre&gt;</description>
    <dc:creator>Joerg Sonnenberger</dc:creator>
    <dc:date>2013-05-09T20:10:59</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.os.netbsd.devel.userlevel">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.os.netbsd.devel.userlevel</link>
  </textinput>
</rdf:RDF>
