about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog72
-rw-r--r--NEWS7
-rw-r--r--elf/dl-addr.c3
-rw-r--r--fedora/branch.mk4
-rw-r--r--fedora/glibc.spec.in54
-rw-r--r--include/netinet/in.h1
-rw-r--r--inet/Makefile4
-rw-r--r--inet/Versions6
-rw-r--r--inet/inet6_opt.c278
-rw-r--r--inet/inet6_option.c26
-rw-r--r--inet/inet6_rth.c192
-rw-r--r--inet/netinet/icmp6.h30
-rw-r--r--inet/netinet/in.h61
-rw-r--r--inet/netinet/ip6.h21
-rw-r--r--localedata/ChangeLog7
-rw-r--r--localedata/SUPPORTED2
-rw-r--r--localedata/locales/as_IN728
-rw-r--r--localedata/locales/or_IN807
-rw-r--r--nis/nis_addmember.c30
-rw-r--r--nis/nis_callback.c3
-rw-r--r--nis/nis_removemember.c80
-rw-r--r--nscd/cache.c37
-rw-r--r--nscd/connections.c29
-rw-r--r--nscd/nscd.c30
-rw-r--r--nscd/nscd.h3
-rw-r--r--sysdeps/posix/getaddrinfo.c3
26 files changed, 2377 insertions, 141 deletions
diff --git a/ChangeLog b/ChangeLog
index 3de745cf0d..0fca57dc90 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,75 @@
+2006-05-30  Jakub Jelinek  <jakub@redhat.com>
+
+	* nscd/nscd.h (prune_cache): Add fd argument to prototype.
+	* nscd/nscd.c (parse_opt): Read response from INVALIDATE request
+	to make sure the database has been already invalidated.
+	* nscd/cache.c (prune_cache): Add fd argument.  Write response to fd
+	after the cache has been invalidated.  Use pthread_mutex_lock rather
+	than pthread_mutex_trylock if fd != -1.
+	* nscd/connections.c (invalidate_cache): Add fd argument, write
+	response to fd if not calling prune_cache, pass fd to prune_cache.
+	(handle_request): Adjust invalidate_cache caller.
+	(nscd_run): Pass -1 as fd to prune_cache.
+
+2006-05-30  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/posix/getaddrinfo.c (gaiconf_init): Initialize bits in
+	the correct place.
+
+2006-05-29  Ulrich Drepper  <drepper@redhat.com>
+
+	* nscd/nscd.h (struct database_dyn): Add prunelock field.
+	* nscd/cache.c (prune_cache): Take prunelock before starting the
+	work.  Just return in case it is already taken.
+	* nscd/connections.c (dbs): Initialize .prunelock.
+
+2006-05-25  Ulrich Drepper  <drepper@redhat.com>
+
+	* nis/nis_removemember.c (nis_removemember): Avoid unnecessary
+	copying.  No need to allocate new array for group members.  Just
+	move the pointers and update the size.
+
+	* nis/nis_addmember.c (nis_addmember): Avoid unnecessary copying.
+	Avoid memory leak in case realloc fails.  Simplification for
+	better code generation.
+
+	Avoid deprecation warning because of libc_hidden_proto for
+	inet6_option_alloc.
+	* inet/inet6_option.c (option_alloc): Renamed from
+	inet6_option_alloc.  Made static.
+	(inet6_option_alloc): Now a simple wrapper around option_alloc.
+	(inet6_option_append): Call option_alloc.
+	* include/netinet/in.h: Remove libc_hidden_proto for
+	inet6_option_alloc.
+
+	* nis/nis_callback.c (__nis_create_callback): Always call xdr_free
+	for cleanup when cb!=NULL [Coverity CID 233].
+
+2006-05-24  Ulrich Drepper  <drepper@redhat.com>
+
+	[BZ #2693]
+	* inet/Makefile (routines): Add inet6_opt and inet6_rth.
+	* inet/Versions (libc, GLIBC_2.5): Add inet6_opt_init,
+	inet6_opt_append, inet6_opt_finish, inet6_opt_set_val, inet6_opt_next,
+	inet6_opt_find, inet6_opt_get_val, inet6_rth_space, inet6_rth_init,
+	inet6_rth_add, inet6_rth_reverse, inet6_rth_segments,
+	and inet6_rth_getaddr.
+	* inet/netinet/ip6.h (struct ip6_rthdr0): Make ip6r0_addr a flexible
+	array.
+	* inet/netinet/in.h (struct ip6_mtuinfo): Define.
+	Mark inet6_option_* interfaces as deprecated.
+	Declare inet6_opt_init, inet6_opt_append, inet6_opt_finish,
+	inet6_opt_set_val, inet6_opt_next, inet6_opt_find, inet6_opt_get_val,
+	inet6_rth_space, inet6_rth_init, inet6_rth_add, inet6_rth_reverse,
+	inet6_rth_segments, and inet6_rth_getaddr.
+	* inet/inet6_opt.c: New file.
+	* inet/inet6_rth.c: New file.
+
+	* inet/netinet/icmp6.h: Pretty printing.
+
+	[BZ #2683]
+	* elf/dl-addr.c (_dl_addr): Don't match undefined references.
+
 2006-05-23  Ulrich Drepper  <drepper@redhat.com>
 
 	* nis/nis_lookup.c (nis_lookup): Use __prepare_niscall instead of
diff --git a/NEWS b/NEWS
index 006aa2989f..edc576e096 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2006-05-07
+GNU C Library NEWS -- history of user-visible changes.  2006-05-24
 Copyright (C) 1992-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -23,11 +23,14 @@ Version 2.5
   site might have problems with default behavior.
   Implemented by Ulrich Drepper.
 
-* Iterating over entire database in NIS and NIS+ can be slow.  With the
+* Iterating over entire database in NIS can be slow.  With the
   SETENT_BATCH_READ option in /etc/default/nss a system admin can decide
   to trade time for memory.  The entire database will be read at once.
   Implemented by Ulrich Drepper.
 
+* The interfaces introduced in RFC 3542 have been implemented by
+  Ulrich Drepper.
+
 
 Version 2.4
 
diff --git a/elf/dl-addr.c b/elf/dl-addr.c
index fa62e40840..ced8978eb3 100644
--- a/elf/dl-addr.c
+++ b/elf/dl-addr.c
@@ -1,5 +1,5 @@
 /* Locate the shared object symbol nearest a given address.
-   Copyright (C) 1996-2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -92,6 +92,7 @@ _dl_addr (const void *address, Dl_info *info,
 #if defined USE_TLS
 	    && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS
 #endif
+	    && symtab->st_shndx != SHN_UNDEF
 	    && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr)
 	    && symtab->st_name < strtabsize)
 	  matchsym = (ElfW(Sym) *) symtab;
diff --git a/fedora/branch.mk b/fedora/branch.mk
index 773fe3e523..93d7c4f3d8 100644
--- a/fedora/branch.mk
+++ b/fedora/branch.mk
@@ -3,5 +3,5 @@ glibc-branch := fedora
 glibc-base := HEAD
 DIST_BRANCH := devel
 COLLECTION := dist-fc4
-fedora-sync-date := 2006-05-24 07:21 UTC
-fedora-sync-tag := fedora-glibc-20060524T0721
+fedora-sync-date := 2006-05-31 13:22 UTC
+fedora-sync-tag := fedora-glibc-20060531T1322
diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in
index 0360f5dd66..58760fec40 100644
--- a/fedora/glibc.spec.in
+++ b/fedora/glibc.spec.in
@@ -1,4 +1,4 @@
-%define glibcrelease 10
+%define glibcrelease 11
 %define auxarches i586 i686 athlon sparcv9 alphaev6
 %define prelinkarches noarch
 %define xenarches i686 athlon
@@ -326,6 +326,9 @@ cat > override_headers/asm/unistd.h <<EOF
 #ifndef __NR_tee
 #define __NR_tee		315
 #endif
+#ifndef __NR_vmsplice
+#define __NR_vmsplice		316
+#endif
 %endif
 %ifarch ia64
 #ifndef __NR_timer_create
@@ -392,6 +395,9 @@ cat > override_headers/asm/unistd.h <<EOF
 #ifndef __NR_tee
 #define __NR_tee		1301
 #endif
+#ifndef __NR_vmsplice
+#define __NR_vmsplice		1302
+#endif
 %endif
 %ifarch ppc
 #ifndef __NR_utimes
@@ -433,6 +439,24 @@ cat > override_headers/asm/unistd.h <<EOF
 #ifndef __NR_tee
 #define __NR_tee		284
 #endif
+#ifndef __NR_vmsplice
+#define __NR_vmsplice		285
+#endif
+#ifndef __NR_openat
+#define __NR_openat		286
+#define __NR_mkdirat		287
+#define __NR_mknodat		288
+#define __NR_fchownat		289
+#define __NR_futimesat		290
+#define __NR_fstatat64		291
+#define __NR_unlinkat		292
+#define __NR_renameat		293
+#define __NR_linkat		294
+#define __NR_symlinkat		295
+#define __NR_readlinkat		296
+#define __NR_fchmodat		297
+#define __NR_faccessat		298
+#endif
 %endif
 %ifarch ppc64
 #ifndef __NR_utimes
@@ -467,6 +491,24 @@ cat > override_headers/asm/unistd.h <<EOF
 #ifndef __NR_tee
 #define __NR_tee		284
 #endif
+#ifndef __NR_vmsplice
+#define __NR_vmsplice		285
+#endif
+#ifndef __NR_openat
+#define __NR_openat		286
+#define __NR_mkdirat		287
+#define __NR_mknodat		288
+#define __NR_fchownat		289
+#define __NR_futimesat		290
+#define __NR_newfstatat		291
+#define __NR_unlinkat		292
+#define __NR_renameat		293
+#define __NR_linkat		294
+#define __NR_symlinkat		295
+#define __NR_readlinkat		296
+#define __NR_fchmodat		297
+#define __NR_faccessat		298
+#endif
 %endif
 %ifarch s390
 #ifndef __NR_timer_create
@@ -674,6 +716,9 @@ cat > override_headers/asm/unistd.h <<EOF
 #ifndef __NR_sync_file_range
 #define __NR_sync_file_range	277
 #endif
+#ifndef __NR_vmsplice
+#define __NR_vmsplice		278
+#endif
 %endif
 %ifnarch %{ix86} x86_64
 /* FIXME: Reenable it when the kernel side is more stable.  */
@@ -1394,6 +1439,13 @@ rm -f *.filelist*
 %endif
 
 %changelog
+* Wed May 31 2006 Jakub Jelinek <jakub@redhat.com> 2.4.90-11
+- don't exit from nscd -i <database> before the database is
+  actually invalidated, add locking to prune_cache (#191464)
+- build glibc-devel.i386 static libraries with
+  -mno-tls-direct-seg-refs -DNO_TLS_DIRECT_SEG_REFS
+- RFC3542 support (advanced API for IPv6; #191001, BZ##2693)
+
 * Wed May 24 2006 Jakub Jelinek <jakub@redhat.com> 2.4.90-10
 - on i686 make glibc owner of /lib/i686 directory (#192597)
 - search parent NIS+ domains (#190803)
diff --git a/include/netinet/in.h b/include/netinet/in.h
index 2018ed21c3..876f1a4369 100644
--- a/include/netinet/in.h
+++ b/include/netinet/in.h
@@ -5,6 +5,5 @@
 libc_hidden_proto (bindresvport)
 libc_hidden_proto (in6addr_loopback)
 libc_hidden_proto (in6addr_any)
-libc_hidden_proto (inet6_option_alloc)
 
 #endif
diff --git a/inet/Makefile b/inet/Makefile
index 0fdf9e33e4..075716fbeb 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-2002, 2003, 2004 Free Software Foundation, Inc.
+# Copyright (C) 1991-2002, 2003, 2004, 2006 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -47,7 +47,7 @@ routines := htonl htons		\
 	    getaliasent_r getaliasent getaliasname getaliasname_r \
 	    in6_addr getnameinfo if_index ifaddrs inet6_option \
 	    getipv4sourcefilter setipv4sourcefilter \
-	    getsourcefilter setsourcefilter
+	    getsourcefilter setsourcefilter inet6_opt inet6_rth
 
 aux := check_pf ifreq
 
diff --git a/inet/Versions b/inet/Versions
index 2b7ec901ff..06507199a9 100644
--- a/inet/Versions
+++ b/inet/Versions
@@ -78,6 +78,12 @@ libc {
     getipv4sourcefilter; setipv4sourcefilter;
     getsourcefilter; setsourcefilter;
   }
+  GLIBC_2.5 {
+    inet6_opt_init; inet6_opt_append; inet6_opt_finish; inet6_opt_set_val;
+    inet6_opt_next; inet6_opt_find; inet6_opt_get_val;
+    inet6_rth_space; inet6_rth_init; inet6_rth_add; inet6_rth_reverse;
+    inet6_rth_segments; inet6_rth_getaddr;
+  }
   GLIBC_PRIVATE {
     # functions used in other libraries
     __internal_endnetgrent; __internal_getnetgrent_r;
diff --git a/inet/inet6_opt.c b/inet/inet6_opt.c
new file mode 100644
index 0000000000..bddb85182b
--- /dev/null
+++ b/inet/inet6_opt.c
@@ -0,0 +1,278 @@
+/* Copyright (C) 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@redhat.com>, 2006.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <string.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+
+
+/* RFC 3542, 10.1
+
+   This function returns the number of bytes needed for the empty
+   extension header i.e., without any options.  If EXTBUF is not NULL it
+   also initializes the extension header to have the correct length
+   field.  In that case if the EXTLEN value is not a positive (i.e.,
+   non-zero) multiple of 8 the function fails and returns -1.  */
+int
+inet6_opt_init (void *extbuf, socklen_t extlen)
+{
+  if (extbuf != NULL)
+    {
+      if (extlen <= 0 || (extlen % 8) != 0)
+	return -1;
+
+      /* Fill in the length in units of 8 octets.  */
+      struct ip6_hbh *extp = (struct ip6_hbh *) extbuf;
+      extp->ip6h_len = extlen / 8;
+    }
+
+  return sizeof (struct ip6_hbh);
+}
+
+
+static void
+add_padding (uint8_t *extbuf, int offset, int npad)
+{
+  if (npad == 1)
+    extbuf[offset] = IP6OPT_PAD1;
+  else
+    {
+      struct ip6_opt *pad_opt = (struct ip6_opt *) (extbuf + offset);
+
+      pad_opt->ip6o_type = IP6OPT_PADN;
+      pad_opt->ip6o_len = npad - sizeof (struct ip6_opt);
+      /* Clear the memory used by the padding.  */
+      memset (pad_opt + 1, '\0', pad_opt->ip6o_len);
+    }
+}
+
+
+
+/* RFC 3542, 10.2
+
+   This function returns the updated total length taking into account
+   adding an option with length 'len' and alignment 'align'.  If
+   EXTBUF is not NULL then, in addition to returning the length, the
+   function inserts any needed pad option, initializes the option
+   (setting the type and length fields) and returns a pointer to the
+   location for the option content in databufp.  If the option does
+   not fit in the extension header buffer the function returns -1.  */
+int
+inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type,
+		  socklen_t len, uint8_t align, void **databufp)
+{
+  /* Check minimum offset.  */
+  if (offset < sizeof (struct ip6_hbh))
+    return -1;
+
+  /* One cannot add padding options.  */
+  if (type == IP6OPT_PAD1 || type == IP6OPT_PADN)
+    return -1;
+
+  /* The option length must fit in one octet.  */
+  if (len > 255)
+    return -1;
+
+  /* The alignment can only by 1, 2, 4, or 8 and must not exceed the
+     option length.  */
+  if (align == 0 || align > 8 || (align & (align - 1)) != 0 || align > len)
+    return -1;
+
+  /* Determine the needed padding for alignment.  Following the
+     current content of the buffer we have the is the IPv6 option type
+     and length, followed immediately by the data.  The data has the
+     alignment constraints.  Therefore padding must be inserted in the
+     form of padding options before the new option. */
+  int data_offset = offset + sizeof (struct ip6_opt);
+  int npad = (align - data_offset % align) & (align - 1);
+
+  /* Now we can check whether the buffer is large enough.  */
+  if (data_offset + npad + len > extlen)
+    return -1;
+
+  if (npad != 0)
+    {
+      if (extbuf != NULL)
+	add_padding (extbuf, offset, npad);
+
+      offset += npad;
+    }
+
+  /* Now prepare the option itself.  */
+  if (extbuf != NULL)
+    {
+      struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
+
+      opt->ip6o_type = type;
+      opt->ip6o_len = len;
+
+      *databufp = opt + 1;
+    }
+
+  return offset + sizeof (struct ip6_opt) + len;
+}
+
+
+/* RFC 3542, 10.3
+
+   This function returns the updated total length taking into account
+   the final padding of the extension header to make it a multiple of
+   8 bytes.  If EXTBUF is not NULL the function also initializes the
+   option by inserting a Pad1 or PadN option of the proper length.  */
+int
+inet6_opt_finish (void *extbuf, socklen_t extlen, int offset)
+{
+  /* Check minimum offset.  */
+  if (offset < sizeof (struct ip6_hbh))
+    return -1;
+
+  /* Required padding at the end.  */
+  int npad = (8 - (offset & 7)) & 7;
+
+  /* Make sure the buffer is large enough.  */
+  if (offset + npad > extlen)
+    return -1;
+
+  if (extbuf != NULL)
+    add_padding (extbuf, offset, npad);
+
+  return offset + npad;
+}
+
+
+/* RFC 3542, 10.4
+
+   This function inserts data items of various sizes in the data
+   portion of the option.  VAL should point to the data to be
+   inserted.  OFFSET specifies where in the data portion of the option
+   the value should be inserted; the first byte after the option type
+   and length is accessed by specifying an offset of zero.  */
+int
+inet6_opt_set_val (void *databuf, int offset, void *val, socklen_t vallen)
+{
+  memcpy ((uint8_t *) databuf + offset, val, vallen);
+
+  return offset + vallen;
+}
+
+
+/* RFC 3542, 10.5
+
+   This function parses received option extension headers returning
+   the next option.  EXTBUF and EXTLEN specifies the extension header.
+   OFFSET should either be zero (for the first option) or the length
+   returned by a previous call to 'inet6_opt_next' or
+   'inet6_opt_find'.  It specifies the position where to continue
+   scanning the extension buffer.  */
+int
+inet6_opt_next (void *extbuf, socklen_t extlen, int offset, uint8_t *typep,
+		socklen_t *lenp, void **databufp)
+{
+  if (offset == 0)
+    offset = sizeof (struct ip6_hbh);
+  else if (offset < sizeof (struct ip6_hbh))
+    return -1;
+
+  while (offset < extlen)
+    {
+      struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
+
+      if (opt->ip6o_type == IP6OPT_PAD1)
+	/* Single byte padding.  */
+	++offset;
+      else if (opt->ip6o_type == IP6OPT_PADN)
+	offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+      else
+	{
+	  /* Check whether the option is valid.  */
+	  offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+	  if (offset > extlen)
+	    return -1;
+
+	  *typep = opt->ip6o_type;
+	  *lenp = opt->ip6o_len;
+	  *databufp = opt + 1;
+	  return offset;
+	}
+    }
+
+  return -1;
+}
+
+
+/* RFC 3542, 10.6
+
+   This function is similar to the previously described
+   'inet6_opt_next' function, except this function lets the caller
+   specify the option type to be searched for, instead of always
+   returning the next option in the extension header.  */
+int
+inet6_opt_find (void *extbuf, socklen_t extlen, int offset, uint8_t type,
+		socklen_t *lenp, void **databufp)
+{
+  if (offset == 0)
+    offset = sizeof (struct ip6_hbh);
+  else if (offset < sizeof (struct ip6_hbh))
+    return -1;
+
+  while (offset < extlen)
+    {
+      struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
+
+      if (opt->ip6o_type == IP6OPT_PAD1)
+	{
+	  /* Single byte padding.  */
+	  ++offset;
+	  if (type == IP6OPT_PAD1)
+	    {
+	      *lenp = 0;
+	      *databufp = (uint8_t *) extbuf + offset;
+	      return offset;
+	    }
+	}
+      else if (opt->ip6o_type != type)
+	offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+      else
+	{
+	  /* Check whether the option is valid.  */
+	  offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+	  if (offset > extlen)
+	    return -1;
+
+	  *lenp = opt->ip6o_len;
+	  *databufp = opt + 1;
+	  return offset;
+	}
+    }
+
+  return -1;
+}
+
+
+/* RFC 3542, 10.7
+
+   This function extracts data items of various sizes in the data
+   portion of the option.  */
+int
+inet6_opt_get_val (void *databuf, int offset, void *val, socklen_t vallen)
+{
+  memcpy (val, (uint8_t *) databuf + offset, vallen);
+
+  return offset + vallen;
+}
diff --git a/inet/inet6_option.c b/inet/inet6_option.c
index f88982e323..cae9ae5797 100644
--- a/inet/inet6_option.c
+++ b/inet/inet6_option.c
@@ -75,6 +75,10 @@ get_opt_end (const uint8_t **result, const uint8_t *startp,
 }
 
 
+static uint8_t *option_alloc (struct cmsghdr *cmsg, int datalen, int multx,
+			      int plusy);
+
+
 /* RFC 2292, 6.3.1
 
    This function returns the number of bytes required to hold an option
@@ -150,7 +154,7 @@ inet6_option_append (cmsg, typep, multx, plusy)
   int len = typep[0] == IP6OPT_PAD1 ? 1 : typep[1] + 2;
 
   /* Get the pointer to the space in the message.  */
-  uint8_t *ptr = inet6_option_alloc (cmsg, len, multx, plusy);
+  uint8_t *ptr = option_alloc (cmsg, len, multx, plusy);
   if (ptr == NULL)
     /* Some problem with the parameters.  */
     return -1;
@@ -169,12 +173,8 @@ inet6_option_append (cmsg, typep, multx, plusy)
    inet6_option_init().  This function returns a pointer to the 8-bit
    option type field that starts the option on success, or NULL on an
    error.  */
-uint8_t *
-inet6_option_alloc (cmsg, datalen, multx, plusy)
-     struct cmsghdr *cmsg;
-     int datalen;
-     int multx;
-     int plusy;
+static uint8_t *
+option_alloc (struct cmsghdr *cmsg, int datalen, int multx, int plusy)
 {
   /* The RFC limits the value of the alignment values.  */
   if ((multx != 1 && multx != 2 && multx != 4 && multx != 8)
@@ -214,7 +214,17 @@ inet6_option_alloc (cmsg, datalen, multx, plusy)
 
   return result;
 }
-libc_hidden_def (inet6_option_alloc)
+
+
+uint8_t *
+inet6_option_alloc (cmsg, datalen, multx, plusy)
+     struct cmsghdr *cmsg;
+     int datalen;
+     int multx;
+     int plusy;
+{
+  return option_alloc (cmsg, datalen, multx, plusy);
+}
 
 
 /* RFC 2292, 6.3.5
diff --git a/inet/inet6_rth.c b/inet/inet6_rth.c
new file mode 100644
index 0000000000..15f8240909
--- /dev/null
+++ b/inet/inet6_rth.c
@@ -0,0 +1,192 @@
+/* Copyright (C) 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@redhat.com>, 2006.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <string.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+
+
+/* RFC 3542, 7.1
+
+   This function returns the number of bytes required to hold a
+   Routing header of the specified type containing the specified
+   number of segments (addresses).  For an IPv6 Type 0 Routing header,
+   the number of segments must be between 0 and 127, inclusive.  */
+socklen_t
+inet6_rth_space (int type, int segments)
+{
+  switch (type)
+    {
+    case IPV6_RTHDR_TYPE_0:
+      if (segments < 0 || segments > 127)
+	return 0;
+
+      return sizeof (struct ip6_rthdr0) + segments * sizeof (struct in6_addr);
+    }
+
+  return 0;
+}
+
+
+/* RFC 3542, 7.2
+
+   This function initializes the buffer pointed to by BP to contain a
+   Routing header of the specified type and sets ip6r_len based on the
+   segments parameter.  */
+void *
+inet6_rth_init (void *bp, socklen_t bp_len, int type, int segments)
+{
+  struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+  switch (type)
+    {
+    case IPV6_RTHDR_TYPE_0:
+      /* Make sure the parameters are valid and the buffer is large enough.  */
+      if (segments < 0 || segments > 127)
+	break;
+
+      socklen_t len = (sizeof (struct ip6_rthdr0)
+		       + segments * sizeof (struct in6_addr));
+      if (len > bp_len)
+	break;
+
+      /* Some implementations seem to initialize the whole memory area.  */
+      memset (bp, '\0', len);
+
+      /* Length in units of 8 octets.  */
+      rthdr->ip6r_len = segments * sizeof (struct in6_addr) / 8;
+      rthdr->ip6r_type = IPV6_RTHDR_TYPE_0;
+      return bp;
+    }
+
+  return NULL;
+}
+
+
+/* RFC 3542, 7.3
+
+   This function adds the IPv6 address pointed to by addr to the end of
+   the Routing header being constructed.  */
+int
+inet6_rth_add (void *bp, const struct in6_addr *addr)
+{
+  struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+  switch (rthdr->ip6r_type)
+    {
+      struct ip6_rthdr0 *rthdr0;
+    case IPV6_RTHDR_TYPE_0:
+      rthdr0 = (struct ip6_rthdr0 *) rthdr;
+
+      memcpy (&rthdr0->ip6r0_addr[rthdr0->ip6r0_segleft++],
+	      addr, sizeof (struct in6_addr));
+
+      return 0;
+    }
+
+  return -1;
+}
+
+
+/* RFC 3542, 7.4
+
+   This function takes a Routing header extension header (pointed to by
+   the first argument) and writes a new Routing header that sends
+   datagrams along the reverse of that route.  The function reverses the
+   order of the addresses and sets the segleft member in the new Routing
+   header to the number of segments.  */
+int
+inet6_rth_reverse (const void *in, void *out)
+{
+  struct ip6_rthdr *in_rthdr = (struct ip6_rthdr *) in;
+
+  switch (in_rthdr->ip6r_type)
+    {
+      struct ip6_rthdr0 *in_rthdr0;
+      struct ip6_rthdr0 *out_rthdr0;
+    case IPV6_RTHDR_TYPE_0:
+      in_rthdr0 = (struct ip6_rthdr0 *) in;
+      out_rthdr0 = (struct ip6_rthdr0 *) out;
+
+      /* Copy header, not the addresses.  The memory regions can overlap.  */
+      memmove (out_rthdr0, in_rthdr0, sizeof (struct ip6_rthdr0));
+
+      int total = in_rthdr0->ip6r0_segleft * 8 / sizeof (struct in6_addr);
+      for (int i = 0; i < total / 2; ++i)
+	{
+	  /* Remember, IN_RTHDR0 and OUT_RTHDR0 might overlap.  */
+	  struct in6_addr temp = in_rthdr0->ip6r0_addr[i];
+	  out_rthdr0->ip6r0_addr[i] = in_rthdr0->ip6r0_addr[total - 1 - i];
+	  out_rthdr0->ip6r0_addr[total - 1 - i] = temp;
+	}
+      if (total % 2 != 0 && in != out)
+	out_rthdr0->ip6r0_addr[total / 2] = in_rthdr0->ip6r0_addr[total / 2];
+
+      return 0;
+    }
+
+  return -1;
+}
+
+
+/* RFC 3542, 7.5
+
+   This function returns the number of segments (addresses) contained in
+   the Routing header described by BP.  */
+int
+inet6_rth_segments (const void *bp)
+{
+  struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+  switch (rthdr->ip6r_type)
+    {
+    case IPV6_RTHDR_TYPE_0:
+
+      return rthdr->ip6r_len * 8 / sizeof (struct in6_addr);
+    }
+
+  return -1;
+}
+
+
+/* RFC 3542, 7.6
+
+   This function returns a pointer to the IPv6 address specified by
+   index (which must have a value between 0 and one less than the
+   value returned by 'inet6_rth_segments') in the Routing header
+   described by BP.  */
+struct in6_addr *
+inet6_rth_getaddr (const void *bp, int index)
+{
+  struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+  switch (rthdr->ip6r_type)
+    {
+       struct ip6_rthdr0 *rthdr0;
+    case IPV6_RTHDR_TYPE_0:
+      rthdr0 = (struct ip6_rthdr0 *) rthdr;
+
+      if (index >= rthdr0->ip6r0_len * 8 / sizeof (struct in6_addr))
+	break;
+
+      return &rthdr0->ip6r0_addr[index];
+    }
+
+  return NULL;
+}
diff --git a/inet/netinet/icmp6.h b/inet/netinet/icmp6.h
index c5138a39c9..0cb1aa6a6c 100644
--- a/inet/netinet/icmp6.h
+++ b/inet/netinet/icmp6.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,93,94,95,96,97,2000 Free Software Foundation, Inc.
+/* Copyright (C) 1991-1997,2000,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -191,13 +191,13 @@ struct nd_opt_hdr             /* Neighbor discovery option header */
     /* followed by option specific data */
   };
 
-#define  ND_OPT_SOURCE_LINKADDR       1
-#define  ND_OPT_TARGET_LINKADDR       2
-#define  ND_OPT_PREFIX_INFORMATION    3
-#define  ND_OPT_REDIRECTED_HEADER     4
-#define  ND_OPT_MTU                   5
-#define  ND_OPT_RTR_ADV_INTERVAL      7
-#define  ND_OPT_HOME_AGENT_INFO       8
+#define ND_OPT_SOURCE_LINKADDR		1
+#define ND_OPT_TARGET_LINKADDR		2
+#define ND_OPT_PREFIX_INFORMATION	3
+#define ND_OPT_REDIRECTED_HEADER	4
+#define ND_OPT_MTU			5
+#define ND_OPT_RTR_ADV_INTERVAL		7
+#define ND_OPT_HOME_AGENT_INFO		8
 
 struct nd_opt_prefix_info     /* prefix information */
   {
@@ -211,9 +211,9 @@ struct nd_opt_prefix_info     /* prefix information */
     struct in6_addr  nd_opt_pi_prefix;
   };
 
-#define ND_OPT_PI_FLAG_ONLINK        0x80
-#define ND_OPT_PI_FLAG_AUTO          0x40
-#define ND_OPT_PI_FLAG_RADDR         0x20
+#define ND_OPT_PI_FLAG_ONLINK	0x80
+#define ND_OPT_PI_FLAG_AUTO	0x40
+#define ND_OPT_PI_FLAG_RADDR	0x20
 
 struct nd_opt_rd_hdr          /* redirected header */
   {
@@ -300,11 +300,11 @@ struct rr_pco_use      /* use prefix part */
 #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO    0x10
 
 #if BYTE_ORDER == BIG_ENDIAN
-# define ICMP6_RR_PCOUSE_DECRVLTIME      0x80000000
-# define ICMP6_RR_PCOUSE_DECRPLTIME      0x40000000
+# define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000
+# define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000
 #elif BYTE_ORDER == LITTLE_ENDIAN
-# define ICMP6_RR_PCOUSE_DECRVLTIME      0x80
-# define ICMP6_RR_PCOUSE_DECRPLTIME      0x40
+# define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80
+# define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40
 #endif
 
 struct rr_result       /* router renumbering result message */
diff --git a/inet/netinet/in.h b/inet/netinet/in.h
index 8898be3664..4fdc0fadf1 100644
--- a/inet/netinet/in.h
+++ b/inet/netinet/in.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2001, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2001, 2003, 2004, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -455,25 +455,66 @@ extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in)
 /* IPv6 packet information.  */
 struct in6_pktinfo
   {
-    struct in6_addr	ipi6_addr;    /* src/dst IPv6 address */
-    unsigned int	ipi6_ifindex; /* send/recv interface index */
+    struct in6_addr ipi6_addr;	/* src/dst IPv6 address */
+    unsigned int ipi6_ifindex;	/* send/recv interface index */
+  };
+
+/* IPv6 MTU information.  */
+struct ip6_mtuinfo
+  {
+    struct sockaddr_in6 ip6m_addr; /* dst address including zone ID */
+    uint32_t ip6m_mtu;		   /* path MTU in host byte order */
   };
 
 
 #ifdef __USE_GNU
-/* Hop-by-Hop and Destination Options Processing.  */
-extern int inet6_option_space (int __nbytes) __THROW;
+/* Obsolete hop-by-hop and Destination Options Processing (RFC 2292).  */
+extern int inet6_option_space (int __nbytes)
+     __THROW __attribute_deprecated__;
 extern int inet6_option_init (void *__bp, struct cmsghdr **__cmsgp,
-			      int __type) __THROW;
+			      int __type) __THROW __attribute_deprecated__;
 extern int inet6_option_append (struct cmsghdr *__cmsg,
 				__const uint8_t *__typep, int __multx,
-				int __plusy) __THROW;
+				int __plusy) __THROW __attribute_deprecated__;
 extern uint8_t *inet6_option_alloc (struct cmsghdr *__cmsg, int __datalen,
-				    int __multx, int __plusy) __THROW;
+				    int __multx, int __plusy)
+     __THROW __attribute_deprecated__;
 extern int inet6_option_next (__const struct cmsghdr *__cmsg,
-			      uint8_t **__tptrp) __THROW;
+			      uint8_t **__tptrp)
+     __THROW __attribute_deprecated__;
 extern int inet6_option_find (__const struct cmsghdr *__cmsg,
-			      uint8_t **__tptrp, int __type) __THROW;
+			      uint8_t **__tptrp, int __type)
+     __THROW __attribute_deprecated__;
+
+
+/* Hop-by-Hop and Destination Options Processing (RFC 3542).  */
+extern int inet6_opt_init (void *__extbuf, socklen_t __extlen) __THROW;
+extern int inet6_opt_append (void *__extbuf, socklen_t __extlen, int __offset,
+			     uint8_t __type, socklen_t __len, uint8_t __align,
+			     void **__databufp) __THROW;
+extern int inet6_opt_finish (void *__extbuf, socklen_t __extlen, int __offset)
+     __THROW;
+extern int inet6_opt_set_val (void *__databuf, int __offset, void *__val,
+			      socklen_t __vallen) __THROW;
+extern int inet6_opt_next (void *__extbuf, socklen_t __extlen, int __offset,
+			   uint8_t *__typep, socklen_t *__lenp,
+			   void **__databufp) __THROW;
+extern int inet6_opt_find (void *__extbuf, socklen_t __extlen, int __offset,
+			   uint8_t __type, socklen_t *__lenp,
+			   void **__databufp) __THROW;
+extern int inet6_opt_get_val (void *__databuf, int __offset, void *__val,
+			      socklen_t __vallen) __THROW;
+
+
+/* Routing Header Option (RFC 3542).  */
+extern socklen_t inet6_rth_space (int __type, int __segments) __THROW;
+extern void *inet6_rth_init (void *__bp, socklen_t __bp_len, int __type,
+			     int __segments) __THROW;
+extern int inet6_rth_add (void *__bp, __const struct in6_addr *__addr) __THROW;
+extern int inet6_rth_reverse (__const void *__in, void *__out) __THROW;
+extern int inet6_rth_segments (__const void *__bp) __THROW;
+extern struct in6_addr *inet6_rth_getaddr (__const void *__bp, int __index)
+     __THROW;
 
 
 /* Multicast source filter support.  */
diff --git a/inet/netinet/ip6.h b/inet/netinet/ip6.h
index 0ad62f8980..bef2af2f5a 100644
--- a/inet/netinet/ip6.h
+++ b/inet/netinet/ip6.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-1997, 2001, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1991-1997, 2001, 2003, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -89,7 +89,8 @@ struct ip6_rthdr0
     uint8_t  ip6r0_segleft;	/* segments left */
     uint8_t  ip6r0_reserved;	/* reserved field */
     uint8_t  ip6r0_slmap[3];	/* strict/loose bit map */
-    struct in6_addr  ip6r0_addr[1];  /* up to 23 addresses */
+    /* followed by up to 127 struct in6_addr */
+    struct in6_addr ip6r0_addr[0];
   };
 
 /* Fragment header */
