summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-05-31 15:10:35 +0000
committerJakub Jelinek <jakub@redhat.com>2006-05-31 15:10:35 +0000
commit2774ea772499f5779e846646824784a44377c69a (patch)
tree8c23b862c87c0056b7ef8296f527ca580d5e15a5
parente482d83fb7eedcb449bfe80a6aa240cbd114c571 (diff)
Updated to fedora-glibc-20060531T1322cvs/fedora-glibc-2_4_90-11
-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)