diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-05-31 15:10:35 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2006-05-31 15:10:35 +0000 |
commit | 2774ea772499f5779e846646824784a44377c69a (patch) | |
tree | 8c23b862c87c0056b7ef8296f527ca580d5e15a5 | |
parent | e482d83fb7eedcb449bfe80a6aa240cbd114c571 (diff) | |
download | glibc-2774ea772499f5779e846646824784a44377c69a.tar.gz |
Updated to fedora-glibc-20060531T1322cvs/fedora-glibc-2_4_90-11
-rw-r--r-- | ChangeLog | 72 | ||||
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | elf/dl-addr.c | 3 | ||||
-rw-r--r-- | fedora/branch.mk | 4 | ||||
-rw-r--r-- | fedora/glibc.spec.in | 54 | ||||
-rw-r--r-- | include/netinet/in.h | 1 | ||||
-rw-r--r-- | inet/Makefile | 4 | ||||
-rw-r--r-- | inet/Versions | 6 | ||||
-rw-r--r-- | inet/inet6_opt.c | 278 | ||||
-rw-r--r-- | inet/inet6_option.c | 26 | ||||
-rw-r--r-- | inet/inet6_rth.c | 192 | ||||
-rw-r--r-- | inet/netinet/icmp6.h | 30 | ||||
-rw-r--r-- | inet/netinet/in.h | 61 | ||||
-rw-r--r-- | inet/netinet/ip6.h | 21 | ||||
-rw-r--r-- | localedata/ChangeLog | 7 | ||||
-rw-r--r-- | localedata/SUPPORTED | 2 | ||||
-rw-r--r-- | localedata/locales/as_IN | 728 | ||||
-rw-r--r-- | localedata/locales/or_IN | 807 | ||||
-rw-r--r-- | nis/nis_addmember.c | 30 | ||||
-rw-r--r-- | nis/nis_callback.c | 3 | ||||
-rw-r--r-- | nis/nis_removemember.c | 80 | ||||
-rw-r--r-- | nscd/cache.c | 37 | ||||
-rw-r--r-- | nscd/connections.c | 29 | ||||
-rw-r--r-- | nscd/nscd.c | 30 | ||||
-rw-r--r-- | nscd/nscd.h | 3 | ||||
-rw-r--r-- | sysdeps/posix/getaddrinfo.c | 3 |
26 files changed, 2377 insertions, 141 deletions
@@ -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 @@ -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) |