@@ -101,14 +102,14 @@ struct ip6_frag
     uint32_t  ip6f_ident;	/* identification */
   };
 
-#if     BYTE_ORDER == BIG_ENDIAN
-#define IP6F_OFF_MASK       0xfff8  /* mask out offset from _offlg */
-#define IP6F_RESERVED_MASK  0x0006  /* reserved bits in ip6f_offlg */
-#define IP6F_MORE_FRAG      0x0001  /* more-fragments flag */
+#if BYTE_ORDER == BIG_ENDIAN
+# define IP6F_OFF_MASK       0xfff8  /* mask out offset from _offlg */
+# define IP6F_RESERVED_MASK  0x0006  /* reserved bits in ip6f_offlg */
+# define IP6F_MORE_FRAG      0x0001  /* more-fragments flag */
 #else   /* BYTE_ORDER == LITTLE_ENDIAN */
-#define IP6F_OFF_MASK       0xf8ff  /* mask out offset from _offlg */
-#define IP6F_RESERVED_MASK  0x0600  /* reserved bits in ip6f_offlg */
-#define IP6F_MORE_FRAG      0x0100  /* more-fragments flag */
+# define IP6F_OFF_MASK       0xf8ff  /* mask out offset from _offlg */
+# define IP6F_RESERVED_MASK  0x0600  /* reserved bits in ip6f_offlg */
+# define IP6F_MORE_FRAG      0x0100  /* more-fragments flag */
 #endif
 
 /* IPv6 options */
@@ -175,7 +176,7 @@ struct ip6_opt_router
   };
 
 /* Router alert values (in network byte order) */
-#if     BYTE_ORDER == BIG_ENDIAN
+#if BYTE_ORDER == BIG_ENDIAN
 # define IP6_ALERT_MLD	0x0000
 # define IP6_ALERT_RSVP	0x0001
 # define IP6_ALERT_AN	0x0002
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 8fb2d58464..c8c53b193e 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,10 @@
+2006-05-26  Ulrich Drepper  <drepper@redhat.com>
+
+	* SUPPORTED (SUPPORTED-LOCALES): Add as_IN.UTF-8 and or_IN.UTF-8.
+	* locales/as_IN: New file.
+	* locales/or_IN: New file.
+	Patch by Masahide Washizawa <WASHI@jp.ibm.com>.
+
 2006-05-02  Ulrich Drepper  <drepper@redhat.com>
 
 	[BZ #1203]
diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED
index f801fe263f..e06ce3a768 100644
--- a/localedata/SUPPORTED
+++ b/localedata/SUPPORTED
@@ -47,6 +47,7 @@ ar_TN/ISO-8859-6 \
 ar_YE.UTF-8/UTF-8 \
 ar_YE/ISO-8859-6 \
 az_AZ.UTF-8/UTF-8 \
+as_IN.UTF-8/UTF-8 \
 be_BY.UTF-8/UTF-8 \
 be_BY/CP1251 \
 be_BY@latin/UTF-8 \
@@ -285,6 +286,7 @@ oc_FR/ISO-8859-1 \
 om_ET/UTF-8 \
 om_KE.UTF-8/UTF-8 \
 om_KE/ISO-8859-1 \
+or_IN/UTF-8 \
 pa_IN/UTF-8 \
 pa_PK/UTF-8 \
 pl_PL.UTF-8/UTF-8 \
diff --git a/localedata/locales/as_IN b/localedata/locales/as_IN
new file mode 100644
index 0000000000..9a30d658bd
--- /dev/null
+++ b/localedata/locales/as_IN
@@ -0,0 +1,728 @@
+comment_char %
+escape_char /
+
+% Assamese locale for India.
+% Contributed by Masahide Washizawa <washi at jp ibm com>
+
+%%%%%%%%%%%%%
+LC_IDENTIFICATION
+title       "Assamese language locale for India"
+source      "IBM AP Linux Technology Center, Yamato Software Laboratory"
+address     "1623-14, Shimotsuruma, Yamato-shi, Kanagawa-ken, 242-8502, Japan"
+contact     ""
+email       "bug-glibc@gnu.org"
+tel         ""
+fax         ""
+language    "Assamese"
+territory   "India"
+revision    "1.0"
+date        "2006-05-25"
+%
+category  "as_IN:2000";LC_IDENTIFICATION
+category  "as_IN:2000";LC_CTYPE
+category  "as_IN:2000";LC_COLLATE
+category  "as_IN:2000";LC_TIME
+category  "as_IN:2000";LC_NUMERIC
+category  "as_IN:2000";LC_MONETARY
+category  "as_IN:2000";LC_MESSAGES
+category  "as_IN:2000";LC_PAPER
+category  "as_IN:2000";LC_NAME
+category  "as_IN:2000";LC_ADDRESS
+category  "as_IN:2000";LC_TELEPHONE
+END LC_IDENTIFICATION
+
+%%%%%%%%%%%%%
+LC_CTYPE
+copy "i18n"
+END LC_CTYPE
+
+%%%%%%%%%%%%%
+LC_COLLATE
+
+% Define collation weights as symbols
+collating-symbol <X0001>
+collating-symbol <X0005>
+collating-symbol <X000D>
+collating-symbol <X001D>
+collating-symbol <X0031>
+collating-symbol <X0041>
+collating-symbol <X0086>
+collating-symbol <X0087>
+collating-symbol <X008F>
+collating-symbol <X00C0>
+collating-symbol <X00D7>
+collating-symbol <X00D8>
+collating-symbol <X00E1>
+collating-symbol <X00E9>
+collating-symbol <X00F9>
+collating-symbol <X0507>
+collating-symbol <X0509>
+collating-symbol <X050B>
+collating-symbol <X050D>
+collating-symbol <X050F>
+collating-symbol <X0600>
+collating-symbol <X0764>
+collating-symbol <X076A>
+collating-symbol <X0782>
+collating-symbol <X078E>
+collating-symbol <X07AA>
+collating-symbol <X07C0>
+collating-symbol <X07C6>
+collating-symbol <X07EE>
+collating-symbol <X07F6>
+collating-symbol <X080B>
+collating-symbol <X083F>
+collating-symbol <X084D>
+collating-symbol <X0861>
+collating-symbol <X0863>
+collating-symbol <X0865>
+collating-symbol <X0867>
+collating-symbol <X0869>
+collating-symbol <X086B>
+collating-symbol <X08DF>
+collating-symbol <X08E1>
+collating-symbol <X08E9>
+collating-symbol <X08ED>
+collating-symbol <X08EF>
+collating-symbol <X08F5>
+collating-symbol <X08F7>
+collating-symbol <X09F7>
+collating-symbol <X0BB3>
+collating-symbol <X0BBB>
+collating-symbol <X0BBD>
+collating-symbol <X0BBF>
+collating-symbol <X0BC3>
+collating-symbol <X0BC9>
+collating-symbol <X1FB5>
+collating-symbol <X1FB7>
+collating-symbol <X233C>
+collating-symbol <X2342>
+collating-symbol <X2344>
+collating-symbol <X2370>
+collating-symbol <X2372>
+collating-symbol <X2374>
+collating-symbol <X2376>
+collating-symbol <X2378>
+collating-symbol <X237A>
+collating-symbol <X237C>
+collating-symbol <X237E>
+collating-symbol <X2380>
+collating-symbol <X2382>
+collating-symbol <X2600>
+collating-symbol <X2800>
+collating-symbol <X2A00>
+collating-symbol <X2C00>
+collating-symbol <X2E00>
+collating-symbol <X3000>
+collating-symbol <X3200>
+collating-symbol <X3400>
+collating-symbol <X3600>
+collating-symbol <X3800>
+collating-symbol <X3A00>
+collating-symbol <X3C00>
+collating-symbol <X3E00>
+collating-symbol <X4000>
+collating-symbol <X4200>
+collating-symbol <X4400>
+collating-symbol <X4600>
+collating-symbol <X4800>
+collating-symbol <X4A00>
+collating-symbol <X4C00>
+collating-symbol <X4E00>
+collating-symbol <X5000>
+collating-symbol <X5200>
+collating-symbol <X5400>
+collating-symbol <X5600>
+collating-symbol <X5800>
+collating-symbol <X6820>
+collating-symbol <X6822>
+collating-symbol <X6824>
+collating-symbol <X6826>
+collating-symbol <X6828>
+collating-symbol <X682A>
+collating-symbol <X682C>
+collating-symbol <X682E>
+collating-symbol <X6830>
+collating-symbol <X6832>
+collating-symbol <X6834>
+collating-symbol <X6836>
+collating-symbol <X6838>
+collating-symbol <X683A>
+collating-symbol <X683C>
+collating-symbol <X683E>
+collating-symbol <X6840>
+collating-symbol <X6842>
+collating-symbol <X6844>
+collating-symbol <X6846>
+collating-symbol <X6848>
+collating-symbol <X684A>
+collating-symbol <X684C>
+collating-symbol <X684E>
+collating-symbol <X6850>
+collating-symbol <X6852>
+collating-symbol <X6854>
+collating-symbol <X6856>
+collating-symbol <X6858>
+collating-symbol <X685A>
+collating-symbol <X685C>
+collating-symbol <X685E>
+collating-symbol <X6860>
+collating-symbol <X6862>
+collating-symbol <X6864>
+collating-symbol <X6866>
+collating-symbol <X6868>
+collating-symbol <X686A>
+collating-symbol <X686C>
+collating-symbol <X686E>
+collating-symbol <X6870>
+collating-symbol <X6872>
+collating-symbol <X6874>
+collating-symbol <X6876>
+collating-symbol <X6878>
+collating-symbol <X687A>
+collating-symbol <X687C>
+collating-symbol <X687E>
+collating-symbol <X6880>
+collating-symbol <X6882>
+collating-symbol <X6884>
+collating-symbol <X6886>
+collating-symbol <X6888>
+collating-symbol <X688A>
+collating-symbol <X688C>
+collating-symbol <X688E>
+collating-symbol <X6890>
+collating-symbol <X6892>
+collating-symbol <X6894>
+collating-symbol <X6896>
+collating-symbol <X6898>
+collating-symbol <X689A>
+collating-symbol <X689C>
+collating-symbol <X689E>
+collating-symbol <X6B20>
+collating-symbol <XE2E9>
+
+order_start forward;forward;forward;forward
+
+
+% collation weights in order
+
+<X0001>
+<X0005>
+<X000D>
+<X001D>
+<X0031>
+<X0041>
+<X0086>
+<X0087>
+<X008F>
+<X00C0>
+<X00D7>
+<X00D8>
+<X00E1>
+<X00E9>
+<X00F9>
+<X0507>
+<X0509>
+<X050B>
+<X050D>
+<X050F>
+<X0600>
+<X0764>
+<X076A>
+<X0782>
+<X078E>
+<X07AA>
+<X07C0>
+<X07C6>
+<X07EE>
+<X07F6>
+<X080B>
+<X083F>
+<X084D>
+<X0861>
+<X0863>
+<X0865>
+<X0867>
+<X0869>
+<X086B>
+<X08DF>
+<X08E1>
+<X08E9>
+<X08ED>
+<X08EF>
+<X08F5>
+<X08F7>
+<X09F7>
+<X0BB3>
+<X0BBB>
+<X0BBD>
+<X0BBF>
+<X0BC3>
+<X0BC9>
+<X1FB5>
+<X1FB7>
+<X233C>
+<X2342>
+<X2344>
+<X2370>
+<X2372>
+<X2374>
+<X2376>
+<X2378>
+<X237A>
+<X237C>
+<X237E>
+<X2380>
+<X2382>
+<X2600>
+<X2800>
+<X2A00>
+<X2C00>
+<X2E00>
+<X3000>
+<X3200>
+<X3400>
+<X3600>
+<X3800>
+<X3A00>
+<X3C00>
+<X3E00>
+<X4000>
+<X4200>
+<X4400>
+<X4600>
+<X4800>
+<X4A00>
+<X4C00>
+<X4E00>
+<X5000>
+<X5200>
+<X5400>
+<X5600>
+<X5800>
+<X6820>
+<X6822>
+<X6824>
+<X6826>
+<X6828>
+<X682A>
+<X682C>
+<X682E>
+<X6830>
+<X6832>
+<X6834>
+<X6836>
+<X6838>
+<X683A>
+<X683C>
+<X683E>
+<X6840>
+<X6842>
+<X6844>
+<X6846>
+<X6848>
+<X684A>
+<X684C>
+<X684E>
+<X6850>
+<X6852>
+<X6854>
+<X6856>
+<X6858>
+<X685A>
+<X685C>
+<X685E>
+<X6860>
+<X6862>
+<X6864>
+<X6866>
+<X6868>
+<X686A>
+<X686C>
+<X686E>
+<X6870>
+<X6872>
+<X6874>
+<X6876>
+<X6878>
+<X687A>
+<X687C>
+<X687E>
+<X6880>
+<X6882>
+<X6884>
+<X6886>
+<X6888>
+<X688A>
+<X688C>
+<X688E>
+<X6890>
+<X6892>
+<X6894>
+<X6896>
+<X6898>
+<X689A>
+<X689C>
+<X689E>
+<X6B20>
+<XE2E9>
+
+% assignment of characters to weights
+
+<U000F> IGNORE;IGNORE;IGNORE;<U000F>
+<U001E> IGNORE;IGNORE;IGNORE;<U001E>
+<U0008> IGNORE;IGNORE;IGNORE;<U0008>
+<U0017> IGNORE;IGNORE;IGNORE;<U0017>
+<U001F> IGNORE;IGNORE;IGNORE;<U001F>
+<U0010> IGNORE;IGNORE;IGNORE;<U0010>
+<U0007> IGNORE;IGNORE;IGNORE;<U0007>
+<U0016> IGNORE;IGNORE;IGNORE;<U0016>
+<U200D> IGNORE;IGNORE;IGNORE;<U200D>
+<U0015> IGNORE;IGNORE;IGNORE;<U0015>
+<U0006> IGNORE;IGNORE;IGNORE;<U0006>
+<U0001> IGNORE;IGNORE;IGNORE;<U0001>
+<U001D> IGNORE;IGNORE;IGNORE;<U001D>
+<U000E> IGNORE;IGNORE;IGNORE;<U000E>
+<U0018> IGNORE;IGNORE;IGNORE;<U0018>
+<U200C> IGNORE;IGNORE;IGNORE;<U200C>
+<U0004> IGNORE;IGNORE;IGNORE;<U0004>
+<U0013> IGNORE;IGNORE;IGNORE;<U0013>
+<U001A> IGNORE;IGNORE;IGNORE;<U001A>
+<U007F> IGNORE;IGNORE;IGNORE;<U007F>
+<U0012> IGNORE;IGNORE;IGNORE;<U0012>
+<U0003> IGNORE;IGNORE;IGNORE;<U0003>
+<U001B> IGNORE;IGNORE;IGNORE;<U001B>
+<U0011> IGNORE;IGNORE;IGNORE;<U0011>
+<U0002> IGNORE;IGNORE;IGNORE;<U0002>
+<U001C> IGNORE;IGNORE;IGNORE;<U001C>
+<U0014> IGNORE;IGNORE;IGNORE;<U0014>
+<U0019> IGNORE;IGNORE;IGNORE;<U0019>
+<U0005> IGNORE;IGNORE;IGNORE;<U0005>
+<U0000> IGNORE;IGNORE;IGNORE;<U0000>
+<U09BC> IGNORE;"<X00D7><X00E9>";"<X0005><X00C0>";IGNORE
+<U0981> IGNORE;"<X00D7><X00F9>";"<X0005><X00C0>";IGNORE
+<U0982> IGNORE;"<X00D8><X000D>";"<X0005><X00C0>";IGNORE
+<U0983> IGNORE;"<X00D8><X001D>";"<X0005><X00C0>";IGNORE
+<U0009> <X0507>;<X0005>;<X0005>;IGNORE
+<U000A> <X0509>;<X0005>;<X0005>;IGNORE
+<U000B> <X050B>;<X0005>;<X0005>;IGNORE
+<U000C> <X050D>;<X0005>;<X0005>;IGNORE
+<U000D> <X050F>;<X0005>;<X0005>;IGNORE
+<U0020> <X0600>;<X0005>;<X0005>;IGNORE
+<U0060> <X0764>;<X0005>;<X0005>;IGNORE
+<U005E> <X076A>;<X0005>;<X0005>;IGNORE
+<U005F> <X0782>;<X0005>;<X0005>;IGNORE
+<U002D> <X078E>;<X0005>;<X0005>;IGNORE
+<U002C> <X07AA>;<X0005>;<X0005>;IGNORE
+<U003B> <X07C0>;<X0005>;<X0005>;IGNORE
+<U003A> <X07C6>;<X0005>;<X0005>;IGNORE
+<U0021> <X07EE>;<X0005>;<X0005>;IGNORE
+<U003F> <X07F6>;<X0005>;<X0005>;IGNORE
+<U002E> <X080B>;<X0005>;<X0005>;IGNORE
+<U0027> <X083F>;<X0005>;<X0005>;IGNORE
+<U0022> <X084D>;<X0005>;<X0005>;IGNORE
+<U0028> <X0861>;<X0005>;<X0005>;IGNORE
+<U0029> <X0863>;<X0005>;<X0005>;IGNORE
+<U005B> <X0865>;<X0005>;<X0005>;IGNORE
+<U005D> <X0867>;<X0005>;<X0005>;IGNORE
+<U007B> <X0869>;<X0005>;<X0005>;IGNORE
+<U007D> <X086B>;<X0005>;<X0005>;IGNORE
+<U0040> <X08DF>;<X0005>;<X0005>;IGNORE
+<U002A> <X08E1>;<X0005>;<X0005>;IGNORE
+<U002F> <X08E9>;<X0005>;<X0005>;IGNORE
+<U005C> <X08ED>;<X0005>;<X0005>;IGNORE
+<U0026> <X08EF>;<X0005>;<X0005>;IGNORE
+<U0023> <X08F5>;<X0005>;<X0005>;IGNORE
+<U0025> <X08F7>;<X0005>;<X0005>;IGNORE
+<U09FA> <X09F7>;<X0005>;<X0005>;IGNORE
+<U002B> <X0BB3>;<X0005>;<X0005>;IGNORE
+<U003C> <X0BBB>;<X0005>;<X0005>;IGNORE
+<U003D> <X0BBD>;<X0005>;<X0005>;IGNORE
+<U003E> <X0BBF>;<X0005>;<X0005>;IGNORE
+<U007C> <X0BC3>;<X0005>;<X0005>;IGNORE
+<U007E> <X0BC9>;<X0005>;<X0005>;IGNORE
+<U09F8> <X1FB5>;<X0005>;<X0005>;IGNORE
+<U09F9> <X1FB7>;<X0005>;<X0005>;IGNORE
+<U0024> <X233C>;<X0005>;<X0005>;IGNORE
+<U09F2> <X2342>;<X0005>;<X0005>;IGNORE
+<U09F3> <X2344>;<X0005>;<X0005>;IGNORE
+<U0030> <X2370>;<X0005>;<X0005>;IGNORE
+<U09E6> <X2370>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U0031> <X2372>;<X0005>;<X0005>;IGNORE
+<U09E7> <X2372>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U09F4> <X2372>;"<X0005><X00E1><X0041>";"<X0005><X0005><X00C0>";IGNORE
+<U0032> <X2374>;<X0005>;<X0005>;IGNORE
+<U09E8> <X2374>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U09F5> <X2374>;"<X0005><X00E1><X0041>";"<X0005><X0005><X00C0>";IGNORE
+<U0033> <X2376>;<X0005>;<X0005>;IGNORE
+<U09E9> <X2376>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U09F6> <X2376>;"<X0005><X00E1><X0041>";"<X0005><X0005><X00C0>";IGNORE
+<U0034> <X2378>;<X0005>;<X0005>;IGNORE
+<U09EA> <X2378>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U09F7> <X2378>;"<X0005><X00E1><X0041>";"<X0005><X0005><X00C0>";IGNORE
+<U0035> <X237A>;<X0005>;<X0005>;IGNORE
+<U09EB> <X237A>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U0036> <X237C>;<X0005>;<X0005>;IGNORE
+<U09EC> <X237C>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U0037> <X237E>;<X0005>;<X0005>;IGNORE
+<U09ED> <X237E>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U0038> <X2380>;<X0005>;<X0005>;IGNORE
+<U09EE> <X2380>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U0039> <X2382>;<X0005>;<X0005>;IGNORE
+<U09EF> <X2382>;"<X0005><X00E1><X0031>";"<X0005><X0005><X00C0>";IGNORE
+<U0061> <X2600>;<X0005>;<X0005>;IGNORE
+<U0041> <X2600>;<X0005>;<X008F>;IGNORE
+<U00E6> "<X2600><X2E00>";"<X0087><X0005>";"<X0005><X0005>";IGNORE
+<U00C6> "<X2600><X2E00>";"<X0087><X0005>";"<X0086><X0005>";IGNORE
+<U0062> <X2800>;<X0005>;<X0005>;IGNORE
+<U0042> <X2800>;<X0005>;<X008F>;IGNORE
+<U0063> <X2A00>;<X0005>;<X0005>;IGNORE
+<U0043> <X2A00>;<X0005>;<X008F>;IGNORE
+<U0064> <X2C00>;<X0005>;<X0005>;IGNORE
+<U0044> <X2C00>;<X0005>;<X008F>;IGNORE
+<U0065> <X2E00>;<X0005>;<X0005>;IGNORE
+<U0045> <X2E00>;<X0005>;<X008F>;IGNORE
+<U0066> <X3000>;<X0005>;<X0005>;IGNORE
+<U0046> <X3000>;<X0005>;<X008F>;IGNORE
+<U0067> <X3200>;<X0005>;<X0005>;IGNORE
+<U0047> <X3200>;<X0005>;<X008F>;IGNORE
+<U0068> <X3400>;<X0005>;<X0005>;IGNORE
+<U0048> <X3400>;<X0005>;<X008F>;IGNORE
+<U0069> <X3600>;<X0005>;<X0005>;IGNORE
+<U0049> <X3600>;<X0005>;<X008F>;IGNORE
+<U006A> <X3800>;<X0005>;<X0005>;IGNORE
+<U004A> <X3800>;<X0005>;<X008F>;IGNORE
+<U006B> <X3A00>;<X0005>;<X0005>;IGNORE
+<U004B> <X3A00>;<X0005>;<X008F>;IGNORE
+<U006C> <X3C00>;<X0005>;<X0005>;IGNORE
+<U004C> <X3C00>;<X0005>;<X008F>;IGNORE
+<U006D> <X3E00>;<X0005>;<X0005>;IGNORE
+<U004D> <X3E00>;<X0005>;<X008F>;IGNORE
+<U006E> <X4000>;<X0005>;<X0005>;IGNORE
+<U004E> <X4000>;<X0005>;<X008F>;IGNORE
+<U006F> <X4200>;<X0005>;<X0005>;IGNORE
+<U004F> <X4200>;<X0005>;<X008F>;IGNORE
+<U0070> <X4400>;<X0005>;<X0005>;IGNORE
+<U0050> <X4400>;<X0005>;<X008F>;IGNORE
+<U0071> <X4600>;<X0005>;<X0005>;IGNORE
+<U0051> <X4600>;<X0005>;<X008F>;IGNORE
+<U0072> <X4800>;<X0005>;<X0005>;IGNORE
+<U0052> <X4800>;<X0005>;<X008F>;IGNORE
+<U0073> <X4A00>;<X0005>;<X0005>;IGNORE
+<U0053> <X4A00>;<X0005>;<X008F>;IGNORE
+<U0074> <X4C00>;<X0005>;<X0005>;IGNORE
+<U0054> <X4C00>;<X0005>;<X008F>;IGNORE
+<U0075> <X4E00>;<X0005>;<X0005>;IGNORE
+<U0055> <X4E00>;<X0005>;<X008F>;IGNORE
+<U0076> <X5000>;<X0005>;<X0005>;IGNORE
+<U0056> <X5000>;<X0005>;<X008F>;IGNORE
+<U0077> <X5200>;<X0005>;<X0005>;IGNORE
+<U0057> <X5200>;<X0005>;<X008F>;IGNORE
+<U0078> <X5400>;<X0005>;<X0005>;IGNORE
+<U0058> <X5400>;<X0005>;<X008F>;IGNORE
+<U0079> <X5600>;<X0005>;<X0005>;IGNORE
+<U0059> <X5600>;<X0005>;<X008F>;IGNORE
+<U007A> <X5800>;<X0005>;<X0005>;IGNORE
+<U005A> <X5800>;<X0005>;<X008F>;IGNORE
+<U0985> <X6820>;<X0005>;<X0005>;IGNORE
+<U0986> <X6822>;<X0005>;<X0005>;IGNORE
+<U0987> <X6824>;<X0005>;<X0005>;IGNORE
+<U0988> <X6826>;<X0005>;<X0005>;IGNORE
+<U0989> <X6828>;<X0005>;<X0005>;IGNORE
+<U098A> <X682A>;<X0005>;<X0005>;IGNORE
+<U098B> <X682C>;<X0005>;<X0005>;IGNORE
+<U09E0> <X682E>;<X0005>;<X0005>;IGNORE
+<U098C> <X6830>;<X0005>;<X0005>;IGNORE
+<U09E1> <X6832>;<X0005>;<X0005>;IGNORE
+<U098F> <X6834>;<X0005>;<X0005>;IGNORE
+<U0990> <X6836>;<X0005>;<X0005>;IGNORE
+<U0993> <X6838>;<X0005>;<X0005>;IGNORE
+<U0994> <X683A>;<X0005>;<X0005>;IGNORE
+<U0995> <X683C>;<X0005>;<X0005>;IGNORE
+<U0996> <X683E>;<X0005>;<X0005>;IGNORE
+<U0997> <X6840>;<X0005>;<X0005>;IGNORE
+<U0998> <X6842>;<X0005>;<X0005>;IGNORE
+<U0999> <X6844>;<X0005>;<X0005>;IGNORE
+<U099A> <X6846>;<X0005>;<X0005>;IGNORE
+<U099B> <X6848>;<X0005>;<X0005>;IGNORE
+<U099C> <X684A>;<X0005>;<X0005>;IGNORE
+<U099D> <X684C>;<X0005>;<X0005>;IGNORE
+<U099E> <X684E>;<X0005>;<X0005>;IGNORE
+<U099F> <X6850>;<X0005>;<X0005>;IGNORE
+<U09A0> <X6852>;<X0005>;<X0005>;IGNORE
+<U09A1> <X6854>;<X0005>;<X0005>;IGNORE
+<U09DC> <X6854>;"<X0005><X00D7><X00E9>";"<X0005><X0005><X00C0>";IGNORE
+<U09A2> <X6856>;<X0005>;<X0005>;IGNORE
+<U09DD> <X6856>;"<X0005><X00D7><X00E9>";"<X0005><X0005><X00C0>";IGNORE
+<U09A3> <X6858>;<X0005>;<X0005>;IGNORE
+<U09A4> <X685A>;<X0005>;<X0005>;IGNORE
+<U09A5> <X685C>;<X0005>;<X0005>;IGNORE
+<U09A6> <X685E>;<X0005>;<X0005>;IGNORE
+<U09A7> <X6860>;<X0005>;<X0005>;IGNORE
+<U09A8> <X6862>;<X0005>;<X0005>;IGNORE
+<U09AA> <X6864>;<X0005>;<X0005>;IGNORE
+<U09AB> <X6866>;<X0005>;<X0005>;IGNORE
+<U09AC> <X6868>;<X0005>;<X0005>;IGNORE
+<U09AD> <X686A>;<X0005>;<X0005>;IGNORE
+<U09AE> <X686C>;<X0005>;<X0005>;IGNORE
+<U09AF> <X686E>;<X0005>;<X0005>;IGNORE
+<U09DF> <X686E>;"<X0005><X00D7><X00E9>";"<X0005><X0005><X00C0>";IGNORE
+<U09B0> <X6870>;<X0005>;<X0005>;IGNORE
+<U09F0> <X6872>;<X0005>;<X0005>;IGNORE
+<U09B2> <X6874>;<X0005>;<X0005>;IGNORE
+<U09F1> <X6876>;<X0005>;<X0005>;IGNORE
+<U09B6> <X6878>;<X0005>;<X0005>;IGNORE
+<U09B7> <X687A>;<X0005>;<X0005>;IGNORE
+<U09B8> <X687C>;<X0005>;<X0005>;IGNORE
+<U09B9> <X687E>;<X0005>;<X0005>;IGNORE
+% FIXME <U09BD> <X6880>;<X0005>;<X0005>;IGNORE 
+%     <U09BD> (Bengali sign avagraha) is defined from Unicode4.0 
+<U09BE> <X6882>;<X0005>;<X0005>;IGNORE
+<U09BF> <X6884>;<X0005>;<X0005>;IGNORE
+<U09C0> <X6886>;<X0005>;<X0005>;IGNORE
+<U09C1> <X6888>;<X0005>;<X0005>;IGNORE
+<U09C2> <X688A>;<X0005>;<X0005>;IGNORE
+<U09C3> <X688C>;<X0005>;<X0005>;IGNORE
+<U09C4> <X688E>;<X0005>;<X0005>;IGNORE
+<U09E2> <X6890>;<X0005>;<X0005>;IGNORE
+<U09E3> <X6892>;<X0005>;<X0005>;IGNORE
+<U09C7> <X6894>;<X0005>;<X0005>;IGNORE
+<U09C8> <X6896>;<X0005>;<X0005>;IGNORE
+<U09CB> <X6898>;<X0005>;<X0005>;IGNORE
+<U09CC> <X689A>;<X0005>;<X0005>;IGNORE
+<U09CD> <X689C>;<X0005>;<X0005>;IGNORE
+<U09D7> <X689E>;<X0005>;<X0005>;IGNORE
+<UNASSIGNED-09CE> "<XE2E9><X6B20>";<X0005>;"<X0005><X00C0>";IGNORE
+UNDEFINED IGNORE;IGNORE;IGNORE;%...
+
+order_end
+END LC_COLLATE
+
+%%%%%%%%%%%%%
+LC_NUMERIC
+copy "en_IN"
+END LC_NUMERIC
+
+%%%%%%%%%%%%%
+LC_MONETARY
+int_curr_symbol       "<U0049><U004E><U0052><U0020>"
+currency_symbol       "<U0052><U0073><U002E>"
+mon_decimal_point     "<U002E>"
+mon_thousands_sep     "<U002C>"
+mon_grouping          3;2
+positive_sign         ""
+negative_sign         "<U002D>"
+int_frac_digits       2
+frac_digits           2
+p_cs_precedes         1
+p_sep_by_space        1
+n_cs_precedes         1
+n_sep_by_space        1
+p_sign_posn           1
+n_sign_posn           1
+int_p_cs_precedes     1
+int_p_sep_by_space    1
+int_n_cs_precedes     1
+int_n_sep_by_space    1
+int_p_sign_posn       1
+int_n_sign_posn       1
+END LC_MONETARY
+
+%%%%%%%%%%%%%
+LC_TIME
+abday   "<U09F0><U09AC><U09BF>";/
+        "<U09B8><U09CB><U09AE>";/
+        "<U09AE><U0999><U09CD><U0997><U09B2>";/
+        "<U09AC><U09C1><U09A7>";/
+        "<U09AC><U09C3><U09B9><U09B7><U09CD><U09AA><U09A4><U09BF>";/
+        "<U09B6><U09C1><U0995><U09CD><U09F0>";/
+        "<U09B6><U09A8><U09BF>"
+day     "<U09A6><U09C7><U0993><U09AC><U09BE><U09F0>";/
+        "<U09B8><U09CB><U09AE><U09AC><U09BE><U09F0>";/
+        "<U09AE><U0999><U09CD><U0997><U09B2><U09AC><U09BE><U09F0>";/
+        "<U09AC><U09C1><U09A7><U09AC><U09BE><U09F0>";/
+        "<U09AC><U09C3><U09B9><U09B7><U09CD><U09AA><U09A4><U09BF><U09AC><U09BE><U09F0>";/
+        "<U09B6><U09C1><U0995><U09CD><U09F0><U09AC><U09BE><U09F0>";/
+        "<U09B6><U09A8><U09BF><U09AC><U09BE><U09F0>"
+abmon   "<U099C><U09BE><U09A8><U09C1>";/
+        "<U09AB><U09C7><U09AC><U09CD><U09F0><U09C1>";/
+        "<U09AE><U09BE><U09F0><U09CD><U099A>";/
+        "<U098F><U09AA><U09CD><U09F0><U09BF><U09B2>";/
+        "<U09AE><U09C7>";/
+        "<U099C><U09C1><U09A8>";/
+        "<U099C><U09C1><U09B2><U09BE><U0987>";/
+        "<U0986><U0997>";/
+        "<U09B8><U09C7><U09AA><U09CD><U099F>";/
+        "<U0985><U0995><U09CD><U099F><U09CB>";/
+        "<U09A8><U09AD><U09C7>";/
+        "<U09A1><U09BF><U09B8><U09C7>"
+mon     "<U099C><U09BE><U09A8><U09C1><U09DF><U09BE><U09F0><U09C0>";/
+        "<U09AB><U09C7><U09AC><U09CD><U09F0><U09C1><U09DF><U09BE><U09F0><U09C0>";/
+        "<U09AE><U09BE><U09F0><U09CD><U099A>";/
+        "<U098F><U09AA><U09CD><U09F0><U09BF><U09B2>";/
+        "<U09AE><U09C7>";/
+        "<U099C><U09C1><U09A8>";/
+        "<U099C><U09C1><U09B2><U09BE><U0987>";/
+        "<U0986><U0997><U09B7><U09CD><U099F>";/
+        "<U09B8><U09C7><U09AA><U09CD><U099F><U09C7><U09AE><U09CD><U09AC><U09F0>";/
+        "<U0985><U0995><U09CD><U099F><U09CB><U09AC><U09F0>";/
+        "<U09A8><U09AD><U09C7><U09AE><U09CD><U09AC><U09F0>";/
+        "<U09A1><U09BF><U09B8><U09C7><U09AE><U09CD><U09AC><U09F0>"
+% d_fmt  "%e-%m-%Y"
+d_fmt    "<U0025><U0065><U002D><U0025><U006D><U002D><U0025><U0059>"
+% t_fmt  "%I.%M.%S %p"
+t_fmt    "<U0025><U0049><U002E><U0025><U004D><U002E><U0025><U0053><U0020><U0025><U0070>"
+% d_t_fmt"%e %B, %Y %I.%M.%S %p %Z"
+d_t_fmt  "<U0025><U0065><U0020><U0025><U0042><U002C><U0020><U0025><U0059><U0020><U0025><U0049><U002E><U0025><U004D><U002E><U0025><U0053><U0020><U0025><U0070><U0020><U0025><U005A>"
+am_pm    "<U09AA><U09C2><U09F0><U09CD><U09AC><U09BE>";"<U0985><U09AA>"
+% t_fmt_ampm  "%I.%M.%S %p"
+t_fmt_ampm  "<U0025><U0049><U002E><U0025><U004D><U002E><U0025><U0053><U0020><U0025><U0070>"
+END LC_TIME
+
+%%%%%%%%%%%%%
+LC_MESSAGES
+yesstr   "<U09B9><U09DF>"
+nostr    "<U09A8><U09B9><U09DF>"
+yesexpr  "<U005E><U005B><U0079><U0059><U09B9><U005D><U002E><U002A>"
+noexpr   "<U005E><U005B><U006E><U004E><U09A8><U005D><U002E><U002A>"
+END LC_MESSAGES
+
+%%%%%%%%%%%%%
+LC_PAPER
+copy "hi_IN"
+END LC_PAPER
+
+%%%%%%%%%%%%%
+LC_NAME
+% This is the ISO_IEC TR14652 Locale definition for the
+% LC_NAME category.
+%
+name_fmt    "<U0025><U0070><U0025><U0074><U0025><U0066><U0025><U0074>/
+<U0025><U0067>"
+name_gen    ""
+name_mr     "<U004D><U0072><U002E>"
+name_mrs    "<U004D><U0072><U0073><U002E>"
+name_miss   "<U004D><U0069><U0073><U0073><U002E>"
+name_ms     "<U004D><U0073><U002E>"
+END LC_NAME
+
+%%%%%%%%%%%%%
+LC_ADDRESS
+% This is the ISO_IEC TR14652 Locale definition for the
+% LC_ADDRESS
+postal_fmt  "<U0025><U007A><U0025><U0063><U0025><U0054><U0025><U0073>/
+<U0025><U0062><U0025><U0065><U0025><U0072>"
+END LC_ADDRESS
+
+%%%%%%%%%%%%%
+LC_TELEPHONE
+% This is the ISO_IEC TR14652 Locale definition for the
+tel_int_fmt "<U002B><U0025><U0063><U0020><U003B><U0025><U0061><U0020><U003B><U0025><U006C>"
+int_prefix  "<U0039><U0031>"
+int_select  "<U0030><U0030>"
+END LC_TELEPHONE
+
+%%%%%%%%%%%%%
+LC_MEASUREMENT
+copy "hi_IN"
+END LC_MEASUREMENT
diff --git a/localedata/locales/or_IN b/localedata/locales/or_IN
new file mode 100644
index 0000000000..7929b2b13f
--- /dev/null
+++ b/localedata/locales/or_IN
@@ -0,0 +1,807 @@
+comment_char %
+escape_char /
+
+% Oriya locale for India.
+% Contributed by Masahide Washizawa <washi at jp ibm com>
+
+%%%%%%%%%%%%%
+LC_IDENTIFICATION
+title       "Oriya language locale for India"
+source      "IBM AP Linux Technology Center, Yamato Software Laboratory"
+address     "1623-14, Shimotsuruma, Yamato-shi, Kanagawa-ken, 242-8502, Japan"
+contact     ""
+email       "bug-glibc@gnu.org"
+tel         ""
+fax         ""
+language    "Oriya"
+territory   "India"
+revision    "1.0"
+date        "2006-05-25"
+%
+category  "or_IN:2004";LC_IDENTIFICATION
+category  "or_IN:2004";LC_CTYPE
+category  "or_IN:2004";LC_COLLATE
+category  "or_IN:2004";LC_TIME
+category  "or_IN:2004";LC_NUMERIC
+category  "or_IN:2004";LC_MONETARY
+category  "or_IN:2004";LC_MESSAGES
+category  "or_IN:2004";LC_PAPER
+category  "or_IN:2004";LC_NAME
+category  "or_IN:2004";LC_ADDRESS
+category  "or_IN:2004";LC_TELEPHONE
+END LC_IDENTIFICATION
+
+%%%%%%%%%%%%%
+LC_CTYPE
+copy "i18n"
+END LC_CTYPE
+
+%%%%%%%%%%%%%
+LC_COLLATE
+
+collating-element <ORIYA_LETTER_KA-ORIYA_SIGN_VIRAMA-ORIYA_LETTER_SSA> from "<U0B15><U0B4D><U0B37>"
+collating-element <ORIYA_LETTER_DDA-ORIYA_SIGN_NUKTA> from "<U0B21><U0B3C>"
+collating-element <ORIYA_LETTER_DDHA-ORIYA_SIGN_NUKTA> from "<U0B22><U0B3C>"
+
+% Define collation weights as symbols
+
+collating-symbol <X0001>
+collating-symbol <X0005>
+collating-symbol <X0071>
+collating-symbol <X008F>
+collating-symbol <X00C0>
+collating-symbol <X00E1>
+collating-symbol <X0400>
+collating-symbol <X0500>
+collating-symbol <X0507>
+collating-symbol <X0509>
+collating-symbol <X050B>
+collating-symbol <X050D>
+collating-symbol <X050F>
+collating-symbol <X0600>
+collating-symbol <X0700>
+collating-symbol <X0764>
+collating-symbol <X076A>
+collating-symbol <X0782>
+collating-symbol <X078E>
+collating-symbol <X07AA>
+collating-symbol <X07C0>
+collating-symbol <X07C6>
+collating-symbol <X07EE>
+collating-symbol <X07F6>
+collating-symbol <X0800>
+collating-symbol <X080B>
+collating-symbol <X083F>
+collating-symbol <X084D>
+collating-symbol <X0861>
+collating-symbol <X0863>
+collating-symbol <X0865>
+collating-symbol <X0867>
+collating-symbol <X0869>
+collating-symbol <X086B>
+collating-symbol <X08DF>
+collating-symbol <X08E1>
+collating-symbol <X08E9>
+collating-symbol <X08ED>
+collating-symbol <X08EF>
+collating-symbol <X08F5>
+collating-symbol <X08F7>
+collating-symbol <X0900>
+collating-symbol <X09F9>
+collating-symbol <X0A00>
+collating-symbol <X0B00>
+collating-symbol <X0BB3>
+collating-symbol <X0BBB>
+collating-symbol <X0BBD>
+collating-symbol <X0BBF>
+collating-symbol <X0BC3>
+collating-symbol <X0BC9>
+collating-symbol <X0C00>
+collating-symbol <X0D00>
+collating-symbol <X0E00>
+collating-symbol <X233C>
+collating-symbol <X2370>
+collating-symbol <X2372>
+collating-symbol <X2374>
+collating-symbol <X2376>
+collating-symbol <X2378>
+collating-symbol <X237A>
+collating-symbol <X237C>
+collating-symbol <X237E>
+collating-symbol <X2380>
+collating-symbol <X2382>
+collating-symbol <X2600>
+collating-symbol <X2800>
+collating-symbol <X2A00>
+collating-symbol <X2C00>
+collating-symbol <X2E00>
+collating-symbol <X3000>
+collating-symbol <X3200>
+collating-symbol <X3400>
+collating-symbol <X3600>
+collating-symbol <X3800>
+collating-symbol <X3A00>
+collating-symbol <X3C00>
+collating-symbol <X3E00>
+collating-symbol <X4000>
+collating-symbol <X4200>
+collating-symbol <X4400>
+collating-symbol <X4600>
+collating-symbol <X4800>
+collating-symbol <X4A00>
+collating-symbol <X4C00>
+collating-symbol <X4E00>
+collating-symbol <X5000>
+collating-symbol <X5200>
+collating-symbol <X5400>
+collating-symbol <X5600>
+collating-symbol <X5800>
+collating-symbol <X6B20>
+collating-symbol <X6B22>
+collating-symbol <X6B24>
+collating-symbol <X6B26>
+collating-symbol <X6B28>
+collating-symbol <X6B2A>
+collating-symbol <X6B2C>
+collating-symbol <X6B2E>
+collating-symbol <X6B30>
+collating-symbol <X6B32>
+collating-symbol <X6B34>
+collating-symbol <X6B36>
+collating-symbol <X6B38>
+collating-symbol <X6B3A>
+collating-symbol <X6B3C>
+collating-symbol <X6B3E>
+collating-symbol <X6B40>
+collating-symbol <X6B42>
+collating-symbol <X6B44>
+collating-symbol <X6B46>
+collating-symbol <X6B48>
+collating-symbol <X6B4A>
+collating-symbol <X6B4C>
+collating-symbol <X6B4E>
+collating-symbol <X6B50>
+collating-symbol <X6B52>
+collating-symbol <X6B54>
+collating-symbol <X6B56>
+collating-symbol <X6B58>
+collating-symbol <X6B5A>
+collating-symbol <X6B5C>
+collating-symbol <X6B5E>
+collating-symbol <X6B60>
+collating-symbol <X6B62>
+collating-symbol <X6B64>
+collating-symbol <X6B66>
+collating-symbol <X6B68>
+collating-symbol <X6B6A>
+collating-symbol <X6B6C>
+collating-symbol <X6B6E>
+collating-symbol <X6B72>
+collating-symbol <X6B74>
+collating-symbol <X6B76>
+collating-symbol <X6B7C>
+collating-symbol <X6B7E>
+collating-symbol <X6B80>
+collating-symbol <X6B82>
+collating-symbol <X6B83>
+collating-symbol <X6B84>
+collating-symbol <X6B86>
+collating-symbol <X6B88>
+collating-symbol <X6B8A>
+collating-symbol <X6B8C>
+collating-symbol <X6B8E>
+collating-symbol <X6B90>
+collating-symbol <X6B92>
+collating-symbol <X6B94>
+collating-symbol <X6B96>
+collating-symbol <X6B98>
+collating-symbol <X6B9C>
+collating-symbol <X6B9E>
+
+order_start forward;forward;forward;forward
+
+
+% collation weights in order
+
+<X0001>
+<X0005>
+<X0071>
+<X008F>
+<X00C0>
+<X00E1>
+<X0400>
+<X0500>
+<X0507>
+<X0509>
+<X050B>
+<X050D>
+<X050F>
+<X0600>
+<X0700>
+<X0764>
+<X076A>
+<X0782>
+<X078E>
+<X07AA>
+<X07C0>
+<X07C6>
+<X07EE>
+<X07F6>
+<X0800>
+<X080B>
+<X083F>
+<X084D>
+<X0861>
+<X0863>
+<X0865>
+<X0867>
+<X0869>
+<X086B>
+<X08DF>
+<X08E1>
+<X08E9>
+<X08ED>
+<X08EF>
+<X08F5>
+<X08F7>
+<X0900>
+<X09F9>
+<X0A00>
+<X0B00>
+<X0BB3>
+<X0BBB>
+<X0BBD>
+<X0BBF>
+<X0BC3>
+<X0BC9>
+<X0C00>
+<X0D00>
+<X0E00>
+<X233C>
+<X2370>
+<X2372>
+<X2374>
+<X2376>
+<X2378>
+<X237A>
+<X237C>
+<X237E>
+<X2380>
+<X2382>
+<X2600>
+<X2800>
+<X2A00>
+<X2C00>
+<X2E00>
+<X3000>
+<X3200>
+<X3400>
+<X3600>
+<X3800>
+<X3A00>
+<X3C00>
+<X3E00>
+<X4000>
+<X4200>
+<X4400>
+<X4600>
+<X4800>
+<X4A00>
+<X4C00>
+<X4E00>
+<X5000>
+<X5200>
+<X5400>
+<X5600>
+<X5800>
+<X6B20>
+<X6B22>
+<X6B24>
+<X6B26>
+<X6B28>
+<X6B2A>
+<X6B2C>
+<X6B2E>
+<X6B30>
+<X6B32>
+<X6B34>
+<X6B36>
+<X6B38>
+<X6B3A>
+<X6B3C>
+<X6B3E>
+<X6B40>
+<X6B42>
+<X6B44>
+<X6B46>
+<X6B48>
+<X6B4A>
+<X6B4C>
+<X6B4E>
+<X6B50>
+<X6B52>
+<X6B54>
+<X6B56>
+<X6B58>
+<X6B5A>
+<X6B5C>
+<X6B5E>
+<X6B60>
+<X6B62>
+<X6B64>
+<X6B66>
+<X6B68>
+<X6B6A>
+<X6B6C>
+<X6B6E>
+<X6B72>
+<X6B74>
+<X6B76>
+<X6B7C>
+<X6B7E>
+<X6B80>
+<X6B82>
+<X6B83>
+<X6B84>
+<X6B86>
+<X6B88>
+<X6B8A>
+<X6B8C>
+<X6B8E>
+<X6B90>
+<X6B92>
+<X6B94>
+<X6B96>
+<X6B98>
+<X6B9C>
+<X6B9E>
+
+% assignment of characters to weights
+
+<U000F> IGNORE;IGNORE;IGNORE;<U000F>
+<U001E> IGNORE;IGNORE;IGNORE;<U001E>
+<U0008> IGNORE;IGNORE;IGNORE;<U0008>
+<U0017> IGNORE;IGNORE;IGNORE;<U0017>
+<U001F> IGNORE;IGNORE;IGNORE;<U001F>
+<U0010> IGNORE;IGNORE;IGNORE;<U0010>
+<U0007> IGNORE;IGNORE;IGNORE;<U0007>
+<U0016> IGNORE;IGNORE;IGNORE;<U0016>
+<U0015> IGNORE;IGNORE;IGNORE;<U0015>
+<U0006> IGNORE;IGNORE;IGNORE;<U0006>
+<U0001> IGNORE;IGNORE;IGNORE;<U0001>
+<U001D> IGNORE;IGNORE;IGNORE;<U001D>
+<U000E> IGNORE;IGNORE;IGNORE;<U000E>
+<U0018> IGNORE;IGNORE;IGNORE;<U0018>
+<U0004> IGNORE;IGNORE;IGNORE;<U0004>
+<U0013> IGNORE;IGNORE;IGNORE;<U0013>
+<U001A> IGNORE;IGNORE;IGNORE;<U001A>
+<U007F> IGNORE;IGNORE;IGNORE;<U007F>
+<U0012> IGNORE;IGNORE;IGNORE;<U0012>
+<U0003> IGNORE;IGNORE;IGNORE;<U0003>
+<U001B> IGNORE;IGNORE;IGNORE;<U001B>
+<U0011> IGNORE;IGNORE;IGNORE;<U0011>
+<U0002> IGNORE;IGNORE;IGNORE;<U0002>
+<U001C> IGNORE;IGNORE;IGNORE;<U001C>
+<U0014> IGNORE;IGNORE;IGNORE;<U0014>
+<U0019> IGNORE;IGNORE;IGNORE;<U0019>
+<U0005> IGNORE;IGNORE;IGNORE;<U0005>
+<U0000> IGNORE;IGNORE;IGNORE;<U0000>
+<U0009> <X0507>;<X0005>;<X0005>;IGNORE
+<U000A> <X0509>;<X0005>;<X0005>;IGNORE
+<U000B> <X050B>;<X0005>;<X0005>;IGNORE
+<U000C> <X050D>;<X0005>;<X0005>;IGNORE
+<U000D> <X050F>;<X0005>;<X0005>;IGNORE
+<U0020> <X0600>;<X0005>;<X0005>;IGNORE
+<U0060> <X0764>;<X0005>;<X0005>;IGNORE
+<U005E> <X076A>;<X0005>;<X0005>;IGNORE
+<U005F> <X0782>;<X0005>;<X0005>;IGNORE
+<U002D> <X078E>;<X0005>;<X0005>;IGNORE
+<U002C> <X07AA>;<X0005>;<X0005>;IGNORE
+<U003B> <X07C0>;<X0005>;<X0005>;IGNORE
+<U003A> <X07C6>;<X0005>;<X0005>;IGNORE
+<U0021> <X07EE>;<X0005>;<X0005>;IGNORE
+<U003F> <X07F6>;<X0005>;<X0005>;IGNORE
+<U002E> <X080B>;<X0005>;<X0005>;IGNORE
+<U0027> <X083F>;<X0005>;<X0005>;IGNORE
+<U0022> <X084D>;<X0005>;<X0005>;IGNORE
+<U0028> <X0861>;<X0005>;<X0005>;IGNORE
+<U0029> <X0863>;<X0005>;<X0005>;IGNORE
+<U005B> <X0865>;<X0005>;<X0005>;IGNORE
+<U005D> <X0867>;<X0005>;<X0005>;IGNORE
+<U007B> <X0869>;<X0005>;<X0005>;IGNORE
+<U007D> <X086B>;<X0005>;<X0005>;IGNORE
+<U0040> <X08DF>;<X0005>;<X0005>;IGNORE
+<U002A> <X08E1>;<X0005>;<X0005>;IGNORE
+<U002F> <X08E9>;<X0005>;<X0005>;IGNORE
+<U005C> <X08ED>;<X0005>;<X0005>;IGNORE
+<U0026> <X08EF>;<X0005>;<X0005>;IGNORE
+<U0023> <X08F5>;<X0005>;<X0005>;IGNORE
+<U0025> <X08F7>;<X0005>;<X0005>;IGNORE
+<U0B70> <X09F9>;<X0005>;<X0005>;IGNORE
+<U002B> <X0BB3>;<X0005>;<X0005>;IGNORE
+<U003C> <X0BBB>;<X0005>;<X0005>;IGNORE
+<U003D> <X0BBD>;<X0005>;<X0005>;IGNORE
+<U003E> <X0BBF>;<X0005>;<X0005>;IGNORE
+<U007C> <X0BC3>;<X0005>;<X0005>;IGNORE
+<U007E> <X0BC9>;<X0005>;<X0005>;IGNORE
+<U0024> <X233C>;<X0005>;<X0005>;IGNORE
+<U0030> <X2370>;<X0005>;<X0005>;IGNORE
+<U0B66> <X2370>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0031> <X2372>;<X0005>;<X0005>;IGNORE
+<U0B67> <X2372>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0032> <X2374>;<X0005>;<X0005>;IGNORE
+<U0B68> <X2374>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0033> <X2376>;<X0005>;<X0005>;IGNORE
+<U0B69> <X2376>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0034> <X2378>;<X0005>;<X0005>;IGNORE
+<U0B6A> <X2378>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0035> <X237A>;<X0005>;<X0005>;IGNORE
+<U0B6B> <X237A>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0036> <X237C>;<X0005>;<X0005>;IGNORE
+<U0B6C> <X237C>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0037> <X237E>;<X0005>;<X0005>;IGNORE
+<U0B6D> <X237E>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0038> <X2380>;<X0005>;<X0005>;IGNORE
+<U0B6E> <X2380>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0039> <X2382>;<X0005>;<X0005>;IGNORE
+<U0B6F> <X2382>;"<X0005><X00E1><X0071>";"<X0005><X0005><X00C0>";IGNORE
+<U0061> <X2600>;<X0005>;<X0005>;IGNORE
+<U0041> <X2600>;<X0005>;<X008F>;IGNORE
+<U0062> <X2800>;<X0005>;<X0005>;IGNORE
+<U0042> <X2800>;<X0005>;<X008F>;IGNORE
+<U0063> <X2A00>;<X0005>;<X0005>;IGNORE
+<U0043> <X2A00>;<X0005>;<X008F>;IGNORE
+<U0064> <X2C00>;<X0005>;<X0005>;IGNORE
+<U0044> <X2C00>;<X0005>;<X008F>;IGNORE
+<U0065> <X2E00>;<X0005>;<X0005>;IGNORE
+<U0045> <X2E00>;<X0005>;<X008F>;IGNORE
+<U0066> <X3000>;<X0005>;<X0005>;IGNORE
+<U0046> <X3000>;<X0005>;<X008F>;IGNORE
+<U0067> <X3200>;<X0005>;<X0005>;IGNORE
+<U0047> <X3200>;<X0005>;<X008F>;IGNORE
+<U0068> <X3400>;<X0005>;<X0005>;IGNORE
+<U0048> <X3400>;<X0005>;<X008F>;IGNORE
+<U0069> <X3600>;<X0005>;<X0005>;IGNORE
+<U0049> <X3600>;<X0005>;<X008F>;IGNORE
+<U006A> <X3800>;<X0005>;<X0005>;IGNORE
+<U004A> <X3800>;<X0005>;<X008F>;IGNORE
+<U006B> <X3A00>;<X0005>;<X0005>;IGNORE
+<U004B> <X3A00>;<X0005>;<X008F>;IGNORE
+<U006C> <X3C00>;<X0005>;<X0005>;IGNORE
+<U004C> <X3C00>;<X0005>;<X008F>;IGNORE
+<U006D> <X3E00>;<X0005>;<X0005>;IGNORE
+<U004D> <X3E00>;<X0005>;<X008F>;IGNORE
+<U006E> <X4000>;<X0005>;<X0005>;IGNORE
+<U004E> <X4000>;<X0005>;<X008F>;IGNORE
+<U006F> <X4200>;<X0005>;<X0005>;IGNORE
+<U004F> <X4200>;<X0005>;<X008F>;IGNORE
+<U0070> <X4400>;<X0005>;<X0005>;IGNORE
+<U0050> <X4400>;<X0005>;<X008F>;IGNORE
+<U0071> <X4600>;<X0005>;<X0005>;IGNORE
+<U0051> <X4600>;<X0005>;<X008F>;IGNORE
+<U0072> <X4800>;<X0005>;<X0005>;IGNORE
+<U0052> <X4800>;<X0005>;<X008F>;IGNORE
+<U0073> <X4A00>;<X0005>;<X0005>;IGNORE
+<U0053> <X4A00>;<X0005>;<X008F>;IGNORE
+<U0074> <X4C00>;<X0005>;<X0005>;IGNORE
+<U0054> <X4C00>;<X0005>;<X008F>;IGNORE
+<U0075> <X4E00>;<X0005>;<X0005>;IGNORE
+<U0055> <X4E00>;<X0005>;<X008F>;IGNORE
+<U0076> <X5000>;<X0005>;<X0005>;IGNORE
+<U0056> <X5000>;<X0005>;<X008F>;IGNORE
+<U0077> <X5200>;<X0005>;<X0005>;IGNORE
+<U0057> <X5200>;<X0005>;<X008F>;IGNORE
+<U0078> <X5400>;<X0005>;<X0005>;IGNORE
+<U0058> <X5400>;<X0005>;<X008F>;IGNORE
+<U0079> <X5600>;<X0005>;<X0005>;IGNORE
+<U0059> <X5600>;<X0005>;<X008F>;IGNORE
+<U007A> <X5800>;<X0005>;<X0005>;IGNORE
+<U005A> <X5800>;<X0005>;<X008F>;IGNORE
+<U0B05> <X6B20>;<X0005>;<X0005>;IGNORE
+<U0B06> <X6B22>;<X0005>;<X0005>;IGNORE
+<U0B07> <X6B24>;<X0005>;<X0005>;IGNORE
+<U0B08> <X6B26>;<X0005>;<X0005>;IGNORE
+<U0B09> <X6B28>;<X0005>;<X0005>;IGNORE
+<U0B0A> <X6B2A>;<X0005>;<X0005>;IGNORE
+<U0B0B> <X6B2C>;<X0005>;<X0005>;IGNORE
+<U0B60> <X6B2E>;<X0005>;<X0005>;IGNORE
+<U0B0C> <X6B30>;<X0005>;<X0005>;IGNORE
+<U0B61> <X6B32>;<X0005>;<X0005>;IGNORE
+<U0B0F> <X6B34>;<X0005>;<X0005>;IGNORE
+<U0B10> <X6B36>;<X0005>;<X0005>;IGNORE
+<U0B13> <X6B38>;<X0005>;<X0005>;IGNORE
+<U0B14> <X6B3A>;<X0005>;<X0005>;IGNORE
+<U0B15> <X6B3C>;<X0005>;<X0005>;IGNORE
+<U0B16> <X6B3E>;<X0005>;<X0005>;IGNORE
+<U0B17> <X6B40>;<X0005>;<X0005>;IGNORE
+<U0B18> <X6B42>;<X0005>;<X0005>;IGNORE
+<U0B19> <X6B44>;<X0005>;<X0005>;IGNORE
+<U0B1A> <X6B46>;<X0005>;<X0005>;IGNORE
+<U0B1B> <X6B48>;<X0005>;<X0005>;IGNORE
+<U0B1C> <X6B4A>;<X0005>;<X0005>;IGNORE
+<U0B1D> <X6B4C>;<X0005>;<X0005>;IGNORE
+<U0B1E> <X6B4E>;<X0005>;<X0005>;IGNORE
+<U0B1F> <X6B50>;<X0005>;<X0005>;IGNORE
+<U0B20> <X6B52>;<X0005>;<X0005>;IGNORE
+<U0B21> <X6B54>;<X0005>;<X0005>;IGNORE
+<U0B22> <X6B56>;<X0005>;<X0005>;IGNORE
+<U0B23> <X6B58>;<X0005>;<X0005>;IGNORE
+<U0B24> <X6B5A>;<X0005>;<X0005>;IGNORE
+<U0B25> <X6B5C>;<X0005>;<X0005>;IGNORE
+<U0B26> <X6B5E>;<X0005>;<X0005>;IGNORE
+<U0B27> <X6B60>;<X0005>;<X0005>;IGNORE
+<U0B28> <X6B62>;<X0005>;<X0005>;IGNORE
+<U0B2A> <X6B64>;<X0005>;<X0005>;IGNORE
+<U0B2B> <X6B66>;<X0005>;<X0005>;IGNORE
+<U0B2C> <X6B68>;<X0005>;<X0005>;IGNORE
+<U0B2D> <X6B6A>;<X0005>;<X0005>;IGNORE
+<U0B2E> <X6B6C>;<X0005>;<X0005>;IGNORE
+<U0B2F> <X6B6E>;<X0005>;<X0005>;IGNORE
+<U0B30> <X6B72>;<X0005>;<X0005>;IGNORE
+<U0B32> <X6B74>;<X0005>;<X0005>;IGNORE
+<U0B33> <X6B76>;<X0005>;<X0005>;IGNORE
+<U0B36> <X6B7C>;<X0005>;<X0005>;IGNORE
+<U0B37> <X6B7E>;<X0005>;<X0005>;IGNORE
+<U0B38> <X6B80>;<X0005>;<X0005>;IGNORE
+<U0B39> <X6B82>;<X0005>;<X0005>;IGNORE
+<ORIYA_LETTER_KA-ORIYA_SIGN_VIRAMA-ORIYA_LETTER_SSA> "<X6B83><X0400>";<X0005>;"<X0005><X00C0>";IGNORE
+<ORIYA_LETTER_DDA-ORIYA_SIGN_NUKTA> "<X6B83><X0500>";<X0005>;"<X0005><X00C0>";"<U0B21><U0B3C>"
+<U0B5C> "<X6B83><X0500>";<X0005>;"<X0005><X00C0>";"<U0B21><U0B3C>"
+<ORIYA_LETTER_DDHA-ORIYA_SIGN_NUKTA> "<X6B83><X0600>";<X0005>;"<X0005><X00C0>";"<U0B22><U0B3C>"
+<U0B5D> "<X6B83><X0600>";<X0005>;"<X0005><X00C0>";"<U0B22><U0B3C>"
+<U0B5F> "<X6B83><X0700>";<X0005>;"<X0005><X00C0>";IGNORE
+% FIXME ORIYA_LETTER_WA "<X6B83><X0800>";<X0005>;"<X0005><X00C0>";IGNORE
+% FIXME ORIYA_LETTER_VA "<X6B83><X0900>";<X0005>;"<X0005><X00C0>";IGNORE
+% ORIYA_LETTER_WA and ORIYA_LETTER_VA are not defined in unicode 3.0
+<U0B02> "<X6B83><X0A00>";<X0005>;"<X0005><X00C0>";IGNORE
+<U0B03> "<X6B83><X0B00>";<X0005>;"<X0005><X00C0>";IGNORE
+<U0B01> "<X6B83><X0C00>";<X0005>;"<X0005><X00C0>";IGNORE
+<U0B4D> "<X6B83><X0D00>";<X0005>;"<X0005><X00C0>";IGNORE
+<U0B3C> "<X6B83><X0E00>";<X0005>;"<X0005><X00C0>";IGNORE
+<U0B3D> <X6B84>;<X0005>;<X0005>;IGNORE
+<U0B3E> <X6B86>;<X0005>;<X0005>;IGNORE
+<U0B3F> <X6B88>;<X0005>;<X0005>;IGNORE
+<U0B40> <X6B8A>;<X0005>;<X0005>;IGNORE
+<U0B41> <X6B8C>;<X0005>;<X0005>;IGNORE
+<U0B42> <X6B8E>;<X0005>;<X0005>;IGNORE
+<U0B43> <X6B90>;<X0005>;<X0005>;IGNORE
+<U0B47> <X6B92>;<X0005>;<X0005>;IGNORE
+<U0B48> <X6B94>;<X0005>;<X0005>;IGNORE
+<U0B4B> <X6B96>;<X0005>;<X0005>;IGNORE
+<U0B4C> <X6B98>;<X0005>;<X0005>;IGNORE
+<U0B56> <X6B9C>;<X0005>;<X0005>;IGNORE
+<U0B57> <X6B9E>;<X0005>;<X0005>;IGNORE
+UNDEFINED IGNORE;IGNORE;IGNORE;%...
+
+order_end
+END LC_COLLATE
+
+%%%%%%%%%%%%%
+LC_NUMERIC
+decimal_point     "<U002E>"
+thousands_sep     "<U002C>"
+grouping          3;2
+END LC_NUMERIC
+
+%%%%%%%%%%%%%
+LC_MONETARY
+int_curr_symbol       "<U0049><U004E><U0052><U0020>"
+currency_symbol       "<U003D><U0030><U0023><U0052><U0073><U002E><U007C><U0031><U0023><U0052><U0065><U002E><U007C><U0031><U003C><U0052><U0073><U002E>"
+mon_decimal_point     "<U002E>"
+mon_thousands_sep     "<U002C>"
+mon_grouping          3;2
+positive_sign         ""
+negative_sign         "<U002D>"
+int_frac_digits       2
+frac_digits           2
+p_cs_precedes         1
+p_sep_by_space        1
+n_cs_precedes         1
+n_sep_by_space        1
+p_sign_posn           1
+n_sign_posn           1
+int_p_cs_precedes     1
+int_p_sep_by_space    1
+int_n_cs_precedes     1
+int_n_sep_by_space    1
+int_p_sign_posn       1
+int_n_sign_posn       1
+END LC_MONETARY
+
+%%%%%%%%%%%%%
+LC_TIME
+abday   "<U0B30><U0B2C><U0B3F>";/
+        "<U0B38><U0B4B><U0B2E>";/
+        "<U0B2E><U0B19><U0B4D><U0B17><U0B33>";/
+        "<U0B2C><U0B41><U0B27>";/
+        "<U0B17><U0B41><U0B30><U0B41>";/
+        "<U0B36><U0B41><U0B15><U0B4D><U0B30>";/
+        "<U0B36><U0B28><U0B3F>"
+day     "<U0B30><U0B2C><U0B3F><U0B2C><U0B3E><U0B30>";/
+        "<U0B38><U0B4B><U0B2E><U0B2C><U0B3E><U0B30>";/
+        "<U0B2E><U0B19><U0B4D><U0B17><U0B33><U0B2C><U0B3E><U0B30>";/
+        "<U0B2C><U0B41><U0B27><U0B2C><U0B3E><U0B30>";/
+        "<U0B17><U0B41><U0B30><U0B41><U0B2C><U0B3E><U0B30>";/
+        "<U0B36><U0B41><U0B15><U0B4D><U0B30><U0B2C><U0B3E><U0B30>";/
+        "<U0B36><U0B28><U0B3F><U0B2C><U0B3E><U0B30>"
+abmon   "<U0031>";/
+        "<U0032>";/
+        "<U0033>";/
+        "<U0034>";/
+        "<U0035>";/
+        "<U0036>";/
+        "<U0037>";/
+        "<U0038>";/
+        "<U0039>";/
+        "<U0031><U0030>";/
+        "<U0031><U0031>";/
+        "<U0031><U0032>"
+mon     "<U0B1C><U0B3E><U0B28><U0B41><U0B06><U0B30><U0B40>";/
+        "<U0B2B><U0B47><U0B2C><U0B4D><U0B30><U0B41><U0B5F><U0B3E><U0B30><U0B40>";/
+        "<U0B2E><U0B3E><U0B30><U0B4D><U0B1A><U0B4D><U0B1A>";/
+        "<U0B05><U0B2A><U0B4D><U0B30><U0B47><U0B32>";/
+        "<U0B2E><U0B47>";/
+        "<U0B1C><U0B41><U0B28>";/
+        "<U0B1C><U0B41><U0B32><U0B3E><U0B07>";/
+        "<U0B05><U0B17><U0B37><U0B4D><U0B1F>";/
+        "<U0B38><U0B47><U0B2A><U0B4D><U0B1F><U0B47><U0B2E><U0B4D><U0B2C><U0B30>";/
+        "<U0B05><U0B15><U0B4D><U0B1F><U0B4B><U0B2C><U0B30>";/
+        "<U0B28><U0B2D><U0B47><U0B2E><U0B4D><U0B2C><U0B30>";/
+        "<U0B21><U0B3F><U0B38><U0B47><U0B2E><U0B4D><U0B2C><U0B30>"
+% d_fmt   "%Od-%Om-%Oy"
+d_fmt     "<U0025><U004F><U0064><U002D><U0025><U004F><U006D><U002D><U0025><U004F><U0079>"
+% t_fmt   "%OI:%OM:%OS %p"
+t_fmt     "<U0025><U004F><U0049><U003A><U0025><U004F><U004D><U003A><U0025><U004F><U0053><U0020><U0025><U0070>"
+% d_t_fmt "%Oe %B %Oy %OI:%OM:%OS %p %Z"
+d_t_fmt   "<U0025><U004F><U0065><U0020><U0025><U0042><U0020><U0025><U004F><U0079><U0020><U0025><U004F><U0049><U003A><U0025><U004F><U004D><U003A><U0025><U004F><U0053><U0020><U0025><U0070><U0020><U0025><U005A>"
+am_pm     "<U0041><U004D>";"<U0050><U004D>"
+% t_fmt_ampm  "%OI:%OM:%OS %p"
+t_fmt_ampm "<U0025><U004F><U0049><U003A><U0025><U004F><U004D><U003A><U0025><U004F><U0053><U0020><U0025><U0070>"
+alt_digits "<U0B66>";/
+           "<U0B67>";/
+           "<U0B68>";/
+           "<U0B69>";/
+           "<U0B6A>";/
+           "<U0B6B>";/
+           "<U0B6C>";/
+           "<U0B6D>";/
+           "<U0B6E>";/
+           "<U0B6F>";/
+           "<U0B67><U0B66>";/
+           "<U0B67><U0B67>";/
+           "<U0B67><U0B68>";/
+           "<U0B67><U0B69>";/
+           "<U0B67><U0B6A>";/
+           "<U0B67><U0B6B>";/
+           "<U0B67><U0B6C>";/
+           "<U0B67><U0B6D>";/
+           "<U0B67><U0B6E>";/
+           "<U0B67><U0B6F>";/
+           "<U0B68><U0B66>";/
+           "<U0B68><U0B67>";/
+           "<U0B68><U0B68>";/
+           "<U0B68><U0B69>";/
+           "<U0B68><U0B6A>";/
+           "<U0B68><U0B6B>";/
+           "<U0B68><U0B6C>";/
+           "<U0B68><U0B6D>";/
+           "<U0B68><U0B6E>";/
+           "<U0B68><U0B6F>";/
+           "<U0B69><U0B66>";/
+           "<U0B69><U0B67>";/
+           "<U0B69><U0B68>";/
+           "<U0B69><U0B69>";/
+           "<U0B69><U0B6A>";/
+           "<U0B69><U0B6B>";/
+           "<U0B69><U0B6C>";/
+           "<U0B69><U0B6D>";/
+           "<U0B69><U0B6E>";/
+           "<U0B69><U0B6F>";/
+           "<U0B6A><U0B66>";/
+           "<U0B6A><U0B67>";/
+           "<U0B6A><U0B68>";/
+           "<U0B6A><U0B69>";/
+           "<U0B6A><U0B6A>";/
+           "<U0B6A><U0B6B>";/
+           "<U0B6A><U0B6C>";/
+           "<U0B6A><U0B6D>";/
+           "<U0B6A><U0B6E>";/
+           "<U0B6A><U0B6F>";/
+           "<U0B6B><U0B66>";/
+           "<U0B6B><U0B67>";/
+           "<U0B6B><U0B68>";/
+           "<U0B6B><U0B69>";/
+           "<U0B6B><U0B6A>";/
+           "<U0B6B><U0B6B>";/
+           "<U0B6B><U0B6C>";/
+           "<U0B6B><U0B6D>";/
+           "<U0B6B><U0B6E>";/
+           "<U0B6B><U0B6F>";/
+           "<U0B6C><U0B66>";/
+           "<U0B6C><U0B67>";/
+           "<U0B6C><U0B68>";/
+           "<U0B6C><U0B69>";/
+           "<U0B6C><U0B6A>";/
+           "<U0B6C><U0B6B>";/
+           "<U0B6C><U0B6C>";/
+           "<U0B6C><U0B6D>";/
+           "<U0B6C><U0B6E>";/
+           "<U0B6C><U0B6F>";/
+           "<U0B6D><U0B66>";/
+           "<U0B6D><U0B67>";/
+           "<U0B6D><U0B68>";/
+           "<U0B6D><U0B69>";/
+           "<U0B6D><U0B6A>";/
+           "<U0B6D><U0B6B>";/
+           "<U0B6D><U0B6C>";/
+           "<U0B6D><U0B6D>";/
+           "<U0B6D><U0B6E>";/
+           "<U0B6D><U0B6F>";/
+           "<U0B6E><U0B66>";/
+           "<U0B6E><U0B67>";/
+           "<U0B6E><U0B68>";/
+           "<U0B6E><U0B69>";/
+           "<U0B6E><U0B6A>";/
+           "<U0B6E><U0B6B>";/
+           "<U0B6E><U0B6C>";/
+           "<U0B6E><U0B6D>";/
+           "<U0B6E><U0B6E>";/
+           "<U0B6E><U0B6F>";/
+           "<U0B6F><U0B66>";/
+           "<U0B6F><U0B67>";/
+           "<U0B6F><U0B68>";/
+           "<U0B6F><U0B69>";/
+           "<U0B6F><U0B6A>";/
+           "<U0B6F><U0B6B>";/
+           "<U0B6F><U0B6C>";/
+           "<U0B6F><U0B6D>";/
+           "<U0B6F><U0B6E>";/
+           "<U0B6F><U0B6F>"
+END LC_TIME
+
+%%%%%%%%%%%%%
+LC_MESSAGES
+% FIXME These need support for the translated words
+yesexpr "<U005E><U005B><U0079><U0059><U005D><U002E><U002A>"
+noexpr  "<U005E><U005B><U006E><U004E><U005D><U002E><U002A>"
+END LC_MESSAGES
+
+%%%%%%%%%%%%%
+LC_PAPER
+copy "hi_IN"
+END LC_PAPER
+
+%%%%%%%%%%%%%
+LC_NAME
+% This is the ISO_IEC TR14652 Locale definition for the
+% LC_NAME category.
+%
+name_fmt    "<U0025><U0070><U0025><U0074><U0025><U0066><U0025><U0074>/
+<U0025><U0067>"
+name_gen    ""
+name_mr     "<U004D><U0072><U002E>"
+name_mrs    "<U004D><U0072><U0073><U002E>"
+name_miss   "<U004D><U0069><U0073><U0073><U002E>"
+name_ms     "<U004D><U0073><U002E>"
+END LC_NAME
+
+%%%%%%%%%%%%%
+LC_ADDRESS
+% This is the ISO_IEC TR14652 Locale definition for the
+% LC_ADDRESS
+postal_fmt  "<U0025><U007A><U0025><U0063><U0025><U0054><U0025><U0073>/
+<U0025><U0062><U0025><U0065><U0025><U0072>"
+END LC_ADDRESS
+
+%%%%%%%%%%%%%
+LC_TELEPHONE
+% This is the ISO_IEC TR14652 Locale definition for the
+tel_int_fmt "<U002B><U0025><U0063><U0020><U003B><U0025><U0061><U0020><U003B><U0025><U006C>"
+int_prefix  "<U0039><U0031>"
+int_select  "<U0030><U0030>"
+END LC_TELEPHONE
+
+%%%%%%%%%%%%%
+LC_MEASUREMENT
+copy "hi_IN"
+END LC_MEASUREMENT
diff --git a/nis/nis_addmember.c b/nis/nis_addmember.c
index bbe1c23977..5e342ad0d0 100644
--- a/nis/nis_addmember.c
+++ b/nis/nis_addmember.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997, 1998, 1999, 2004 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998, 1999, 2004, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -28,13 +28,12 @@ nis_addmember (const_nis_name member, const_nis_name group)
     {
       size_t grouplen = strlen (group);
       char buf[grouplen + 14 + NIS_MAXNAMELEN];
-      char leafbuf[grouplen + 2];
       char domainbuf[grouplen + 2];
       nis_result *res, *res2;
       nis_error status;
       char *cp, *cp2;
 
-      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = rawmemchr (nis_leaf_of_r (group, buf, sizeof (buf) - 1), '\0');
       cp = stpcpy (cp, ".groups_dir");
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && cp2[0] != '\0')
@@ -42,30 +41,35 @@ nis_addmember (const_nis_name member, const_nis_name group)
 	  *cp++ = '.';
           stpcpy (cp, cp2);
         }
-      res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
+      res = nis_lookup (buf, FOLLOW_LINKS | EXPAND_NAME);
       if (NIS_RES_STATUS (res) != NIS_SUCCESS)
 	{
 	  status = NIS_RES_STATUS (res);
 	  nis_freeresult (res);
 	  return status;
 	}
-      if ((NIS_RES_NUMOBJ (res)  != 1) ||
-          (__type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ))
+      if (NIS_RES_NUMOBJ (res) != 1
+	  || __type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ)
 	{
 	  nis_freeresult (res);
 	  return NIS_INVALIDOBJ;
 	}
 
-      NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val
+      u_int gr_members_len
+	= NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len;
+
+      nis_name *new_gr_members_val
 	= realloc (NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val,
-		   (NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len + 1)
-		   * sizeof (char *));
-      if (NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val == NULL)
+		   (gr_members_len + 1) * sizeof (nis_name));
+      if (new_gr_members_val == NULL)
 	goto nomem_out;
-      NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val[NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len] = strdup (member);
-      if (NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val[NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len] == NULL)
+
+      NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val
+	= new_gr_members_val;
+
+      new_gr_members_val[gr_members_len] = strdup (member);
+      if (new_gr_members_val[gr_members_len] == NULL)
 	{
-	  free (NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val);
 	nomem_out:
 	  nis_freeresult (res);
 	  return NIS_NOMEMORY;
diff --git a/nis/nis_callback.c b/nis/nis_callback.c
index 7c76f99b6b..e0acd9683a 100644
--- a/nis/nis_callback.c
+++ b/nis/nis_callback.c
@@ -360,8 +360,7 @@ __nis_create_callback (int (*callback) (const_nis_name, const nis_object *,
     {
       if (cb->xprt)
 	svc_destroy (cb->xprt);
-      if (cb->serv)
-	xdr_free ((xdrproc_t) _xdr_nis_server, (char *) cb->serv);
+      xdr_free ((xdrproc_t) _xdr_nis_server, (char *) cb->serv);
       free (cb);
     }
   if (!nomsg)
diff --git a/nis/nis_removemember.c b/nis/nis_removemember.c
index 21fe13aedf..2e45b4fb79 100644
--- a/nis/nis_removemember.c
+++ b/nis/nis_removemember.c
@@ -28,15 +28,12 @@ nis_removemember (const_nis_name member, const_nis_name group)
     {
       size_t grouplen = strlen (group);
       char buf[grouplen + 14 + NIS_MAXNAMELEN];
-      char leafbuf[grouplen + 2];
       char domainbuf[grouplen + 2];
-      nis_name *newmem;
       nis_result *res, *res2;
       nis_error status;
       char *cp, *cp2;
-      unsigned long int i, j, k;
 
-      cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
+      cp = rawmemchr (nis_leaf_of_r (group, buf, sizeof (buf) - 1), '\0');
       cp = stpcpy (cp, ".groups_dir");
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && cp2[0] != '\0')
@@ -44,68 +41,41 @@ nis_removemember (const_nis_name member, const_nis_name group)
           cp = stpcpy (cp, ".");
           stpcpy (cp, cp2);
         }
-      res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
-      if (res == NULL || NIS_RES_STATUS (res) != NIS_SUCCESS)
+      res = nis_lookup (buf, FOLLOW_LINKS | EXPAND_NAME);
+      if (res == NULL)
+	return NIS_NOMEMORY;
+      if (NIS_RES_STATUS (res) != NIS_SUCCESS)
         {
-	  if (res)
-	    {
-	      status = NIS_RES_STATUS (res);
-	      nis_freeresult (res);
-	    }
-	  else
-	    return NIS_NOMEMORY;
+	  status = NIS_RES_STATUS (res);
+	  nis_freeresult (res);
           return status;
         }
 
-      if ((res->objects.objects_len != 1) ||
-          (__type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ))
+      if (NIS_RES_NUMOBJ (res) != 1
+	  || __type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ)
 	{
 	  nis_freeresult (res);
 	  return NIS_INVALIDOBJ;
 	}
 
-      newmem =
-	calloc (NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len,
-		sizeof (char *));
-      if (newmem == NULL)
-	{
-	  nis_freeresult (res);
-	  return NIS_NOMEMORY;
-	}
+      nis_name *gr_members_val
+	= NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_val;
+      u_int gr_members_len
+	= NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len;
 
-      k = NIS_RES_OBJECT (res)[0].GR_data.gr_members.gr_members_len;
-      j = 0;
-      for (i = 0; i < NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len;
-	   ++i)
-	{
-	  if (strcmp (NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_val[i],
-		      member) != 0)
-	    {
-	      newmem[j] = NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_val[i];
-	      ++j;
-	    }
-	  else
-	    {
-	      free (NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_val[i]);
-	      --k;
-	    }
-	}
-      free (NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val);
-      assert (k <= NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len);
-      /* This realloc() call always decreases the size.  This cannot
-	 fail.  We still have the test but do not recover memory
-	 (i.e., we overwrite the input pointer).  */
-      nis_name *newp = realloc (newmem, k * sizeof (char*));
-      if (newp == NULL)
-	{
-	  free (newmem);
-	  nis_freeresult (res);
-	  return NIS_NOMEMORY;
-	}
-      newmem = newp;
+      u_int j = 0;
+      for (u_int i = 0; i < gr_members_len; ++i)
+	if (strcmp (gr_members_val[i], member) != 0)
+	  gr_members_val[j++] = gr_members_val[i];
+	else
+	  free (gr_members_val[i]);
 
-      NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val = newmem;
-      NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len = k;
+      /* There is no need to reallocate the gr_members_val array.  We
+	 just adjust the size to match the number of strings still in
+	 it.  Yes, xdr_array will use mem_free with a size parameter
+	 but this is mapped to a simple free call which determines the
+	 size of the block by itself.  */
+      NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len = j;
 
       cp = stpcpy (buf, NIS_RES_OBJECT (res)->zo_name);
       *cp++ = '.';
diff --git a/nscd/cache.c b/nscd/cache.c
index 787f8b46f5..be9be2aa4f 100644
--- a/nscd/cache.c
+++ b/nscd/cache.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1998, 1999, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (c) 1998, 1999, 2003-2005, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -190,13 +190,34 @@ cache_add (int type, const void *key, size_t len, struct datahead *packet,
    free the data structures since some hash table entries share the same
    data.  */
 void
-prune_cache (struct database_dyn *table, time_t now)
+prune_cache (struct database_dyn *table, time_t now, int fd)
 {
   size_t cnt = table->head->module;
 
   /* If this table is not actually used don't do anything.  */
   if (cnt == 0)
-    return;
+    {
+      if (fd != -1)
+	{
+	  /* Reply to the INVALIDATE initiator.  */
+	  int32_t resp = 0;
+	  writeall (fd, &resp, sizeof (resp));
+	}
+      return;
+    }
+
+  /* This function can be called from the cleanup thread but also in
+     response to an invalidate command.  Make sure only one thread is
+     running.  When not serving INVALIDATE request, no need for the
+     second to wait around.  */
+  if (fd == -1)
+    {
+      if (pthread_mutex_trylock (&table->prunelock) != 0)
+	/* The work is already being done.  */
+	return;
+    }
+  else
+    pthread_mutex_lock (&table->prunelock);
 
   /* If we check for the modification of the underlying file we invalidate
      the entries also in this case.  */
@@ -367,6 +388,14 @@ prune_cache (struct database_dyn *table, time_t now)
     }
   while (cnt > 0);
 
+  if (fd != -1)
+    {
+      /* Reply to the INVALIDATE initiator that the cache has been
+	 invalidated.  */
+      int32_t resp = 0;
+      writeall (fd, &resp, sizeof (resp));
+    }
+
   if (first <= last)
     {
       struct hashentry *head = NULL;
@@ -455,4 +484,6 @@ prune_cache (struct database_dyn *table, time_t now)
   /* Run garbage collection if any entry has been removed or replaced.  */
   if (any)
     gc (table);
+
+  pthread_mutex_unlock (&table->prunelock);
 }
diff --git a/nscd/connections.c b/nscd/connections.c
index 8bd9a66be8..307337bffe 100644
--- a/nscd/connections.c
+++ b/nscd/connections.c
@@ -100,6 +100,7 @@ struct database_dyn dbs[lastdb] =
 {
   [pwddb] = {
     .lock = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP,
+    .prunelock = PTHREAD_MUTEX_INITIALIZER,
     .enabled = 0,
     .check_file = 1,
     .persistent = 0,
@@ -117,6 +118,7 @@ struct database_dyn dbs[lastdb] =
   },
   [grpdb] = {
     .lock = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP,
+    .prunelock = PTHREAD_MUTEX_INITIALIZER,
     .enabled = 0,
     .check_file = 1,
     .persistent = 0,
@@ -134,6 +136,7 @@ struct database_dyn dbs[lastdb] =
   },
   [hstdb] = {
     .lock = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP,
+    .prunelock = PTHREAD_MUTEX_INITIALIZER,
     .enabled = 0,
     .check_file = 1,
     .persistent = 0,
@@ -813,9 +816,10 @@ close_sockets (void)
 
 
 static void
-invalidate_cache (char *key)
+invalidate_cache (char *key, int fd)
 {
   dbtype number;
+  int32_t resp;
 
   if (strcmp (key, "passwd") == 0)
     number = pwddb;
@@ -829,10 +833,19 @@ invalidate_cache (char *key)
       res_init ();
     }
   else
-    return;
+    {
+      resp = EINVAL;
+      writeall (fd, &resp, sizeof (resp));
+      return;
+    }
 
   if (dbs[number].enabled)
-    prune_cache (&dbs[number], LONG_MAX);
+    prune_cache (&dbs[number], LONG_MAX, fd);
+  else
+    {
+      resp = 0;
+      writeall (fd, &resp, sizeof (resp));
+    }
 }
 
 
@@ -1089,7 +1102,7 @@ cannot handle old request version %d; current version is %d"),
       else if (uid == 0)
 	{
 	  if (req->type == INVALIDATE)
-	    invalidate_cache (key);
+	    invalidate_cache (key, fd);
 	  else
 	    termination_handler (0);
 	}
@@ -1435,7 +1448,7 @@ handle_request: request received (Version = %d)"), req.version);
 	  /* The pthread_cond_timedwait() call timed out.  It is time
 		 to clean up the cache.  */
 	  assert (my_number < lastdb);
-	  prune_cache (&dbs[my_number], time (NULL));
+	  prune_cache (&dbs[my_number], time (NULL), -1);
 
 	  if (clock_gettime (timeout_clock, &prune_ts) == -1)
 	    /* Should never happen.  */
@@ -1908,14 +1921,14 @@ sighup_handler (int signum)
 {
   /* Prune the password database.  */
   if (dbs[pwddb].enabled)
-    prune_cache (&dbs[pwddb], LONG_MAX);
+    prune_cache (&dbs[pwddb], LONG_MAX, -1);
     
   /* Prune the group database.  */
   if (dbs[grpdb].enabled)
-    prune_cache (&dbs[grpdb], LONG_MAX);
+    prune_cache (&dbs[grpdb], LONG_MAX, -1);
 
   /* Prune the host database.  */
   if (dbs[hstdb].enabled)
-    prune_cache (&dbs[hstdb], LONG_MAX);
+    prune_cache (&dbs[hstdb], LONG_MAX, -1);
 }
 
diff --git a/nscd/nscd.c b/nscd/nscd.c
index 917163af78..03359f3c05 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -336,9 +336,6 @@ parse_opt (int key, char *arg, struct argp_state *state)
 	    exit (EXIT_FAILURE);
 
 	  request_header req;
-	  ssize_t nbytes;
-	  struct iovec iov[2];
-
 	  if (strcmp (arg, "passwd") == 0)
 	    req.key_len = sizeof "passwd";
 	  else if (strcmp (arg, "group") == 0)
@@ -351,17 +348,38 @@ parse_opt (int key, char *arg, struct argp_state *state)
 	  req.version = NSCD_VERSION;
 	  req.type = INVALIDATE;
 
+	  struct iovec iov[2];
 	  iov[0].iov_base = &req;
 	  iov[0].iov_len = sizeof (req);
 	  iov[1].iov_base = arg;
 	  iov[1].iov_len = req.key_len;
 
-	  nbytes = TEMP_FAILURE_RETRY (writev (sock, iov, 2));
+	  ssize_t nbytes = TEMP_FAILURE_RETRY (writev (sock, iov, 2));
+
+	  if (nbytes != iov[0].iov_len + iov[1].iov_len)
+	    {
+	      int err = errno;
+	      close (sock);
+	      error (EXIT_FAILURE, err, _("write incomplete"));
+	    }
+
+	  /* Wait for ack.  Older nscd just closed the socket when
+	     prune_cache finished, silently ignore that.  */
+	  int32_t resp = 0;
+	  nbytes = TEMP_FAILURE_RETRY (read (sock, &resp, sizeof (resp)));
+	  if (nbytes != 0 && nbytes != sizeof (resp))
+	    {
+	      int err = errno;
+	      close (sock);
+	      error (EXIT_FAILURE, err, _("cannot read invalidate ACK"));
+	    }
 
 	  close (sock);
 
-	  exit (nbytes != iov[0].iov_len + iov[1].iov_len
-		? EXIT_FAILURE : EXIT_SUCCESS);
+	  if (resp != 0)
+	    error (EXIT_FAILURE, resp, _("invalidation failed"));
+
+	  exit (0);
 	}
 
     case 't':
diff --git a/nscd/nscd.h b/nscd/nscd.h
index 8b95630807..5c2ff3a95b 100644
--- a/nscd/nscd.h
+++ b/nscd/nscd.h
@@ -58,6 +58,7 @@ typedef enum
 struct database_dyn
 {
   pthread_rwlock_t lock;
+  pthread_mutex_t prunelock;
 
   int enabled;
   int check_file;
@@ -184,7 +185,7 @@ extern struct datahead *cache_search (request_type, void *key, size_t len,
 extern int cache_add (int type, const void *key, size_t len,
 		      struct datahead *packet, bool first,
 		      struct database_dyn *table, uid_t owner);
-extern void prune_cache (struct database_dyn *table, time_t now);
+extern void prune_cache (struct database_dyn *table, time_t now, int fd);
 
 /* pwdcache.c */
 extern void addpwbyname (struct database_dyn *db, int fd, request_header *req,
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index a35b8662d5..185957be6a 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -1668,7 +1668,7 @@ gaiconf_init (void)
 	      if (strcmp (cmd, "label") == 0)
 		{
 		  struct in6_addr prefix;
-		  unsigned long int bits = 128;
+		  unsigned long int bits;
 		  unsigned long int val;
 		  char *endp;
 
@@ -1677,6 +1677,7 @@ gaiconf_init (void)
 		  nullbitsp = &labellist_nullbits;
 
 		new_elem:
+		  bits = 128;
 		  __set_errno (0);
 		  cp = strchr (val1, '/');
 		  if (cp != NULL)