aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-05-15 07:57:49 +0000
committerJakub Jelinek <jakub@redhat.com>2008-05-15 07:57:49 +0000
commit78463734c14d180e4d8e16c6e66fb213fc3479c0 (patch)
tree718b7357ea9e63d4a951a0a725105619b97d2977
parent2.8-2 (diff)
downloadglibc-78463734c14d180e4d8e16c6e66fb213fc3479c0.tar.gz
glibc-78463734c14d180e4d8e16c6e66fb213fc3479c0.tar.bz2
glibc-78463734c14d180e4d8e16c6e66fb213fc3479c0.zip
Updated to fedora-glibc-20080515T0735cvs/fedora-glibc-2_8_90-1
-rw-r--r--ChangeLog304
-rw-r--r--NEWS20
-rw-r--r--bits/byteswap.h4
-rw-r--r--bits/termios.h94
-rwxr-xr-xconfigure2
-rw-r--r--configure.in2
-rw-r--r--elf/dl-conflict.c9
-rw-r--r--elf/dl-reloc.c42
-rw-r--r--elf/dl-tls.c99
-rw-r--r--elf/dynamic-link.h27
-rw-r--r--elf/elf.h22
-rw-r--r--elf/tlsdeschtab.h157
-rw-r--r--fedora/branch.mk4
-rw-r--r--fedora/glibc.spec.in18
-rw-r--r--fedora/glibc_post_upgrade.c4
-rw-r--r--iconv/gconv_simple.c18
-rw-r--r--iconvdata/Makefile3
-rw-r--r--iconvdata/bug-iconv6.c2
-rwxr-xr-xiconvdata/run-iconv-test.sh4
-rw-r--r--include/arpa/nameser_compat.h7
-rw-r--r--include/inline-hashtab.h302
-rw-r--r--include/resolv.h8
-rw-r--r--inet/netinet/in.h6
-rw-r--r--io/openat.c2
-rw-r--r--io/openat64.c2
-rw-r--r--localedata/ChangeLog18
-rw-r--r--localedata/charmaps/UTF-8133
-rw-r--r--localedata/locales/be_BY2
-rw-r--r--localedata/locales/i18n412
-rw-r--r--localedata/locales/iso14651_t1_common273
-rw-r--r--math/libm-test.inc1
-rw-r--r--misc/truncate64.c2
-rw-r--r--nis/Versions3
-rw-r--r--nis/nss_nis/nis-hosts.c118
-rw-r--r--nis/nss_nisplus/nisplus-hosts.c222
-rw-r--r--nptl/ChangeLog14
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S8
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S8
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S8
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S8
-rw-r--r--nscd/Makefile2
-rw-r--r--nscd/aicache.c496
-rw-r--r--nscd/cache.c7
-rw-r--r--nscd/grpcache.c28
-rw-r--r--nscd/hstcache.c15
-rw-r--r--nscd/initgrcache.c15
-rw-r--r--nscd/mem.c2
-rw-r--r--nscd/pwdcache.c29
-rw-r--r--nscd/servicescache.c15
-rw-r--r--nss/Versions1
-rw-r--r--nss/getent.c16
-rw-r--r--nss/nss.h14
-rw-r--r--nss/nss_files/files-hosts.c133
-rw-r--r--po/lt.po7082
-rw-r--r--posix/regcomp.c48
-rw-r--r--posix/regex_internal.c6
-rw-r--r--posix/tst-rfc3484-2.c11
-rw-r--r--posix/tst-rfc3484-3.c11
-rw-r--r--posix/tst-rfc3484.c11
-rw-r--r--resolv/Versions1
-rw-r--r--resolv/gethnamaddr.c6
-rw-r--r--resolv/nss_dns/dns-canon.c4
-rw-r--r--resolv/nss_dns/dns-host.c337
-rw-r--r--resolv/nss_dns/dns-network.c6
-rw-r--r--resolv/res_mkquery.c12
-rw-r--r--resolv/res_query.c149
-rw-r--r--resolv/res_send.c323
-rw-r--r--stdlib/tst-setcontext.c3
-rw-r--r--string/Makefile7
-rw-r--r--string/endian.h38
-rw-r--r--string/memmem.c58
-rw-r--r--string/str-two-way.h430
-rw-r--r--string/strcasestr.c152
-rw-r--r--string/strstr.c142
-rw-r--r--string/tester.c34
-rw-r--r--string/tst-endian.c112
-rw-r--r--sysdeps/i386/Makefile10
-rw-r--r--sysdeps/i386/bits/byteswap.h4
-rw-r--r--sysdeps/i386/bits/linkmap.h1
-rw-r--r--sysdeps/i386/dl-lookupcfg.h28
-rw-r--r--sysdeps/i386/dl-machine.h131
-rw-r--r--sysdeps/i386/dl-tls.h2
-rw-r--r--sysdeps/i386/dl-tlsdesc.S290
-rw-r--r--sysdeps/i386/dl-tlsdesc.h61
-rw-r--r--sysdeps/i386/tlsdesc.c269
-rw-r--r--sysdeps/i386/tlsdesc.sym17
-rw-r--r--sysdeps/ia64/bits/byteswap.h4
-rw-r--r--sysdeps/ieee754/flt-32/w_expf.c2
-rw-r--r--sysdeps/ieee754/ldbl-128/e_j0l.c4
-rw-r--r--sysdeps/ieee754/ldbl-128/e_j1l.c4
-rw-r--r--sysdeps/ieee754/ldbl-128/s_expm1l.c2
-rw-r--r--sysdeps/ieee754/ldbl-128/s_log1pl.c9
-rw-r--r--sysdeps/mach/hurd/bits/ioctls.h56
-rw-r--r--sysdeps/posix/getaddrinfo.c261
-rw-r--r--sysdeps/s390/bits/byteswap.h4
-rw-r--r--sysdeps/sparc/sparc32/Makefile4
-rw-r--r--sysdeps/sparc/sparc64/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/bits/resource.h10
-rw-r--r--sysdeps/unix/sysv/linux/bits/resource.h10
-rw-r--r--sysdeps/unix/sysv/linux/bits/socket.h4
-rw-r--r--sysdeps/unix/sysv/linux/dl-osinfo.h1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/bits/resource.h10
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S85
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c93
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S119
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S119
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym61
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S1
-rw-r--r--sysdeps/unix/sysv/linux/sys/user.h2
-rw-r--r--sysdeps/unix/sysv/linux/times.c59
-rw-r--r--sysdeps/x86_64/Makefile10
-rw-r--r--sysdeps/x86_64/bits/byteswap.h4
-rw-r--r--sysdeps/x86_64/bits/linkmap.h2
-rw-r--r--sysdeps/x86_64/dl-lookupcfg.h28
-rw-r--r--sysdeps/x86_64/dl-machine.h53
-rw-r--r--sysdeps/x86_64/dl-tls.h4
-rw-r--r--sysdeps/x86_64/dl-tlsdesc.S245
-rw-r--r--sysdeps/x86_64/dl-tlsdesc.h64
-rw-r--r--sysdeps/x86_64/tlsdesc.c151
-rw-r--r--sysdeps/x86_64/tlsdesc.sym17
-rw-r--r--version.h4
124 files changed, 13219 insertions, 1263 deletions
diff --git a/ChangeLog b/ChangeLog
index 826b080137..097f3173f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,291 @@
+2008-05-14 Ulrich Drepper <drepper@redhat.com>
+
+ * string/Makefile (distribute): Add str-two-way.h.
+
+2008-03-29 Eric Blake <ebb9@byu.net>
+
+ Rewrite string searches to O(n) rather than O(n^2).
+ * string/str-two-way.h: New file. For linear fixed-allocation
+ string searching.
+ * string/memmem.c: New implementation.
+ * string/strstr.c: New implementation.
+ * string/strcasestr.c: New implementation.
+
+2008-04-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * posix/regcomp.c (optimize_utf8): Add a note on why we test
+ opr.ctx_type.
+ (calc_first): Initialize constraint field.
+ (duplicate_node_closure): Use it instead of special casing ANCHORS.
+ Use search_duplicated_node to avoid loops. Fix grammar.
+ (duplicate_node): Merge constraint field for all node types.
+ (calc_eclosure_iter): Look at constraint field for all node types.
+ * posix/regex_internal.c (create_cd_newstate): Don't look at
+ create_cd_newstate.
+
+2008-05-14 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #6428]
+ * configure.in: Don't use $CFLAGS when assembling, use $ASFLAGS.
+
+ [BZ #6442]
+ * string/endian.h: Add macros for fixed-size endian conversion.
+ * bits/byteswap.h: Allow inclusion from <endian.h>.
+ * sysdeps/i386/bits/byteswap.h: Likewise.
+ * sysdeps/ia64/bits/byteswap.h: Likewise.
+ * sysdeps/s390/bits/byteswap.h: Likewise.
+ * sysdeps/x86_64/bits/byteswap.h: Likewise.
+ * string/Makefile (tests): Add tst-endian.
+ * string/tst-endian.c: New file.
+
+ * iconvdata/run-iconv-test.sh: Use = instead of == in test.
+ Patch by Reuben Thomas.
+
+2008-05-14 Joseph Myers <joseph@codesourcery.com>
+
+ * iconvdata/Makefile (bug-iconv6-ENV, tst-iconv7-ENV): Define.
+
+2008-05-14 Ulrich Drepper <drepper@redhat.com>
+
+ * iconvdata/bug-iconv6.c (do_test): Use de_DE.UTF-8 locale.
+
+ [BZ #6461]
+ * iconv/gconv_simple.c (BODY for __gconv_transform_ascii_internal):
+ Add missing braces.
+ (BODY for __gconv_transform_internal_ascii): Likewise.
+
+ [BZ #6472]
+ * sysdeps/posix/getaddrinfo.c (get_scope): Loopback addresses have
+ to be treated like link-local addresses.
+ (match_prefix): Don't treat IPv4 loopback address special when
+ converting to v4 mapped addressed.
+
+ * sysdeps/posix/getaddrinfo.c (getaddrinfo): Call _res_hconf_init
+ if necessary.
+ * posix/tst-rfc3484.c: Add dummy definition of _res_hconf_init.
+ * posix/tst-rfc3484-2.c: Likewise.
+ * posix/tst-rfc3484-3.c: Likewise.
+
+ * sysdeps/posix/getaddrinfo.c: Implement handling of DCCP, UDPlite,
+ and SCTP.
+
+ * nss/getent.c (ahosts_keys_int): Handle all known socket types.
+
+ * inet/netinet/in.h (IPPIPPROTO_DCCP, IPPROTO_UDPLITE): Define.
+
+ * sysdeps/unix/sysv/linux/bits/socket.h (SOCK_DCCP): Define.
+
+2008-05-13 Ulrich Drepper <drepper@redhat.com>
+
+ * po/lt.po: New file. From Lituanian translation team.
+
+2008-01-30 Alexandre Oliva <aoliva@redhat.com>
+
+ Introduce TLS descriptors for i386 and x86_64.
+ * include/inline-hashtab.h: New file, copied from 2005's
+ libiberty, with fix for memory leak imported afterwards by
+ Glauber de Oliveira Costa.
+ * elf/tlsdeschtab.h: New file.
+ * elf/dl-reloc.c (_dl_try_allocate_static_tls): Extract from...
+ (_dl_allocate_static_tls): ... here. Rearrange failure path.
+ (CHECK_STATIC_TLS): Move to...
+ * elf/dynamic-link.h: ... this file.
+ (TRY_STATIC_TLS): New macro.
+ * elf/dl-conflict.c (CHECK_STATIC_TLS, TRY_STATIC_TLS): Override.
+ * elf/elf.h (R_386_TLS_GOTDESC, R_386_TLS_DESC_CALL,
+ R_386_TLS_DESC): Define.
+ (R_X86_64_PC64, R_X86_GOTOFF64, R_X86_64_GOTPC32): Merge from
+ binutils.
+ (R_X86_64_GOTPC32_TLSDESC, R_X86_64_TLSDESC_CALL,
+ R_X86_64_TLSDESC): Define.
+ (R_386_NUM, R_X86_64_NUM): Adjust.
+ * sysdeps/i386/Makefile (sysdep-dl-routines, sysdep_routines,
+ sysdep-rtld-routines): Add tlsdesc and dl-tlsdesc for elf subdir.
+ (gen-as-const-headers): Add tlsdesc.sym to csu subdir.
+ * sysdeps/i386/dl-lookupcfg.h: New file. Introduce _dl_unmap to
+ release tlsdesc_table.
+ * sysdeps/i386/dl-machine.h: Include dl-tlsdesc.h.
+ (elf_machine_type_class): Mark R_386_TLS_DESC as PLT class.
+ (elf_machine_rel): Handle R_386_TLS_DESC.
+ (elf_machine_rela): Likewise.
+ (elf_machine_lazy_rel): Likewise.
+ (elf_machine_lazy_rela): Likewise.
+ * sysdeps/i386/dl-tls.h (struct dl_tls_index): Name it.
+ * sysdeps/i386/dl-tlsdesc.S: New file.
+ * sysdeps/i386/dl-tlsdesc.h: New file.
+ * sysdeps/i386/tlsdesc.c: New file.
+ * sysdeps/i386/tlsdesc.sym: New file.
+ * sysdeps/i386/bits/linkmap.h (struct link_map_machine): Add
+ tlsdesc_table.
+ * sysdeps/x86_64/Makefile (sysdep-dl-routines, sysdep_routines,
+ sysdep-rtld-routines): Add tlsdesc and dl-tlsdesc for elf subdir.
+ (gen-as-const-headers): Add tlsdesc.sym to csu subdir.
+ * sysdeps/x86_64/dl-lookupcfg.h: New file. Introduce _dl_unmap to
+ release tlsdesc_table.
+ * sysdeps/x86_64/dl-machine.h: Include dl-tlsdesc.h.
+ (elf_machine_runtime_setup): Set up lazy TLSDESC GOT entry.
+ (elf_machine_type_class): Mark R_X86_64_TLSDESC as PLT class.
+ (elf_machine_rel): Handle R_X86_64_TLSDESC.
+ (elf_machine_rela): Likewise.
+ (elf_machine_lazy_rel): Likewise.
+ * sysdeps/x86_64/dl-tls.h (struct dl_tls_index): Name it.
+ (__tls_get_addr): Do not declare for non-shared compiles.
+ * sysdeps/x86_64/dl-tlsdesc.S: New file.
+ * sysdeps/x86_64/dl-tlsdesc.h: New file.
+ * sysdeps/x86_64/tlsdesc.c: New file.
+ * sysdeps/x86_64/tlsdesc.sym: New file.
+ * sysdeps/x86_64/bits/linkmap.h (struct link_map_machine): Add
+ tlsdesc_table for both 32- and 64-bit structs.
+
+2008-05-11 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-tls.c (__tls_get_addr): Optimize by moving slow path in
+ its own function. This reduces the frame setup costs and more.
+
+2008-02-11 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #3406]
+ * sysdeps/ieee754/flt-32/w_expf.c (o_threshold): Correct value.
+ * math/libm-test.inc (exp_test): Test 88.72269439697265625.
+
+2008-05-11 Ulrich Drepper <drepper@redhat.com>
+
+ * io/openat.c (__openat_2): Also pass fd to __openat.
+ * io/openat64.c (__openat64_2): Also pass fd to __openat64.
+ Patch by Kristian Van Der Vliet <vanders@liqwyd.com>.
+
+ * string/tester.c (test_memcmp): Add a few more tests.
+ Patch by Mats Erik Andersson <ynglingatal@comhem.se>.
+
+2008-05-10 Ulrich Drepper <drepper@redhat.com>
+
+ * nscd/cache.c (cache_add): Before returning with failure and this
+ is the first use of the record, mark it as unusable.
+ * nscd/aicache.c: Don't touch the dataset after cache_add returns
+ reporting a failure.
+ * nscd/grpcache.c: Likewise
+ * nscd/hstcache.c: Likewise.
+ * nscd/initgrcache.c: Likewise.
+ * nscd/pwdcache.c: Likewise.
+ * nscd/servicecache.c: Likewise.
+
+2008-05-10 Roland McGrath <roland@redhat.com>
+
+ [BZ #6505]
+ * sysdeps/unix/sysv/linux/sys/user.h: Replace with #error stub.
+
+2008-05-08 David S. Miller <davem@davemloft.net>
+
+ * misc/truncate64.c (truncate64): Use __truncate not truncate.
+
+ * sysdeps/ieee754/ldbl-128/e_j0l.c (__ieee751_j0l): Use __finitel.
+ (__ieee754_y0l): Likewise.
+ * sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_j1l): Likewise.
+ (__ieee754_y1l): Likewise.
+ * sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Use __ldexpl.
+ * sysdeps/ieee754/ldbl-128/s_log1pl.c: Kill bogus prototypes for
+ frexpl and ldexpl. math_private.h provides them and the latter
+ is not even used.
+ (__log1pl): Use __frexpl.
+
+2008-05-10 Ulrich Drepper <drepper@redhat.com>
+
+ * include/resolv.h: Adjust __libc_res_nquery and __libc_res_nsend
+ prototypes.
+ * include/arpa/nameser_compat.h: Define T_UNSPEC.
+ * nis/Versions (libnss_nis): Export _nss_nis_gethostbyname4_r.
+ (libnss_nisplus): Export _nss_nisplus_gethostbyname4_r.
+ * nis/nss_nis/nis-hosts.c (LINE_PARSER): Change to also handle
+ af==AF_UNSPEC.
+ (_nss_nis_gethostbyname4_r): New function.
+ * nis/nss_nisplus/nisplus-hosts.c (_nss_nisplus_parse_hostent):
+ Change to also handle af==AF_UNSPEC.
+ (get_tablename): New function. Use it to avoid duplication.
+ (_nss_nisplus_gethostbyname4_r): New function.
+ * nscd/aicache.c (addhstaiX): Use gethostbyname4_r function is
+ available.
+ * nss/Versions (libnss_files): Export _nss_files_gethostbyname4_r.
+ * nss/nss.h: Define struct gaih_addrtuple.
+ * nss/nss_files/files-hosts.c (LINE_PARSER): Change to also handle
+ af==AF_UNSPEC.
+ (_nss_files_gethostbyname4_r): New function.
+ * resolv/Versions (libnss_dns): Export _nss_dns_gethostbyname4_r.
+ * resolv/gethnmaddr.c: Adjust __libc_res_nsearch and __libc_res_nquery
+ calls.
+ * resolv/res_query.c (__libc_res_nquery): Take two additional
+ parameters for second answer buffer. Handle type=T_UNSPEC to mean
+ look up IPv4 and IPv6.
+ Change all callers.
+ * resolv/res_send.c (__libc_res_nsend): Take five aditional parameters
+ for an additional query and answer buffer. Pass to send_vc and
+ send_dg.
+ (send_vc): Send possibly two requests and receive two answers.
+ (send_dg): Likewise.
+ * resolv/nss_dns/dns-host.c: Adjust calls to __libc_res_nsearch and
+ __libc_res_nquery.
+ (_nss_dns_gethostbyname4_r): New function.
+ (gaih_getanswer_slice): Likewise.
+ (gaih_getanswer): Likewise.
+ * resolv/nss_dns/dns-canon.c (_nss_dns_getcanonname_r): Adjust
+ __libc_res_nquery call.
+ * resolv/nss_dns/dns-network.c (_nss_dns_getnetbyaddr_r): Likewise.
+ (_nss_dns_getnetbyname_r): Adjust __libc_res_nsearch call.
+ * sysdeps/posix/getaddrinfo.c: Use gethostbyname4_r function is
+ available.
+
+2008-05-05 David S. Miller <davem@davemloft.net>
+
+ * sysdeps/sparc/sparc32/Makefile: Use -mcpu=v7 for initfini.s build.
+ * sysdeps/sparc/sparc64/Makefile: Use -mcpu=v9 for initfini.s build.
+
+2007-09-14 Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+ Fix termios bit macros.
+ Move *DLY definitions where they belong, in termios.h.
+ Add *[0-3] definitions.
+ Fixes confusion between VT and FF.
+ * sysdeps/mach/hurd/bits/ioctls.h (NL0, NL1, TAB0, TAB1, TAB2, CR0,
+ CR1, CR2, CR3, FF0, FF1, BS0, BS1): Undefine these at start if they
+ are already defined to avoid collision with termios.h.
+ (NLDLY, TABDLY, TAB3, CRDLY, VTDLY, BSDLY): Remove macros.
+ * bits/termios.h [__USE_MISC || __USE_XOPEN] (NL0, NL1, TAB0,
+ TAB1, TAB2, CR0, CR1, CR2, CR3, FF0, FF1, BS0, BS1): Likewise.
+ [__USE_BSD || __USE_XOPEN] (OCRNL, ONOCR, ONLRET): New macros.
+ [__USE_MISC || __USE_XOPEN] (NLDLY, NL0, NL1, TABDLY, TAB0, TAB1, TAB2,
+ TAB3, CRDLY, CR0, CR1, CR2, CR3, FFDLY, FF0, FF1, BSDLY, BS0, BS1,
+ VTDLY, VT0, VT1): New macros.
+ [__USE_GNU] (OLCUC): Change value of macro.
+ [__USE_XOPEN] (OFILL): New macro.
+ [__USE_BSD] (CRTSCTS): Change value.
+ (CRTS_IFLOW, CCTS_OFLOW): Change into compatibility macros.
+ [__USE_BSD] (CDTRCTS, CHWFLOW): New macros.
+ (B7200, B14400, B28800, B76800): New macros.
+
+2008-05-01 David S. Miller <davem@davemloft.net>
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = stdlib]:
+ (gen-as-const-headers): Add it.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S: New file.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S: Likewise.
+
+ * sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S: Add support for
+ six system call parameters.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Likewise.
+
+2008-04-30 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/bits/resource.h: Define RUSAGE_THREAD and
+ RUSAGE_LWP.
+ * sysdeps/unix/sysv/linux/sparc/bits/resource.h: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/bits/resource.h: Likewise.
+
+2008-04-30 Jakub Jelinek <jakub@redhat.com>
+
+ * stdlib/tst-setcontext.c: Include unistd.h.
+
2008-04-25 David S. Miller <davem@davemloft.net>
* sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c (semctl):
@@ -12,8 +300,18 @@
* nscd/nscd.h (dbs): Make hidden.
+ * sysdeps/unix/sysv/linux/times.c (__times): Fix check for EFAULT.
+ Avoid returning -1, return 0 instead.
+
+2008-04-19 Ulrich Drepper <drepper@redhat.com>
+
+ * resolv/res_mkquery.c (__res_nopt): Use NS_PUT16 instead of ns_put16.
+
2008-04-15 Ulrich Drepper <drepper@redhat.com>
+ [BZ #5209]
+ * sysdeps/unix/sysv/linux/times.c: New file.
+
[BZ #5381]
* nscd/nscd.h: Define enum in_flight, mem_in_flight, and
mem_in_flight_list variables. Add new parameter to mempool_alloc
@@ -38,6 +336,12 @@
* nscd/connections.c (handle_request): Provide better error message
in case SELinux forbids the service.
+ * version.h (VERSION): Bump to 2.8.90.
+
+2008-04-17 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/dl-osinfo.h: Include fcntl.h.
+
2008-04-11 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/powerpc/bits/mathinline.h (__signbitl):
diff --git a/NEWS b/NEWS
index 2d8621af7e..eebc6b8349 100644
--- a/NEWS
+++ b/NEWS
@@ -1,10 +1,28 @@
-GNU C Library NEWS -- history of user-visible changes. 2008-4-9
+GNU C Library NEWS -- history of user-visible changes. 2008-5-14
Copyright (C) 1992-2007, 2008 Free Software Foundation, Inc.
See the end for copying conditions.
Please send GNU C library bug reports via <http://sources.redhat.com/bugzilla/>
using `glibc' in the "product" field.
+Version 2.9
+
+* Unified lookup for getaddrinfo: IPv4 and IPv6 addresses are now looked
+ up at the same time. Implemented by Ulrich Drepper.
+
+* TLS descriptors for LD and GD on x86 and x86-64.
+ Implemented by Alexandre Oliva.
+
+* getaddrinfo now handles DCCP and UDPlite.
+ Implemented by Ulrich Drepper.
+
+* New fixed-size conversion macros: htobe16, htole16, be16toh, le16toh,
+ htobe32, htole32, be32toh, le32toh, htobe64, htole64, be64toh, le64toh.
+ Implemented by Ulrich Drepper.
+
+* New implementation of memmem, strstr, and strcasestr which is O(n).
+ Implemented by Eric Blake.
+
Version 2.8
* New locales: bo_CN, bo_IN.
diff --git a/bits/byteswap.h b/bits/byteswap.h
index 949ed0bc9d..45cb9471e3 100644
--- a/bits/byteswap.h
+++ b/bits/byteswap.h
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997,1998,2000,2001,2002,2005 Free Software Foundation, Inc.
+ Copyright (C) 1997,1998,2000-2002,2005,2008 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
@@ -17,7 +17,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
#endif
diff --git a/bits/termios.h b/bits/termios.h
index 43bb1ce52d..4dc0fab911 100644
--- a/bits/termios.h
+++ b/bits/termios.h
@@ -24,6 +24,50 @@
/* These macros are also defined in some <bits/ioctls.h> files (with
numerically identical values), but this serves to shut up cpp's
complaining. */
+#if defined __USE_MISC || defined __USE_XOPEN
+
+# ifdef NL0
+# undef NL0
+# endif
+# ifdef NL1
+# undef NL1
+# endif
+# ifdef TAB0
+# undef TAB0
+# endif
+# ifdef TAB1
+# undef TAB1
+# endif
+# ifdef TAB2
+# undef TAB2
+# endif
+# ifdef CR0
+# undef CR0
+# endif
+# ifdef CR1
+# undef CR1
+# endif
+# ifdef CR2
+# undef CR2
+# endif
+# ifdef CR3
+# undef CR3
+# endif
+# ifdef FF0
+# undef FF0
+# endif
+# ifdef FF1
+# undef FF1
+# endif
+# ifdef BS0
+# undef BS0
+# endif
+# ifdef BS1
+# undef BS1
+# endif
+
+#endif /* __USE_MISC || __USE_XOPEN */
+
#ifdef __USE_BSD
# ifdef MDMBUF
@@ -93,11 +137,43 @@ struct termios
#define OPOST (1 << 0) /* Perform output processing. */
#ifdef __USE_BSD
# define ONLCR (1 << 1) /* Map NL to CR-NL on output. */
-# define OXTABS (1 << 2) /* Expand tabs to spaces. */
+# define OXTABS TAB3 /* Expand tabs to spaces. */
# define ONOEOT (1 << 3) /* Discard EOT (^D) on output. */
#endif
+#if defined __USE_BSD || defined __USE_XOPEN
+# define OCRNL (1 << 4) /* Map CR to NL. */
+# define ONOCR (1 << 5) /* Discard CR's when on column 0. */
+# define ONLRET (1 << 6) /* Move to column 0 on NL. */
+#endif
+#if defined __USE_MISC || defined __USE_XOPEN
+# define NLDLY (3 << 8) /* NL delay. */
+# define NL0 (0 << 8) /* NL type 0. */
+# define NL1 (1 << 8) /* NL type 1. */
+# define TABDLY (3 << 10) /* TAB delay. */
+# define TAB0 (0 << 10) /* TAB delay type 0. */
+# define TAB1 (1 << 10) /* TAB delay type 1. */
+# define TAB2 (2 << 10) /* TAB delay type 2. */
+# define TAB3 (1 << 2) /* Expand tabs to spaces. */
+# define CRDLY (3 << 12) /* CR delay. */
+# define CR0 (0 << 12) /* CR delay type 0. */
+# define CR1 (1 << 12) /* CR delay type 1. */
+# define CR2 (2 << 12) /* CR delay type 2. */
+# define CR3 (3 << 12) /* CR delay type 3. */
+# define FFDLY (1 << 14) /* FF delay. */
+# define FF0 (0 << 14) /* FF delay type 0. */
+# define FF1 (1 << 14) /* FF delay type 1. */
+# define BSDLY (1 << 15) /* BS delay. */
+# define BS0 (0 << 15) /* BS delay type 0. */
+# define BS1 (1 << 15) /* BS delay type 1. */
+# define VTDLY (1 << 16) /* VT delay. */
+# define VT0 (0 << 16) /* VT delay type 0. */
+# define VT1 (1 << 16) /* VT delay type 1. */
+#endif /* __USE_MISC || __USE_XOPEN */
#ifdef __USE_GNU
-# define OLCUC (1 << 9) /* Translate lower case output to upper case */
+# define OLCUC (1 << 17) /* Translate lower case output to upper case */
+#endif
+#ifdef __USE_XOPEN
+# define OFILL (1 << 18) /* Send fill characters for delays. */
#endif
/* Control modes. */
@@ -117,10 +193,12 @@ struct termios
#define HUPCL (1 << 14) /* Hang up on last close. */
#define CLOCAL (1 << 15) /* Ignore modem status lines. */
#ifdef __USE_BSD
-# define CCTS_OFLOW (1 << 16) /* CTS flow control of output. */
-# define CRTS_IFLOW (1 << 17) /* RTS flow control of input. */
-# define CRTSCTS (CCTS_OFLOW|CRTS_IFLOW) /* CTS/RTS flow control. */
-# define MDMBUF (1 << 20) /* Carrier flow control of output. */
+# define CRTSCTS (1 << 16) /* RTS/CTS flow control. */
+# define CRTS_IFLOW CRTSCTS /* Compatibility. */
+# define CCTS_OFLOW CRTSCTS /* Compatibility. */
+# define CDTRCTS (1 << 17) /* DTR/CTS flow control. */
+# define MDMBUF (1 << 20) /* DTR/DCD flow control. */
+# define CHWFLOW (MDMBUF|CRTSCTS|CDTRCTS) /* All types of flow control. */
#endif
/* Local modes. */
@@ -210,13 +288,17 @@ struct termios
#define B2400 2400 /* 2400 baud. */
#define B4800 4800 /* 4800 baud. */
#define B9600 9600 /* 9600 baud. */
+#define B7200 7200 /* 7200 baud. */
+#define B14400 14400 /* 14400 baud. */
#define B19200 19200 /* 19200 baud. */
+#define B28800 28800 /* 28800 baud. */
#define B38400 38400 /* 38400 baud. */
#ifdef __USE_MISC
# define EXTA 19200
# define EXTB 38400
#endif
#define B57600 57600
+#define B76800 76800
#define B115200 115200
#define B230400 230400
#define B460800 460800
diff --git a/configure b/configure
index 3330d53dc3..a43f850f51 100755
--- a/configure
+++ b/configure
@@ -6266,7 +6266,7 @@ EOF
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } \
&& grep -q .note.GNU-stack conftest.s \
- && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Wa,--noexecstack
+ && { ac_try='${CC-cc} $ASFLAGS -Wa,--noexecstack
-c -o conftest.o conftest.s 1>&5'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
diff --git a/configure.in b/configure.in
index e6a5abb54c..ef9893c800 100644
--- a/configure.in
+++ b/configure.in
@@ -1520,7 +1520,7 @@ EOF
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS
-S -o conftest.s conftest.c 1>&AS_MESSAGE_LOG_FD]) \
&& grep -q .note.GNU-stack conftest.s \
- && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -Wa,--noexecstack
+ && AC_TRY_COMMAND([${CC-cc} $ASFLAGS -Wa,--noexecstack
-c -o conftest.o conftest.s 1>&AS_MESSAGE_LOG_FD])
then
libc_cv_as_noexecstack=yes
diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c
index 9b49e77d28..b730105628 100644
--- a/elf/dl-conflict.c
+++ b/elf/dl-conflict.c
@@ -1,5 +1,5 @@
/* Resolve conflicts against already prelinked libraries.
- Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
@@ -44,7 +44,6 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
/* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code. */
#define RESOLVE_MAP(ref, version, flags) (*ref = NULL, NULL)
#define RESOLVE(ref, version, flags) (*ref = NULL, 0)
-#define CHECK_STATIC_TLS(ref_map, sym_map) ((void) 0)
#define RESOLVE_CONFLICT_FIND_MAP(map, r_offset) \
do { \
while ((resolve_conflict_map->l_map_end < (ElfW(Addr)) (r_offset)) \
@@ -61,6 +60,12 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
#include "dynamic-link.h"
+ /* Override these, defined in dynamic-link.h. */
+#undef CHECK_STATIC_TLS
+#define CHECK_STATIC_TLS(ref_map, sym_map) ((void) 0)
+#undef TRY_STATIC_TLS
+#define TRY_STATIC_TLS(ref_map, sym_map) (0)
+
GL(dl_num_cache_relocations) += conflictend - conflict;
for (; conflict < conflictend; ++conflict)
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index e9784c2094..a303cb4ce6 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -1,5 +1,5 @@
/* Relocate a shared object and resolve its references to other loaded objects.
- Copyright (C) 1995-2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2004, 2005, 2006, 2008 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
@@ -43,9 +43,9 @@
This function intentionally does not return any value but signals error
directly, as static TLS should be rare and code handling it should
not be inlined as much as possible. */
-void
-internal_function __attribute_noinline__
-_dl_allocate_static_tls (struct link_map *map)
+int
+internal_function
+_dl_try_allocate_static_tls (struct link_map *map)
{
/* If we've already used the variable with dynamic access, or if the
alignment requirements are too high, fail. */
@@ -53,8 +53,7 @@ _dl_allocate_static_tls (struct link_map *map)
|| map->l_tls_align > GL(dl_tls_static_align))
{
fail:
- _dl_signal_error (0, map->l_name, NULL, N_("\
-cannot allocate memory in static TLS block"));
+ return -1;
}
#if TLS_TCB_AT_TP
@@ -108,6 +107,20 @@ cannot allocate memory in static TLS block"));
}
else
map->l_need_tls_init = 1;
+
+ return 0;
+}
+
+void
+internal_function __attribute_noinline__
+_dl_allocate_static_tls (struct link_map *map)
+{
+ if (map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET
+ || _dl_try_allocate_static_tls (map))
+ {
+ _dl_signal_error (0, map->l_name, NULL, N_("\
+cannot allocate memory in static TLS block"));
+ }
}
/* Initialize static TLS area and DTV for current (only) thread.
@@ -248,23 +261,6 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
l->l_lookup_cache.value = _lr; })) \
: l)
- /* This macro is used as a callback from elf_machine_rel{a,} when a
- static TLS reloc is about to be performed. Since (in dl-load.c) we
- permit dynamic loading of objects that might use such relocs, we
- have to check whether each use is actually doable. If the object
- whose TLS segment the reference resolves to was allocated space in
- the static TLS block at startup, then it's ok. Otherwise, we make
- an attempt to allocate it in surplus space on the fly. If that
- can't be done, we fall back to the error that DF_STATIC_TLS is
- intended to produce. */
-#define CHECK_STATIC_TLS(map, sym_map) \
- do { \
- if (__builtin_expect ((sym_map)->l_tls_offset == NO_TLS_OFFSET \
- || ((sym_map)->l_tls_offset \
- == FORCED_DYNAMIC_TLS_OFFSET), 0)) \
- _dl_allocate_static_tls (sym_map); \
- } while (0)
-
#include "dynamic-link.h"
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 76a3f25c0f..54c3590a9d 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -691,6 +691,61 @@ _dl_update_slotinfo (unsigned long int req_modid)
}
+static void *
+__attribute_noinline__
+tls_get_addr_tail (dtv_t *dtv, struct link_map *the_map, size_t module)
+{
+ /* The allocation was deferred. Do it now. */
+ if (the_map == NULL)
+ {
+ /* Find the link map for this module. */
+ size_t idx = module;
+ struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
+
+ while (idx >= listp->len)
+ {
+ idx -= listp->len;
+ listp = listp->next;
+ }
+
+ the_map = listp->slotinfo[idx].map;
+ }
+
+ again:
+ /* Make sure that, if a dlopen running in parallel forces the
+ variable into static storage, we'll wait until the address in the
+ static TLS block is set up, and use that. If we're undecided
+ yet, make sure we make the decision holding the lock as well. */
+ if (__builtin_expect (the_map->l_tls_offset
+ != FORCED_DYNAMIC_TLS_OFFSET, 0))
+ {
+ __rtld_lock_lock_recursive (GL(dl_load_lock));
+ if (__builtin_expect (the_map->l_tls_offset == NO_TLS_OFFSET, 1))
+ {
+ the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+ }
+ else
+ {
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+ if (__builtin_expect (the_map->l_tls_offset
+ != FORCED_DYNAMIC_TLS_OFFSET, 1))
+ {
+ void *p = dtv[module].pointer.val;
+ if (__builtin_expect (p == TLS_DTV_UNALLOCATED, 0))
+ goto again;
+
+ return p;
+ }
+ }
+ }
+ void *p = dtv[module].pointer.val = allocate_and_init (the_map);
+ dtv[module].pointer.is_static = false;
+
+ return p;
+}
+
+
/* The generic dynamic and local dynamic model cannot be used in
statically linked applications. */
void *
@@ -703,52 +758,10 @@ __tls_get_addr (GET_ADDR_ARGS)
if (__builtin_expect (dtv[0].counter != GL(dl_tls_generation), 0))
the_map = _dl_update_slotinfo (GET_ADDR_MODULE);
- retry:
p = dtv[GET_ADDR_MODULE].pointer.val;
if (__builtin_expect (p == TLS_DTV_UNALLOCATED, 0))
- {
- /* The allocation was deferred. Do it now. */
- if (the_map == NULL)
- {
- /* Find the link map for this module. */
- size_t idx = GET_ADDR_MODULE;
- struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
-
- while (idx >= listp->len)
- {
- idx -= listp->len;
- listp = listp->next;
- }
-
- the_map = listp->slotinfo[idx].map;
- }
-
- /* Make sure that, if a dlopen running in parallel forces the
- variable into static storage, we'll wait until the address in
- the static TLS block is set up, and use that. If we're
- undecided yet, make sure we make the decision holding the
- lock as well. */
- if (__builtin_expect (the_map->l_tls_offset
- != FORCED_DYNAMIC_TLS_OFFSET, 0))
- {
- __rtld_lock_lock_recursive (GL(dl_load_lock));
- if (__builtin_expect (the_map->l_tls_offset == NO_TLS_OFFSET, 1))
- {
- the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
- }
- else
- {
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
- if (__builtin_expect (the_map->l_tls_offset
- != FORCED_DYNAMIC_TLS_OFFSET, 1))
- goto retry;
- }
- }
- p = dtv[GET_ADDR_MODULE].pointer.val = allocate_and_init (the_map);
- dtv[GET_ADDR_MODULE].pointer.is_static = false;
- }
+ p = tls_get_addr_tail (dtv, the_map, GET_ADDR_MODULE);
return (char *) p + GET_ADDR_OFFSET;
}
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
index 7eb9a36137..c34cbcd43b 100644
--- a/elf/dynamic-link.h
+++ b/elf/dynamic-link.h
@@ -1,5 +1,5 @@
/* Inline functions for dynamic linking.
- Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-2005, 2006, 2008 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
@@ -17,6 +17,31 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+/* This macro is used as a callback from elf_machine_rel{a,} when a
+ static TLS reloc is about to be performed. Since (in dl-load.c) we
+ permit dynamic loading of objects that might use such relocs, we
+ have to check whether each use is actually doable. If the object
+ whose TLS segment the reference resolves to was allocated space in
+ the static TLS block at startup, then it's ok. Otherwise, we make
+ an attempt to allocate it in surplus space on the fly. If that
+ can't be done, we fall back to the error that DF_STATIC_TLS is
+ intended to produce. */
+#define CHECK_STATIC_TLS(map, sym_map) \
+ do { \
+ if (__builtin_expect ((sym_map)->l_tls_offset == NO_TLS_OFFSET \
+ || ((sym_map)->l_tls_offset \
+ == FORCED_DYNAMIC_TLS_OFFSET), 0)) \
+ _dl_allocate_static_tls (sym_map); \
+ } while (0)
+
+#define TRY_STATIC_TLS(map, sym_map) \
+ (__builtin_expect ((sym_map)->l_tls_offset \
+ != FORCED_DYNAMIC_TLS_OFFSET, 1) \
+ && (__builtin_expect ((sym_map)->l_tls_offset != NO_TLS_OFFSET, 1) \
+ || _dl_try_allocate_static_tls (sym_map) == 0))
+
+int internal_function _dl_try_allocate_static_tls (struct link_map *map);
+
#include <elf.h>
#include <assert.h>
diff --git a/elf/elf.h b/elf/elf.h
index 928e9ec976..269de527e6 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -1159,8 +1159,17 @@ typedef struct
#define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */
#define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */
#define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */
+/* 38? */
+#define R_386_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */
+#define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS
+ descriptor for
+ relaxation. */
+#define R_386_TLS_DESC 41 /* TLS descriptor containing
+ pointer to code and to
+ argument, returning the TLS
+ offset for the symbol. */
/* Keep this the last entry. */
-#define R_386_NUM 38
+#define R_386_NUM 42
/* SUN SPARC specific definitions. */
@@ -2557,8 +2566,17 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset
to GOT entry for IE symbol */
#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */
+#define R_X86_64_PC64 24 /* PC relative 64 bit */
+#define R_X86_64_GOTOFF64 25 /* 64 bit offset to GOT */
+#define R_X86_64_GOTPC32 26 /* 32 bit signed pc relative
+ offset to GOT */
+/* 27 .. 33 */
+#define R_X86_64_GOTPC32_TLSDESC 34 /* GOT offset for TLS descriptor. */
+#define R_X86_64_TLSDESC_CALL 35 /* Marker for call through TLS
+ descriptor. */
+#define R_X86_64_TLSDESC 36 /* TLS descriptor. */
-#define R_X86_64_NUM 24
+#define R_X86_64_NUM 37
/* AM33 relocations. */
diff --git a/elf/tlsdeschtab.h b/elf/tlsdeschtab.h
new file mode 100644
index 0000000000..c3cbc3fb79
--- /dev/null
+++ b/elf/tlsdeschtab.h
@@ -0,0 +1,157 @@
+/* Hash table for TLS descriptors.
+ Copyright (C) 2005, 2008 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>
+
+ 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. */
+
+#ifndef TLSDESCHTAB_H
+# define TLSDESCHTAB_H 1
+
+# ifdef SHARED
+
+# include <inline-hashtab.h>
+
+inline static int
+hash_tlsdesc (void *p)
+{
+ struct tlsdesc_dynamic_arg *td = p;
+
+ /* We know all entries are for the same module, so ti_offset is the
+ only distinguishing entry. */
+ return td->tlsinfo.ti_offset;
+}
+
+inline static int
+eq_tlsdesc (void *p, void *q)
+{
+ struct tlsdesc_dynamic_arg *tdp = p, *tdq = q;
+
+ return tdp->tlsinfo.ti_offset == tdq->tlsinfo.ti_offset;
+}
+
+inline static int
+map_generation (struct link_map *map)
+{
+ size_t idx = map->l_tls_modid;
+ struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
+
+ /* Find the place in the dtv slotinfo list. */
+ do
+ {
+ /* Does it fit in the array of this list element? */
+ if (idx < listp->len)
+ {
+ /* We should never get here for a module in static TLS, so
+ we can assume that, if the generation count is zero, we
+ still haven't determined the generation count for this
+ module. */
+ if (listp->slotinfo[idx].gen)
+ return listp->slotinfo[idx].gen;
+ else
+ break;
+ }
+ idx -= listp->len;
+ listp = listp->next;
+ }
+ while (listp != NULL);
+
+ /* If we get to this point, the module still hasn't been assigned an
+ entry in the dtv slotinfo data structures, and it will when we're
+ done with relocations. At that point, the module will get a
+ generation number that is one past the current generation, so
+ return exactly that. */
+ return GL(dl_tls_generation) + 1;
+}
+
+void *
+internal_function
+_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset)
+{
+ struct hashtab *ht;
+ void **entry;
+ struct tlsdesc_dynamic_arg *td, test;
+
+ /* FIXME: We could use a per-map lock here, but is it worth it? */
+ __rtld_lock_lock_recursive (GL(dl_load_lock));
+
+ ht = map->l_mach.tlsdesc_table;
+ if (! ht)
+ {
+ ht = htab_create ();
+ if (! ht)
+ {
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+ return 0;
+ }
+ map->l_mach.tlsdesc_table = ht;
+ }
+
+ test.tlsinfo.ti_module = map->l_tls_modid;
+ test.tlsinfo.ti_offset = ti_offset;
+ entry = htab_find_slot (ht, &test, 1, hash_tlsdesc, eq_tlsdesc);
+ if (*entry)
+ {
+ td = *entry;
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+ return td;
+ }
+
+ *entry = td = malloc (sizeof (struct tlsdesc_dynamic_arg));
+ /* This may be higher than the map's generation, but it doesn't
+ matter much. Worst case, we'll have one extra DTV update per
+ thread. */
+ td->gen_count = map_generation (map);
+ td->tlsinfo = test.tlsinfo;
+
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+ return td;
+}
+
+# endif /* SHARED */
+
+/* The idea of the following two functions is to stop multiple threads
+ from attempting to resolve the same TLS descriptor without busy
+ waiting. Ideally, we should be able to release the lock right
+ after changing td->entry, and then using say a condition variable
+ or a futex wake to wake up any waiting threads, but let's try to
+ avoid introducing such dependencies. */
+
+inline static int
+_dl_tlsdesc_resolve_early_return_p (struct tlsdesc volatile *td, void *caller)
+{
+ if (caller != td->entry)
+ return 1;
+
+ __rtld_lock_lock_recursive (GL(dl_load_lock));
+ if (caller != td->entry)
+ {
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+ return 1;
+ }
+
+ td->entry = _dl_tlsdesc_resolve_hold;
+
+ return 0;
+}
+
+inline static void
+_dl_tlsdesc_wake_up_held_fixups (void)
+{
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+}
+
+#endif
diff --git a/fedora/branch.mk b/fedora/branch.mk
index b35fb36cea..8c74d1611e 100644
--- a/fedora/branch.mk
+++ b/fedora/branch.mk
@@ -3,5 +3,5 @@ glibc-branch := fedora
glibc-base := HEAD
DIST_BRANCH := devel
COLLECTION := dist-f8
-fedora-sync-date := 2008-04-12 07:41 UTC
-fedora-sync-tag := fedora-glibc-20080412T0741
+fedora-sync-date := 2008-05-15 07:35 UTC
+fedora-sync-tag := fedora-glibc-20080515T0735
diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in
index c58ba1b48f..4512939d61 100644
--- a/fedora/glibc.spec.in
+++ b/fedora/glibc.spec.in
@@ -19,7 +19,7 @@
Summary: The GNU libc libraries
Name: glibc
Version: @glibcversion@
-Release: 2
+Release: 1
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
# Things that are linked directly into dynamically linked programs
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
@@ -688,7 +688,7 @@ cd ..
%if %{buildxen}
echo ====================TESTING -mno-tls-direct-seg-refs=============
cd build-%{nptl_target_cpu}-linuxnptl-nosegneg
-( make -j$numprocs -k check PARALLELMFLAGS=-s 2>&1
+( make %{?_smp_mflags} -k check PARALLELMFLAGS=-s 2>&1
sleep 10s
teepid="`ps -eo ppid,pid,command | awk '($1 == '${parent}' && $3 ~ /^tee/) { print $2 }'`"
[ -n "$teepid" ] && kill $teepid
@@ -701,7 +701,7 @@ cd build-%{nptl_target_cpu}-linuxnptl-power6
( if [ -d ../power6emul ]; then
export LD_PRELOAD=`cd ../power6emul; pwd`/\$LIB/power6emul.so
fi
- make -j$numprocs -k check PARALLELMFLAGS=-s 2>&1
+ make %{?_smp_mflags} -k check PARALLELMFLAGS=-s 2>&1
sleep 10s
teepid="`ps -eo ppid,pid,command | awk '($1 == '${parent}' && $3 ~ /^tee/) { print $2 }'`"
[ -n "$teepid" ] && kill $teepid
@@ -976,6 +976,18 @@ rm -f *.filelist*
%endif
%changelog
+* Thu May 15 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-1
+- update to trunk
+ - O(n) memmem/strstr/strcasestr
+ - i386/x86_64 TLS descriptors support
+ - concurrent IPv4 and IPv6 DNS lookups by getaddrinfo
+
+* Mon May 5 2008 Jakub Jelinek <jakub@redhat.com> 2.8-3
+- don't run telinit u in %post if both /dev/initctl and
+ /sbin/initctl exist (#444978)
+- workaround GCC ppc64 miscompilation of c{log{,10},acosh,atan}l
+ (#444996)
+
* Wed Apr 30 2008 Jakub Jelinek <jakub@redhat.com> 2.8-2
- fix nscd races during GC (BZ#5381)
- rebuilt with fixed GCC to fix regex miscompilation on power6
diff --git a/fedora/glibc_post_upgrade.c b/fedora/glibc_post_upgrade.c
index 4358b90a76..e9bb0b82b9 100644
--- a/fedora/glibc_post_upgrade.c
+++ b/fedora/glibc_post_upgrade.c
@@ -170,8 +170,8 @@ main (void)
/* Check if telinit is available and either SysVInit fifo,
or upstart telinit. */
if (access ("/sbin/telinit", X_OK)
- || (access ("/dev/initctl", F_OK)
- && access ("/sbin/initctl", X_OK)))
+ || ((!!access ("/dev/initctl", F_OK))
+ ^ !access ("/sbin/initctl", X_OK)))
_exit (0);
/* Check if we are not inside of some chroot, because we'd just
timeout and leave /etc/initrunlvl. */
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index ec8f38a962..5cf3237abb 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -1,5 +1,5 @@
/* Simple transformations functions.
- Copyright (C) 1997-2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1997-2005, 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -820,9 +820,11 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
STANDARD_FROM_LOOP_ERR_HANDLER (1); \
} \
else \
- /* It's an one byte sequence. */ \
- *((uint32_t *) outptr) = *inptr++; \
- outptr += sizeof (uint32_t); \
+ { \
+ /* It's an one byte sequence. */ \
+ *((uint32_t *) outptr) = *inptr++; \
+ outptr += sizeof (uint32_t); \
+ } \
}
#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
@@ -851,9 +853,11 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
STANDARD_TO_LOOP_ERR_HANDLER (4); \
} \
else \
- /* It's an one byte sequence. */ \
- *outptr++ = *((const uint32_t *) inptr); \
- inptr += sizeof (uint32_t); \
+ { \
+ /* It's an one byte sequence. */ \
+ *outptr++ = *((const uint32_t *) inptr); \
+ inptr += sizeof (uint32_t); \
+ } \
}
#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
diff --git a/iconvdata/Makefile b/iconvdata/Makefile
index 1a46a64ccd..e93de56c50 100644
--- a/iconvdata/Makefile
+++ b/iconvdata/Makefile
@@ -73,6 +73,9 @@ tests += bug-iconv3
endif
test-srcs := tst-table-from tst-table-to
+
+bug-iconv6-ENV = LOCPATH=$(common-objpfx)localedata
+tst-iconv7-ENV = LOCPATH=$(common-objpfx)localedata
endif
# No code here is in libc.so.
diff --git a/iconvdata/bug-iconv6.c b/iconvdata/bug-iconv6.c
index f920954bc2..b364f4c161 100644
--- a/iconvdata/bug-iconv6.c
+++ b/iconvdata/bug-iconv6.c
@@ -13,7 +13,7 @@ static const char testbuf[] = {
static int
do_test (void)
{
- setlocale (LC_ALL, "en_US.UTF-8");
+ setlocale (LC_ALL, "de_DE.UTF-8");
iconv_t ic = iconv_open ("ISO-2022-JP//TRANSLIT", "UTF-8");
if (ic == (iconv_t) -1)
{
diff --git a/iconvdata/run-iconv-test.sh b/iconvdata/run-iconv-test.sh
index 5f6339d2c8..4b8a1280af 100755
--- a/iconvdata/run-iconv-test.sh
+++ b/iconvdata/run-iconv-test.sh
@@ -1,6 +1,6 @@
#! /bin/sh -f
# Run available iconv(1) tests.
-# Copyright (C) 1998-2002, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 1998-2002, 2005, 2006, 2008 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
#
@@ -130,7 +130,7 @@ while read from to subset targets; do
done
fi
- if test "$subset" == N; then
+ if test "$subset" = N; then
echo $ac_n " suntzu: ASCII -> $to -> ASCII $ac_c"
$PROG -f ASCII -t $to testdata/suntzus |
$PROG -f $to -t ASCII > $temp1 ||
diff --git a/include/arpa/nameser_compat.h b/include/arpa/nameser_compat.h
index bfbb2de58c..2e735ede4c 100644
--- a/include/arpa/nameser_compat.h
+++ b/include/arpa/nameser_compat.h
@@ -1 +1,8 @@
+#ifndef _ARPA_NAMESER_COMPAT_
#include <resolv/arpa/nameser_compat.h>
+
+/* Picksome unused number to represent lookups of IPv4 and IPv6 (i.e.,
+ T_A and T_AAAA). */
+#define T_UNSPEC 62321
+
+#endif
diff --git a/include/inline-hashtab.h b/include/inline-hashtab.h
new file mode 100644
index 0000000000..1c36bd7fce
--- /dev/null
+++ b/include/inline-hashtab.h
@@ -0,0 +1,302 @@
+/* Fully-inline hash table, used mainly for managing TLS descriptors.
+
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005, 2008
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>
+
+ This file is derived from a 2003's version of libiberty's
+ hashtab.c, contributed by Vladimir Makarov (vmakarov@cygnus.com),
+ but with most adaptation points and support for deleting elements
+ removed.
+
+ 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. */
+
+#ifndef INLINE_HASHTAB_H
+# define INLINE_HASHTAB_H 1
+
+extern void weak_function free (void *ptr);
+
+inline static unsigned long
+higher_prime_number (unsigned long n)
+{
+ /* These are primes that are near, but slightly smaller than, a
+ power of two. */
+ static const uint32_t primes[] = {
+ UINT32_C (7),
+ UINT32_C (13),
+ UINT32_C (31),
+ UINT32_C (61),
+ UINT32_C (127),
+ UINT32_C (251),
+ UINT32_C (509),
+ UINT32_C (1021),
+ UINT32_C (2039),
+ UINT32_C (4093),
+ UINT32_C (8191),
+ UINT32_C (16381),
+ UINT32_C (32749),
+ UINT32_C (65521),
+ UINT32_C (131071),
+ UINT32_C (262139),
+ UINT32_C (524287),
+ UINT32_C (1048573),
+ UINT32_C (2097143),
+ UINT32_C (4194301),
+ UINT32_C (8388593),
+ UINT32_C (16777213),
+ UINT32_C (33554393),
+ UINT32_C (67108859),
+ UINT32_C (134217689),
+ UINT32_C (268435399),
+ UINT32_C (536870909),
+ UINT32_C (1073741789),
+ UINT32_C (2147483647),
+ /* 4294967291L */
+ UINT32_C (2147483647) + UINT32_C (2147483644)
+ };
+
+ const uint32_t *low = &primes[0];
+ const uint32_t *high = &primes[sizeof (primes) / sizeof (primes[0])];
+
+ while (low != high)
+ {
+ const unsigned long *mid = low + (high - low) / 2;
+ if (n > *mid)
+ low = mid + 1;
+ else
+ high = mid;
+ }
+
+#if 0
+ /* If we've run out of primes, abort. */
+ if (n > *low)
+ {
+ fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
+ abort ();
+ }
+#endif
+
+ return *low;
+}
+
+struct hashtab
+{
+ /* Table itself. */
+ void **entries;
+
+ /* Current size (in entries) of the hash table */
+ size_t size;
+
+ /* Current number of elements. */
+ size_t n_elements;
+
+ /* Free function for the entries array. This may vary depending on
+ how early the array was allocated. If it is NULL, then the array
+ can't be freed. */
+ void (*free) (void *ptr);
+};
+
+inline static struct hashtab *
+htab_create (void)
+{
+ struct hashtab *ht = malloc (sizeof (struct hashtab));
+
+ if (! ht)
+ return NULL;
+ ht->size = 3;
+ ht->entries = malloc (sizeof (void *) * ht->size);
+ ht->free = free;
+ if (! ht->entries)
+ {
+ if (ht->free)
+ ht->free (ht);
+ return NULL;
+ }
+
+ ht->n_elements = 0;
+
+ memset (ht->entries, 0, sizeof (void *) * ht->size);
+
+ return ht;
+}
+
+/* This is only called from _dl_unmap, so it's safe to call
+ free(). */
+inline static void
+htab_delete (struct hashtab *htab)
+{
+ int i;
+
+ for (i = htab->size - 1; i >= 0; i--)
+ if (htab->entries[i])
+ free (htab->entries[i]);
+
+ if (htab->free)
+ htab->free (htab->entries);
+ free (htab);
+}
+
+/* Similar to htab_find_slot, but without several unwanted side effects:
+ - Does not call htab->eq_f when it finds an existing entry.
+ - Does not change the count of elements/searches/collisions in the
+ hash table.
+ This function also assumes there are no deleted entries in the table.
+ HASH is the hash value for the element to be inserted. */
+
+inline static void **
+find_empty_slot_for_expand (struct hashtab *htab, int hash)
+{
+ size_t size = htab->size;
+ unsigned int index = hash % size;
+ void **slot = htab->entries + index;
+ int hash2;
+
+ if (! *slot)
+ return slot;
+
+ hash2 = 1 + hash % (size - 2);
+ for (;;)
+ {
+ index += hash2;
+ if (index >= size)
+ index -= size;
+
+ slot = htab->entries + index;
+ if (! *slot)
+ return slot;
+ }
+}
+
+/* The following function changes size of memory allocated for the
+ entries and repeatedly inserts the table elements. The occupancy
+ of the table after the call will be about 50%. Naturally the hash
+ table must already exist. Remember also that the place of the
+ table entries is changed. If memory allocation failures are allowed,
+ this function will return zero, indicating that the table could not be
+ expanded. If all goes well, it will return a non-zero value. */
+
+inline static int
+htab_expand (struct hashtab *htab, int (*hash_fn) (void *))
+{
+ void **oentries;
+ void **olimit;
+ void **p;
+ void **nentries;
+ size_t nsize;
+
+ oentries = htab->entries;
+ olimit = oentries + htab->size;
+
+ /* Resize only when table after removal of unused elements is either
+ too full or too empty. */
+ if (htab->n_elements * 2 > htab->size)
+ nsize = higher_prime_number (htab->n_elements * 2);
+ else
+ nsize = htab->size;
+
+ nentries = malloc (sizeof (void *) * nsize);
+ memset (nentries, 0, sizeof (void *) * nsize);
+ if (nentries == NULL)
+ return 0;
+ htab->entries = nentries;
+ htab->size = nsize;
+
+ p = oentries;
+ do
+ {
+ if (*p)
+ *find_empty_slot_for_expand (htab, hash_fn (*p))
+ = *p;
+
+ p++;
+ }
+ while (p < olimit);
+
+ /* Without recording the free corresponding to the malloc used to
+ allocate the table, we couldn't tell whether this was allocated
+ by the malloc() built into ld.so or the one in the main
+ executable or libc. Calling free() for something that was
+ allocated by the early malloc(), rather than the final run-time
+ malloc() could do Very Bad Things (TM). We will waste memory
+ allocated early as long as there's no corresponding free(), but
+ this isn't so much memory as to be significant. */
+
+ if (htab->free)
+ htab->free (oentries);
+
+ /* Use the free() corresponding to the malloc() above to free this
+ up. */
+ htab->free = free;
+
+ return 1;
+}
+
+/* This function searches for a hash table slot containing an entry
+ equal to the given element. To delete an entry, call this with
+ INSERT = 0, then call htab_clear_slot on the slot returned (possibly
+ after doing some checks). To insert an entry, call this with
+ INSERT = 1, then write the value you want into the returned slot.
+ When inserting an entry, NULL may be returned if memory allocation
+ fails. */
+
+inline static void **
+htab_find_slot (struct hashtab *htab, void *ptr, int insert,
+ int (*hash_fn)(void *), int (*eq_fn)(void *, void *))
+{
+ unsigned int index;
+ int hash, hash2;
+ size_t size;
+ void **entry;
+
+ if (htab->size * 3 <= htab->n_elements * 4
+ && htab_expand (htab, hash_fn) == 0)
+ return NULL;
+
+ hash = hash_fn (ptr);
+
+ size = htab->size;
+ index = hash % size;
+
+ entry = &htab->entries[index];
+ if (!*entry)
+ goto empty_entry;
+ else if (eq_fn (*entry, ptr))
+ return entry;
+
+ hash2 = 1 + hash % (size - 2);
+ for (;;)
+ {
+ index += hash2;
+ if (index >= size)
+ index -= size;
+
+ entry = &htab->entries[index];
+ if (!*entry)
+ goto empty_entry;
+ else if (eq_fn (*entry, ptr))
+ return entry;
+ }
+
+ empty_entry:
+ if (!insert)
+ return NULL;
+
+ htab->n_elements++;
+ return entry;
+}
+
+#endif /* INLINE_HASHTAB_H */
diff --git a/include/resolv.h b/include/resolv.h
index c1c89f0ada..925746f685 100644
--- a/include/resolv.h
+++ b/include/resolv.h
@@ -58,11 +58,11 @@ libc_hidden_proto (__res_randomid)
libc_hidden_proto (__res_state)
int __libc_res_nquery (res_state, const char *, int, int, u_char *, int,
- u_char **);
+ u_char **, u_char **, int *);
int __libc_res_nsearch (res_state, const char *, int, int, u_char *, int,
- u_char **);
-int __libc_res_nsend (res_state, const u_char *, int, u_char *, int,
- u_char **)
+ u_char **, u_char **, int *);
+int __libc_res_nsend (res_state, const u_char *, int, const u_char *, int,
+ u_char *, int, u_char **, u_char **, int *)
attribute_hidden;
libresolv_hidden_proto (_sethtent)
diff --git a/inet/netinet/in.h b/inet/netinet/in.h
index e3446a9994..180227af5b 100644
--- a/inet/netinet/in.h
+++ b/inet/netinet/in.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2001, 2003, 2004, 2006, 2007
+/* Copyright (C) 1991-2001, 2003, 2004, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -53,6 +53,8 @@ enum
#define IPPROTO_IDP IPPROTO_IDP
IPPROTO_TP = 29, /* SO Transport Protocol Class 4. */
#define IPPROTO_TP IPPROTO_TP
+ IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol. */
+#define IPPROTO_DCCP IPPROTO_DCCP
IPPROTO_IPV6 = 41, /* IPv6 header. */
#define IPPROTO_IPV6 IPPROTO_IPV6
IPPROTO_ROUTING = 43, /* IPv6 routing header. */
@@ -83,6 +85,8 @@ enum
#define IPPROTO_COMP IPPROTO_COMP
IPPROTO_SCTP = 132, /* Stream Control Transmission Protocol. */
#define IPPROTO_SCTP IPPROTO_SCTP
+ IPPROTO_UDPLITE = 136, /* UDP-Lite protocol. */
+#define IPPROTO_UDPLITE IPPROTO_UDPLITE
IPPROTO_RAW = 255, /* Raw IP packets. */
#define IPPROTO_RAW IPPROTO_RAW
IPPROTO_MAX
diff --git a/io/openat.c b/io/openat.c
index 98fa1a1d64..a6bd62094b 100644
--- a/io/openat.c
+++ b/io/openat.c
@@ -79,7 +79,7 @@ __openat_2 (fd, file, oflag)
if (oflag & O_CREAT)
__fortify_fail ("invalid openat call: O_CREAT without mode");
- return __openat (file, oflag);
+ return __openat (fd, file, oflag);
}
stub_warning (__openat_2)
diff --git a/io/openat64.c b/io/openat64.c
index 2d63490c65..1532afeea6 100644
--- a/io/openat64.c
+++ b/io/openat64.c
@@ -79,7 +79,7 @@ __openat64_2 (fd, file, oflag)
if (oflag & O_CREAT)
__fortify_fail ("invalid openat64 call: O_CREAT without mode");
- return __openat64 (file, oflag);
+ return __openat64 (fd, file, oflag);
}
stub_warning (__openat_2)
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 52cb387c98..95bbd7c832 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,21 @@
+2008-05-14 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #6438]
+ * locales/iso14651_t1_common: Add sorting data for Telugu.
+
+ [BZ #6447]
+ * locales/be_BY: Fix yesexpr.
+ Patch by Alexander Mikhailian <mikhailian@altern.org>.
+
+2008-04-15 Ulrich Drepper <drepper@redhat.com>
+
+ * charmaps/UTF-8: Update for Unicode v5.1.
+ * locales/i18n: Update for Unicode 5.
+
+2008-04-09 Ulrich Drepper <drepper@redhat.com>
+
+ * tst-langinfo.sh: Adjust for latest fr_FR locale changes.
+
2008-04-07 Ulrich Drepper <drepper@redhat.com>
[BZ #6021]
diff --git a/localedata/charmaps/UTF-8 b/localedata/charmaps/UTF-8
index 4ace37697e..d4375bbab4 100644
--- a/localedata/charmaps/UTF-8
+++ b/localedata/charmaps/UTF-8
@@ -899,7 +899,6 @@ CHARMAP
<U037C> /xcd/xbc GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
<U037D> /xcd/xbd GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
<U037E> /xcd/xbe GREEK QUESTION MARK
-<U037F> /xcd/xbf GREEK CAPITAL KAI SYMBOL
<U0384> /xce/x84 GREEK TONOS
<U0385> /xce/x85 GREEK DIALYTIKA TONOS
<U0386> /xce/x86 GREEK CAPITAL LETTER ALPHA WITH TONOS
@@ -972,6 +971,7 @@ CHARMAP
<U03CC> /xcf/x8c GREEK SMALL LETTER OMICRON WITH TONOS
<U03CD> /xcf/x8d GREEK SMALL LETTER UPSILON WITH TONOS
<U03CE> /xcf/x8e GREEK SMALL LETTER OMEGA WITH TONOS
+<U03CF> /xcf/x8f GREEK CAPITAL KAI SYMBOL
<U03D0> /xcf/x90 GREEK BETA SYMBOL
<U03D1> /xcf/x91 GREEK THETA SYMBOL
<U03D2> /xcf/x92 GREEK UPSILON WITH HOOK SYMBOL
@@ -9443,71 +9443,71 @@ CHARMAP
<U2D23> /xe2/xb4/xa3 GEORGIAN SMALL LETTER WE
<U2D24> /xe2/xb4/xa4 GEORGIAN SMALL LETTER HAR
<U2D25> /xe2/xb4/xa5 GEORGIAN SMALL LETTER HOE
-<U2D30> /xe2/xb4/xb0 TIFINAGH YA
-<U2D31> /xe2/xb4/xb1 LETTRE TIFINAGHE YAB
-<U2D32> /xe2/xb4/xb2 LETTRE TIFINAGHE YAB SPIRANT
-<U2D33> /xe2/xb4/xb3 LETTRE TIFINAGHE YAG
-<U2D34> /xe2/xb4/xb4 LETTRE TIFINAGHE YAG SPIRANT
-<U2D35> /xe2/xb4/xb5 LETTRE TIFINAGHE YADJ KABYLE
-<U2D36> /xe2/xb4/xb6 LETTRE TIFINAGHE YADJ
-<U2D37> /xe2/xb4/xb7 LETTRE TIFINAGHE YAD
-<U2D38> /xe2/xb4/xb8 LETTRE TIFINAGHE YAD SPIRANT (yadh)
-<U2D39> /xe2/xb4/xb9 LETTRE TIFINAGHE YADD
-<U2D3A> /xe2/xb4/xba LETTRE TIFINAGHE YADD SPIRANT
-<U2D3B> /xe2/xb4/xbb LETTRE TIFINAGHE YEY
-<U2D3C> /xe2/xb4/xbc LETTRE TIFINAGHE YAF
-<U2D3D> /xe2/xb4/xbd LETTRE TIFINAGHE YAK
-<U2D3E> /xe2/xb4/xbe LETTRE TIFINAGHE YAK TOUAREG
-<U2D3F> /xe2/xb4/xbf LETTRE TIFINAGHE YAK SPIRANT
-<U2D40> /xe2/xb5/x80 LETTRE TIFINAGHE YAH (yab touareg)
-<U2D41> /xe2/xb5/x81 LETTRE TIFINAGHE YAH KABYLE
-<U2D42> /xe2/xb5/x82 LETTRE TIFINAGHE YAH TOUAREG
-<U2D43> /xe2/xb5/x83 LETTRE TIFINAGHE YAHH
-<U2D44> /xe2/xb5/x84 LETTRE TIFINAGHE YA’
-<U2D45> /xe2/xb5/x85 LETTRE TIFINAGHE YAKH
-<U2D46> /xe2/xb5/x86 LETTRE TIFINAGHE YAKH TOUAREG (quatre-points en carré touareg)
-<U2D47> /xe2/xb5/x87 LETTRE TIFINAGHE YAQ
-<U2D48> /xe2/xb5/x88 LETTRE TIFINAGHE YAQ TOUAREG
-<U2D49> /xe2/xb5/x89 LETTRE TIFINAGHE YI
-<U2D4A> /xe2/xb5/x8a LETTRE TIFINAGHE YAJ
-<U2D4B> /xe2/xb5/x8b LETTRE TIFINAGHE YAJ DE L’AHAGGAR
-<U2D4C> /xe2/xb5/x8c LETTRE TIFINAGHE YAJ TOUAREG
-<U2D4D> /xe2/xb5/x8d LETTRE TIFINAGHE YAL
-<U2D4E> /xe2/xb5/x8e LETTRE TIFINAGHE YAM
-<U2D4F> /xe2/xb5/x8f LETTRE TIFINAGHE YAN
-<U2D50> /xe2/xb5/x90 LETTRE TIFINAGHE YAGN TOUAREG
-<U2D51> /xe2/xb5/x91 LETTRE TIFINAGHE YANG TOUAREG
-<U2D52> /xe2/xb5/x92 LETTRE TIFINAGHE YAP
-<U2D53> /xe2/xb5/x93 LETTRE TIFINAGHE YOU (yaw touareg)
-<U2D54> /xe2/xb5/x94 LETTRE TIFINAGHE YAR
-<U2D55> /xe2/xb5/x95 LETTRE TIFINAGHE YARR
-<U2D56> /xe2/xb5/x96 LETTRE TIFINAGHE YAGH
-<U2D57> /xe2/xb5/x97 LETTRE TIFINAGHE YAGH TOUAREG
-<U2D58> /xe2/xb5/x98 LETTRE TIFINAGHE YAGH DE L’AÏR (yadj de l’Adrar, cinq-points en quinconce touareg)
-<U2D59> /xe2/xb5/x99 LETTRE TIFINAGHE YAS
-<U2D5A> /xe2/xb5/x9a LETTRE TIFINAGHE YASS
-<U2D5B> /xe2/xb5/x9b LETTRE TIFINAGHE YACH
-<U2D5C> /xe2/xb5/x9c LETTRE TIFINAGHE YAT
-<U2D5D> /xe2/xb5/x9d LETTRE TIFINAGHE YAT SPIRANT (yath)
-<U2D5E> /xe2/xb5/x9e LETTRE TIFINAGHE YATCH
-<U2D5F> /xe2/xb5/x9f LETTRE TIFINAGHE YATT
-<U2D60> /xe2/xb5/xa0 LETTRE TIFINAGHE YAV
-<U2D61> /xe2/xb5/xa1 LETTRE TIFINAGHE YAW
-<U2D62> /xe2/xb5/xa2 LETTRE TIFINAGHE YAY
-<U2D63> /xe2/xb5/xa3 LETTRE TIFINAGHE YAZ
-<U2D64> /xe2/xb5/xa4 LETTRE TIFINAGHE YAZ TAWELLEMET (yaz harpon)
-<U2D65> /xe2/xb5/xa5 LETTRE TIFINAGHE YAZZ
-<U2D6F> /xe2/xb5/xaf LETTRE MODIFICATIVE TIFINAGHE DE LABIO-VÉLARISATION (tamatart)
-<U2D80> /xe2/xb6/x80 ETHIOPIC SYLLALE LOA
-<U2D81> /xe2/xb6/x81 ETHIOPIC SYLLALE MOA
-<U2D82> /xe2/xb6/x82 ETHIOPIC SYLLALE ROA
-<U2D83> /xe2/xb6/x83 ETHIOPIC SYLLALE SOA
-<U2D84> /xe2/xb6/x84 ETHIOPIC SYLLALE SHOA
-<U2D85> /xe2/xb6/x85 ETHIOPIC SYLLALE BOA
-<U2D86> /xe2/xb6/x86 ETHIOPIC SYLLALE TOA
-<U2D87> /xe2/xb6/x87 ETHIOPIC SYLLALE COA
-<U2D88> /xe2/xb6/x88 ETHIOPIC SYLLALE NOA
-<U2D89> /xe2/xb6/x89 ETHIOPIC SYLLALE NYOA
+<U2D30> /xe2/xb4/xb0 TIFINAGH LETTER YA
+<U2D31> /xe2/xb4/xb1 TIFINAGH LETTER YAB
+<U2D32> /xe2/xb4/xb2 TIFINAGH LETTER YABH
+<U2D33> /xe2/xb4/xb3 TIFINAGH LETTER YAG
+<U2D34> /xe2/xb4/xb4 TIFINAGH LETTER YAGHH
+<U2D35> /xe2/xb4/xb5 TIFINAGH LETTER BERBER ACADEMY YAJ
+<U2D36> /xe2/xb4/xb6 TIFINAGH LETTER YAJ
+<U2D37> /xe2/xb4/xb7 TIFINAGH LETTER YAD
+<U2D38> /xe2/xb4/xb8 TIFINAGH LETTER YADH
+<U2D39> /xe2/xb4/xb9 TIFINAGH LETTER YADD
+<U2D3A> /xe2/xb4/xba TIFINAGH LETTER YADDH
+<U2D3B> /xe2/xb4/xbb TIFINAGH LETTER YEY
+<U2D3C> /xe2/xb4/xbc TIFINAGH LETTER YAF
+<U2D3D> /xe2/xb4/xbd TIFINAGH LETTER YAK
+<U2D3E> /xe2/xb4/xbe TIFINAGH LETTER TUAREG YAK
+<U2D3F> /xe2/xb4/xbf TIFINAGH LETTER YAKHH
+<U2D40> /xe2/xb5/x80 TIFINAGH LETTER YAH
+<U2D41> /xe2/xb5/x81 TIFINAGH LETTER BERBER ACADEMY YAH
+<U2D42> /xe2/xb5/x82 TIFINAGH LETTER TUAREG YAH
+<U2D43> /xe2/xb5/x83 TIFINAGH LETTER YAHH
+<U2D44> /xe2/xb5/x84 TIFINAGH LETTER YAA
+<U2D45> /xe2/xb5/x85 TIFINAGH LETTER YAKH
+<U2D46> /xe2/xb5/x86 TIFINAGH LETTER TUAREG YAKH
+<U2D47> /xe2/xb5/x87 TIFINAGH LETTER YAQ
+<U2D48> /xe2/xb5/x88 TIFINAGH LETTER TUAREG YAQ
+<U2D49> /xe2/xb5/x89 TIFINAGH LETTER YI
+<U2D4A> /xe2/xb5/x8a TIFINAGH LETTER YAZH
+<U2D4B> /xe2/xb5/x8b TIFINAGH LETTER AHAGGAR YAZH
+<U2D4C> /xe2/xb5/x8c TIFINAGH LETTER TUAREG YAZH
+<U2D4D> /xe2/xb5/x8d TIFINAGH LETTER YAL
+<U2D4E> /xe2/xb5/x8e TIFINAGH LETTER YAM
+<U2D4F> /xe2/xb5/x8f TIFINAGH LETTER YAN
+<U2D50> /xe2/xb5/x90 TIFINAGH LETTER TUAREG YAGN
+<U2D51> /xe2/xb5/x91 TIFINAGH LETTER TUAREG YANG
+<U2D52> /xe2/xb5/x92 TIFINAGH LETTER YAP
+<U2D53> /xe2/xb5/x93 TIFINAGH LETTER YU
+<U2D54> /xe2/xb5/x94 TIFINAGH LETTER YAR
+<U2D55> /xe2/xb5/x95 TIFINAGH LETTER YARR
+<U2D56> /xe2/xb5/x96 TIFINAGH LETTER YAGH
+<U2D57> /xe2/xb5/x97 TIFINAGH LETTER TUAREG YAGH
+<U2D58> /xe2/xb5/x98 TIFINAGH LETTER AYER YAGH
+<U2D59> /xe2/xb5/x99 TIFINAGH LETTER YAS
+<U2D5A> /xe2/xb5/x9a TIFINAGH LETTER YASS
+<U2D5B> /xe2/xb5/x9b TIFINAGH LETTER YASH
+<U2D5C> /xe2/xb5/x9c TIFINAGH LETTER YAT
+<U2D5D> /xe2/xb5/x9d TIFINAGH LETTER YATH
+<U2D5E> /xe2/xb5/x9e TIFINAGH LETTER YACH
+<U2D5F> /xe2/xb5/x9f TIFINAGH LETTER YATT
+<U2D60> /xe2/xb5/xa0 TIFINAGH LETTER YAV
+<U2D61> /xe2/xb5/xa1 TIFINAGH LETTER YAW
+<U2D62> /xe2/xb5/xa2 TIFINAGH LETTER YAY
+<U2D63> /xe2/xb5/xa3 TIFINAGH LETTER YAZ
+<U2D64> /xe2/xb5/xa4 TIFINAGH LETTER TAWELLEMET YAZ
+<U2D65> /xe2/xb5/xa5 TIFINAGH LETTER YAZZ
+<U2D6F> /xe2/xb5/xaf TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+<U2D80> /xe2/xb6/x80 ETHIOPIC SYLLABLE LOA
+<U2D81> /xe2/xb6/x81 ETHIOPIC SYLLABLE MOA
+<U2D82> /xe2/xb6/x82 ETHIOPIC SYLLABLE ROA
+<U2D83> /xe2/xb6/x83 ETHIOPIC SYLLABLE SOA
+<U2D84> /xe2/xb6/x84 ETHIOPIC SYLLABLE SHOA
+<U2D85> /xe2/xb6/x85 ETHIOPIC SYLLABLE BOA
+<U2D86> /xe2/xb6/x86 ETHIOPIC SYLLABLE TOA
+<U2D87> /xe2/xb6/x87 ETHIOPIC SYLLABLE COA
+<U2D88> /xe2/xb6/x88 ETHIOPIC SYLLABLE NOA
+<U2D89> /xe2/xb6/x89 ETHIOPIC SYLLABLE NYOA
<U2D8A> /xe2/xb6/x8a ETHIOPIC SYLLABLE GLOTTAL OA
<U2D8B> /xe2/xb6/x8b ETHIOPIC SYLLABLE ZOA
<U2D8C> /xe2/xb6/x8c ETHIOPIC SYLLABLE DOA
@@ -26425,7 +26425,6 @@ CHARMAP
<UFFFC> /xef/xbf/xbc OBJECT REPLACEMENT CHARACTER
<UFFFD> /xef/xbf/xbd REPLACEMENT CHARACTER
<U00010000> /xf0/x90/x80/x80 LINEAR B SYLLABLE B008 A
-<U00010000> /xf0/x90/x80/x80 LINEAR B SYLLABLE B008 A
<U00010001> /xf0/x90/x80/x81 LINEAR B SYLLABLE B038 E
<U00010002> /xf0/x90/x80/x82 LINEAR B SYLLABLE B028 I
<U00010003> /xf0/x90/x80/x83 LINEAR B SYLLABLE B061 O
diff --git a/localedata/locales/be_BY b/localedata/locales/be_BY
index 3111a6a62c..0e02ac4dea 100644
--- a/localedata/locales/be_BY
+++ b/localedata/locales/be_BY
@@ -69,7 +69,7 @@ translit_end
END LC_CTYPE
LC_MESSAGES
-yesexpr "<U005E><U005B><U0414><U0434><U0059><U0079><U005D><U002E><U002A>"
+yesexpr "<U005E><U005B><U0422><U0442><U0059><U0079><U005D><U002E><U002A>"
noexpr "<U005E><U005B><U041D><U043D><U004E><U006E><U005D><U002E><U002A>"
END LC_MESSAGES
diff --git a/localedata/locales/i18n b/localedata/locales/i18n
index 93ffe90e7e..7287424417 100644
--- a/localedata/locales/i18n
+++ b/localedata/locales/i18n
@@ -2,20 +2,17 @@ escape_char /
comment_char %
LC_IDENTIFICATION
-% This is the ISO/IEC TR 14652 "i18n" definition for
-% the LC_IDENTIFICATION category.
-%
-title "ISO/IEC TR 14652 i18n FDCC-set"
-source "ISO/IEC Copyright Office"
-address "Case postale 56, CH-1211 Geneve 20, Switzerland"
+title ""
+source ""
+address ""
contact ""
email ""
tel ""
fax ""
language ""
-territory "ISO"
-revision "1.0"
-date "2000-01-24"
+territory ""
+revision ""
+date "2008-04-13"
%
category "i18n:2000";LC_IDENTIFICATION
category "i18n:2000";LC_CTYPE
@@ -63,6 +60,7 @@ upper /
<U023A>;<U023B>;<U023D>;<U023E>;/
<U0241>;<U0243>..<U0246>;<U0248>;<U024A>;<U024C>;<U024E>;/
% BASIC GREEK/
+ <U0370>;<U0372>;<U0376>;/
<U0386>;<U0388>..<U038A>;<U038C>;<U038E>;<U038F>;<U0391>..<U03A1>;/
<U03A3>..<U03AB>;<U03D8>..(2)..<U03DE>;/
% GREEK SYMBOLS AND COPTIC/
@@ -73,7 +71,7 @@ upper /
<U0480>;<U048A>..(2)..<U04BE>;<U04C0>;<U04C1>..(2)..<U04CD>;/
<U04D0>..(2)..<U04FE>;/
% CYRILLIC SUPPLEMENT/
- <U0500>..(2)..<U0512>;/
+ <U0500>..(2)..<U0522>;/
% ARMENIAN/
<U0531>..<U0556>;/
% GEORGIAN/
@@ -83,8 +81,8 @@ upper /
<U10A0>..<U10C5>;/
% LATIN EXTENDED ADDITIONAL/
<U1E00>..(2)..<U1E7E>;/
- <U1E80>..(2)..<U1E94>;/
- <U1EA0>..(2)..<U1EF8>;/
+ <U1E80>..(2)..<U1E94>;<U1E9E>;/
+ <U1EA0>..(2)..<U1EFE>;/
% GREEK EXTENDED/
<U1F08>..<U1F0F>;<U1F18>..<U1F1D>;<U1F28>..<U1F2F>;<U1F38>..<U1F3F>;/
<U1F48>..<U1F4D>;<U1F59>..(2)..<U1F5F>;<U1F68>..<U1F6F>;/
@@ -101,9 +99,15 @@ upper /
% GLAGOLITIC/
<U2C00>..<U2C2E>;/
% LATIN EXTENDED-C/
- <U2C60>;<U2C62>..<U2C64>;<U2C67>..(2)..<U2C6B>;<U2C75>;/
+ <U2C60>;<U2C62>..<U2C64>;<U2C67>..(2)..<U2C6B>;<U2C6D>..<U2C6F>;/
+ <U2C72>;<U2C75>;<UA78B>;/
% COPTIC/
<U2C80>..(2)..<U2CE2>;/
+% CYRILLIC SUPPLEMENT 2/
+ <UA640>..(2)..<UA65E>;<UA662>..(2)..<UA66C>;<UA680>..(2)..<UA696>;/
+% LATIN EXTENDED-D/
+ <UA722>..(2)..<UA72E>;<UA732>..(2)..<UA76E>;<UA779>..(2)..<UA77D>;/
+ <UA77E>..(2)..<UA786>;/
% HALFWIDTH AND FULLWIDTH FORMS/
<UFF21>..<UFF3A>;/
% DESERET/
@@ -133,6 +137,7 @@ lower /
% COMBINING DIACRITICAL MARKS/
<U0345>;/
% BASIC GREEK/
+ <U0371>;<U0373>;<U0377>;/
<U037B>..<U037D>;/
<U03AC>..<U03AF>;<U03B1>..<U03CE>;/
% GREEK SYMBOLS AND COPTIC/
@@ -142,13 +147,13 @@ lower /
<U0430>..<U045F>;<U0461>..(2)..<U047F>;/
<U0481>;<U048B>..(2)..<U04BF>;<U04C2>..(2)..<U04CE>;/
<U04CF>;/
- <U04D1>..(2)..<U0513>;/
+ <U04D1>..(2)..<U0523>;/
% ARMENIAN/
<U0561>..<U0586>;/
% PHONETIC EXTENSIONS/
<U1D7D>;/
% LATIN EXTENDED ADDITIONAL/
- <U1E01>..(2)..<U1E95>;<U1E9B>;<U1EA1>..(2)..<U1EF9>;/
+ <U1E01>..(2)..<U1E95>;<U1E9B>..<U1E9D>;<U1E9F>;<U1EA1>..(2)..<U1EFF>;/
% GREEK EXTENDED/
<U1F00>..<U1F07>;<U1F10>..<U1F15>;<U1F20>..<U1F27>;<U1F30>..<U1F37>;/
<U1F40>..<U1F45>;<U1F51>..(2)..<U1F57>;<U1F60>..<U1F67>;<U1F70>..<U1F7D>;/
@@ -158,19 +163,25 @@ lower /
% LETTERLIKE SYMBOLS/
<U214E>;/
% NUMBER FORMS/
- <U2170>..<U217F>;<U2184>;/
+ <U2170>..<U217F>;<U2188>;/
% ENCLOSED ALPHANUMERICS/
<U24D0>..<U24E9>;/
% GLAGOLITIC/
<U2C30>..<U2C5E>;/
% LATIN EXTENDED-C/
- <U2C61>;<U2C65>;<U2C66>..(2)..<U2C6C>;<U2C76>;/
+ <U2C61>;<U2C65>;<U2C66>..(2)..<U2C6C>;<U2C71>;<U2C73>;<U2C74>;/
+ <U2C76>..<U2C7A>;/
% COPTIC/
<U2C81>..(2)..<U2CE3>;/
% GEORGIAN SUPPLEMENT/
% well, there are three georgian blocks defined; one caseless (the one usually/
% used), one defined as uppercase and one as lowercase. defining the lowercase one here/
<U2D00>..<U2D25>;/
+% CYRILLIC SUPPLEMENT 2/
+ <UA641>..(2)..<UA65F>;<UA663>..(2)..<UA66D>;<UA681>..(2)..<UA697>;/
+% LATIN EXTENDED-D/
+ <UA723>..(2)..<UA72F>;<UA730>;<UA731>..(2)..<UA76F>;<UA771>..<UA778>;/
+ <UA77A>..(2)..<UA77C>;<UA77F>..(2)..<UA787>;<UA78C>;/
% HALFWIDTH AND FULLWIDTH FORMS/
<UFF41>..<UFF5A>;/
% DESERET/
@@ -196,7 +207,7 @@ alpha /
% COMBINING DIACRITICAL MARKS/
<U0345>;/
% BASIC GREEK/
- <U037A>..<U037D>;<U0386>;/
+ <U0370>..<U0373>;<U0376>..<U0377>;<U037A>..<U037D>;<U0386>;/
<U0388>..<U038A>;<U038C>;<U038E>..<U03A1>;/
<U03A3>..<U03CE>;/
% GREEK SYMBOLS AND COPTIC/
@@ -204,18 +215,18 @@ alpha /
% CYRILLIC/
<U0400>..<U0481>;<U048A>..<U04FF>;/
% CYRILLIC SUPPLEMENT/
- <U0500>..<U0513>;/
+ <U0500>..<U0523>;/
% ARMENIAN/
<U0531>..<U0556>;<U0559>;<U0561>..<U0587>;/
% HEBREW/
<U05D0>..<U05EA>;<U05F0>..<U05F2>;/
% ARABIC/
- <U0621>..<U063A>;<U0640>..<U064A>;<U066E>..<U066F>;<U0671>..<U06D3>;/
+ <U0621>..<U064A>;<U066E>..<U066F>;<U0671>..<U06D3>;/
<U06D5>;<U06E5>..<U06E6>;<U06EE>..<U06EF>;<U06FA>..<U06FC>;<U06FF>;/
% SYRIAC/
<U0710>;<U0712>..<U072F>;<U074D>..<U074F>;/
% ARABIC SUPPLEMENT/
- <U0750>..<U076D>;/
+ <U0750>..<U077F>;/
% THAANA/
<U0780>..<U07A5>;<U07B1>;/
% NKO/
@@ -238,20 +249,20 @@ alpha /
% ORIYA/
<U0B05>..<U0B0C>;<U0B0F>;<U0B10>;<U0B13>..<U0B28>;<U0B2A>..<U0B30>;/
<U0B32>;<U0B33>;<U0B35>..<U0B39>;<U0B3D>;<U0B5C>;<U0B5D>;/
- <U0B5F>..<U0B61>;<U0B71>;/
+ <U0B5F>..<U0B63>;<U0B71>;/
% TAMIL/
<U0B83>;<U0B85>..<U0B8A>;<U0B8E>..<U0B90>;<U0B92>..<U0B95>;<U0B99>;/
<U0B9A>;<U0B9C>;<U0B9E>;<U0B9F>;<U0BA3>;<U0BA4>;<U0BA8>..<U0BAA>;/
<U0BAE>..<U0BB9>;/
% TELUGU/
<U0C05>..<U0C0C>;<U0C0E>..<U0C10>;<U0C12>..<U0C28>;<U0C2A>..<U0C33>;/
- <U0C35>..<U0C39>;<U0C60>..<U0C61>;/
+ <U0C35>..<U0C39>;<U0C3D>;<U0C58>..<U0C59>;<U0C60>..<U0C63>;/
% KANNADA/
<U0C85>..<U0C8C>;<U0C8E>..<U0C90>;<U0C92>..<U0CA8>;<U0CAA>..<U0CB3>;/
<U0CB5>..<U0CB9>;<U0CDE>;<U0CE0>..<U0CE1>;/
% MALAYALAM/
<U0D05>..<U0D0C>;<U0D0E>..<U0D10>;<U0D12>..<U0D28>;<U0D2A>..<U0D39>;/
- <U0D60>..<U0D61>;/
+ <U0D3D>;<U0D60>..<U0D63>;/
% SINHALA/
<U0D85>..<U0D96>;<U0D9A>..<U0DB1>;<U0DB3>..<U0DBB>;<U0DBD>;/
<U0DC0>..<U0DC6>;/
@@ -263,9 +274,10 @@ alpha /
<U0EAA>..<U0EAB>;<U0EAD>..<U0EB0>;<U0EB2>..<U0EB3>;<U0EBD>;/
<U0EC0>..<U0EC4>;<U0EC6>;<U0EDC>..<U0EDD>;/
% TIBETAN/
- <U0F00>;<U0F40>..<U0F47>;<U0F49>..<U0F6A>;<U0F88>..<U0F8B>;/
+ <U0F00>;<U0F40>..<U0F47>;<U0F49>..<U0F6C>;<U0F88>..<U0F8B>;/
% MYANMAR/
- <U1000>..<U1021>;<U1023>..<U1027>;<U1029>;<U102A>;<U1050>..<U1055>;/
+ <U1000>..<U102A>;<U1050>..<U1055>;<U105A>..<U105D>;<U1061>;<U0165>;/
+ <U1066>;<U106E>..<U1070>;<U1075>..<U1081>;<U108E>;/
% GEORGIAN/
<U10A0>..<U10C5>;<U10D0>..<U10FA>;<U10FC>;/
% HANGUL JAMO/
@@ -298,7 +310,7 @@ alpha /
% KHMER/
<U1780>..<U17B3>;<U17D7>;<U17DC>;/
% MONGOLIAN/
- <U1820>..<U1877>;<U1880>..<U18A8>;/
+ <U1820>..<U1877>;<U1880>..<U18A8>;<U18AA>;/
% LIMBU/
<U1900>..<U191C>;<U1946>..<U194F>;/
% TAI LE/
@@ -309,10 +321,16 @@ alpha /
<U1A00>..<U1A16>;/
% BALINESE/
<U1B05>..<U1B33>;<U1B45>..<U1B4B>;<U1B50>..<U1B59>;/
+% SUNDANESE/
+ <U1B83>..<U1BA0>;<U1BAE>..<U1BAF>;/
+% LEPCHA/
+ <U1C00>..<U1C23>;<U1C4D>..<U1C4F>;/
+% OL CHIKI/
+ <U1C5A>..<U1C7D>;/
% PHONETIC EXTENSIONS/
<U1D00>..<U1DBF>;/
% LATIN EXTENDED ADDITIONAL/
- <U1E00>..<U1E9B>;<U1EA0>..<U1EF9>;/
+ <U1E00>..<U1E9F>;<U1EA0>..<U1EFF>;/
% GREEK EXTENDED/
<U1F00>..<U1F15>;<U1F18>..<U1F1D>;<U1F20>..<U1F45>;<U1F48>..<U1F4D>;/
<U1F50>..<U1F57>;<U1F59>;<U1F5B>;<U1F5D>;<U1F5F>..<U1F7D>;/
@@ -326,13 +344,13 @@ alpha /
<U2126>;<U2128>..<U212D>;<U212F>..<U2139>;/
<U213C>..<U213F>;<U2145>..<U2149>;<U214E>;/
% NUMBER FORMS/
- <U2160>..<U2184>;/
+ <U2160>..<U2188>;/
% ENCLOSED ALPHANUMERICS/
<U249C>..<U24E9>;/
% GLAGOLITIC/
<U2C00>..<U2C2E>;<U2C30>..<U2C5E>;/
% LATIN EXTENDED-C/
- <U2C60>..<U2C6C>;<U2C74>..<U2C77>;/
+ <U2C60>..<U2C6F>;<U2C71>..<U2C7D>;/
% COPTIC/
<U2C80>..<U2CE4>;/
% GEORGIAN SUPPLEMENT/
@@ -350,7 +368,7 @@ alpha /
% KATAKANA/
<U30A1>..<U30FA>;<U30FC>..<U30FF>;/
% BOPOMOFO/
- <U3105>..<U312C>;/
+ <U3105>..<U312D>;/
% HANGUL COMPATIBILITY JAMO/
<U3131>..<U318E>;/
% BOPOMOFO EXTENDED/
@@ -363,12 +381,24 @@ alpha /
<U4E00>..<U9FBB>;/
% YI SYLLABLES/
<UA000>..<UA48C>;/
+% VAI SYLLABLES/
+ <UA500>..<UA60B>;<UA610>..<UA61F>;<UA62A>..<UA62B>;/
+% CYRILLIC SUPPLEMENT 2/
+ <UA640>..<UA65F>;<UA662>..<UA66E>;<UA680>..<UA697>;/
% LATIN EXTENDED-D/
- <UA717>..<UA71A>;/
+ <UA717>..<UA71F>;<UA722>..<UA78C>;<UA7FB>..<UA7FF>;/
% SYLOTI NEGRI/
<UA800>;<UA801>;<UA803>..<UA805>;<UA807>..<UA80A>;<UA80C>..<UA822>;/
% PHAGS PA/
<UA840>..<UA873>;/
+% SAURASHTRA/
+ <UA882>..<UA8B3>;/
+% KAYAH LI/
+ <UA90A>..<UA92D>;/
+% REJANG/
+ <UA930>..<UA946>;/
+% CHAM/
+ <UAA00>..<UAA28>;<UAA40>..<UAA42>;<UAA44>..<UAA4B>;/
% HANGUL SYLLABLES/
<UAC00>..<UD7A3>;/
% CJK COMPATIBILITY IDEOGRAPHS/
@@ -394,6 +424,10 @@ alpha /
<U00010080>..<U000100FA>;/
% ANCIENT GREEK NUMBERS/
<U00010140>..<U00010174>;/
+% LYCIAN/
+ <U00010280>..<U0001029C>;/
+% CARIAN/
+ <U000102A0>..<U000102D0>;/
% OLD ITALIC/
<U00010300>..<U0001031E>;/
% GOTHIC/
@@ -458,11 +492,11 @@ alpha /
% TAMIL/
<U0BE6>..<U0BEF>;/
% TELUGU/
- <U0C66>..<U0C6F>;/
+ <U0C66>..<U0C6F>;<U0C78>..<U0C7F>;/
% KANNADA/
<U0CE6>..<U0CEF>;/
% MALAYALAM/
- <U0D66>..<U0D6F>;/
+ <U0D66>..<U0D75>;<U0D79>..<U0D7F>;/
% THAI/
<U0E50>..<U0E59>;/
% LAO/
@@ -475,6 +509,20 @@ alpha /
<U17E0>..<U17E9>;/
% MONGOLIAN/
<U1810>..<U1819>;/
+% SUNDANESE/
+ <U1BB0>..<U1BB9>;/
+% LEPCHA/
+ <U1C40>..<U1C49>;/
+% OL CHIKI/
+ <U1C50>..<U1C59>;/
+% VAI/
+ <UA620>..<UA629>;/
+% SAURASHTRA/
+ <UA8D0>..<UA8D9>;/
+% KAYAH LI/
+ <UA900>..<UA909>;/
+% CHAM/
+ <UAA50>..<UAA59>;/
% HALFWIDTH AND FULLWIDTH FORMS/
<UFF10>..<UFF19>
@@ -514,57 +562,67 @@ punct /
<U02EF>..<U0344>;<U0346>..<U036F>;<U0374>..<U0375>;<U037E>;/
<U0384>..<U0385>;<U0387>;<U03F6>;<U0482>..<U0486>;<U0488>..<U0489>;/
<U055A>..<U055F>;<U0589>..<U058A>;<U0591>..<U05C7>;<U05F3>..<U05F4>;/
- <U0600>..<U0603>;<U060B>..<U0615>;<U061B>;<U061E>..<U061F>;/
+ <U0600>..<U0603>;<U060B>..<U061B>;<U061E>..<U061F>;/
<U064B>..<U065E>;<U066A>..<U066D>;<U0670>;<U06D4>;<U06D6>..<U06E4>;/
<U06E7>..<U06ED>;<U06FD>..<U06FE>;<U0700>..<U070D>;<U070F>;<U0711>;/
<U0730>..<U074A>;<U07A6>..<U07B0>;<U07EB>..<U07F3>;<U07F6>..<U07F9>;/
<U0901>..<U0903>;<U093C>;<U093E>..<U094D>;<U0951>..<U0954>;/
- <U0962>..<U0965>;<U0970>;<U0981>..<U0983>;<U09BC>;<U09BE>..<U09C4>;/
+ <U0962>..<U0965>;<U0972>;<U0981>..<U0983>;<U09BC>;<U09BE>..<U09C4>;/
<U09C7>..<U09C8>;<U09CB>..<U09CD>;<U09D7>;<U09E2>..<U09E3>;/
<U09F2>..<U09FA>;<U0A01>..<U0A03>;<U0A3C>;<U0A3E>..<U0A42>;/
- <U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A70>..<U0A71>;<U0A81>..<U0A83>;/
+ <U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A51>;<U0A70>..<U0A71>;/
+ <U0A75>;<U0A81>..<U0A83>;/
<U0ABC>;<U0ABE>..<U0AC5>;<U0AC7>..<U0AC9>;<U0ACB>..<U0ACD>;/
- <U0AE2>..<U0AE3>;<U0AF1>;<U0B01>..<U0B03>;<U0B3C>;<U0B3E>..<U0B43>;/
+ <U0AE2>..<U0AE3>;<U0AF1>;<U0B01>..<U0B03>;<U0B3C>;<U0B3E>..<U0B44>;/
<U0B47>..<U0B48>;<U0B4B>..<U0B4D>;<U0B56>..<U0B57>;<U0B70>;<U0B82>;/
- <U0BBE>..<U0BC2>;<U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD7>;/
+ <U0BBE>..<U0BC2>;<U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD0>;<U0BD7>;/
<U0BF0>..<U0BFA>;<U0C01>..<U0C03>;<U0C3E>..<U0C44>;<U0C46>..<U0C48>;/
<U0C4A>..<U0C4D>;<U0C55>..<U0C56>;<U0C82>..<U0C83>;<U0CBC>;/
<U0CBE>..<U0CC4>;<U0CC6>..<U0CC8>;<U0CCA>..<U0CCD>;<U0CD5>..<U0CD6>;/
- <U0CE2>..<U0CE3>;<U0CF1>..<U0CF2>;<U0D02>..<U0D03>;<U0D3E>..<U0D43>;/
+ <U0CE2>..<U0CE3>;<U0CF1>..<U0CF2>;<U0D02>..<U0D03>;<U0D3E>..<U0D44>;/
<U0D46>..<U0D48>;<U0D4A>..<U0D4D>;<U0D57>;<U0D82>..<U0D83>;<U0DCA>;/
<U0DCF>..<U0DD4>;<U0DD6>;<U0DD8>..<U0DDF>;<U0DF2>..<U0DF4>;<U0E2F>;/
<U0E3F>;<U0E46>;<U0E4F>;<U0E5A>..<U0E5B>;<U0EB1>;<U0EB4>..<U0EB9>;/
<U0EBB>..<U0EBC>;<U0EC8>..<U0ECD>;<U0F01>..<U0F1F>;<U0F2A>..<U0F3F>;/
<U0F71>..<U0F87>;<U0F90>..<U0F97>;<U0F99>..<U0FBC>;<U0FBE>..<U0FCC>;/
- <U0FCF>..<U0FD1>;<U102C>..<U1032>;<U1036>..<U1039>;<U104A>..<U104F>;/
- <U1056>..<U1059>;<U10FB>;<U135F>..<U137C>;<U1390>..<U1399>;/
+ <U0FCE>..<U0FD4>;<U102B>..<U103F>;<U104A>..<U104F>;<U1056>..<U1059>;/
+ <U105E>..<U1060>;<U1062>..<U1064>;<U1067>..<U106D>;<U1071>..<U1074>;/
+ <U1082>..<U108D>;<U108F>..<U1099>;<U109E>;<U109F>;/
+ <U10FB>;<U135F>..<U137C>;<U1390>..<U1399>;/
<U166D>..<U166E>;<U169B>..<U169C>;<U16EB>..<U16ED>;<U1712>..<U1714>;/
<U1732>..<U1736>;<U1752>..<U1753>;<U1772>..<U1773>;<U17B4>..<U17D6>;/
<U17D8>..<U17DB>;<U17DD>;<U17F0>..<U17F9>;<U1800>..<U180D>;<U18A9>;/
<U1920>..<U192B>;<U1930>..<U193B>;<U1940>;<U1944>..<U1945>;/
<U19B0>..<U19C0>;<U19C8>..<U19C9>;<U19DE>..<U19FF>;<U1A17>..<U1A1B>;/
<U1A1E>..<U1A1F>;<U1B00>..<U1B04>;<U1B34>..<U1B44>;<U1B5A>..<U1B7C>;/
- <U1DC0>..<U1DCA>;<U1DFE>..<U1DFF>;<U1FBD>;<U1FBF>..<U1FC1>;/
+ <U1B80>..<U1B82>;<U1BA1>..<U1BAA>;<U1C24>..<U1C37>;<U1C3B>..<U1C3F>;/
+ <U1C7E>..<U1C7F>;/
+ <U1DC0>..<U1DE6>;<U1DFE>..<U1DFF>;<U1FBD>;<U1FBF>..<U1FC1>;/
<U1FCD>..<U1FCF>;<U1FDD>..<U1FDF>;<U1FED>..<U1FEF>;<U1FFD>..<U1FFE>;/
- <U2007>;<U200B>..<U2027>;<U202A>..<U205E>;<U2060>..<U2063>;/
+ <U2007>;<U200B>..<U2027>;<U202A>..<U205E>;<U2060>..<U2064>;/
<U206A>..<U2070>;<U2074>..<U207E>;<U2080>..<U208E>;<U20A0>..<U20B5>;/
- <U20D0>..<U20EF>;<U2100>..<U2101>;<U2103>..<U2106>;<U2108>..<U2109>;/
+ <U20D0>..<U20F0>;<U2100>..<U2101>;<U2103>..<U2106>;<U2108>..<U2109>;/
<U2114>;<U2116>..<U2118>;<U211E>..<U2123>;<U2125>;<U2127>;<U212E>;/
<U213A>..<U213B>;<U2140>..<U2144>;<U214A>..<U214D>;<U2153>..<U215F>;/
<U2190>..<U23E7>;<U2400>..<U2426>;<U2440>..<U244A>;<U2460>..<U249B>;/
- <U24EA>..<U269C>;<U26A0>..<U26B2>;<U2701>..<U2704>;<U2706>..<U2709>;/
+ <U24EA>..<U269D>;<U26A0>..<U26C3>;<U2701>..<U2704>;<U2706>..<U2709>;/
<U270C>..<U2727>;<U2729>..<U274B>;<U274D>;<U274F>..<U2752>;<U2756>;/
<U2758>..<U275E>;<U2761>..<U2794>;<U2798>..<U27AF>;<U27B1>..<U27BE>;/
- <U27C0>..<U27CA>;<U27D0>..<U27EB>;<U27F0>..<U2B1A>;<U2B20>..<U2B23>;/
- <U2CE5>..<U2CEA>;<U2CF9>..<U2CFF>;<U2E00>..<U2E17>;<U2E1C>..<U2E1D>;/
+ <U27C0>..<U27CA>;<U27CC>;<U27D0>..<U27EF>;<U27F0>..<U2B4C>;/
+ <U2B50>..<U2B54>;<U2DE0>..<U2DFF>;/
+ <U2CE5>..<U2CEA>;<U2CF9>..<U2CFF>;<U2E00>..<U2E30>;/
<U2E80>..<U2E99>;<U2E9B>..<U2EF3>;<U2F00>..<U2FD5>;<U2FF0>..<U2FFB>;/
<U3001>..<U3004>;<U3008>..<U3020>;<U302A>..<U3030>;<U3036>..<U3037>;/
<U303D>..<U303F>;<U3099>..<U309C>;<U30A0>;<U30FB>;<U3190>..<U319F>;/
<U31C0>..<U31CF>;<U3200>..<U321E>;<U3220>..<U3243>;<U3250>..<U32FE>;/
- <U3300>..<U33FF>;<U4DC0>..<U4DFF>;<UA490>..<UA4C6>;<UA700>..<UA716>;/
+ <U3300>..<U33FF>;<U4DC0>..<U4DFF>;<UA490>..<UA4C6>;<UA60C>..<UA60F>;/
+ <UA66F>..<UA673>;<UA67C>..<UA67F>;<UA700>..<UA716>;/
<UA720>..<UA721>;<UA802>;<UA806>;<UA80B>;<UA823>..<UA82B>;/
- <UA874>..<UA877>;<UE000>..<UF8FF>;<UFB1E>;<UFB29>;<UFD3E>..<UFD3F>;/
- <UFDFC>..<UFDFD>;<UFE00>..<UFE19>;<UFE20>..<UFE23>;<UFE30>..<UFE52>;/
+ <UA874>..<UA877>;<UA880>;<UA881>;<UA8B4>..<UA8C4>;<UA8CE>..<UA8CF>;/
+ <UA92E>..<UA92F>;<UA947>..<UA953>;<UA95F>;<UAA29>..<UAA36>;<UAA43>;/
+ <UAA4C>..<UAA4D>;<UAA5C>..<UAA5F>;/
+ <UE000>..<UF8FF>;<UFB1E>;<UFB29>;<UFD3E>..<UFD3F>;/
+ <UFDFC>..<UFDFD>;<UFE00>..<UFE19>;<UFE20>..<UFE26>;<UFE30>..<UFE52>;/
<UFE54>..<UFE66>;<UFE68>..<UFE6B>;<UFEFF>;<UFF01>..<UFF0F>;/
<UFF1A>..<UFF20>;<UFF3B>..<UFF40>;<UFF5B>..<UFF65>;<UFFE0>..<UFFE6>;/
<UFFE8>..<UFFEE>;<UFFF9>..<UFFFD>;<U00010100>..<U00010102>;/
@@ -575,7 +633,7 @@ punct /
<U00010A0C>..<U00010A0F>;<U00010A38>..<U00010A3A>;/
<U00010A3F>..<U00010A47>;<U00010A50>..<U00010A58>;/
<U00012470>..<U00012473>;<U0001D000>..<U0001D0F5>;/
- <U0001D100>..<U0001D126>;<U0001D12A>..<U0001D1DD>;/
+ <U0001D100>..<U0001D126>;<U0001D129>..<U0001D1DD>;/
<U0001D200>..<U0001D245>;<U0001D300>..<U0001D356>;/
<U0001D360>..<U0001D371>;<U0001D6C1>;<U0001D6DB>;<U0001D6FB>;<U0001D715>;/
<U0001D735>;<U0001D74F>;<U0001D76F>;<U0001D789>;<U0001D7A9>;<U0001D7C3>;/
@@ -583,52 +641,55 @@ punct /
<U000F0000>..<U000FFFFD>;<U00100000>..<U0010FFFD>
graph /
- <U0021>..<U007E>;<U00A0>..<U036F>;<U0374>..<U0375>;<U037A>..<U037E>;/
- <U0384>..<U038A>;<U038C>;<U038E>..<U03A1>;<U03A3>..<U03CE>;/
- <U03D0>..<U0486>;<U0488>..<U0513>;<U0531>..<U0556>;<U0559>..<U055F>;/
+ <U0021>..<U007E>;<U00A0>..<U0377>;<U037A>..<U037E>;/
+ <U0384>..<U038A>;<U038C>;<U038E>..<U03A1>;<U03A3>..<U0486>;/
+ <U0488>..<U0523>;<U0531>..<U0556>;<U0559>..<U055F>;/
<U0561>..<U0587>;<U0589>..<U058A>;<U0591>..<U05C7>;<U05D0>..<U05EA>;/
- <U05F0>..<U05F4>;<U0600>..<U0603>;<U060B>..<U0615>;<U061B>;/
- <U061E>..<U061F>;<U0621>..<U063A>;<U0640>..<U065E>;<U0660>..<U070D>;/
- <U070F>..<U074A>;<U074D>..<U076D>;<U0780>..<U07B1>;<U07C0>..<U07FA>;/
- <U0901>..<U0939>;<U093C>..<U094D>;<U0950>..<U0954>;<U0958>..<U0970>;/
+ <U05F0>..<U05F4>;<U0600>..<U0603>;<U0606>..<U061B>;/
+ <U061E>..<U061F>;<U0621>..<U065E>;<U0660>..<U070D>;/
+ <U070F>..<U074A>;<U074D>..<U07B1>;<U07C0>..<U07FA>;/
+ <U0901>..<U0939>;<U093C>..<U094D>;<U0950>..<U0954>;<U0958>..<U0972>;/
<U097B>..<U097F>;<U0981>..<U0983>;<U0985>..<U098C>;<U098F>..<U0990>;/
<U0993>..<U09A8>;<U09AA>..<U09B0>;<U09B2>;<U09B6>..<U09B9>;/
<U09BC>..<U09C4>;<U09C7>..<U09C8>;<U09CB>..<U09CE>;<U09D7>;/
<U09DC>..<U09DD>;<U09DF>..<U09E3>;<U09E6>..<U09FA>;<U0A01>..<U0A03>;/
<U0A05>..<U0A0A>;<U0A0F>..<U0A10>;<U0A13>..<U0A28>;<U0A2A>..<U0A30>;/
<U0A32>..<U0A33>;<U0A35>..<U0A36>;<U0A38>..<U0A39>;<U0A3C>;/
- <U0A3E>..<U0A42>;<U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A59>..<U0A5C>;/
- <U0A5E>;<U0A66>..<U0A74>;<U0A81>..<U0A83>;<U0A85>..<U0A8D>;/
+ <U0A3E>..<U0A42>;<U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A51>;/
+ <U0A59>..<U0A5C>;/
+ <U0A5E>;<U0A66>..<U0A75>;<U0A81>..<U0A83>;<U0A85>..<U0A8D>;/
<U0A8F>..<U0A91>;<U0A93>..<U0AA8>;<U0AAA>..<U0AB0>;<U0AB2>..<U0AB3>;/
<U0AB5>..<U0AB9>;<U0ABC>..<U0AC5>;<U0AC7>..<U0AC9>;<U0ACB>..<U0ACD>;/
<U0AD0>;<U0AE0>..<U0AE3>;<U0AE6>..<U0AEF>;<U0AF1>;<U0B01>..<U0B03>;/
<U0B05>..<U0B0C>;<U0B0F>..<U0B10>;<U0B13>..<U0B28>;<U0B2A>..<U0B30>;/
- <U0B32>..<U0B33>;<U0B35>..<U0B39>;<U0B3C>..<U0B43>;<U0B47>..<U0B48>;/
- <U0B4B>..<U0B4D>;<U0B56>..<U0B57>;<U0B5C>..<U0B5D>;<U0B5F>..<U0B61>;/
+ <U0B32>..<U0B33>;<U0B35>..<U0B39>;<U0B3C>..<U0B44>;<U0B47>..<U0B48>;/
+ <U0B4B>..<U0B4D>;<U0B56>..<U0B57>;<U0B5C>..<U0B5D>;<U0B5F>..<U0B63>;/
<U0B66>..<U0B71>;<U0B82>..<U0B83>;<U0B85>..<U0B8A>;<U0B8E>..<U0B90>;/
<U0B92>..<U0B95>;<U0B99>..<U0B9A>;<U0B9C>;<U0B9E>..<U0B9F>;/
<U0BA3>..<U0BA4>;<U0BA8>..<U0BAA>;<U0BAE>..<U0BB9>;<U0BBE>..<U0BC2>;/
- <U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD7>;<U0BE6>..<U0BFA>;/
+ <U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD0>;<U0BD7>;<U0BE6>..<U0BFA>;/
<U0C01>..<U0C03>;<U0C05>..<U0C0C>;<U0C0E>..<U0C10>;<U0C12>..<U0C28>;/
- <U0C2A>..<U0C33>;<U0C35>..<U0C39>;<U0C3E>..<U0C44>;<U0C46>..<U0C48>;/
- <U0C4A>..<U0C4D>;<U0C55>..<U0C56>;<U0C60>..<U0C61>;<U0C66>..<U0C6F>;/
+ <U0C2A>..<U0C33>;<U0C35>..<U0C39>;<U0C3D>..<U0C44>;<U0C46>..<U0C48>;/
+ <U0C4A>..<U0C4D>;<U0C55>..<U0C56>;<U0C58>..<U0C59>;<U0C60>..<U0C63>;/
+ <U0C66>..<U0C6F>;<U0C78>..<U0C7F>;/
<U0C82>..<U0C83>;<U0C85>..<U0C8C>;<U0C8E>..<U0C90>;<U0C92>..<U0CA8>;/
<U0CAA>..<U0CB3>;<U0CB5>..<U0CB9>;<U0CBC>..<U0CC4>;<U0CC6>..<U0CC8>;/
<U0CCA>..<U0CCD>;<U0CD5>..<U0CD6>;<U0CDE>;<U0CE0>..<U0CE3>;/
<U0CE6>..<U0CEF>;<U0CF1>..<U0CF2>;<U0D02>..<U0D03>;<U0D05>..<U0D0C>;/
- <U0D0E>..<U0D10>;<U0D12>..<U0D28>;<U0D2A>..<U0D39>;<U0D3E>..<U0D43>;/
- <U0D46>..<U0D48>;<U0D4A>..<U0D4D>;<U0D57>;<U0D60>..<U0D61>;/
- <U0D66>..<U0D6F>;<U0D82>..<U0D83>;<U0D85>..<U0D96>;<U0D9A>..<U0DB1>;/
+ <U0D0E>..<U0D10>;<U0D12>..<U0D28>;<U0D2A>..<U0D39>;<U0D3D>..<U0D44>;/
+ <U0D46>..<U0D48>;<U0D4A>..<U0D4D>;<U0D57>;<U0D60>..<U0D63>;/
+ <U0D66>..<U0D75>;<U0D79>..<U0D7F>;<U0D82>..<U0D83>;<U0D85>..<U0D96>;/
+ <U0D9A>..<U0DB1>;/
<U0DB3>..<U0DBB>;<U0DBD>;<U0DC0>..<U0DC6>;<U0DCA>;<U0DCF>..<U0DD4>;/
<U0DD6>;<U0DD8>..<U0DDF>;<U0DF2>..<U0DF4>;<U0E01>..<U0E3A>;/
<U0E3F>..<U0E5B>;<U0E81>..<U0E82>;<U0E84>;<U0E87>..<U0E88>;<U0E8A>;/
<U0E8D>;<U0E94>..<U0E97>;<U0E99>..<U0E9F>;<U0EA1>..<U0EA3>;<U0EA5>;/
<U0EA7>;<U0EAA>..<U0EAB>;<U0EAD>..<U0EB9>;<U0EBB>..<U0EBD>;/
<U0EC0>..<U0EC4>;<U0EC6>;<U0EC8>..<U0ECD>;<U0ED0>..<U0ED9>;/
- <U0EDC>..<U0EDD>;<U0F00>..<U0F47>;<U0F49>..<U0F6A>;<U0F71>..<U0F8B>;/
- <U0F90>..<U0F97>;<U0F99>..<U0FBC>;<U0FBE>..<U0FCC>;<U0FCF>..<U0FD1>;/
- <U1000>..<U1021>;<U1023>..<U1027>;<U1029>..<U102A>;<U102C>..<U1032>;/
- <U1036>..<U1039>;<U1040>..<U1059>;<U10A0>..<U10C5>;<U10D0>..<U10FC>;/
+ <U0EDC>..<U0EDD>;<U0F00>..<U0F47>;<U0F49>..<U0F6C>;<U0F71>..<U0F8B>;/
+ <U0F90>..<U0F97>;<U0F99>..<U0FBC>;<U0FBE>..<U0FCC>;<U0FCE>..<U0FD4>;/
+ <U1000>..<U102A>;<U102B>..<U103F>;<U1040>..<U1099>;<U109E>;<U109F>;/
+ <U10A0>..<U10C5>;<U10D0>..<U10FC>;/
<U1100>..<U1159>;<U115F>..<U11A2>;<U11A8>..<U11F9>;<U1200>..<U1248>;/
<U124A>..<U124D>;<U1250>..<U1256>;<U1258>;<U125A>..<U125D>;/
<U1260>..<U1288>;<U128A>..<U128D>;<U1290>..<U12B0>;<U12B2>..<U12B5>;/
@@ -638,37 +699,43 @@ graph /
<U16A0>..<U16F0>;<U1700>..<U170C>;<U170E>..<U1714>;<U1720>..<U1736>;/
<U1740>..<U1753>;<U1760>..<U176C>;<U176E>..<U1770>;<U1772>..<U1773>;/
<U1780>..<U17DD>;<U17E0>..<U17E9>;<U17F0>..<U17F9>;<U1800>..<U180D>;/
- <U1810>..<U1819>;<U1820>..<U1877>;<U1880>..<U18A9>;<U1900>..<U191C>;/
+ <U1810>..<U1819>;<U1820>..<U1877>;<U1880>..<U18AA>;<U1900>..<U191C>;/
<U1920>..<U192B>;<U1930>..<U193B>;<U1940>;<U1944>..<U196D>;/
<U1970>..<U1974>;<U1980>..<U19A9>;<U19B0>..<U19C9>;<U19D0>..<U19D9>;/
<U19DE>..<U1A1B>;<U1A1E>..<U1A1F>;<U1B00>..<U1B4B>;<U1B50>..<U1B7C>;/
- <U1D00>..<U1DCA>;<U1DFE>..<U1E9B>;<U1EA0>..<U1EF9>;<U1F00>..<U1F15>;/
+ <U1B80>..<U1BAA>;<U1BAE>..<U1BB9>;<U1C00>..<U1C37>;<U1C3B>..<U1C49>;/
+ <U1C4D>..<U1C7F>;/
+ <U1D00>..<U1DE6>;<U1DFE>..<U1E9F>;<U1EA0>..<U1EFF>;<U1F00>..<U1F15>;/
<U1F18>..<U1F1D>;<U1F20>..<U1F45>;<U1F48>..<U1F4D>;<U1F50>..<U1F57>;/
<U1F59>;<U1F5B>;<U1F5D>;<U1F5F>..<U1F7D>;<U1F80>..<U1FB4>;/
<U1FB6>..<U1FC4>;<U1FC6>..<U1FD3>;<U1FD6>..<U1FDB>;<U1FDD>..<U1FEF>;/
<U1FF2>..<U1FF4>;<U1FF6>..<U1FFE>;<U2007>;<U200B>..<U2027>;/
- <U202A>..<U205E>;<U2060>..<U2063>;<U206A>..<U2071>;<U2074>..<U208E>;/
- <U2090>..<U2094>;<U20A0>..<U20B5>;<U20D0>..<U20EF>;<U2100>..<U214E>;/
- <U2153>..<U2184>;<U2190>..<U23E7>;<U2400>..<U2426>;<U2440>..<U244A>;/
- <U2460>..<U269C>;<U26A0>..<U26B2>;<U2701>..<U2704>;<U2706>..<U2709>;/
+ <U202A>..<U205E>;<U2060>..<U2064>;<U206A>..<U2071>;<U2074>..<U208E>;/
+ <U2090>..<U2094>;<U20A0>..<U20B5>;<U20D0>..<U20F0>;<U2100>..<U214F>;/
+ <U2153>..<U2188>;<U2190>..<U23E7>;<U2400>..<U2426>;<U2440>..<U244A>;/
+ <U2460>..<U269D>;<U26A0>..<U26C3>;<U2701>..<U2704>;<U2706>..<U2709>;/
<U270C>..<U2727>;<U2729>..<U274B>;<U274D>;<U274F>..<U2752>;<U2756>;/
<U2758>..<U275E>;<U2761>..<U2794>;<U2798>..<U27AF>;<U27B1>..<U27BE>;/
- <U27C0>..<U27CA>;<U27D0>..<U27EB>;<U27F0>..<U2B1A>;<U2B20>..<U2B23>;/
- <U2C00>..<U2C2E>;<U2C30>..<U2C5E>;<U2C60>..<U2C6C>;<U2C74>..<U2C77>;/
+ <U27C0>..<U27CA>;<U27CC>;<U27D0>..<U27EF>;<U27F0>..<U2B4C>;/
+ <U2B50>..<U2B54>;/
+ <U2C00>..<U2C2E>;<U2C30>..<U2C5E>;<U2C60>..<U2C6F>;<U2C71>..<U2C7D>;/
<U2C80>..<U2CEA>;<U2CF9>..<U2D25>;<U2D30>..<U2D65>;<U2D6F>;/
<U2D80>..<U2D96>;<U2DA0>..<U2DA6>;<U2DA8>..<U2DAE>;<U2DB0>..<U2DB6>;/
<U2DB8>..<U2DBE>;<U2DC0>..<U2DC6>;<U2DC8>..<U2DCE>;<U2DD0>..<U2DD6>;/
- <U2DD8>..<U2DDE>;<U2E00>..<U2E17>;<U2E1C>..<U2E1D>;<U2E80>..<U2E99>;/
+ <U2DD8>..<U2DDE>;<U2DE0>..<U2E30>;<U2E80>..<U2E99>;/
<U2E9B>..<U2EF3>;<U2F00>..<U2FD5>;<U2FF0>..<U2FFB>;<U3001>..<U303F>;/
- <U3041>..<U3096>;<U3099>..<U30FF>;<U3105>..<U312C>;<U3131>..<U318E>;/
+ <U3041>..<U3096>;<U3099>..<U30FF>;<U3105>..<U312D>;<U3131>..<U318E>;/
<U3190>..<U31B7>;<U31C0>..<U31CF>;<U31F0>..<U321E>;<U3220>..<U3243>;/
<U3250>..<U32FE>;<U3300>..<U4DB5>;<U4DC0>..<U9FBB>;<UA000>..<UA48C>;/
- <UA490>..<UA4C6>;<UA700>..<UA71A>;<UA720>..<UA721>;<UA800>..<UA82B>;/
- <UA840>..<UA877>;<UAC00>..<UD7A3>;<UE000>..<UFA2D>;<UFA30>..<UFA6A>;/
+ <UA490>..<UA4C6>;<UA500>..<UA62B>;<UA640>..<UA65F>;<UA662>..<UA673>;/
+ <UA67C>..<UA697>;<UA700>..<UA78C>;<UA7FB>..<UA7FF>;<UA800>..<UA82B>;/
+ <UA840>..<UA877>;<UA880>..<UA8C4>;<UA8CE>..<UA8D9>;<UA900>..<UA953>;/
+ <UA95F>;<UAA00>..<UAA36>;<UAA40>..<UAA4D>;<UAA50>..<UAA59>;/
+ <UAA5C>..<UAA5F>;<UAC00>..<UD7A3>;<UE000>..<UFA2D>;<UFA30>..<UFA6A>;/
<UFA70>..<UFAD9>;<UFB00>..<UFB06>;<UFB13>..<UFB17>;<UFB1D>..<UFB36>;/
<UFB38>..<UFB3C>;<UFB3E>;<UFB40>..<UFB41>;<UFB43>..<UFB44>;/
<UFB46>..<UFBB1>;<UFBD3>..<UFD3F>;<UFD50>..<UFD8F>;<UFD92>..<UFDC7>;/
- <UFDF0>..<UFDFD>;<UFE00>..<UFE19>;<UFE20>..<UFE23>;<UFE30>..<UFE52>;/
+ <UFDF0>..<UFDFD>;<UFE00>..<UFE19>;<UFE20>..<UFE26>;<UFE30>..<UFE52>;/
<UFE54>..<UFE66>;<UFE68>..<UFE6B>;<UFE70>..<UFE74>;<UFE76>..<UFEFC>;/
<UFEFF>;<UFF01>..<UFFBE>;<UFFC2>..<UFFC7>;<UFFCA>..<UFFCF>;/
<UFFD2>..<UFFD7>;<UFFDA>..<UFFDC>;<UFFE0>..<UFFE6>;<UFFE8>..<UFFEE>;/
@@ -677,6 +744,8 @@ graph /
<U0001003F>..<U0001004D>;<U00010050>..<U0001005D>;/
<U00010080>..<U000100FA>;<U00010100>..<U00010102>;/
<U00010107>..<U00010133>;<U00010137>..<U0001018A>;/
+ <U00010190>..<U0001019B>;<U000101D0>..<U000101FD>;/
+ <U00010280>..<U0001029C>;<U000102A0>..<U000102D0>;/
<U00010300>..<U0001031E>;<U00010320>..<U00010323>;/
<U00010330>..<U0001034A>;<U00010380>..<U0001039D>;/
<U0001039F>..<U000103C3>;<U000103C8>..<U000103D5>;/
@@ -690,7 +759,7 @@ graph /
<U00010A50>..<U00010A58>;<U00012000>..<U0001236E>;/
<U00012400>..<U00012462>;<U00012470>..<U00012473>;/
<U0001D000>..<U0001D0F5>;<U0001D100>..<U0001D126>;/
- <U0001D12A>..<U0001D1DD>;<U0001D200>..<U0001D245>;/
+ <U0001D129>..<U0001D1DD>;<U0001D200>..<U0001D245>;/
<U0001D300>..<U0001D356>;<U0001D360>..<U0001D371>;/
<U0001D400>..<U0001D454>;<U0001D456>..<U0001D49C>;/
<U0001D49E>..<U0001D49F>;<U0001D4A2>;<U0001D4A5>..<U0001D4A6>;/
@@ -701,57 +770,61 @@ graph /
<U0001D53B>..<U0001D53E>;<U0001D540>..<U0001D544>;<U0001D546>;/
<U0001D54A>..<U0001D550>;<U0001D552>..<U0001D6A5>;/
<U0001D6A8>..<U0001D7CB>;<U0001D7CE>..<U0001D7FF>;/
+ <U0001F000>..<U0001F02B>;<U0001F030>..<U0001F093>;/
<U00020000>..<U0002A6D6>;<U0002F800>..<U0002FA1D>;<U000E0001>;/
<U000E0020>..<U000E007F>;<U000E0100>..<U000E01EF>;/
<U000F0000>..<U000FFFFD>;<U00100000>..<U0010FFFD>
print /
- <U0020>..<U007E>;<U00A0>..<U036F>;<U0374>..<U0375>;<U037A>..<U037E>;/
- <U0384>..<U038A>;<U038C>;<U038E>..<U03A1>;<U03A3>..<U03CE>;/
- <U03D0>..<U0486>;<U0488>..<U0513>;<U0531>..<U0556>;<U0559>..<U055F>;/
+ <U0020>..<U007E>;<U00A0>..<U0377>;<U037A>..<U037E>;/
+ <U0384>..<U038A>;<U038C>;<U038E>..<U03A1>;<U03A3>..<U0486>;/
+ <U0488>..<U0523>;<U0531>..<U0556>;<U0559>..<U055F>;/
<U0561>..<U0587>;<U0589>..<U058A>;<U0591>..<U05C7>;<U05D0>..<U05EA>;/
- <U05F0>..<U05F4>;<U0600>..<U0603>;<U060B>..<U0615>;<U061B>;/
- <U061E>..<U061F>;<U0621>..<U063A>;<U0640>..<U065E>;<U0660>..<U070D>;/
- <U070F>..<U074A>;<U074D>..<U076D>;<U0780>..<U07B1>;<U07C0>..<U07FA>;/
- <U0901>..<U0939>;<U093C>..<U094D>;<U0950>..<U0954>;<U0958>..<U0970>;/
+ <U05F0>..<U05F4>;<U0600>..<U0603>;<U0606>..<U061B>;/
+ <U061E>..<U061F>;<U0621>..<U065E>;<U0660>..<U070D>;/
+ <U070F>..<U074A>;<U074D>..<U07B1>;<U07C0>..<U07FA>;/
+ <U0901>..<U0939>;<U093C>..<U094D>;<U0950>..<U0954>;<U0958>..<U0972>;/
<U097B>..<U097F>;<U0981>..<U0983>;<U0985>..<U098C>;<U098F>..<U0990>;/
<U0993>..<U09A8>;<U09AA>..<U09B0>;<U09B2>;<U09B6>..<U09B9>;/
<U09BC>..<U09C4>;<U09C7>..<U09C8>;<U09CB>..<U09CE>;<U09D7>;/
<U09DC>..<U09DD>;<U09DF>..<U09E3>;<U09E6>..<U09FA>;<U0A01>..<U0A03>;/
<U0A05>..<U0A0A>;<U0A0F>..<U0A10>;<U0A13>..<U0A28>;<U0A2A>..<U0A30>;/
<U0A32>..<U0A33>;<U0A35>..<U0A36>;<U0A38>..<U0A39>;<U0A3C>;/
- <U0A3E>..<U0A42>;<U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A59>..<U0A5C>;/
- <U0A5E>;<U0A66>..<U0A74>;<U0A81>..<U0A83>;<U0A85>..<U0A8D>;/
+ <U0A3E>..<U0A42>;<U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A51>;/
+ <U0A59>..<U0A5C>;/
+ <U0A5E>;<U0A66>..<U0A75>;<U0A81>..<U0A83>;<U0A85>..<U0A8D>;/
<U0A8F>..<U0A91>;<U0A93>..<U0AA8>;<U0AAA>..<U0AB0>;<U0AB2>..<U0AB3>;/
<U0AB5>..<U0AB9>;<U0ABC>..<U0AC5>;<U0AC7>..<U0AC9>;<U0ACB>..<U0ACD>;/
<U0AD0>;<U0AE0>..<U0AE3>;<U0AE6>..<U0AEF>;<U0AF1>;<U0B01>..<U0B03>;/
<U0B05>..<U0B0C>;<U0B0F>..<U0B10>;<U0B13>..<U0B28>;<U0B2A>..<U0B30>;/
- <U0B32>..<U0B33>;<U0B35>..<U0B39>;<U0B3C>..<U0B43>;<U0B47>..<U0B48>;/
- <U0B4B>..<U0B4D>;<U0B56>..<U0B57>;<U0B5C>..<U0B5D>;<U0B5F>..<U0B61>;/
+ <U0B32>..<U0B33>;<U0B35>..<U0B39>;<U0B3C>..<U0B44>;<U0B47>..<U0B48>;/
+ <U0B4B>..<U0B4D>;<U0B56>..<U0B57>;<U0B5C>..<U0B5D>;<U0B5F>..<U0B63>;/
<U0B66>..<U0B71>;<U0B82>..<U0B83>;<U0B85>..<U0B8A>;<U0B8E>..<U0B90>;/
<U0B92>..<U0B95>;<U0B99>..<U0B9A>;<U0B9C>;<U0B9E>..<U0B9F>;/
<U0BA3>..<U0BA4>;<U0BA8>..<U0BAA>;<U0BAE>..<U0BB9>;<U0BBE>..<U0BC2>;/
- <U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD7>;<U0BE6>..<U0BFA>;/
+ <U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD0>;<U0BD7>;<U0BE6>..<U0BFA>;/
<U0C01>..<U0C03>;<U0C05>..<U0C0C>;<U0C0E>..<U0C10>;<U0C12>..<U0C28>;/
- <U0C2A>..<U0C33>;<U0C35>..<U0C39>;<U0C3E>..<U0C44>;<U0C46>..<U0C48>;/
- <U0C4A>..<U0C4D>;<U0C55>..<U0C56>;<U0C60>..<U0C61>;<U0C66>..<U0C6F>;/
+ <U0C2A>..<U0C33>;<U0C35>..<U0C39>;<U0C3D>..<U0C44>;<U0C46>..<U0C48>;/
+ <U0C4A>..<U0C4D>;<U0C55>..<U0C56>;<U0C58>..<U0C59>;<U0C60>..<U0C63>;/
+ <U0C66>..<U0C6F>;<U0C78>..<U0C7F>;/
<U0C82>..<U0C83>;<U0C85>..<U0C8C>;<U0C8E>..<U0C90>;<U0C92>..<U0CA8>;/
<U0CAA>..<U0CB3>;<U0CB5>..<U0CB9>;<U0CBC>..<U0CC4>;<U0CC6>..<U0CC8>;/
<U0CCA>..<U0CCD>;<U0CD5>..<U0CD6>;<U0CDE>;<U0CE0>..<U0CE3>;/
<U0CE6>..<U0CEF>;<U0CF1>..<U0CF2>;<U0D02>..<U0D03>;<U0D05>..<U0D0C>;/
- <U0D0E>..<U0D10>;<U0D12>..<U0D28>;<U0D2A>..<U0D39>;<U0D3E>..<U0D43>;/
- <U0D46>..<U0D48>;<U0D4A>..<U0D4D>;<U0D57>;<U0D60>..<U0D61>;/
- <U0D66>..<U0D6F>;<U0D82>..<U0D83>;<U0D85>..<U0D96>;<U0D9A>..<U0DB1>;/
+ <U0D0E>..<U0D10>;<U0D12>..<U0D28>;<U0D2A>..<U0D39>;<U0D3D>..<U0D44>;/
+ <U0D46>..<U0D48>;<U0D4A>..<U0D4D>;<U0D57>;<U0D60>..<U0D63>;/
+ <U0D66>..<U0D75>;<U0D79>..<U0D7F>;<U0D82>..<U0D83>;<U0D85>..<U0D96>;/
+ <U0D9A>..<U0DB1>;/
<U0DB3>..<U0DBB>;<U0DBD>;<U0DC0>..<U0DC6>;<U0DCA>;<U0DCF>..<U0DD4>;/
<U0DD6>;<U0DD8>..<U0DDF>;<U0DF2>..<U0DF4>;<U0E01>..<U0E3A>;/
<U0E3F>..<U0E5B>;<U0E81>..<U0E82>;<U0E84>;<U0E87>..<U0E88>;<U0E8A>;/
<U0E8D>;<U0E94>..<U0E97>;<U0E99>..<U0E9F>;<U0EA1>..<U0EA3>;<U0EA5>;/
<U0EA7>;<U0EAA>..<U0EAB>;<U0EAD>..<U0EB9>;<U0EBB>..<U0EBD>;/
<U0EC0>..<U0EC4>;<U0EC6>;<U0EC8>..<U0ECD>;<U0ED0>..<U0ED9>;/
- <U0EDC>..<U0EDD>;<U0F00>..<U0F47>;<U0F49>..<U0F6A>;<U0F71>..<U0F8B>;/
- <U0F90>..<U0F97>;<U0F99>..<U0FBC>;<U0FBE>..<U0FCC>;<U0FCF>..<U0FD1>;/
- <U1000>..<U1021>;<U1023>..<U1027>;<U1029>..<U102A>;<U102C>..<U1032>;/
- <U1036>..<U1039>;<U1040>..<U1059>;<U10A0>..<U10C5>;<U10D0>..<U10FC>;/
+ <U0EDC>..<U0EDD>;<U0F00>..<U0F47>;<U0F49>..<U0F6C>;<U0F71>..<U0F8B>;/
+ <U0F90>..<U0F97>;<U0F99>..<U0FBC>;<U0FBE>..<U0FCC>;<U0FCE>..<U0FD4>;/
+ <U1000>..<U102A>;<U102B>..<U103F>;<U1040>..<U1099>;<U109E>;<U109F>;/
+ <U10A0>..<U10C5>;<U10D0>..<U10FC>;/
<U1100>..<U1159>;<U115F>..<U11A2>;<U11A8>..<U11F9>;<U1200>..<U1248>;/
<U124A>..<U124D>;<U1250>..<U1256>;<U1258>;<U125A>..<U125D>;/
<U1260>..<U1288>;<U128A>..<U128D>;<U1290>..<U12B0>;<U12B2>..<U12B5>;/
@@ -761,37 +834,45 @@ print /
<U16A0>..<U16F0>;<U1700>..<U170C>;<U170E>..<U1714>;<U1720>..<U1736>;/
<U1740>..<U1753>;<U1760>..<U176C>;<U176E>..<U1770>;<U1772>..<U1773>;/
<U1780>..<U17DD>;<U17E0>..<U17E9>;<U17F0>..<U17F9>;<U1800>..<U180E>;/
- <U1810>..<U1819>;<U1820>..<U1877>;<U1880>..<U18A9>;<U1900>..<U191C>;/
+ <U1810>..<U1819>;<U1820>..<U1877>;<U1880>..<U18AA>;<U1900>..<U191C>;/
<U1920>..<U192B>;<U1930>..<U193B>;<U1940>;<U1944>..<U196D>;/
<U1970>..<U1974>;<U1980>..<U19A9>;<U19B0>..<U19C9>;<U19D0>..<U19D9>;/
<U19DE>..<U1A1B>;<U1A1E>..<U1A1F>;<U1B00>..<U1B4B>;<U1B50>..<U1B7C>;/
- <U1D00>..<U1DCA>;<U1DFE>..<U1E9B>;<U1EA0>..<U1EF9>;<U1F00>..<U1F15>;/
+ <U1B80>..<U1BAA>;<U1BAE>..<U1BB9>;<U1C00>..<U1C37>;<U1C3B>..<U1C49>;/
+ <U1C4D>..<U1C7F>;/
+ <U1D00>..<U1DE6>;<U1DFE>..<U1E9F>;<U1EA0>..<U1EFF>;<U1F00>..<U1F15>;/
<U1F18>..<U1F1D>;<U1F20>..<U1F45>;<U1F48>..<U1F4D>;<U1F50>..<U1F57>;/
<U1F59>;<U1F5B>;<U1F5D>;<U1F5F>..<U1F7D>;<U1F80>..<U1FB4>;/
<U1FB6>..<U1FC4>;<U1FC6>..<U1FD3>;<U1FD6>..<U1FDB>;<U1FDD>..<U1FEF>;/
- <U1FF2>..<U1FF4>;<U1FF6>..<U1FFE>;<U2000>..<U2027>;<U202A>..<U2063>;/
+ <U1FF2>..<U1FF4>;<U1FF6>..<U1FFE>;<U2000>..<U2027>;<U202A>..<U2064>;/
<U206A>..<U2071>;<U2074>..<U208E>;<U2090>..<U2094>;<U20A0>..<U20B5>;/
- <U20D0>..<U20EF>;<U2100>..<U214E>;<U2153>..<U2184>;<U2190>..<U23E7>;/
- <U2400>..<U2426>;<U2440>..<U244A>;<U2460>..<U269C>;<U26A0>..<U26B2>;/
+ <U20D0>..<U20F0>;<U2100>..<U214F>;<U2153>..<U2188>;<U2190>..<U23E7>;/
+ <U2400>..<U2426>;<U2440>..<U244A>;<U2460>..<U269D>;<U26A0>..<U26C3>;/
<U2701>..<U2704>;<U2706>..<U2709>;<U270C>..<U2727>;<U2729>..<U274B>;/
<U274D>;<U274F>..<U2752>;<U2756>;<U2758>..<U275E>;<U2761>..<U2794>;/
- <U2798>..<U27AF>;<U27B1>..<U27BE>;<U27C0>..<U27CA>;<U27D0>..<U27EB>;/
- <U27F0>..<U2B1A>;<U2B20>..<U2B23>;<U2C00>..<U2C2E>;<U2C30>..<U2C5E>;/
- <U2C60>..<U2C6C>;<U2C74>..<U2C77>;<U2C80>..<U2CEA>;<U2CF9>..<U2D25>;/
+ <U2798>..<U27AF>;<U27B1>..<U27BE>;<U27C0>..<U27CA>;<U27CC>;/
+ <U27D0>..<U27EF>;/
+ <U27F0>..<U2B4C>;<U2B50>..<U2B54>;<U2C00>..<U2C2E>;<U2C30>..<U2C5E>;/
+ <U2C60>..<U2C6F>;<U2C71>..<U2C7D>;<U2C80>..<U2CEA>;<U2CF9>..<U2D25>;/
<U2D30>..<U2D65>;<U2D6F>;<U2D80>..<U2D96>;<U2DA0>..<U2DA6>;/
<U2DA8>..<U2DAE>;<U2DB0>..<U2DB6>;<U2DB8>..<U2DBE>;<U2DC0>..<U2DC6>;/
- <U2DC8>..<U2DCE>;<U2DD0>..<U2DD6>;<U2DD8>..<U2DDE>;<U2E00>..<U2E17>;/
- <U2E1C>..<U2E1D>;<U2E80>..<U2E99>;<U2E9B>..<U2EF3>;<U2F00>..<U2FD5>;/
+ <U2DC8>..<U2DCE>;<U2DD0>..<U2DD6>;<U2DD8>..<U2DDE>;<U2DE0>..<U2E30>;/
+ <U2E80>..<U2E99>;<U2E9B>..<U2EF3>;<U2F00>..<U2FD5>;/
<U2FF0>..<U2FFB>;<U3000>..<U303F>;<U3041>..<U3096>;<U3099>..<U30FF>;/
- <U3105>..<U312C>;<U3131>..<U318E>;<U3190>..<U31B7>;<U31C0>..<U31CF>;/
+ <U3105>..<U312D>;<U3131>..<U318E>;<U3190>..<U31B7>;<U31C0>..<U31CF>;/
<U31F0>..<U321E>;<U3220>..<U3243>;<U3250>..<U32FE>;<U3300>..<U4DB5>;/
- <U4DC0>..<U9FBB>;<UA000>..<UA48C>;<UA490>..<UA4C6>;<UA700>..<UA71A>;/
- <UA720>..<UA721>;<UA800>..<UA82B>;<UA840>..<UA877>;<UAC00>..<UD7A3>;/
+ <U4DC0>..<U9FBB>;<UA000>..<UA48C>;<UA490>..<UA4C6>;<UA500>..<UA62B>;/
+ <UA640>..<UA65F>;<UA662>..<UA673>;<UA67C>..<UA697>;<UA700>..<UA78C>;/
+ <UA7FB>..<UA7FF>;<UA800>..<UA82B>;<UA840>..<UA877>;/
+ <UA880>..<UA8C4>;<UA8CE>..<UA8D9>;<UAC00>..<UD7A3>;/
+ <UA840>..<UA877>;<UA880>..<UA8C4>;<UA8CE>..<UA8D9>;<UA900>..<UA953>;/
+ <UA95F>;<UAA00>..<UAA36>;<UAA40>..<UAA4D>;<UAA50>..<UAA59>;/
+ <UAA5C>..<UAA5F>;/
<UE000>..<UFA2D>;<UFA30>..<UFA6A>;<UFA70>..<UFAD9>;<UFB00>..<UFB06>;/
<UFB13>..<UFB17>;<UFB1D>..<UFB36>;<UFB38>..<UFB3C>;<UFB3E>;/
<UFB40>..<UFB41>;<UFB43>..<UFB44>;<UFB46>..<UFBB1>;<UFBD3>..<UFD3F>;/
<UFD50>..<UFD8F>;<UFD92>..<UFDC7>;<UFDF0>..<UFDFD>;<UFE00>..<UFE19>;/
- <UFE20>..<UFE23>;<UFE30>..<UFE52>;<UFE54>..<UFE66>;<UFE68>..<UFE6B>;/
+ <UFE20>..<UFE26>;<UFE30>..<UFE52>;<UFE54>..<UFE66>;<UFE68>..<UFE6B>;/
<UFE70>..<UFE74>;<UFE76>..<UFEFC>;<UFEFF>;<UFF01>..<UFFBE>;/
<UFFC2>..<UFFC7>;<UFFCA>..<UFFCF>;<UFFD2>..<UFFD7>;<UFFDA>..<UFFDC>;/
<UFFE0>..<UFFE6>;<UFFE8>..<UFFEE>;<UFFF9>..<UFFFD>;/
@@ -800,6 +881,8 @@ print /
<U0001003F>..<U0001004D>;<U00010050>..<U0001005D>;/
<U00010080>..<U000100FA>;<U00010100>..<U00010102>;/
<U00010107>..<U00010133>;<U00010137>..<U0001018A>;/
+ <U00010190>..<U0001019B>;<U000101D0>..<U000101FD>;/
+ <U00010280>..<U0001029C>;<U000102A0>..<U000102D0>;/
<U00010300>..<U0001031E>;<U00010320>..<U00010323>;/
<U00010330>..<U0001034A>;<U00010380>..<U0001039D>;/
<U0001039F>..<U000103C3>;<U000103C8>..<U000103D5>;/
@@ -813,7 +896,7 @@ print /
<U00010A50>..<U00010A58>;<U00012000>..<U0001236E>;/
<U00012400>..<U00012462>;<U00012470>..<U00012473>;/
<U0001D000>..<U0001D0F5>;<U0001D100>..<U0001D126>;/
- <U0001D12A>..<U0001D1DD>;<U0001D200>..<U0001D245>;/
+ <U0001D129>..<U0001D1DD>;<U0001D200>..<U0001D245>;/
<U0001D300>..<U0001D356>;<U0001D360>..<U0001D371>;/
<U0001D400>..<U0001D454>;<U0001D456>..<U0001D49C>;/
<U0001D49E>..<U0001D49F>;<U0001D4A2>;<U0001D4A5>..<U0001D4A6>;/
@@ -824,6 +907,7 @@ print /
<U0001D53B>..<U0001D53E>;<U0001D540>..<U0001D544>;<U0001D546>;/
<U0001D54A>..<U0001D550>;<U0001D552>..<U0001D6A5>;/
<U0001D6A8>..<U0001D7CB>;<U0001D7CE>..<U0001D7FF>;/
+ <U0001F000>..<U0001F02B>;<U0001F030>..<U0001F093>;/
<U00020000>..<U0002A6D6>;<U0002F800>..<U0002FA1D>;<U000E0001>;/
<U000E0020>..<U000E007F>;<U000E0100>..<U000E01EF>;/
<U000F0000>..<U000FFFFD>;<U00100000>..<U0010FFFD>
@@ -844,7 +928,8 @@ toupper /
(<U006D>,<U004D>);(<U006E>,<U004E>);(<U006F>,<U004F>);(<U0070>,<U0050>);/
(<U0071>,<U0051>);(<U0072>,<U0052>);(<U0073>,<U0053>);(<U0074>,<U0054>);/
(<U0075>,<U0055>);(<U0076>,<U0056>);(<U0077>,<U0057>);(<U0078>,<U0058>);/
- (<U0079>,<U0059>);(<U007A>,<U005A>);(<U00B5>,<U039C>);(<U00E0>,<U00C0>);/
+ (<U0079>,<U0059>);(<U007A>,<U005A>);(<U00B5>,<U039C>);(<U00DF>,<U1E9E>);/
+ (<U00E0>,<U00C0>);/
(<U00E1>,<U00C1>);(<U00E2>,<U00C2>);(<U00E3>,<U00C3>);(<U00E4>,<U00C4>);/
(<U00E5>,<U00C5>);(<U00E6>,<U00C6>);(<U00E7>,<U00C7>);(<U00E8>,<U00C8>);/
(<U00E9>,<U00C9>);(<U00EA>,<U00CA>);(<U00EB>,<U00CB>);(<U00EC>,<U00CC>);/
@@ -889,13 +974,16 @@ toupper /
(<U0229>,<U0228>);(<U022B>,<U022A>);(<U022D>,<U022C>);(<U022F>,<U022E>);/
(<U0231>,<U0230>);(<U0233>,<U0232>);(<U023C>,<U023B>);(<U0242>,<U0241>);/
(<U0247>,<U0246>);(<U0249>,<U0248>);(<U024B>,<U024A>);(<U024D>,<U024C>);/
- (<U024F>,<U024E>);(<U0253>,<U0181>);(<U0254>,<U0186>);(<U0256>,<U0189>);/
+ (<U024F>,<U024E>);(<U0250>,<U2C6F>);(<U0251>,<U2C6D>);(<U0253>,<U0181>);/
+ (<U0254>,<U0186>);(<U0256>,<U0189>);/
(<U0257>,<U018A>);(<U0259>,<U018F>);(<U025B>,<U0190>);(<U0260>,<U0193>);/
(<U0263>,<U0194>);(<U0268>,<U0197>);(<U0269>,<U0196>);(<U026B>,<U2C62>);/
- (<U026F>,<U019C>);(<U0272>,<U019D>);(<U0275>,<U019F>);(<U027D>,<U2C64>);/
+ (<U026F>,<U019C>);(<U0271>,<U2C6E>);(<U0272>,<U019D>);(<U0275>,<U019F>);/
+ (<U027D>,<U2C64>);/
(<U0280>,<U01A6>);(<U0283>,<U01A9>);(<U0288>,<U01AE>);(<U0289>,<U0244>);/
(<U028A>,<U01B1>);(<U028B>,<U01B2>);(<U028C>,<U0245>);(<U0292>,<U01B7>);/
- (<U0345>,<U0399>);(<U037B>,<U03FD>);(<U037C>,<U03FE>);(<U037D>,<U03FF>);/
+ (<U0345>,<U0399>);(<U0371>,<U0370>);(<U0373>,<U0372>);(<U0377>,<U0376>);/
+ (<U037B>,<U03FD>);(<U037C>,<U03FE>);(<U037D>,<U03FF>);/
(<U03AC>,<U0386>);(<U03AD>,<U0388>);(<U03AE>,<U0389>);(<U03AF>,<U038A>);/
(<U03B1>,<U0391>);(<U03B2>,<U0392>);(<U03B3>,<U0393>);(<U03B4>,<U0394>);/
(<U03B5>,<U0395>);(<U03B6>,<U0396>);(<U03B7>,<U0397>);(<U03B8>,<U0398>);/
@@ -943,7 +1031,9 @@ toupper /
(<U04F9>,<U04F8>);(<U04FB>,<U04FA>);(<U04FD>,<U04FC>);(<U04FF>,<U04FE>);/
(<U0501>,<U0500>);(<U0503>,<U0502>);(<U0505>,<U0504>);(<U0507>,<U0506>);/
(<U0509>,<U0508>);(<U050B>,<U050A>);(<U050D>,<U050C>);(<U050F>,<U050E>);/
- (<U0511>,<U0510>);(<U0513>,<U0512>);(<U0561>,<U0531>);(<U0562>,<U0532>);/
+ (<U0511>,<U0510>);(<U0513>,<U0512>);(<U0515>,<U0514>);(<U0517>,<U0516>);/
+ (<U0519>,<U0518>);(<U051B>,<U051A>);(<U051D>,<U051C>);(<U051F>,<U051E>);/
+ (<U0521>,<U0520>);(<U0523>,<U0522>);(<U0561>,<U0531>);(<U0562>,<U0532>);/
(<U0563>,<U0533>);(<U0564>,<U0534>);(<U0565>,<U0535>);(<U0566>,<U0536>);/
(<U0567>,<U0537>);(<U0568>,<U0538>);(<U0569>,<U0539>);(<U056A>,<U053A>);/
(<U056B>,<U053B>);(<U056C>,<U053C>);(<U056D>,<U053D>);(<U056E>,<U053E>);/
@@ -983,7 +1073,8 @@ toupper /
(<U1EDF>,<U1EDE>);(<U1EE1>,<U1EE0>);(<U1EE3>,<U1EE2>);(<U1EE5>,<U1EE4>);/
(<U1EE7>,<U1EE6>);(<U1EE9>,<U1EE8>);(<U1EEB>,<U1EEA>);(<U1EED>,<U1EEC>);/
(<U1EEF>,<U1EEE>);(<U1EF1>,<U1EF0>);(<U1EF3>,<U1EF2>);(<U1EF5>,<U1EF4>);/
- (<U1EF7>,<U1EF6>);(<U1EF9>,<U1EF8>);(<U1F00>,<U1F08>);(<U1F01>,<U1F09>);/
+ (<U1EF7>,<U1EF6>);(<U1EF9>,<U1EF8>);(<U1EFB>,<U1EFA>);(<U1EFD>,<U1EFC>);/
+ (<U1EFF>,<U1EFE>);(<U1F00>,<U1F08>);(<U1F01>,<U1F09>);/
(<U1F02>,<U1F0A>);(<U1F03>,<U1F0B>);(<U1F04>,<U1F0C>);(<U1F05>,<U1F0D>);/
(<U1F06>,<U1F0E>);(<U1F07>,<U1F0F>);(<U1F10>,<U1F18>);(<U1F11>,<U1F19>);/
(<U1F12>,<U1F1A>);(<U1F13>,<U1F1B>);(<U1F14>,<U1F1C>);(<U1F15>,<U1F1D>);/
@@ -1032,6 +1123,7 @@ toupper /
(<U2C59>,<U2C29>);(<U2C5A>,<U2C2A>);(<U2C5B>,<U2C2B>);(<U2C5C>,<U2C2C>);/
(<U2C5D>,<U2C2D>);(<U2C5E>,<U2C2E>);(<U2C61>,<U2C60>);(<U2C65>,<U023A>);/
(<U2C66>,<U023E>);(<U2C68>,<U2C67>);(<U2C6A>,<U2C69>);(<U2C6C>,<U2C6B>);/
+ (<U2C73>,<U2C72>);/
(<U2C76>,<U2C75>);(<U2C81>,<U2C80>);(<U2C83>,<U2C82>);(<U2C85>,<U2C84>);/
(<U2C87>,<U2C86>);(<U2C89>,<U2C88>);(<U2C8B>,<U2C8A>);(<U2C8D>,<U2C8C>);/
(<U2C8F>,<U2C8E>);(<U2C91>,<U2C90>);(<U2C93>,<U2C92>);(<U2C95>,<U2C94>);/
@@ -1139,7 +1231,8 @@ tolower /
(<U0232>,<U0233>);(<U023A>,<U2C65>);(<U023B>,<U023C>);(<U023D>,<U019A>);/
(<U023E>,<U2C66>);(<U0241>,<U0242>);(<U0243>,<U0180>);(<U0244>,<U0289>);/
(<U0245>,<U028C>);(<U0246>,<U0247>);(<U0248>,<U0249>);(<U024A>,<U024B>);/
- (<U024C>,<U024D>);(<U024E>,<U024F>);(<U0386>,<U03AC>);(<U0388>,<U03AD>);/
+ (<U024C>,<U024D>);(<U024E>,<U024F>);(<U0370>,<U0371>);(<U0372>,<U0373>);/
+ (<U0376>,<U0377>);(<U0386>,<U03AC>);(<U0388>,<U03AD>);/
(<U0389>,<U03AE>);(<U038A>,<U03AF>);(<U038C>,<U03CC>);(<U038E>,<U03CD>);/
(<U038F>,<U03CE>);(<U0391>,<U03B1>);(<U0392>,<U03B2>);(<U0393>,<U03B3>);/
(<U0394>,<U03B4>);(<U0395>,<U03B5>);(<U0396>,<U03B6>);(<U0397>,<U03B7>);/
@@ -1186,6 +1279,8 @@ tolower /
(<U04FC>,<U04FD>);(<U04FE>,<U04FF>);(<U0500>,<U0501>);(<U0502>,<U0503>);/
(<U0504>,<U0505>);(<U0506>,<U0507>);(<U0508>,<U0509>);(<U050A>,<U050B>);/
(<U050C>,<U050D>);(<U050E>,<U050F>);(<U0510>,<U0511>);(<U0512>,<U0513>);/
+ (<U0514>,<U0515>);(<U0516>,<U0517>);(<U0518>,<U0519>);(<U051A>,<U051B>);/
+ (<U051C>,<U051D>);(<U051E>,<U051F>);(<U0520>,<U0521>);(<U0522>,<U0523>);/
(<U0531>,<U0561>);(<U0532>,<U0562>);(<U0533>,<U0563>);(<U0534>,<U0564>);/
(<U0535>,<U0565>);(<U0536>,<U0566>);(<U0537>,<U0567>);(<U0538>,<U0568>);/
(<U0539>,<U0569>);(<U053A>,<U056A>);(<U053B>,<U056B>);(<U053C>,<U056C>);/
@@ -1223,7 +1318,8 @@ tolower /
(<U1E78>,<U1E79>);(<U1E7A>,<U1E7B>);(<U1E7C>,<U1E7D>);(<U1E7E>,<U1E7F>);/
(<U1E80>,<U1E81>);(<U1E82>,<U1E83>);(<U1E84>,<U1E85>);(<U1E86>,<U1E87>);/
(<U1E88>,<U1E89>);(<U1E8A>,<U1E8B>);(<U1E8C>,<U1E8D>);(<U1E8E>,<U1E8F>);/
- (<U1E90>,<U1E91>);(<U1E92>,<U1E93>);(<U1E94>,<U1E95>);(<U1EA0>,<U1EA1>);/
+ (<U1E90>,<U1E91>);(<U1E92>,<U1E93>);(<U1E94>,<U1E95>);(<U1E9E>,<U00DF>);/
+ (<U1EA0>,<U1EA1>);/
(<U1EA2>,<U1EA3>);(<U1EA4>,<U1EA5>);(<U1EA6>,<U1EA7>);(<U1EA8>,<U1EA9>);/
(<U1EAA>,<U1EAB>);(<U1EAC>,<U1EAD>);(<U1EAE>,<U1EAF>);(<U1EB0>,<U1EB1>);/
(<U1EB2>,<U1EB3>);(<U1EB4>,<U1EB5>);(<U1EB6>,<U1EB7>);(<U1EB8>,<U1EB9>);/
@@ -1235,6 +1331,7 @@ tolower /
(<U1EE2>,<U1EE3>);(<U1EE4>,<U1EE5>);(<U1EE6>,<U1EE7>);(<U1EE8>,<U1EE9>);/
(<U1EEA>,<U1EEB>);(<U1EEC>,<U1EED>);(<U1EEE>,<U1EEF>);(<U1EF0>,<U1EF1>);/
(<U1EF2>,<U1EF3>);(<U1EF4>,<U1EF5>);(<U1EF6>,<U1EF7>);(<U1EF8>,<U1EF9>);/
+ (<U1EFA>,<U1EFB>);(<U1EFC>,<U1EFD>);(<U1EFE>,<U1EFF>);/
(<U1F08>,<U1F00>);(<U1F09>,<U1F01>);(<U1F0A>,<U1F02>);(<U1F0B>,<U1F03>);/
(<U1F0C>,<U1F04>);(<U1F0D>,<U1F05>);(<U1F0E>,<U1F06>);(<U1F0F>,<U1F07>);/
(<U1F18>,<U1F10>);(<U1F19>,<U1F11>);(<U1F1A>,<U1F12>);(<U1F1B>,<U1F13>);/
@@ -1284,7 +1381,8 @@ tolower /
(<U2C29>,<U2C59>);(<U2C2A>,<U2C5A>);(<U2C2B>,<U2C5B>);(<U2C2C>,<U2C5C>);/
(<U2C2D>,<U2C5D>);(<U2C2E>,<U2C5E>);(<U2C60>,<U2C61>);(<U2C62>,<U026B>);/
(<U2C63>,<U1D7D>);(<U2C64>,<U027D>);(<U2C67>,<U2C68>);(<U2C69>,<U2C6A>);/
- (<U2C6B>,<U2C6C>);(<U2C75>,<U2C76>);(<U2C80>,<U2C81>);(<U2C82>,<U2C83>);/
+ (<U2C6B>,<U2C6C>);(<U2C6D>,<U0251>);(<U2C6E>,<U0271>);(<U2C6F>,<U0250>);/
+ (<U2C72>,<U2C73>);(<U2C75>,<U2C76>);(<U2C80>,<U2C81>);(<U2C82>,<U2C83>);/
(<U2C84>,<U2C85>);(<U2C86>,<U2C87>);(<U2C88>,<U2C89>);(<U2C8A>,<U2C8B>);/
(<U2C8C>,<U2C8D>);(<U2C8E>,<U2C8F>);(<U2C90>,<U2C91>);(<U2C92>,<U2C93>);/
(<U2C94>,<U2C95>);(<U2C96>,<U2C97>);(<U2C98>,<U2C99>);(<U2C9A>,<U2C9B>);/
@@ -1431,7 +1529,9 @@ map "totitle"; /
(<U04F9>,<U04F8>);(<U04FB>,<U04FA>);(<U04FD>,<U04FC>);(<U04FF>,<U04FE>);/
(<U0501>,<U0500>);(<U0503>,<U0502>);(<U0505>,<U0504>);(<U0507>,<U0506>);/
(<U0509>,<U0508>);(<U050B>,<U050A>);(<U050D>,<U050C>);(<U050F>,<U050E>);/
- (<U0511>,<U0510>);(<U0513>,<U0512>);(<U0561>,<U0531>);(<U0562>,<U0532>);/
+ (<U0511>,<U0510>);(<U0513>,<U0512>);(<U0515>,<U0514>);(<U0517>,<U0516>);/
+ (<U0519>,<U0518>);(<U051B>,<U051A>);(<U051D>,<U051C>);(<U051F>,<U051E>);/
+ (<U0521>,<U0520>);(<U0523>,<U0522>);(<U0561>,<U0531>);(<U0562>,<U0532>);/
(<U0563>,<U0533>);(<U0564>,<U0534>);(<U0565>,<U0535>);(<U0566>,<U0536>);/
(<U0567>,<U0537>);(<U0568>,<U0538>);(<U0569>,<U0539>);(<U056A>,<U053A>);/
(<U056B>,<U053B>);(<U056C>,<U053C>);(<U056D>,<U053D>);(<U056E>,<U053E>);/
@@ -1574,35 +1674,40 @@ map "totitle"; /
% That is, all combining characters (level 2+3).
class "combining"; /
<U0300>..<U036F>;<U0483>..<U0486>;<U0488>..<U0489>;<U0591>..<U05BD>;/
- <U05BF>;<U05C1>..<U05C2>;<U05C4>..<U05C5>;<U05C7>;<U0610>..<U0615>;/
+ <U05BF>;<U05C1>..<U05C2>;<U05C4>..<U05C5>;<U05C7>;<U0610>..<U061A>;/
<U064B>..<U065E>;<U0670>;<U06D6>..<U06DC>;<U06DE>..<U06E4>;/
<U06E7>..<U06E8>;<U06EA>..<U06ED>;<U0711>;<U0730>..<U074A>;/
<U07A6>..<U07B0>;<U07EB>..<U07F3>;<U0901>..<U0903>;<U093C>;/
<U093E>..<U094D>;<U0951>..<U0954>;<U0962>..<U0963>;<U0981>..<U0983>;/
<U09BC>;<U09BE>..<U09C4>;<U09C7>..<U09C8>;<U09CB>..<U09CD>;<U09D7>;/
<U09E2>..<U09E3>;<U0A01>..<U0A03>;<U0A3C>;<U0A3E>..<U0A42>;/
- <U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A70>..<U0A71>;<U0A81>..<U0A83>;/
+ <U0A47>..<U0A48>;<U0A4B>..<U0A4D>;<U0A51>;<U0A70>..<U0A71>;/
+ <U0A75>;<U0A81>..<U0A83>;/
<U0ABC>;<U0ABE>..<U0AC5>;<U0AC7>..<U0AC9>;<U0ACB>..<U0ACD>;/
- <U0AE2>..<U0AE3>;<U0B01>..<U0B03>;<U0B3C>;<U0B3E>..<U0B43>;/
+ <U0AE2>..<U0AE3>;<U0B01>..<U0B03>;<U0B3C>;<U0B3E>..<U0B44>;/
<U0B47>..<U0B48>;<U0B4B>..<U0B4D>;<U0B56>..<U0B57>;<U0B82>;/
- <U0BBE>..<U0BC2>;<U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD7>;/
+ <U0BBE>..<U0BC2>;<U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD0>;<U0BD7>;/
<U0C01>..<U0C03>;<U0C3E>..<U0C44>;<U0C46>..<U0C48>;<U0C4A>..<U0C4D>;/
- <U0C55>..<U0C56>;<U0C82>..<U0C83>;<U0CBC>;<U0CBE>..<U0CC4>;/
+ <U0C55>..<U0C56>;<U0C62>..<U0C63>;<U0C82>..<U0C83>;<U0CBC>;/
+ <U0CBE>..<U0CC4>;/
<U0CC6>..<U0CC8>;<U0CCA>..<U0CCD>;<U0CD5>..<U0CD6>;<U0CE2>..<U0CE3>;/
- <U0D02>..<U0D03>;<U0D3E>..<U0D43>;<U0D46>..<U0D48>;<U0D4A>..<U0D4D>;/
- <U0D57>;<U0D82>..<U0D83>;<U0DCA>;<U0DCF>..<U0DD4>;<U0DD6>;/
- <U0DD8>..<U0DDF>;<U0DF2>..<U0DF3>;<U0E31>;<U0E34>..<U0E3A>;/
+ <U0D02>..<U0D03>;<U0D3E>..<U0D44>;<U0D46>..<U0D48>;<U0D4A>..<U0D4D>;/
+ <U0D57>;<U0D62>..<U0D63>;<U0D82>..<U0D83>;<U0DCA>;<U0DCF>..<U0DD4>;/
+ <U0DD6>;<U0DD8>..<U0DDF>;<U0DF2>..<U0DF3>;<U0E31>;<U0E34>..<U0E3A>;/
<U0E47>..<U0E4E>;<U0EB1>;<U0EB4>..<U0EB9>;<U0EBB>..<U0EBC>;/
<U0EC8>..<U0ECD>;<U0F18>..<U0F19>;<U0F35>;<U0F37>;<U0F39>;/
<U0F3E>..<U0F3F>;<U0F71>..<U0F84>;<U0F86>..<U0F87>;<U0F90>..<U0F97>;/
- <U0F99>..<U0FBC>;<U0FC6>;<U102C>..<U1032>;<U1036>..<U1039>;/
- <U1056>..<U1059>;<U135F>;<U1712>..<U1714>;<U1732>..<U1734>;/
+ <U0F99>..<U0FBC>;<U0FC6>;<U102B>..<U103F>;/
+ <U1056>..<U1059>;<U105E>..<U1060>;<U1062>..<U1064>;<U1067>..<U106D>;/
+ <U1071>..<U1074>;<U1082>..<U108D>;<U108F>;/
+ <U135F>;<U1712>..<U1714>;<U1732>..<U1734>;/
<U1752>..<U1753>;<U1772>..<U1773>;<U17B6>..<U17D3>;<U17DD>;/
<U180B>..<U180D>;<U18A9>;<U1920>..<U192B>;<U1930>..<U193B>;/
<U19B0>..<U19C0>;<U19C8>..<U19C9>;<U1A17>..<U1A1B>;<U1B00>..<U1B04>;/
- <U1B34>..<U1B44>;<U1B6B>..<U1B73>;<U1DC0>..<U1DCA>;<U1DFE>..<U1DFF>;/
- <U20D0>..<U20EF>;<U302A>..<U302F>;<U3099>..<U309A>;<UA802>;<UA806>;/
- <UA80B>;<UA823>..<UA827>;<UFB1E>;<UFE00>..<UFE0F>;<UFE20>..<UFE23>;/
+ <U1B34>..<U1B44>;<U1B6B>..<U1B73>;<U1DC0>..<U1DE6>;<U1DFE>..<U1DFF>;/
+ <U20D0>..<U20F0>;<U2DE0>..<U2DFF>;<U302A>..<U302F>;<U3099>..<U309A>;/
+ <UA66F>..<UA672>;<UA67C>;<UA67D>;<UA802>;<UA806>;/
+ <UA80B>;<UA823>..<UA827>;<UFB1E>;<UFE00>..<UFE0F>;<UFE20>..<UFE26>;/
<U00010A01>..<U00010A03>;<U00010A05>..<U00010A06>;/
<U00010A0C>..<U00010A0F>;<U00010A38>..<U00010A3A>;<U00010A3F>;/
<U0001D165>..<U0001D169>;<U0001D16D>..<U0001D172>;/
@@ -1619,20 +1724,25 @@ class "combining_level3"; /
<U0962>..<U0963>;<U0981>..<U0983>;<U09BC>;<U09BE>..<U09C4>;/
<U09C7>..<U09C8>;<U09CB>..<U09CD>;<U09D7>;<U09E2>..<U09E3>;/
<U0A01>..<U0A03>;<U0A3C>;<U0A3E>..<U0A42>;<U0A47>..<U0A48>;/
- <U0A4B>..<U0A4D>;<U0A70>..<U0A71>;<U0A81>..<U0A83>;<U0ABC>;/
+ <U0A4B>..<U0A4D>;<U0A51>;<U0A70>..<U0A71>;<U0375>;<U0A81>..<U0A83>;/
+ <U0ABC>;/
<U0ABE>..<U0AC5>;<U0AC7>..<U0AC9>;<U0ACB>..<U0ACD>;<U0AE2>..<U0AE3>;/
- <U0B01>..<U0B03>;<U0B3C>;<U0B3E>..<U0B43>;<U0B47>..<U0B48>;/
+ <U0B01>..<U0B03>;<U0B3C>;<U0B3E>..<U0B44>;<U0B47>..<U0B48>;/
<U0B4B>..<U0B4D>;<U0B56>..<U0B57>;<U0B82>;<U0BBE>..<U0BC2>;/
- <U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD7>;<U0C01>..<U0C03>;/
+ <U0BC6>..<U0BC8>;<U0BCA>..<U0BCD>;<U0BD0>;<U0BD7>;<U0C01>..<U0C03>;/
<U0C3E>..<U0C44>;<U0C46>..<U0C48>;<U0C4A>..<U0C4D>;<U0C55>..<U0C56>;/
+ <U0C62>..<U0C63>;/
<U0C82>..<U0C83>;<U0CBC>;<U0CBE>..<U0CC4>;<U0CC6>..<U0CC8>;/
<U0CCA>..<U0CCD>;<U0CD5>..<U0CD6>;<U0CE2>..<U0CE3>;<U0D02>..<U0D03>;/
- <U0D3E>..<U0D43>;<U0D46>..<U0D48>;<U0D4A>..<U0D4D>;<U0D57>;/
+ <U0D3E>..<U0D44>;<U0D46>..<U0D48>;<U0D4A>..<U0D4D>;<U0D57>;/
+ <U0D62>..<U0D63>;/
<U0D82>..<U0D83>;<U0DCA>;<U0DCF>..<U0DD4>;<U0DD6>;<U0DD8>..<U0DDF>;/
<U0DF2>..<U0DF3>;<U0E31>;<U0E34>..<U0E3A>;<U0E47>..<U0E4E>;<U0EB1>;/
<U0EB4>..<U0EB9>;<U0EBB>..<U0EBC>;<U0EC8>..<U0ECD>;<U0F3E>..<U0F3F>;/
<U0F71>..<U0F81>;<U0F84>;<U0F90>..<U0F97>;<U0F99>..<U0FBC>;/
- <U102C>..<U1032>;<U1036>..<U1039>;<U1056>..<U1059>;<U1712>..<U1714>;/
+ <U102B>..<U103F>;<U1056>..<U1059>;<U105E>..<U1060>;<U1062>..<U1064>;/
+ <U1067>..<U106D>;/
+ <U1071>..<U1074>;<U1082>..<U108D>;<U108F>;<U1712>..<U1714>;/
<U1732>..<U1734>;<U1752>..<U1753>;<U1772>..<U1773>;<U17B6>..<U17D3>;/
<U180B>..<U180D>;<U1920>..<U192B>;<U1930>..<U1938>;<U19B0>..<U19C0>;/
<U19C8>..<U19C9>;<U1A19>..<U1A1B>;<U1B00>..<U1B04>;<U1B34>..<U1B44>;/
diff --git a/localedata/locales/iso14651_t1_common b/localedata/locales/iso14651_t1_common
index ab36f0ed9f..ca3a8144cb 100644
--- a/localedata/locales/iso14651_t1_common
+++ b/localedata/locales/iso14651_t1_common
@@ -62,6 +62,7 @@ script <ARMENIAN>
script <GEORGIAN>
script <DEVANAGARI>
script <GUJARATI>
+script <TELUGU>
# Déclaration des symboles internes / Declaration of internal symbols
#
@@ -652,6 +653,95 @@ collating-symbol <gvd-chandrabindu>
collating-symbol <gvd-visarg>
collating-symbol <g-halant>
+# <TELUGU>
+#
+# tvd - denotes Telugu vowel modifier
+# tm - denotes Telugu matras
+# tvw - denotes Telugu vowels
+
+# defining symbols
+collating-symbol <tummu>
+collating-symbol <tvw-a>
+collating-symbol <tvw-aa>
+collating-symbol <tvw-i>
+collating-symbol <tvw-ii>
+collating-symbol <tvw-u>
+collating-symbol <tvw-uu>
+collating-symbol <tvw-vocalicr>
+collating-symbol <tvw-vocalicrr>
+collating-symbol <tvw-vocalicl>
+collating-symbol <tvw-vocalicll>
+collating-symbol <tvw-candrae>
+collating-symbol <tvw-shorte>
+collating-symbol <tvw-e>
+collating-symbol <tvw-ai>
+collating-symbol <tvw-shorto>
+collating-symbol <tvw-o>
+collating-symbol <tvw-au>
+collating-symbol <t-ka>
+collating-symbol <t-kha>
+collating-symbol <t-ga>
+collating-symbol <t-gga>
+collating-symbol <t-gha>
+collating-symbol <t-nga>
+collating-symbol <t-ca>
+collating-symbol <t-tsa>
+collating-symbol <t-cha>
+collating-symbol <t-ja>
+collating-symbol <t-dza>
+collating-symbol <t-jja>
+collating-symbol <t-jha>
+collating-symbol <t-nya>
+collating-symbol <t-tta>
+collating-symbol <t-ttha>
+collating-symbol <t-dda>
+collating-symbol <t-ddda>
+collating-symbol <t-ddha>
+collating-symbol <t-nna>
+collating-symbol <t-ta>
+collating-symbol <t-tha>
+collating-symbol <t-da>
+collating-symbol <t-dha>
+collating-symbol <t-na>
+collating-symbol <t-pa>
+collating-symbol <t-pha>
+collating-symbol <t-ba>
+collating-symbol <t-bba>
+collating-symbol <t-bha>
+collating-symbol <t-ma>
+collating-symbol <t-ya>
+collating-symbol <t-ra>
+collating-symbol <t-rra>
+collating-symbol <t-la>
+collating-symbol <t-lla>
+collating-symbol <t-va>
+collating-symbol <t-sha>
+collating-symbol <t-ssa>
+collating-symbol <t-sa>
+collating-symbol <t-ha>
+collating-symbol <t-avagrah>
+collating-symbol <tm-aa>
+collating-symbol <tm-i>
+collating-symbol <tm-ii>
+collating-symbol <tm-u>
+collating-symbol <tm-uu>
+collating-symbol <tm-vocalicr>
+collating-symbol <tm-vocalicrr>
+collating-symbol <tm-vocalicl>
+collating-symbol <tm-vocalicll>
+collating-symbol <tm-shorte>
+collating-symbol <tm-e>
+collating-symbol <tm-ai>
+collating-symbol <tm-shorto>
+collating-symbol <tm-o>
+collating-symbol <tm-au>
+collating-symbol <tvd-chandrabindu>
+collating-symbol <tvd-anuswara>
+collating-symbol <tvd-visarg>
+collating-symbol <t-halant>
+collating-symbol <t-lenghtmark>
+collating-symbol <t-ailenghtmark>
+
# Ordre des symboles internes / Order of internal symbols
#
# SYMB. N°
@@ -1236,6 +1326,92 @@ collating-symbol <g-halant>
<gvd-chandrabindu>
<gvd-visarg>
<g-halant>
+#
+#<TELUGU>
+#
+# collation weights in order
+
+<tummu>
+<tvw-a>
+<tvw-aa>
+<tvw-i>
+<tvw-ii>
+<tvw-u>
+<tvw-uu>
+<tvw-vocalicr>
+<tvw-vocalicrr>
+<tvw-vocalicl>
+<tvw-vocalicll>
+<tvw-candrae>
+<tvw-shorte>
+<tvw-e>
+<tvw-ai>
+<tvw-shorto>
+<tvw-o>
+<tvw-au>
+<t-ka>
+<t-kha>
+<t-ga>
+<t-gga>
+<t-gha>
+<t-nga>
+<t-ca>
+<t-tsa>
+<t-cha>
+<t-ja>
+<t-dza>
+<t-jja>
+<t-jha>
+<t-nya>
+<t-tta>
+<t-ttha>
+<t-dda>
+<t-ddda>
+<t-ddha>
+<t-nna>
+<t-ta>
+<t-tha>
+<t-da>
+<t-dha>
+<t-na>
+<t-pa>
+<t-pha>
+<t-ba>
+<t-bba>
+<t-bha>
+<t-ma>
+<t-ya>
+<t-ra>
+<t-rra>
+<t-la>
+<t-lla>
+<t-va>
+<t-sha>
+<t-ssa>
+<t-sa>
+<t-ha>
+<t-avagrah>
+<tm-aa>
+<tm-i>
+<tm-ii>
+<tm-u>
+<tm-uu>
+<tm-vocalicr>
+<tm-vocalicrr>
+<tm-vocalicl>
+<tm-vocalicll>
+<tm-shorte>
+<tm-e>
+<tm-ai>
+<tm-shorto>
+<tm-o>
+<tm-au>
+<tvd-chandrabindu>
+<tvd-anuswara>
+<tvd-visarg>
+<t-halant>
+<t-lenghtmark>
+<t-ailenghtmark>
order_start <SPECIAL>;forward;backward;forward;forward,position
#
@@ -3201,6 +3377,103 @@ order_start <GUJARATI>;forward;forward;forward;forward,position
<U0ACD> <g-halant>;<BAS>;<MIN>;IGNORE
<U0ABC> IGNORE;<GNKT>;<MIN>;IGNORE
+order_start <TELUGU>;forward;forward;forward;forward,position
+<U0C66> <0>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C78> <0>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C67> <1>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C79> <1>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C7C> <1>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C68> <2>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C7A> <2>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C7D> <2>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C69> <3>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C7B> <3>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C7E> <3>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C6A> <4>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C6B> <5>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C6C> <6>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C6D> <7>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C6E> <8>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C6F> <9>;"<BAS><NUM>";"<MIN><MIN>";IGNORE
+<U0C7F> <tummu> ;<BAS>;<MIN>;IGNORE
+<U0C05> <tvw-a> ;<BAS>;<MIN>;IGNORE
+<U0C06> <tvw-aa> ;<BAS>;<MIN>;IGNORE
+<U0C07> <tvw-i> ;<BAS>;<MIN>;IGNORE
+<U0C08> <tvw-ii> ;<BAS>;<MIN>;IGNORE
+<U0C09> <tvw-u> ;<BAS>;<MIN>;IGNORE
+<U0C0A> <tvw-uu>;<BAS>;<MIN>;IGNORE
+<U0C0B> <tvw-vocalicr>;<BAS>;<MIN>;IGNORE
+<U0C60> <tvw-vocalicrr>;<BAS>;<MIN>;IGNORE
+<U0C0C> <tvw-vocalicl>;<BAS>;<MIN>;IGNORE
+<U0C61> <tvw-vocalicll>;<BAS>;<MIN>;IGNORE
+<U0C0D> <tvw-candrae>;<BAS>;<MIN>;IGNORE
+<U0C0E> <tvw-shorte>;<BAS>;<MIN>;IGNORE
+<U0C0F> <tvw-e>;<BAS>;<MIN>;IGNORE
+<U0C10> <tvw-ai>;<BAS>;<MIN>;IGNORE
+<U0C12> <tvw-shorto>;<BAS>;<MIN>;IGNORE
+<U0C13> <tvw-o>;<BAS>;<MIN>;IGNORE
+<U0C14> <tvw-au>;<BAS>;<MIN>;IGNORE
+<U0C15> <t-ka>;<BAS>;<MIN>;IGNORE
+<U0C16> <t-kha>;<BAS>;<MIN>;IGNORE
+<U0C17> <t-ga>;<BAS>;<MIN>;IGNORE
+<U0C7B> <t-gga>;<BAS>;<MIN>;IGNORE
+<U0C18> <t-gha>;<BAS>;<MIN>;IGNORE
+<U0C19> <t-nga>;<BAS>;<MIN>;IGNORE
+<U0C1A> <t-ca>;<BAS>;<MIN>;IGNORE
+<U0C58> <t-tsa>;<BAS>;<MIN>;IGNORE
+<U0C1B> <t-cha>;<BAS>;<MIN>;IGNORE
+<U0C1C> <t-ja>;<BAS>;<MIN>;IGNORE
+<U0C59> <t-dza>;<BAS>;<MIN>;IGNORE
+<U0C1D> <t-jha>;<BAS>;<MIN>;IGNORE
+<U0C1E> <t-nya>;<BAS>;<MIN>;IGNORE
+<U0C1F> <t-tta>;<BAS>;<MIN>;IGNORE
+<U0C20> <t-ttha>;<BAS>;<MIN>;IGNORE
+<U0C21> <t-dda>;<BAS>;<MIN>;IGNORE
+<U0C22> <t-ddha>;<BAS>;<MIN>;IGNORE
+<U0C23> <t-nna>;<BAS>;<MIN>;IGNORE
+<U0C24> <t-ta>;<BAS>;<MIN>;IGNORE
+<U0C25> <t-tha>;<BAS>;<MIN>;IGNORE
+<U0C26> <t-da>;<BAS>;<MIN>;IGNORE
+<U0C27> <t-dha>;<BAS>;<MIN>;IGNORE
+<U0C28> <t-na>;<BAS>;<MIN>;IGNORE
+<U0C2A> <t-pa>;<BAS>;<MIN>;IGNORE
+<U0C2B> <t-pha>;<BAS>;<MIN>;IGNORE
+<U0C2C> <t-ba>;<BAS>;<MIN>;IGNORE
+<U0C2D> <t-bha>;<BAS>;<MIN>;IGNORE
+<U0C2E> <t-ma>;<BAS>;<MIN>;IGNORE
+<U0C2F> <t-ya>;<BAS>;<MIN>;IGNORE
+<U0C30> <t-ra>;<BAS>;<MIN>;IGNORE
+<U0C31> <t-rra>;<BAS>;<MIN>;IGNORE
+<U0C32> <t-la>;<BAS>;<MIN>;IGNORE
+<U0C33> <t-lla>;<BAS>;<MIN>;IGNORE
+<U0C35> <t-va>;<BAS>;<MIN>;IGNORE
+<U0C36> <t-sha>;<BAS>;<MIN>;IGNORE
+<U0C37> <t-ssa>;<BAS>;<MIN>;IGNORE
+<U0C38> <t-sa>;<BAS>;<MIN>;IGNORE
+<U0C39> <t-ha>;<BAS>;<MIN>;IGNORE
+<U0C3D> <t-avagrah>;<BAS>;<MIN>;IGNORE
+<U0C3E> <tm-aa>;<BAS>;<MIN>;IGNORE
+<U0C3F> <tm-i>;<BAS>;<MIN>;IGNORE
+<U0C40> <tm-ii>;<BAS>;<MIN>;IGNORE
+<U0C41> <tm-u>;<BAS>;<MIN>;IGNORE
+<U0C42> <tm-uu>;<BAS>;<MIN>;IGNORE
+<U0C43> <tm-vocalicr>;<BAS>;<MIN>;IGNORE
+<U0C44> <tm-vocalicrr>;<BAS>;<MIN>;IGNORE
+<U0C62> <tm-vocalicl>;<BAS>;<MIN>;IGNORE
+<U0C63> <tm-vocalicll>;<BAS>;<MIN>;IGNORE
+<U0C46> <tm-shorte>;<BAS>;<MIN>;IGNORE
+<U0C47> <tm-e>;<BAS>;<MIN>;IGNORE
+<U0C48> <tm-ai>;<BAS>;<MIN>;IGNORE
+<U0C4A> <tm-shorto>;<BAS>;<MIN>;IGNORE
+<U0C4B> <tm-o>;<BAS>;<MIN>;IGNORE
+<U0C4C> <tm-au>;<BAS>;<MIN>;IGNORE
+<U0C01> <tvd-chandrabindu>;<BAS>;<MIN>;IGNORE
+<U0C02> <tvd-anuswara>;<BAS>;<MIN>;IGNORE
+<U0C03> <tvd-visarg>;<BAS>;<MIN>;IGNORE
+<U0C4D> <t-halant>;<BAS>;<MIN>;IGNORE
+<U0C55> <t-lenghtmark>;<BAS>;<MIN>;IGNORE
+<U0C56> <t-ailenghtmark>;<BAS>;<MIN>;IGNORE
+
order_end
END LC_COLLATE
diff --git a/math/libm-test.inc b/math/libm-test.inc
index b8a73ae1f6..267d6077e1 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -2510,6 +2510,7 @@ exp_test (void)
TEST_f_f (exp, 3, M_E3l);
TEST_f_f (exp, 0.75L, 2.11700001661267466854536981983709561L);
TEST_f_f (exp, 50.0L, 5184705528587072464087.45332293348538L);
+ TEST_f_f (exp, 88.72269439697265625L, 3.40233126623160774937554134772290447915e38L);
#ifdef TEST_LDOUBLE
/* The result can only be represented in long double. */
TEST_f_f (exp, 1000.0L, 0.197007111401704699388887935224332313e435L);
diff --git a/misc/truncate64.c b/misc/truncate64.c
index d7e80dc3ae..4a8a540745 100644
--- a/misc/truncate64.c
+++ b/misc/truncate64.c
@@ -31,5 +31,5 @@ truncate64 (path, length)
__set_errno (EINVAL);
return -1;
}
- return truncate (path, (off_t) length);
+ return __truncate (path, (off_t) length);
}
diff --git a/nis/Versions b/nis/Versions
index be4453e285..ef9a512417 100644
--- a/nis/Versions
+++ b/nis/Versions
@@ -95,7 +95,7 @@ libnss_nis {
_nss_nis_setgrent; _nss_nis_sethostent; _nss_nis_setnetent;
_nss_nis_setnetgrent; _nss_nis_setprotoent; _nss_nis_setpwent;
_nss_nis_setrpcent; _nss_nis_setservent; _nss_nis_setspent;
- _nss_nis_initgroups_dyn;
+ _nss_nis_initgroups_dyn; _nss_nis_gethostbyname4_r;
}
}
@@ -126,5 +126,6 @@ libnss_nisplus {
_nss_nisplus_setnetent; _nss_nisplus_setnetgrent; _nss_nisplus_setprotoent;
_nss_nisplus_setpwent; _nss_nisplus_setrpcent; _nss_nisplus_setservent;
_nss_nisplus_setspent; _nss_nisplus_initgroups_dyn;
+ _nss_nisplus_gethostbyname4_r;
}
}
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
index 7bf4af786d..24d13634d7 100644
--- a/nis/nss_nis/nis-hosts.c
+++ b/nis/nss_nis/nis-hosts.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1996-2000, 2002, 2003, 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2000, 2002, 2003, 2006, 2007, 2008
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
@@ -17,6 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <nss.h>
#include <ctype.h>
/* The following is an ugly trick to avoid a prototype declaration for
@@ -61,9 +63,12 @@ LINE_PARSER
STRING_FIELD (addr, isspace, 1);
+ assert (af == AF_INET || af == AF_INET6 || af == AF_UNSPEC);
+
/* Parse address. */
- if (af == AF_INET && inet_pton (AF_INET, addr, entdata->host_addr) > 0)
+ if (af != AF_INET6 && inet_pton (AF_INET, addr, entdata->host_addr) > 0)
{
+ assert ((flags & AI_V4MAPPED) == 0 || af != AF_UNSPEC);
if (flags & AI_V4MAPPED)
{
map_v4v6_address ((char *) entdata->host_addr,
@@ -77,7 +82,7 @@ LINE_PARSER
result->h_length = INADDRSZ;
}
}
- else if (af == AF_INET6
+ else if (af != AF_INET
&& inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
{
result->h_addrtype = AF_INET6;
@@ -102,6 +107,7 @@ static bool_t new_start = 1;
static char *oldkey = NULL;
static int oldkeylen = 0;
+
enum nss_status
_nss_nis_sethostent (int stayopen)
{
@@ -124,6 +130,7 @@ _nss_nis_sethostent (int stayopen)
is used so this makes no difference. */
strong_alias (_nss_nis_sethostent, _nss_nis_endhostent)
+
/* The calling function always need to get a lock first. */
static enum nss_status
internal_nis_gethostent_r (struct hostent *host, char *buffer,
@@ -216,6 +223,7 @@ internal_nis_gethostent_r (struct hostent *host, char *buffer,
return NSS_STATUS_SUCCESS;
}
+
enum nss_status
_nss_nis_gethostent_r (struct hostent *host, char *buffer, size_t buflen,
int *errnop, int *h_errnop)
@@ -233,6 +241,7 @@ _nss_nis_gethostent_r (struct hostent *host, char *buffer, size_t buflen,
return status;
}
+
static enum nss_status
internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
char *buffer, size_t buflen, int *errnop,
@@ -323,16 +332,24 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
return NSS_STATUS_SUCCESS;
}
+
enum nss_status
_nss_nis_gethostbyname2_r (const char *name, int af, struct hostent *host,
char *buffer, size_t buflen, int *errnop,
int *h_errnop)
{
+ if (af != AF_INET && af != AF_INET6)
+ {
+ *h_errnop = HOST_NOT_FOUND;
+ return NSS_STATUS_NOTFOUND;
+ }
+
return internal_gethostbyname2_r (name, af, host, buffer, buflen, errnop,
h_errnop,
((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0));
}
+
enum nss_status
_nss_nis_gethostbyname_r (const char *name, struct hostent *host, char *buffer,
size_t buflen, int *errnop, int *h_errnop)
@@ -351,6 +368,7 @@ _nss_nis_gethostbyname_r (const char *name, struct hostent *host, char *buffer,
errnop, h_errnop, 0);
}
+
enum nss_status
_nss_nis_gethostbyaddr_r (const void *addr, socklen_t addrlen, int af,
struct hostent *host, char *buffer, size_t buflen,
@@ -430,13 +448,93 @@ _nss_nis_gethostbyaddr_r (const void *addr, socklen_t addrlen, int af,
return NSS_STATUS_SUCCESS;
}
-#if 0
+
enum nss_status
-_nss_nis_getipnodebyname_r (const char *name, int af, int flags,
- struct hostent *result, char *buffer,
- size_t buflen, int *errnop, int *herrnop)
+_nss_nis_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
+ char *buffer, size_t buflen, int *errnop,
+ int *herrnop, int32_t *ttlp)
{
- return internal_gethostbyname2_r (name, af, result, buffer, buflen,
- errnop, herrnop, flags);
+ char *domain;
+ if (yp_get_default_domain (&domain))
+ return NSS_STATUS_UNAVAIL;
+
+ /* Convert name to lowercase. */
+ size_t namlen = strlen (name);
+ char name2[namlen + 1];
+ size_t i;
+
+ for (i = 0; i < namlen; ++i)
+ name2[i] = tolower (name[i]);
+ name2[i] = '\0';
+
+ char *result;
+ int len;
+ int yperr = yp_match (domain, "hosts.byname", name2, namlen, &result, &len);
+
+ if (__builtin_expect (yperr != YPERR_SUCCESS, 0))
+ {
+ enum nss_status retval = yperr2nss (yperr);
+
+ if (retval == NSS_STATUS_TRYAGAIN)
+ {
+ *herrnop = TRY_AGAIN;
+ *errnop = errno;
+ }
+ if (retval == NSS_STATUS_NOTFOUND)
+ *herrnop = HOST_NOT_FOUND;
+ return retval;
+ }
+
+ struct parser_data data;
+ struct hostent host;
+ int parse_res = parse_line (result, &host, &data, buflen, errnop, AF_UNSPEC,
+ 0);
+ if (__builtin_expect (parse_res < 1, 0))
+ {
+ if (parse_res == -1)
+ {
+ *herrnop = NETDB_INTERNAL;
+ return NSS_STATUS_TRYAGAIN;
+ }
+ else
+ {
+ *herrnop = HOST_NOT_FOUND;
+ return NSS_STATUS_NOTFOUND;
+ }
+ }
+
+ if (*pat == NULL)
+ {
+ uintptr_t pad = (-(uintptr_t) buffer
+ % __alignof__ (struct gaih_addrtuple));
+ buffer += pad;
+ buflen = buflen > pad ? buflen - pad : 0;
+
+ if (__builtin_expect (buflen < sizeof (struct gaih_addrtuple), 0))
+ {
+ erange:
+ free (result);
+ *errnop = ERANGE;
+ *herrnop = NETDB_INTERNAL;
+ return NSS_STATUS_TRYAGAIN;
+ }
+
+ *pat = (struct gaih_addrtuple *) buffer;
+ buffer += sizeof (struct gaih_addrtuple);
+ buflen -= sizeof (struct gaih_addrtuple);
+ }
+
+ (*pat)->next = NULL;
+ size_t h_name_len = strlen (host.h_name);
+ if (h_name_len >= buflen)
+ goto erange;
+ (*pat)->name = memcpy (buffer, host.h_name, h_name_len + 1);
+ (*pat)->family = host.h_addrtype;
+ memcpy ((*pat)->addr, host.h_addr_list[0], host.h_length);
+ (*pat)->scopeid = 0;
+ assert (host.h_addr_list[1] == NULL);
+
+ free (result);
+
+ return NSS_STATUS_SUCCESS;
}
-#endif
diff --git a/nis/nss_nisplus/nisplus-hosts.c b/nis/nss_nisplus/nisplus-hosts.c
index f5f0ac96da..37d44773fc 100644
--- a/nis/nss_nisplus/nisplus-hosts.c
+++ b/nis/nss_nisplus/nisplus-hosts.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997-2002, 2003, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 1997-2003, 2005, 2006, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1997.
@@ -17,6 +17,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <assert.h>
#include <atomic.h>
#include <ctype.h>
#include <errno.h>
@@ -58,15 +59,15 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
if (result == NULL)
return 0;
- if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) ||
- __type_of (NIS_RES_OBJECT (result)) != NIS_ENTRY_OBJ ||
- strcmp(NIS_RES_OBJECT (result)[0].EN_data.en_type, "hosts_tbl") != 0 ||
- NIS_RES_OBJECT (result)[0].EN_data.en_cols.en_cols_len < 4)
+ if ((result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS)
+ || __type_of (NIS_RES_OBJECT (result)) != NIS_ENTRY_OBJ
+ || strcmp (NIS_RES_OBJECT (result)[0].EN_data.en_type, "hosts_tbl") != 0
+ || NIS_RES_OBJECT (result)[0].EN_data.en_cols.en_cols_len < 4)
return 0;
char *data = first_unused;
- if (room_left < (af == AF_INET6 || (flags & AI_V4MAPPED) != 0
+ if (room_left < (af != AF_INET || (flags & AI_V4MAPPED) != 0
? IN6ADDRSZ : INADDRSZ))
{
no_more_room:
@@ -75,8 +76,10 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
}
/* Parse address. */
- if (af == AF_INET && inet_pton (af, NISENTRYVAL (0, 2, result), data) > 0)
+ if (af != AF_INET6
+ && inet_pton (AF_INET, NISENTRYVAL (0, 2, result), data) > 0)
{
+ assert ((flags & AI_V4MAPPED) == 0 || af != AF_UNSPEC);
if (flags & AI_V4MAPPED)
{
map_v4v6_address (data, data);
@@ -89,7 +92,7 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
host->h_length = INADDRSZ;
}
}
- else if (af == AF_INET6
+ else if (af != AF_INET
&& inet_pton (AF_INET6, NISENTRYVAL (0, 2, result), data) > 0)
{
host->h_addrtype = AF_INET6;
@@ -109,27 +112,33 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
first_unused = __stpncpy (first_unused, NISENTRYVAL (0, 0, result),
NISENTRYLEN (0, 0, result));
*first_unused++ = '\0';
- room_left -= NISENTRYLEN (0, 0, result) + 1;
- /* XXX Rewrite at some point to allocate the array first and then
- copy the strings. It wasteful to first concatenate the strings
- to just split them again later. */
+ room_left -= NISENTRYLEN (0, 0, result) + 1;
char *line = first_unused;
- for (i = 0; i < NIS_RES_NUMOBJ (result); ++i)
+
+ /* When this is a call to gethostbyname4_r we do not need the aliases. */
+ if (af != AF_UNSPEC)
{
- if (strcmp (NISENTRYVAL (i, 1, result), host->h_name) != 0)
+ /* XXX Rewrite at some point to allocate the array first and then
+ copy the strings. It is wasteful to first concatenate the strings
+ to just split them again later. */
+ for (i = 0; i < NIS_RES_NUMOBJ (result); ++i)
{
- if (NISENTRYLEN (i, 1, result) + 2 > room_left)
- goto no_more_room;
-
- *first_unused++ = ' ';
- first_unused = __stpncpy (first_unused, NISENTRYVAL (i, 1, result),
- NISENTRYLEN (i, 1, result));
- *first_unused = '\0';
- room_left -= NISENTRYLEN (i, 1, result) + 1;
+ if (strcmp (NISENTRYVAL (i, 1, result), host->h_name) != 0)
+ {
+ if (NISENTRYLEN (i, 1, result) + 2 > room_left)
+ goto no_more_room;
+
+ *first_unused++ = ' ';
+ first_unused = __stpncpy (first_unused,
+ NISENTRYVAL (i, 1, result),
+ NISENTRYLEN (i, 1, result));
+ *first_unused = '\0';
+ room_left -= NISENTRYLEN (i, 1, result) + 1;
+ }
}
+ *first_unused++ = '\0';
}
- *first_unused++ = '\0';
/* Adjust the pointer so it is aligned for
storing pointers. */
@@ -147,30 +156,34 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
host->h_addr_list[1] = NULL;
host->h_aliases = &host->h_addr_list[2];
- i = 0;
- while (*line != '\0')
+ /* When this is a call to gethostbyname4_r we do not need the aliases. */
+ if (af != AF_UNSPEC)
{
- /* Skip leading blanks. */
- while (isspace (*line))
- ++line;
+ i = 0;
+ while (*line != '\0')
+ {
+ /* Skip leading blanks. */
+ while (isspace (*line))
+ ++line;
- if (*line == '\0')
- break;
+ if (*line == '\0')
+ break;
- if (room_left < sizeof (char *))
- goto no_more_room;
+ if (room_left < sizeof (char *))
+ goto no_more_room;
- room_left -= sizeof (char *);
- host->h_aliases[i++] = line;
+ room_left -= sizeof (char *);
+ host->h_aliases[i++] = line;
- while (*line != '\0' && *line != ' ')
- ++line;
+ while (*line != '\0' && *line != ' ')
+ ++line;
- if (*line == ' ')
- *line++ = '\0';
- }
+ if (*line == ' ')
+ *line++ = '\0';
+ }
- host->h_aliases[i] = NULL;
+ host->h_aliases[i] = NULL;
+ }
return 1;
}
@@ -204,6 +217,7 @@ _nss_create_tablename (int *errnop)
return NSS_STATUS_SUCCESS;
}
+
enum nss_status
_nss_nisplus_sethostent (int stayopen)
{
@@ -226,6 +240,7 @@ _nss_nisplus_sethostent (int stayopen)
return status;
}
+
enum nss_status
_nss_nisplus_endhostent (void)
{
@@ -242,6 +257,7 @@ _nss_nisplus_endhostent (void)
return NSS_STATUS_SUCCESS;
}
+
static enum nss_status
internal_nisplus_gethostent_r (struct hostent *host, char *buffer,
size_t buflen, int *errnop, int *herrnop)
@@ -329,6 +345,7 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer,
return NSS_STATUS_SUCCESS;
}
+
enum nss_status
_nss_nisplus_gethostent_r (struct hostent *result, char *buffer,
size_t buflen, int *errnop, int *herrnop)
@@ -345,26 +362,33 @@ _nss_nisplus_gethostent_r (struct hostent *result, char *buffer,
return status;
}
+
+static enum nss_status
+get_tablename (int *herrnop)
+{
+ __libc_lock_lock (lock);
+
+ enum nss_status status = _nss_create_tablename (herrnop);
+
+ __libc_lock_unlock (lock);
+
+ if (status != NSS_STATUS_SUCCESS)
+ *herrnop = NETDB_INTERNAL;
+
+ return status;
+}
+
+
static enum nss_status
internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
char *buffer, size_t buflen, int *errnop,
int *herrnop, int flags)
{
- int parse_res, retval;
-
if (tablename_val == NULL)
{
- __libc_lock_lock (lock);
-
- enum nss_status status = _nss_create_tablename (errnop);
-
- __libc_lock_unlock (lock);
-
+ enum nss_status status = get_tablename (herrnop);
if (status != NSS_STATUS_SUCCESS)
- {
- *herrnop = NETDB_INTERNAL;
- return NSS_STATUS_UNAVAIL;
- }
+ return status;
}
if (name == NULL)
@@ -374,39 +398,36 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
return NSS_STATUS_NOTFOUND;
}
- nis_result *result;
char buf[strlen (name) + 10 + tablename_len];
int olderr = errno;
/* Search at first in the alias list, and use the correct name
for the next search. */
snprintf (buf, sizeof (buf), "[name=%s],%s", name, tablename_val);
- result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
+ nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
if (result != NULL)
{
- char *bufptr = buf;
-
/* If we did not find it, try it as original name. But if the
database is correct, we should find it in the first case, too. */
- if ((result->status != NIS_SUCCESS
- && result->status != NIS_S_SUCCESS)
- || __type_of (result->objects.objects_val) != NIS_ENTRY_OBJ
- || strcmp (result->objects.objects_val->EN_data.en_type,
- "hosts_tbl") != 0
- || result->objects.objects_val->EN_data.en_cols.en_cols_len < 3)
- snprintf (buf, sizeof (buf), "[cname=%s],%s", name, tablename_val);
- else
+ char *bufptr = buf;
+ size_t buflen = sizeof (buf);
+
+ if ((result->status == NIS_SUCCESS || result->status == NIS_S_SUCCESS)
+ && __type_of (result->objects.objects_val) == NIS_ENTRY_OBJ
+ && strcmp (result->objects.objects_val->EN_data.en_type,
+ "hosts_tbl") == 0
+ && result->objects.objects_val->EN_data.en_cols.en_cols_len >= 3)
{
/* We need to allocate a new buffer since there is no
- guarantee the returned name has a length limit. */
- const char *entryval = NISENTRYVAL(0, 0, result);
- size_t buflen = strlen (entryval) + 10 + tablename_len;
+ guarantee the returned alias name has a length limit. */
+ name = NISENTRYVAL(0, 0, result);
+ size_t buflen = strlen (name) + 10 + tablename_len;
bufptr = alloca (buflen);
- snprintf (bufptr, buflen, "[cname=%s],%s",
- entryval, tablename_val);
}
+ snprintf (bufptr, buflen, "[cname=%s],%s", name, tablename_val);
+
nis_freeresult (result);
result = nis_list (bufptr, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
}
@@ -417,7 +438,7 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
return NSS_STATUS_TRYAGAIN;
}
- retval = niserr2nss (result->status);
+ int retval = niserr2nss (result->status);
if (__builtin_expect (retval != NSS_STATUS_SUCCESS, 0))
{
if (retval == NSS_STATUS_TRYAGAIN)
@@ -431,8 +452,8 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
return retval;
}
- parse_res = _nss_nisplus_parse_hostent (result, af, host, buffer,
- buflen, errnop, flags);
+ int parse_res = _nss_nisplus_parse_hostent (result, af, host, buffer,
+ buflen, errnop, flags);
nis_freeresult (result);
@@ -450,16 +471,24 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
return NSS_STATUS_NOTFOUND;
}
+
enum nss_status
_nss_nisplus_gethostbyname2_r (const char *name, int af, struct hostent *host,
char *buffer, size_t buflen, int *errnop,
int *herrnop)
{
+ if (af != AF_INET && af != AF_INET6)
+ {
+ *herrnop = HOST_NOT_FOUND;
+ return NSS_STATUS_NOTFOUND;
+ }
+
return internal_gethostbyname2_r (name, af, host, buffer, buflen, errnop,
herrnop,
((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0));
}
+
enum nss_status
_nss_nisplus_gethostbyname_r (const char *name, struct hostent *host,
char *buffer, size_t buflen, int *errnop,
@@ -480,6 +509,7 @@ _nss_nisplus_gethostbyname_r (const char *name, struct hostent *host,
buflen, errnop, h_errnop, 0);
}
+
enum nss_status
_nss_nisplus_gethostbyaddr_r (const void *addr, socklen_t addrlen, int af,
struct hostent *host, char *buffer,
@@ -487,12 +517,7 @@ _nss_nisplus_gethostbyaddr_r (const void *addr, socklen_t addrlen, int af,
{
if (tablename_val == NULL)
{
- __libc_lock_lock (lock);
-
- enum nss_status status = _nss_create_tablename (errnop);
-
- __libc_lock_unlock (lock);
-
+ enum nss_status status = get_tablename (herrnop);
if (status != NSS_STATUS_SUCCESS)
return status;
}
@@ -547,3 +572,44 @@ _nss_nisplus_gethostbyaddr_r (const void *addr, socklen_t addrlen, int af,
__set_errno (olderr);
return NSS_STATUS_NOTFOUND;
}
+
+
+enum nss_status
+_nss_nisplus_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
+ char *buffer, size_t buflen, int *errnop,
+ int *herrnop, int32_t *ttlp)
+{
+ struct hostent host;
+
+ enum nss_status status = internal_gethostbyname2_r (name, AF_UNSPEC, &host,
+ buffer, buflen,
+ errnop, herrnop, 0);
+ if (__builtin_expect (status == NSS_STATUS_SUCCESS, 1))
+ {
+ if (*pat == NULL)
+ {
+ uintptr_t pad = (-(uintptr_t) buffer
+ % __alignof__ (struct gaih_addrtuple));
+ buffer += pad;
+ buflen = buflen > pad ? buflen - pad : 0;
+
+ if (__builtin_expect (buflen < sizeof (struct gaih_addrtuple), 0))
+ {
+ free (result);
+ *errnop = ERANGE;
+ *herrnop = NETDB_INTERNAL;
+ return NSS_STATUS_TRYAGAIN;
+ }
+ }
+
+ (*pat)->next = NULL;
+ (*pat)->name = host.h_name;
+ (*pat)->family = host.h_addrtype;
+
+ memcpy ((*pat)->addr, host.h_addr_list[0], host.h_length);
+ (*pat)->scopeid = 0;
+ assert (host.h_addr_list[1] == NULL);
+ }
+
+ return status;
+}
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index ba94a95dac..56c5baea6c 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,17 @@
+2008-05-10 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Access
+ __pshared correctly.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S:
+ Likewise.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S:
+ Likewise.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S:
+ Likewise.
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S:
+ Likewise.
+ Reported by Clemens Kolbitsch <clemens.kol@gmx.at>.
+
2008-04-14 David S. Miller <davem@davemloft.net>
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
index d8f1bd54a2..2ddeed072f 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S
@@ -122,7 +122,7 @@ __pthread_rwlock_rdlock:
#else
leal MUTEX(%ebx), %edx
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_lock_wait
jmp 2b
@@ -138,7 +138,7 @@ __pthread_rwlock_rdlock:
#else
leal MUTEX(%ebx), %eax
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_unlock_wake
jmp 7b
@@ -158,7 +158,7 @@ __pthread_rwlock_rdlock:
#else
leal MUTEX(%ebx), %eax
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_unlock_wake
jmp 11b
@@ -168,7 +168,7 @@ __pthread_rwlock_rdlock:
#else
leal MUTEX(%ebx), %edx
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_lock_wait
jmp 13b
.size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
index 0d96e03252..89027284ec 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S
@@ -162,7 +162,7 @@ pthread_rwlock_timedrdlock:
#else
leal MUTEX(%ebp), %edx
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_lock_wait
jmp 2b
@@ -177,7 +177,7 @@ pthread_rwlock_timedrdlock:
#else
leal MUTEX(%ebp), %eax
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_unlock_wake
jmp 7b
@@ -197,7 +197,7 @@ pthread_rwlock_timedrdlock:
#else
leal MUTEX(%ebp), %eax
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_unlock_wake
jmp 11b
@@ -207,7 +207,7 @@ pthread_rwlock_timedrdlock:
#else
leal MUTEX(%ebp), %edx
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_lock_wait
jmp 13b
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
index e78fdf6dda..0cf02e057e 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S
@@ -160,7 +160,7 @@ pthread_rwlock_timedwrlock:
#else
leal MUTEX(%ebp), %edx
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_lock_wait
jmp 2b
@@ -175,7 +175,7 @@ pthread_rwlock_timedwrlock:
#else
leal MUTEX(%ebp), %eax
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_unlock_wake
jmp 7b
@@ -190,7 +190,7 @@ pthread_rwlock_timedwrlock:
#else
leal MUTEX(%ebp), %eax
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_unlock_wake
jmp 11b
@@ -200,7 +200,7 @@ pthread_rwlock_timedwrlock:
#else
leal MUTEX(%ebp), %edx
#endif
- movl PSHARED(%ebp), %ecx
+ movzbl PSHARED(%ebp), %ecx
call __lll_lock_wait
jmp 13b
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S
index a23e1b50a8..bf9c33ea9f 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S
@@ -110,7 +110,7 @@ __pthread_rwlock_unlock:
#else
leal MUTEX(%edi), %edx
#endif
- movl PSHARED(%edi), %ecx
+ movzbl PSHARED(%edi), %ecx
call __lll_lock_wait
jmp 2b
@@ -120,7 +120,7 @@ __pthread_rwlock_unlock:
#else
leal MUTEX(%edi), %eax
#endif
- movl PSHARED(%edi), %ecx
+ movzbl PSHARED(%edi), %ecx
call __lll_unlock_wake
jmp 4b
@@ -130,7 +130,7 @@ __pthread_rwlock_unlock:
#else
leal MUTEX(%edi), %eax
#endif
- movl PSHARED(%edi), %ecx
+ movzbl PSHARED(%edi), %ecx
call __lll_unlock_wake
jmp 8b
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
index 65b99fe7d3..d13bb5132c 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S
@@ -120,7 +120,7 @@ __pthread_rwlock_wrlock:
#else
leal MUTEX(%ebx), %edx
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_lock_wait
jmp 2b
@@ -135,7 +135,7 @@ __pthread_rwlock_wrlock:
#else
leal MUTEX(%ebx), %eax
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_unlock_wake
jmp 7b
@@ -149,7 +149,7 @@ __pthread_rwlock_wrlock:
#else
leal MUTEX(%ebx), %eax
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_unlock_wake
jmp 11b
@@ -159,7 +159,7 @@ __pthread_rwlock_wrlock:
#else
leal MUTEX(%ebx), %edx
#endif
- movl PSHARED(%ebx), %ecx
+ movzbl PSHARED(%ebx), %ecx
call __lll_lock_wait
jmp 13b
.size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
diff --git a/nscd/Makefile b/nscd/Makefile
index f83e40049a..51badea201 100644
--- a/nscd/Makefile
+++ b/nscd/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1998,2000,2002,2003,2004,2005,2006,2007
+# Copyright (C) 1998,2000,2002,2003,2004,2005,2006,2007,2008
# Free Software Foundation, Inc.
# This file is part of the GNU C Library.
diff --git a/nscd/aicache.c b/nscd/aicache.c
index 3de84821a4..918efc9f39 100644
--- a/nscd/aicache.c
+++ b/nscd/aicache.c
@@ -1,5 +1,5 @@
/* Cache handling for host lookup.
- Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -21,6 +21,7 @@
#include <errno.h>
#include <libintl.h>
#include <netdb.h>
+#include <nss.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
@@ -33,6 +34,10 @@
#endif
+typedef enum nss_status (*nss_gethostbyname4_r)
+ (const char *name, struct gaih_addrtuple **pat,
+ char *buffer, size_t buflen, int *errnop,
+ int *h_errnop, int32_t *ttlp);
typedef enum nss_status (*nss_gethostbyname3_r)
(const char *name, int af, struct hostent *host,
char *buffer, size_t buflen, int *errnop,
@@ -117,16 +122,104 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
while (!no_more)
{
+ void *cp;
int status[2] = { NSS_STATUS_UNAVAIL, NSS_STATUS_UNAVAIL };
+ int naddrs = 0;
+ size_t addrslen = 0;
+ size_t canonlen;
+
+ nss_gethostbyname4_r fct4 = __nss_lookup_function (nip,
+ "gethostbyname4_r");
+ if (fct4 != NULL)
+ {
+ struct gaih_addrtuple *at = NULL;
+ while (1)
+ {
+ rc6 = 0;
+ status[0] = DL_CALL_FCT (fct4, (key, &at, tmpbuf6, tmpbuf6len,
+ &rc6, &herrno, &ttl));
+ if (rc6 != ERANGE || herrno != NETDB_INTERNAL)
+ break;
+ tmpbuf6 = extend_alloca (tmpbuf6, tmpbuf6len, 2 * tmpbuf6len);
+ }
+
+ if (rc6 != 0 && herrno == NETDB_INTERNAL)
+ goto out;
- /* Prefer the function which also returns the TTL and canonical name. */
- nss_gethostbyname3_r fct = __nss_lookup_function (nip,
- "gethostbyname3_r");
- if (fct == NULL)
- fct = __nss_lookup_function (nip, "gethostbyname2_r");
+ if (status[0] != NSS_STATUS_SUCCESS)
+ goto next_nip;
+
+ /* We found the data. Count the addresses and the size. */
+ for (struct gaih_addrtuple *at2 = at; at2 != NULL; at2 = at2->next)
+ {
+ ++naddrs;
+ /* We handle unknown types here the best we can: assume
+ the maximum size for the address. */
+ if (at2->family == AF_INET)
+ addrslen += INADDRSZ;
+ else if (at2->family == AF_INET6
+ && IN6ADDRSZ != sizeof (at2->addr))
+ addrslen += IN6ADDRSZ;
+ else
+ addrslen += sizeof (at2->addr);
+ }
+ canon = at->name;
+ canonlen = strlen (canon) + 1;
+
+ total = sizeof (*dataset) + naddrs + addrslen + canonlen;
+
+ /* Now we can allocate the data structure. If the TTL of the
+ entry is reported as zero do not cache the entry at all. */
+ if (ttl != 0 && he == NULL)
+ {
+ dataset = (struct dataset *) mempool_alloc (db, total
+ + req->key_len,
+ IDX_result_data);
+ if (dataset == NULL)
+ ++db->head->addfailed;
+ }
+
+ if (dataset == NULL)
+ {
+ /* We cannot permanently add the result in the moment. But
+ we can provide the result as is. Store the data in some
+ temporary memory. */
+ dataset = (struct dataset *) alloca (total + req->key_len);
+
+ /* We cannot add this record to the permanent database. */
+ alloca_used = true;
+ }
- if (fct != NULL)
+ /* Fill in the address and address families. */
+ char *addrs = (char *) (&dataset->resp + 1);
+ uint8_t *family = (uint8_t *) (addrs + addrslen);
+
+ for (struct gaih_addrtuple *at2 = at; at2 != NULL; at2 = at2->next)
+ {
+ *family++ = at2->family;
+ if (at2->family == AF_INET)
+ addrs = mempcpy (addrs, at2->addr, INADDRSZ);
+ else if (at2->family == AF_INET6
+ && IN6ADDRSZ != sizeof (at2->addr))
+ addrs = mempcpy (addrs, at2->addr, IN6ADDRSZ);
+ else
+ addrs = mempcpy (addrs, at2->addr, sizeof (at2->addr));
+ }
+
+ cp = family;
+ }
+ else
{
+ /* Prefer the function which also returns the TTL and
+ canonical name. */
+ nss_gethostbyname3_r fct = __nss_lookup_function (nip,
+ "gethostbyname3_r");
+ if (fct == NULL)
+ fct = __nss_lookup_function (nip, "gethostbyname2_r");
+
+ if (fct == NULL)
+ goto next_nip;
+
struct hostent th[2];
/* Collect IPv6 information first. */
@@ -134,8 +227,8 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
{
rc6 = 0;
status[0] = DL_CALL_FCT (fct, (key, AF_INET6, &th[0], tmpbuf6,
- tmpbuf6len, &rc6, &herrno,
- &ttl, &canon));
+ tmpbuf6len, &rc6, &herrno, &ttl,
+ &canon));
if (rc6 != ERANGE || herrno != NETDB_INTERNAL)
break;
tmpbuf6 = extend_alloca (tmpbuf6, tmpbuf6len, 2 * tmpbuf6len);
@@ -173,231 +266,226 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
if (rc4 != 0 && herrno == NETDB_INTERNAL)
goto out;
- if (status[0] == NSS_STATUS_SUCCESS
- || status[1] == NSS_STATUS_SUCCESS)
+ if (status[0] != NSS_STATUS_SUCCESS
+ && status[1] != NSS_STATUS_SUCCESS)
+ goto next_nip;
+
+ /* We found the data. Count the addresses and the size. */
+ for (int j = 0; j < 2; ++j)
+ if (status[j] == NSS_STATUS_SUCCESS)
+ for (int i = 0; th[j].h_addr_list[i] != NULL; ++i)
+ {
+ ++naddrs;
+ addrslen += th[j].h_length;
+ }
+
+ if (canon == NULL)
{
- /* We found the data. Count the addresses and the size. */
- int naddrs = 0;
- size_t addrslen = 0;
- for (int j = 0; j < 2; ++j)
- if (status[j] == NSS_STATUS_SUCCESS)
- for (int i = 0; th[j].h_addr_list[i] != NULL; ++i)
+ /* Determine the canonical name. */
+ nss_getcanonname_r cfct;
+ cfct = __nss_lookup_function (nip, "getcanonname_r");
+ if (cfct != NULL)
+ {
+ const size_t max_fqdn_len = 256;
+ char *buf = alloca (max_fqdn_len);
+ char *s;
+ int rc;
+
+ if (DL_CALL_FCT (cfct, (key, buf, max_fqdn_len, &s,
+ &rc, &herrno))
+ == NSS_STATUS_SUCCESS)
+ canon = s;
+ else
+ /* Set to name now to avoid using gethostbyaddr. */
+ canon = key;
+ }
+ else
+ {
+ struct hostent *he = NULL;
+ int herrno;
+ struct hostent he_mem;
+ void *addr;
+ size_t addrlen;
+ int addrfamily;
+
+ if (status[1] == NSS_STATUS_SUCCESS)
+ {
+ addr = th[1].h_addr_list[0];
+ addrlen = sizeof (struct in_addr);
+ addrfamily = AF_INET;
+ }
+ else
{
- ++naddrs;
- addrslen += th[j].h_length;
+ addr = th[0].h_addr_list[0];
+ addrlen = sizeof (struct in6_addr);
+ addrfamily = AF_INET6;
}
- if (canon == NULL)
- {
- /* Determine the canonical name. */
- nss_getcanonname_r cfct;
- cfct = __nss_lookup_function (nip, "getcanonname_r");
- if (cfct != NULL)
+ size_t tmpbuflen = 512;
+ char *tmpbuf = alloca (tmpbuflen);
+ int rc;
+ while (1)
{
- const size_t max_fqdn_len = 256;
- char *buf = alloca (max_fqdn_len);
- char *s;
- int rc;
-
- if (DL_CALL_FCT (cfct, (key, buf, max_fqdn_len, &s, &rc,
- &herrno)) == NSS_STATUS_SUCCESS)
- canon = s;
- else
- /* Set to name now to avoid using gethostbyaddr. */
- canon = key;
+ rc = __gethostbyaddr2_r (addr, addrlen, addrfamily,
+ &he_mem, tmpbuf, tmpbuflen,
+ &he, &herrno, NULL);
+ if (rc != ERANGE || herrno != NETDB_INTERNAL)
+ break;
+ tmpbuf = extend_alloca (tmpbuf, tmpbuflen,
+ tmpbuflen * 2);
}
- else
+
+ if (rc == 0)
{
- struct hostent *he = NULL;
- int herrno;
- struct hostent he_mem;
- void *addr;
- size_t addrlen;
- int addrfamily;
-
- if (status[1] == NSS_STATUS_SUCCESS)
- {
- addr = th[1].h_addr_list[0];
- addrlen = sizeof (struct in_addr);
- addrfamily = AF_INET;
- }
+ if (he != NULL)
+ canon = he->h_name;
else
- {
- addr = th[0].h_addr_list[0];
- addrlen = sizeof (struct in6_addr);
- addrfamily = AF_INET6;
- }
-
- size_t tmpbuflen = 512;
- char *tmpbuf = alloca (tmpbuflen);
- int rc;
- while (1)
- {
- rc = __gethostbyaddr2_r (addr, addrlen, addrfamily,
- &he_mem, tmpbuf, tmpbuflen,
- &he, &herrno, NULL);
- if (rc != ERANGE || herrno != NETDB_INTERNAL)
- break;
- tmpbuf = extend_alloca (tmpbuf, tmpbuflen,
- tmpbuflen * 2);
- }
-
- if (rc == 0)
- {
- if (he != NULL)
- canon = he->h_name;
- else
- canon = key;
- }
+ canon = key;
}
}
- size_t canonlen = canon == NULL ? 0 : (strlen (canon) + 1);
+ }
- total = sizeof (*dataset) + naddrs + addrslen + canonlen;
+ canonlen = canon == NULL ? 0 : (strlen (canon) + 1);
+
+ total = sizeof (*dataset) + naddrs + addrslen + canonlen;
- /* Now we can allocate the data structure. If the TTL
- of the entry is reported as zero do not cache the
- entry at all. */
- if (ttl != 0 && he == NULL)
- {
- dataset = (struct dataset *) mempool_alloc (db,
- total
- + req->key_len,
- IDX_result_data);
- if (dataset == NULL)
- ++db->head->addfailed;
- }
+ /* Now we can allocate the data structure. If the TTL of the
+ entry is reported as zero do not cache the entry at all. */
+ if (ttl != 0 && he == NULL)
+ {
+ dataset = (struct dataset *) mempool_alloc (db, total
+ + req->key_len,
+ IDX_result_data);
if (dataset == NULL)
- {
- /* We cannot permanently add the result in the moment. But
- we can provide the result as is. Store the data in some
- temporary memory. */
- dataset = (struct dataset *) alloca (total + req->key_len);
+ ++db->head->addfailed;
+ }
+
+ if (dataset == NULL)
+ {
+ /* We cannot permanently add the result in the moment. But
+ we can provide the result as is. Store the data in some
+ temporary memory. */
+ dataset = (struct dataset *) alloca (total + req->key_len);
+
+ /* We cannot add this record to the permanent database. */
+ alloca_used = true;
+ }
- /* We cannot add this record to the permanent database. */
- alloca_used = true;
+ /* Fill in the address and address families. */
+ char *addrs = (char *) (&dataset->resp + 1);
+ uint8_t *family = (uint8_t *) (addrs + addrslen);
+
+ for (int j = 0; j < 2; ++j)
+ if (status[j] == NSS_STATUS_SUCCESS)
+ for (int i = 0; th[j].h_addr_list[i] != NULL; ++i)
+ {
+ addrs = mempcpy (addrs, th[j].h_addr_list[i],
+ th[j].h_length);
+ *family++ = th[j].h_addrtype;
}
- dataset->head.allocsize = total + req->key_len;
- dataset->head.recsize = total - offsetof (struct dataset, resp);
- dataset->head.notfound = false;
- dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1);
- dataset->head.usable = true;
-
- /* Compute the timeout time. */
- dataset->head.timeout = time (NULL) + (ttl == INT32_MAX
- ? db->postimeout : ttl);
-
- dataset->resp.version = NSCD_VERSION;
- dataset->resp.found = 1;
- dataset->resp.naddrs = naddrs;
- dataset->resp.addrslen = addrslen;
- dataset->resp.canonlen = canonlen;
- dataset->resp.error = NETDB_SUCCESS;
-
- char *addrs = (char *) (&dataset->resp + 1);
- uint8_t *family = (uint8_t *) (addrs + addrslen);
-
- for (int j = 0; j < 2; ++j)
- if (status[j] == NSS_STATUS_SUCCESS)
- for (int i = 0; th[j].h_addr_list[i] != NULL; ++i)
- {
- addrs = mempcpy (addrs, th[j].h_addr_list[i],
- th[j].h_length);
- *family++ = th[j].h_addrtype;
- }
+ cp = family;
+ }
- void *cp = family;
- if (canon != NULL)
- cp = mempcpy (cp, canon, canonlen);
+ /* Fill in the rest of the dataset. */
+ dataset->head.allocsize = total + req->key_len;
+ dataset->head.recsize = total - offsetof (struct dataset, resp);
+ dataset->head.notfound = false;
+ dataset->head.nreloads = he == NULL ? 0 : (dh->nreloads + 1);
+ dataset->head.usable = true;
- key_copy = memcpy (cp, key, req->key_len);
+ /* Compute the timeout time. */
+ dataset->head.timeout = time (NULL) + (ttl == INT32_MAX
+ ? db->postimeout : ttl);
- /* Now we can determine whether on refill we have to
- create a new record or not. */
- if (he != NULL)
- {
- assert (fd == -1);
+ dataset->resp.version = NSCD_VERSION;
+ dataset->resp.found = 1;
+ dataset->resp.naddrs = naddrs;
+ dataset->resp.addrslen = addrslen;
+ dataset->resp.canonlen = canonlen;
+ dataset->resp.error = NETDB_SUCCESS;
- if (total + req->key_len == dh->allocsize
- && total - offsetof (struct dataset, resp) == dh->recsize
- && memcmp (&dataset->resp, dh->data,
- dh->allocsize
- - offsetof (struct dataset, resp)) == 0)
- {
- /* The data has not changed. We will just bump the
- timeout value. Note that the new record has been
- allocated on the stack and need not be freed. */
- dh->timeout = dataset->head.timeout;
- ++dh->nreloads;
- }
- else
- {
- /* We have to create a new record. Just allocate
- appropriate memory and copy it. */
- struct dataset *newp
- = (struct dataset *) mempool_alloc (db,
- total
- + req->key_len,
- IDX_result_data);
- if (__builtin_expect (newp != NULL, 1))
- {
- /* Adjust pointer into the memory block. */
- key_copy = (char *) newp + (key_copy
- - (char *) dataset);
-
- dataset = memcpy (newp, dataset,
- total + req->key_len);
- alloca_used = false;
- }
- else
- ++db->head->addfailed;
+ if (canon != NULL)
+ cp = mempcpy (cp, canon, canonlen);
- /* Mark the old record as obsolete. */
- dh->usable = false;
- }
+ key_copy = memcpy (cp, key, req->key_len);
+
+ /* Now we can determine whether on refill we have to create a
+ new record or not. */
+ if (he != NULL)
+ {
+ assert (fd == -1);
+
+ if (total + req->key_len == dh->allocsize
+ && total - offsetof (struct dataset, resp) == dh->recsize
+ && memcmp (&dataset->resp, dh->data,
+ dh->allocsize - offsetof (struct dataset,
+ resp)) == 0)
+ {
+ /* The data has not changed. We will just bump the
+ timeout value. Note that the new record has been
+ allocated on the stack and need not be freed. */
+ dh->timeout = dataset->head.timeout;
+ ++dh->nreloads;
+ }
+ else
+ {
+ /* We have to create a new record. Just allocate
+ appropriate memory and copy it. */
+ struct dataset *newp
+ = (struct dataset *) mempool_alloc (db, total + req->key_len,
+ IDX_result_data);
+ if (__builtin_expect (newp != NULL, 1))
+ {
+ /* Adjust pointer into the memory block. */
+ key_copy = (char *) newp + (key_copy - (char *) dataset);
+
+ dataset = memcpy (newp, dataset, total + req->key_len);
+ alloca_used = false;
}
else
- {
- /* We write the dataset before inserting it to the
- database since while inserting this thread might
- block and so would unnecessarily let the receiver
- wait. */
- assert (fd != -1);
+ ++db->head->addfailed;
+
+ /* Mark the old record as obsolete. */
+ dh->usable = false;
+ }
+ }
+ else
+ {
+ /* We write the dataset before inserting it to the database
+ since while inserting this thread might block and so
+ would unnecessarily let the receiver wait. */
+ assert (fd != -1);
#ifdef HAVE_SENDFILE
- if (__builtin_expect (db->mmap_used, 1) && !alloca_used)
- {
- assert (db->wr_fd != -1);
- assert ((char *) &dataset->resp > (char *) db->data);
- assert ((char *) &dataset->resp - (char *) db->head
- + total
- <= (sizeof (struct database_pers_head)
- + db->head->module * sizeof (ref_t)
- + db->head->data_size));
- ssize_t written;
- written = sendfileall (fd, db->wr_fd,
- (char *) &dataset->resp
- - (char *) db->head, total);
+ if (__builtin_expect (db->mmap_used, 1) && !alloca_used)
+ {
+ assert (db->wr_fd != -1);
+ assert ((char *) &dataset->resp > (char *) db->data);
+ assert ((char *) &dataset->resp - (char *) db->head + total
+ <= (sizeof (struct database_pers_head)
+ + db->head->module * sizeof (ref_t)
+ + db->head->data_size));
+ ssize_t written;
+ written = sendfileall (fd, db->wr_fd, (char *) &dataset->resp
+ - (char *) db->head, total);
# ifndef __ASSUME_SENDFILE
- if (written == -1 && errno == ENOSYS)
- goto use_write;
+ if (written == -1 && errno == ENOSYS)
+ goto use_write;
# endif
- }
- else
+ }
+ else
# ifndef __ASSUME_SENDFILE
- use_write:
+ use_write:
# endif
#endif
- writeall (fd, &dataset->resp, total);
- }
-
- goto out;
- }
-
+ writeall (fd, &dataset->resp, total);
}
+ goto out;
+
+next_nip:
if (nss_next_action (nip, status[1]) == NSS_ACTION_RETURN)
break;
@@ -468,10 +556,8 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (req->type, key_copy, req->key_len, &dataset->head, true,
- db, uid) < 0)
- /* Ensure the data can be recovered. */
- dataset->head.usable = false;
+ (void) cache_add (req->type, key_copy, req->key_len, &dataset->head,
+ true, db, uid);
pthread_rwlock_unlock (&db->lock);
diff --git a/nscd/cache.c b/nscd/cache.c
index 7e9b0dc2df..f4a9de530a 100644
--- a/nscd/cache.c
+++ b/nscd/cache.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1998, 1999, 2003-2006, 2007 Free Software Foundation, Inc.
+/* Copyright (c) 1998, 1999, 2003-2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -161,6 +161,11 @@ cache_add (int type, const void *key, size_t len, struct datahead *packet,
{
++table->head->addfailed;
+ /* If necessary mark the entry as unusable so that lookups will
+ not use it. */
+ if (first)
+ packet->usable = false;
+
/* Mark the in-flight memory as unused. */
for (enum in_flight idx = 0; idx < IDX_record_data; ++idx)
mem_in_flight.block[idx].dbidx = -1;
diff --git a/nscd/grpcache.c b/nscd/grpcache.c
index 57fcd0f7d2..9921ae313e 100644
--- a/nscd/grpcache.c
+++ b/nscd/grpcache.c
@@ -1,5 +1,5 @@
/* Cache handling for group lookup.
- Copyright (C) 1998-2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1998-2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -146,10 +146,8 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (req->type, &dataset->strdata, req->key_len,
- &dataset->head, true, db, owner) < 0)
- /* Ensure the data can be recovered. */
- dataset->head.usable = false;
+ (void) cache_add (req->type, &dataset->strdata, req->key_len,
+ &dataset->head, true, db, owner);
pthread_rwlock_unlock (&db->lock);
@@ -356,12 +354,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
{
if (cache_add (GETGRBYGID, cp, key_offset, &dataset->head, true,
db, owner) < 0)
- {
- /* Could not allocate memory. Make sure the data gets
- discarded. */
- dataset->head.usable = false;
- goto out;
- }
+ goto out;
first = false;
}
@@ -370,12 +363,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
{
if (cache_add (GETGRBYNAME, key_copy, key_len + 1,
&dataset->head, true, db, owner) < 0)
- {
- /* Could not allocate memory. Make sure the data gets
- discarded. */
- dataset->head.usable = false;
- goto out;
- }
+ goto out;
first = false;
}
@@ -389,12 +377,8 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
{
if (req->type == GETGRBYNAME && db->propagate)
(void) cache_add (GETGRBYGID, cp, key_offset, &dataset->head,
- req->type != GETGRBYNAME, db, owner);
+ false, db, owner);
}
- else if (first)
- /* Could not allocate memory. Make sure the data gets
- discarded. */
- dataset->head.usable = false;
out:
pthread_rwlock_unlock (&db->lock);
diff --git a/nscd/hstcache.c b/nscd/hstcache.c
index 7777723463..3ceb6715ce 100644
--- a/nscd/hstcache.c
+++ b/nscd/hstcache.c
@@ -1,5 +1,5 @@
/* Cache handling for host lookup.
- Copyright (C) 1998-2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1998-2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -155,10 +155,8 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (req->type, &dataset->strdata, req->key_len,
- &dataset->head, true, db, owner) < 0)
- /* Ensure the data can be recovered. */
- dataset->head.usable = false;
+ (void) cache_add (req->type, &dataset->strdata, req->key_len,
+ &dataset->head, true, db, owner);
pthread_rwlock_unlock (&db->lock);
@@ -409,11 +407,8 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|| req->type == GETHOSTBYADDR
|| req->type == GETHOSTBYADDRv6);
- if (cache_add (req->type, key_copy, req->key_len,
- &dataset->head, true, db, owner) < 0)
- /* Could not allocate memory. Make sure the
- data gets discarded. */
- dataset->head.usable = false;
+ (void) cache_add (req->type, key_copy, req->key_len,
+ &dataset->head, true, db, owner);
pthread_rwlock_unlock (&db->lock);
}
diff --git a/nscd/initgrcache.c b/nscd/initgrcache.c
index 6a95fb5992..94e909d4ae 100644
--- a/nscd/initgrcache.c
+++ b/nscd/initgrcache.c
@@ -1,5 +1,5 @@
/* Cache handling for host lookup.
- Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -230,10 +230,8 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (req->type, key_copy, req->key_len,
- &dataset->head, true, db, uid) < 0)
- /* Ensure the data can be recovered. */
- dataset->head.usable = false;
+ (void) cache_add (req->type, key_copy, req->key_len,
+ &dataset->head, true, db, uid);
pthread_rwlock_unlock (&db->lock);
@@ -399,11 +397,8 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (INITGROUPS, cp, req->key_len, &dataset->head, true,
- db, uid) < 0)
- /* Could not allocate memory. Make sure the data gets
- discarded. */
- dataset->head.usable = false;
+ (void) cache_add (INITGROUPS, cp, req->key_len, &dataset->head, true,
+ db, uid);
pthread_rwlock_unlock (&db->lock);
}
diff --git a/nscd/mem.c b/nscd/mem.c
index 508d9343d0..14928d633c 100644
--- a/nscd/mem.c
+++ b/nscd/mem.c
@@ -1,5 +1,5 @@
/* Cache memory handling.
- Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c
index 3d1e8241ec..2d0a26592c 100644
--- a/nscd/pwdcache.c
+++ b/nscd/pwdcache.c
@@ -1,5 +1,5 @@
/* Cache handling for passwd lookup.
- Copyright (C) 1998-2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1998-2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@@ -153,11 +153,8 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (req->type, key_copy, req->key_len,
- &dataset->head, true, db, owner) < 0)
- /* Ensure the data can be recovered. */
- dataset->head.usable = false;
-
+ (void) cache_add (req->type, key_copy, req->key_len,
+ &dataset->head, true, db, owner);
pthread_rwlock_unlock (&db->lock);
@@ -352,12 +349,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
{
if (cache_add (GETPWBYUID, cp, key_offset, &dataset->head, true,
db, owner) < 0)
- {
- /* Could not allocate memory. Make sure the data gets
- discarded. */
- dataset->head.usable = false;
- goto out;
- }
+ goto out;
first = false;
}
@@ -366,12 +358,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
{
if (cache_add (GETPWBYNAME, key_copy, key_len + 1,
&dataset->head, true, db, owner) < 0)
- {
- /* Could not allocate memory. Make sure the data gets
- discarded. */
- dataset->head.usable = false;
- goto out;
- }
+ goto out;
first = false;
}
@@ -384,12 +371,8 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
{
if (req->type == GETPWBYNAME && db->propagate)
(void) cache_add (GETPWBYUID, cp, key_offset, &dataset->head,
- req->type != GETPWBYNAME, db, owner);
+ false, db, owner);
}
- else if (first)
- /* Could not allocate memory. Make sure the data gets
- discarded. */
- dataset->head.usable = false;
out:
pthread_rwlock_unlock (&db->lock);
diff --git a/nscd/servicescache.c b/nscd/servicescache.c
index e2d1e26a2f..c6f0b47e35 100644
--- a/nscd/servicescache.c
+++ b/nscd/servicescache.c
@@ -1,5 +1,5 @@
/* Cache handling for services lookup.
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@drepper.com>, 2007.
@@ -136,10 +136,8 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (req->type, &dataset->strdata, req->key_len,
- &dataset->head, true, db, owner) < 0)
- /* Ensure the data can be recovered. */
- dataset->head.usable = false;
+ (void) cache_add (req->type, &dataset->strdata, req->key_len,
+ &dataset->head, true, db, owner);
pthread_rwlock_unlock (&db->lock);
@@ -332,11 +330,8 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
/* Now get the lock to safely insert the records. */
pthread_rwlock_rdlock (&db->lock);
- if (cache_add (req->type, key_copy, req->key_len,
- &dataset->head, true, db, owner) < 0)
- /* Could not allocate memory. Make sure the
- data gets discarded. */
- dataset->head.usable = false;
+ (void) cache_add (req->type, key_copy, req->key_len,
+ &dataset->head, true, db, owner);
pthread_rwlock_unlock (&db->lock);
}
diff --git a/nss/Versions b/nss/Versions
index 8f2f0fb371..f7f0e56979 100644
--- a/nss/Versions
+++ b/nss/Versions
@@ -38,6 +38,7 @@ libnss_files {
_nss_files_endhostent;
_nss_files_gethostbyaddr_r;
_nss_files_gethostbyname2_r;
+ _nss_files_gethostbyname4_r;
_nss_files_gethostbyname_r;
_nss_files_gethostent_r;
_nss_files_gethostton_r;
diff --git a/nss/getent.c b/nss/getent.c
index 28c6dce13b..c8173d0b51 100644
--- a/nss/getent.c
+++ b/nss/getent.c
@@ -337,6 +337,22 @@ ahosts_keys_int (int af, int xflags, int number, char *key[])
sockstr = "DGRAM";
else if (runp->ai_socktype == SOCK_RAW)
sockstr = "RAW";
+#ifdef SOCK_SEQPACKET
+ else if (runp->ai_socktype == SOCK_SEQPACKET)
+ sockstr = "SEQPACKET";
+#endif
+#ifdef SOCK_RDM
+ else if (runp->ai_socktype == SOCK_RDM)
+ sockstr = "RDM";
+#endif
+#ifdef SOCK_DCCP
+ else if (runp->ai_socktype == SOCK_DCCP)
+ sockstr = "DCCP";
+#endif
+#ifdef SOCK_PACKET
+ else if (runp->ai_socktype == SOCK_PACKET)
+ sockstr = "PACKET";
+#endif
else
{
snprintf (sockbuf, sizeof (sockbuf), "%d",
diff --git a/nss/nss.h b/nss/nss.h
index f5c12afab6..611b2580ad 100644
--- a/nss/nss.h
+++ b/nss/nss.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1999, 2008 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
@@ -23,6 +23,7 @@
#define _NSS_H 1
#include <features.h>
+#include <stdint.h>
__BEGIN_DECLS
@@ -38,6 +39,17 @@ enum nss_status
};
+/* Data structure used for the 'gethostbyname4_r' function. */
+struct gaih_addrtuple
+ {
+ struct gaih_addrtuple *next;
+ char *name;
+ int family;
+ uint32_t addr[4];
+ uint32_t scopeid;
+ };
+
+
/* Overwrite service selection for database DBNAME using specification
in STRING.
This function should only be used by system programs which have to
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
index b06467225b..7b69d47fcb 100644
--- a/nss/nss_files/files-hosts.c
+++ b/nss/nss_files/files-hosts.c
@@ -1,6 +1,5 @@
/* Hosts file parser in nss_files module.
- Copyright (C) 1996-2001, 2003, 2004, 2006, 2007
- Free Software Foundation, Inc.
+ Copyright (C) 1996-2001, 2003-2007, 2008 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
@@ -56,7 +55,10 @@ LINE_PARSER
STRING_FIELD (addr, isspace, 1);
/* Parse address. */
- if (inet_pton (af, addr, entdata->host_addr) <= 0)
+ if (inet_pton (af == AF_UNSPEC ? AF_INET : af, addr, entdata->host_addr)
+ > 0)
+ af = af == AF_UNSPEC ? AF_INET : af;
+ else
{
if (af == AF_INET6 && (flags & AI_V4MAPPED) != 0
&& inet_pton (AF_INET, addr, entdata->host_addr) > 0)
@@ -76,6 +78,9 @@ LINE_PARSER
/* Illegal address: ignore line. */
return 0;
}
+ else if (af == AF_UNSPEC
+ && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
+ af = AF_INET6;
else
/* Illegal address: ignore line. */
return 0;
@@ -101,8 +106,6 @@ _nss_files_get##name##_r (proto, \
struct STRUCTURE *result, char *buffer, \
size_t buflen, int *errnop H_ERRNO_PROTO) \
{ \
- enum nss_status status; \
- \
uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data); \
buffer += pad; \
buflen = buflen > pad ? buflen - pad : 0; \
@@ -110,7 +113,7 @@ _nss_files_get##name##_r (proto, \
__libc_lock_lock (lock); \
\
/* Reset file pointer to beginning or open file. */ \
- status = internal_setent (keep_stream); \
+ enum nss_status status = internal_setent (keep_stream); \
\
if (status == NSS_STATUS_SUCCESS) \
{ \
@@ -288,9 +291,9 @@ HOST_DB_LOOKUP (hostbyname, ,,
{
LOOKUP_NAME_CASE (h_name, h_aliases)
}, const char *name)
+#undef EXTRA_ARGS_VALUE
-#undef EXTRA_ARGS_VALUE
/* XXX Is using _res to determine whether we want to convert IPv4 addresses
to IPv6 addresses really the right thing to do? */
#define EXTRA_ARGS_VALUE \
@@ -299,8 +302,9 @@ HOST_DB_LOOKUP (hostbyname2, ,,
{
LOOKUP_NAME_CASE (h_name, h_aliases)
}, const char *name, int af)
-
#undef EXTRA_ARGS_VALUE
+
+
/* We only need to consider IPv4 mapped addresses if the input to the
gethostbyaddr() function is an IPv6 address. */
#define EXTRA_ARGS_VALUE \
@@ -311,3 +315,116 @@ DB_LOOKUP (hostbyaddr, ,,
&& ! memcmp (addr, result->h_addr_list[0], len))
break;
}, const void *addr, socklen_t len, int af)
+#undef EXTRA_ARGS_VALUE
+
+
+enum nss_status
+_nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
+ char *buffer, size_t buflen, int *errnop,
+ int *herrnop, int32_t *ttlp)
+{
+ __libc_lock_lock (lock);
+
+ /* Reset file pointer to beginning or open file. */
+ enum nss_status status = internal_setent (keep_stream);
+
+ if (status == NSS_STATUS_SUCCESS)
+ {
+ /* Tell getent function that we have repositioned the file pointer. */
+ last_use = getby;
+
+ bool any = false;
+ bool got_canon = false;
+ while (1)
+ {
+ /* Align the buffer for the next record. */
+ uintptr_t pad = (-(uintptr_t) buffer
+ % __alignof__ (struct hostent_data));
+ buffer += pad;
+ buflen = buflen > pad ? buflen - pad : 0;
+
+ struct hostent result;
+ status = internal_getent (&result, buffer, buflen, errnop
+ H_ERRNO_ARG, AF_UNSPEC, 0);
+ if (status != NSS_STATUS_SUCCESS)
+ break;
+
+ int naliases = 0;
+ if (__strcasecmp (name, result.h_name) != 0)
+ {
+ for (; result.h_aliases[naliases] != NULL; ++naliases)
+ if (! __strcasecmp (name, result.h_aliases[naliases]))
+ break;
+ if (result.h_aliases[naliases] == NULL)
+ continue;
+
+ /* We know this alias exist. Count it. */
+ ++naliases;
+ }
+
+ /* Determine how much memory has been used so far. */
+ // XXX It is not necessary to preserve the aliases array
+ while (result.h_aliases[naliases] != NULL)
+ ++naliases;
+ char *bufferend = (char *) &result.h_aliases[naliases + 1];
+ assert (buflen >= bufferend - buffer);
+ buflen -= bufferend - buffer;
+ buffer = bufferend;
+
+ /* We found something. */
+ any = true;
+
+ /* Create the record the caller expects. There is only one
+ address. */
+ assert (result.h_addr_list[1] == NULL);
+ if (*pat == NULL)
+ {
+ uintptr_t pad = (-(uintptr_t) buffer
+ % __alignof__ (struct gaih_addrtuple));
+ buffer += pad;
+ buflen = buflen > pad ? buflen - pad : 0;
+
+ if (__builtin_expect (buflen < sizeof (struct gaih_addrtuple),
+ 0))
+ {
+ *errnop = ERANGE;
+ *herrnop = NETDB_INTERNAL;
+ status = NSS_STATUS_TRYAGAIN;
+ break;
+ }
+
+ *pat = (struct gaih_addrtuple *) buffer;
+ buffer += sizeof (struct gaih_addrtuple);
+ buflen -= sizeof (struct gaih_addrtuple);
+ }
+
+ (*pat)->next = NULL;
+ (*pat)->name = got_canon ? NULL : result.h_name;
+ got_canon = true;
+ (*pat)->family = result.h_addrtype;
+ memcpy ((*pat)->addr, result.h_addr_list[0], result.h_length);
+ (*pat)->scopeid = 0;
+
+ pat = &((*pat)->next);
+
+ /* If we only look for the first matching entry we are done. */
+ if ((_res_hconf.flags & HCONF_FLAG_MULTI) == 0)
+ break;
+ }
+
+ /* If we have to look for multiple records and found one, this
+ is a success. */
+ if (status == NSS_STATUS_NOTFOUND && any)
+ {
+ assert ((_res_hconf.flags & HCONF_FLAG_MULTI) != 0);
+ status = NSS_STATUS_SUCCESS;
+ }
+
+ if (! keep_stream)
+ internal_endent ();
+ }
+
+ __libc_lock_unlock (lock);
+
+ return status;
+}
diff --git a/po/lt.po b/po/lt.po
new file mode 100644
index 0000000000..3556ba06c2
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,7082 @@
+# translation of libc-2.7 to Lithuanian
+# Copyright (C) 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the glibc package.
+#
+# Gintautas Miliauskas <gintas@akl.lt>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: libc-2.7\n"
+"POT-Creation-Date: 2007-10-15 21:18-0700\n"
+"PO-Revision-Date: 2008-05-14 01:35+0300\n"
+"Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
+"Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: argp/argp-help.c:228
+#, c-format
+msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+msgstr "%.*s: ARGP_HELP_FMT parametrui rekia reikšmės"
+
+#: argp/argp-help.c:238
+#, c-format
+msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+msgstr "%.*s: Nežinomas ARGP_HELP_FMT parametras"
+
+#: argp/argp-help.c:251
+#, c-format
+msgid "Garbage in ARGP_HELP_FMT: %s"
+msgstr "Šiukšlės ARGP_HELP_FMT: %s"
+
+#: argp/argp-help.c:1215
+msgid "Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options."
+msgstr "Būtini ar nebūtini argumentai ilgiems parametrams atitinkamai būtini ar nebūtini trumpoms jų formoms."
+
+#: argp/argp-help.c:1601
+msgid "Usage:"
+msgstr "Naudojimas:"
+
+#: argp/argp-help.c:1605
+msgid " or: "
+msgstr " arba: "
+
+#: argp/argp-help.c:1617
+msgid " [OPTION...]"
+msgstr "[PARAMETRAS...]"
+
+#: argp/argp-help.c:1644
+#, fuzzy, c-format
+msgid "Try `%s --help' or `%s --usage' for more information.\n"
+msgstr "Pabandykite „memusage --help“, jei norite gauti daugiau informacijos."
+
+#: argp/argp-help.c:1672
+#, c-format
+msgid "Report bugs to %s.\n"
+msgstr "Praneškite apie klaidas %s.\n"
+
+#: argp/argp-parse.c:102
+msgid "Give this help list"
+msgstr "Pateikti šį pagalbinį sąrašą"
+
+#: argp/argp-parse.c:103
+msgid "Give a short usage message"
+msgstr "Pateikti trumpą pranešimą apie naudojimą"
+
+#: argp/argp-parse.c:104
+msgid "Set the program name"
+msgstr "Nustatyti programos pavadinimą"
+
+#: argp/argp-parse.c:106
+msgid "Hang for SECS seconds (default 3600)"
+msgstr "Laukti SECS sekundžių (standartiškai 3600)"
+
+#: argp/argp-parse.c:167
+msgid "Print program version"
+msgstr "Išspausdinti programos versiją"
+
+#: argp/argp-parse.c:183
+msgid "(PROGRAM ERROR) No version known!?"
+msgstr "(PROGRAM ERROR) Nežinoma joka versija!?"
+
+#: argp/argp-parse.c:623
+#, c-format
+msgid "%s: Too many arguments\n"
+msgstr "%s: Per daug argumentų\n"
+
+#: argp/argp-parse.c:766
+#, fuzzy
+msgid "(PROGRAM ERROR) Option should have been recognized!?"
+msgstr "(PROGRAM ERROR) Nežinoma joka versija!?"
+
+#: assert/assert-perr.c:57
+#, c-format
+msgid "%s%s%s:%u: %s%sUnexpected error: %s.\n"
+msgstr "%s%s%s:%u: %s%sNetikėta klaida: %s.\n"
+
+#: assert/assert.c:57
+#, c-format
+msgid "%s%s%s:%u: %s%sAssertion `%s' failed.\n"
+msgstr "%s%s%s:%u: %s%sPrielaida „%s“ pažeista.\n"
+
+#: catgets/gencat.c:110 catgets/gencat.c:114 nscd/nscd.c:97 nss/makedb.c:61
+msgid "NAME"
+msgstr "PAVADINIMAS"
+
+#: catgets/gencat.c:111
+msgid "Create C header file NAME containing symbol definitions"
+msgstr "Sukurti C antraščių failą duotu PAVADINIMU, kuriame surašyti simbolių apibrėžimus"
+
+#: catgets/gencat.c:113
+msgid "Do not use existing catalog, force new output file"
+msgstr "Nenaudoti egzistuojančio katalogo, kurti naują išvedimo failą"
+
+#: catgets/gencat.c:114 nss/makedb.c:61
+msgid "Write output to file NAME"
+msgstr "Išvesti į failą duotu PAVADINIMU"
+
+#: catgets/gencat.c:119
+msgid ""
+"Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE\n"
+"is -, output is written to standard output.\n"
+msgstr ""
+
+#: catgets/gencat.c:124
+msgid ""
+"-o OUTPUT-FILE [INPUT-FILE]...\n"
+"[OUTPUT-FILE [INPUT-FILE]...]"
+msgstr ""
+"-o IŠVEDIMO-FAILAS [DUOMENŲ-FAILAS]...\n"
+"[IŠVEDIMO-FAILAS [DUOMENŲ-FAILAS]...]"
+
+#: catgets/gencat.c:232 debug/pcprofiledump.c:204 iconv/iconv_prog.c:411
+#: iconv/iconvconfig.c:380 locale/programs/localedef.c:371
+#: login/programs/pt_chown.c:88 malloc/memusagestat.c:526 nss/makedb.c:231
+msgid ""
+"For bug reporting instructions, please see:\n"
+"<http://www.gnu.org/software/libc/bugs.html>.\n"
+msgstr ""
+
+#: catgets/gencat.c:246 debug/xtrace.sh:64 elf/ldconfig.c:296
+#: elf/ldd.bash.in:39 elf/sprof.c:355 iconv/iconv_prog.c:426
+#: iconv/iconvconfig.c:395 locale/programs/locale.c:275
+#: locale/programs/localedef.c:387 login/programs/pt_chown.c:59
+#: malloc/memusage.sh:71 nscd/nscd.c:406 nss/getent.c:83 nss/makedb.c:245
+#: posix/getconf.c:1012
+#, c-format
+msgid ""
+"Copyright (C) %s Free Software Foundation, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+#: catgets/gencat.c:251 debug/xtrace.sh:68 elf/ldconfig.c:301 elf/sprof.c:361
+#: iconv/iconv_prog.c:431 iconv/iconvconfig.c:400 locale/programs/locale.c:280
+#: locale/programs/localedef.c:392 malloc/memusage.sh:75 nscd/nscd.c:411
+#: nss/getent.c:88 nss/makedb.c:250 posix/getconf.c:1017
+#, c-format
+msgid "Written by %s.\n"
+msgstr "Parašė %s.\n"
+
+#: catgets/gencat.c:282
+msgid "*standard input*"
+msgstr "*standartinis įvedimas*"
+
+#: catgets/gencat.c:288 iconv/iconv_charmap.c:158 iconv/iconv_prog.c:298
+#: nss/makedb.c:170
+#, fuzzy, c-format
+msgid "cannot open input file `%s'"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: catgets/gencat.c:417 catgets/gencat.c:494
+#, fuzzy
+msgid "illegal set number"
+msgstr "nekorektiška eilutė"
+
+#: catgets/gencat.c:444
+msgid "duplicate set definition"
+msgstr "pakartotinis rinkinio apibrėžimas"
+
+#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677
+msgid "this is the first definition"
+msgstr "šis apibrėžimas pirmasis"
+
+#: catgets/gencat.c:522
+#, c-format
+msgid "unknown set `%s'"
+msgstr "nežinomas rinkinys „%s“"
+
+#: catgets/gencat.c:563
+#, fuzzy
+msgid "invalid quote character"
+msgstr "netaisyklingas kabučių simbolis"
+
+#: catgets/gencat.c:576
+#, c-format
+msgid "unknown directive `%s': line ignored"
+msgstr "nežinoma direktyva „%s“: eilutė ignoruota"
+
+#: catgets/gencat.c:621
+msgid "duplicated message number"
+msgstr "pakartotas pranešimo numeris"
+
+#: catgets/gencat.c:674
+msgid "duplicated message identifier"
+msgstr "pakartotas pranešimo identifikatorius"
+
+#: catgets/gencat.c:731
+#, fuzzy
+msgid "invalid character: message ignored"
+msgstr "netaisyklingas simbolis: pranešimas ignoruotas"
+
+#: catgets/gencat.c:774
+#, fuzzy
+msgid "invalid line"
+msgstr "nekorektiška eilutė"
+
+#: catgets/gencat.c:828
+msgid "malformed line ignored"
+msgstr "nekorektiška eilutė ignoruota"
+
+#: catgets/gencat.c:992 catgets/gencat.c:1033 nss/makedb.c:183
+#, fuzzy, c-format
+msgid "cannot open output file `%s'"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: catgets/gencat.c:1195 locale/programs/linereader.c:560
+#, fuzzy
+msgid "invalid escape sequence"
+msgstr "netaisyklingas naudotojas"
+
+#: catgets/gencat.c:1217
+msgid "unterminated message"
+msgstr "neužbaigtas pranešimas"
+
+#: catgets/gencat.c:1241
+#, fuzzy, c-format
+msgid "while opening old catalog file"
+msgstr "rašant duomenų bazės failą"
+
+#: catgets/gencat.c:1332
+#, fuzzy, c-format
+msgid "conversion modules not available"
+msgstr "RPC programa nerasta"
+
+#: catgets/gencat.c:1358
+#, c-format
+msgid "cannot determine escape character"
+msgstr ""
+
+#: debug/pcprofiledump.c:53
+msgid "Don't buffer output"
+msgstr ""
+
+#: debug/pcprofiledump.c:58
+msgid "Dump information generated by PC profiling."
+msgstr ""
+
+#: debug/pcprofiledump.c:61
+msgid "[FILE]"
+msgstr "[FAILAS]"
+
+#: debug/pcprofiledump.c:104
+#, fuzzy, c-format
+msgid "cannot open input file"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: debug/pcprofiledump.c:111
+#, c-format
+msgid "cannot read header"
+msgstr "nepavyko perskaityti antraštės"
+
+#: debug/pcprofiledump.c:175
+#, fuzzy, c-format
+msgid "invalid pointer size"
+msgstr "netaisyklingas naudotojas"
+
+#: debug/xtrace.sh:27 debug/xtrace.sh:45
+msgid "Usage: xtrace [OPTION]... PROGRAM [PROGRAMOPTION]...\\n"
+msgstr ""
+
+#: debug/xtrace.sh:33
+#, fuzzy
+msgid "Try \\`xtrace --help' for more information.\\n"
+msgstr "Pabandykite „memusage --help“, jei norite gauti daugiau informacijos."
+
+#: debug/xtrace.sh:39
+#, fuzzy
+msgid "xtrace: option \\`$1' requires an argument.\\n"
+msgstr "memusage: parametrui „$1“ reikia argumento"
+
+#: debug/xtrace.sh:46
+msgid ""
+"Trace execution of program by printing currently executed function.\n"
+"\n"
+" --data=FILE Don't run the program, just print the data from FILE.\n"
+"\n"
+" -?,--help Print this help and exit\n"
+" --usage Give a short usage message\n"
+" -V,--version Print version information and exit\n"
+"\n"
+"Mandatory arguments to long options are also mandatory for any corresponding\n"
+"short options.\n"
+"\n"
+"For bug reporting instructions, please see:\n"
+"<http://www.gnu.org/software/libc/bugs.html>.\\n"
+msgstr ""
+
+#: debug/xtrace.sh:125
+#, fuzzy
+msgid "xtrace: unrecognized option \\`$1'\\n"
+msgstr "%s: neatpažintas parametras „--%s“\n"
+
+#: debug/xtrace.sh:138
+msgid "No program name given\\n"
+msgstr "Nenurodytas programos vardas\\n"
+
+#: debug/xtrace.sh:146
+#, sh-format
+msgid "executable \\`$program' not found\\n"
+msgstr ""
+
+#: debug/xtrace.sh:150
+#, sh-format
+msgid "\\`$program' is no executable\\n"
+msgstr ""
+
+#: dlfcn/dlinfo.c:64
+msgid "RTLD_SELF used in code not dynamically loaded"
+msgstr "RTLD_SELF panaudotas ne dinamiškai įkeltame kode"
+
+#: dlfcn/dlinfo.c:73
+msgid "unsupported dlinfo request"
+msgstr "nepalaikoma dlinfo užklausa"
+
+#: dlfcn/dlmopen.c:64
+#, fuzzy
+msgid "invalid namespace"
+msgstr "netaisyklingas kvietėjas"
+
+#: dlfcn/dlmopen.c:69
+msgid "invalid mode"
+msgstr "netaisyklinga veiksena"
+
+#: dlfcn/dlopen.c:64
+#, fuzzy
+msgid "invalid mode parameter"
+msgstr "netaisyklinga veiksena"
+
+#: elf/cache.c:69
+#, fuzzy
+msgid "unknown"
+msgstr "%s: adresas nežinomas"
+
+#: elf/cache.c:112
+msgid "Unknown OS"
+msgstr "Nežinoma OS"
+
+#: elf/cache.c:117
+#, c-format
+msgid ", OS ABI: %s %d.%d.%d"
+msgstr ""
+
+#: elf/cache.c:134 elf/ldconfig.c:1270
+#, c-format
+msgid "Can't open cache file %s\n"
+msgstr "Nepavyko atverti podėlio failo %s\n"
+
+#: elf/cache.c:148
+#, fuzzy, c-format
+msgid "mmap of cache file failed.\n"
+msgstr "Nepavyko atverti podėlio failo %s\n"
+
+#: elf/cache.c:152 elf/cache.c:166
+#, c-format
+msgid "File is not a cache file.\n"
+msgstr "Failas nėra podėlio failas.\n"
+
+#: elf/cache.c:199 elf/cache.c:209
+#, c-format
+msgid "%d libs found in cache `%s'\n"
+msgstr "Rasta %d bibliotekų podėlyje „%s“\n"
+
+#: elf/cache.c:403
+#, fuzzy, c-format
+msgid "Can't create temporary cache file %s"
+msgstr "Nepavyko atverti podėlio failo %s\n"
+
+#: elf/cache.c:411 elf/cache.c:421 elf/cache.c:425 elf/cache.c:430
+#, c-format
+msgid "Writing of cache data failed"
+msgstr ""
+
+#: elf/cache.c:435
+#, fuzzy, c-format
+msgid "Changing access rights of %s to %#o failed"
+msgstr "%s pervardinimas į %s nesėkmingas"
+
+#: elf/cache.c:440
+#, c-format
+msgid "Renaming of %s to %s failed"
+msgstr "%s pervardinimas į %s nesėkmingas"
+
+#: elf/dl-close.c:378 elf/dl-open.c:460
+#, fuzzy
+msgid "cannot create scope list"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: elf/dl-close.c:724
+msgid "shared object not open"
+msgstr "bendrasis objektas neatvertas"
+
+#: elf/dl-deps.c:114
+msgid "DST not allowed in SUID/SGID programs"
+msgstr "DST neleidžiamas SUID/SGID programose"
+
+#: elf/dl-deps.c:127 elf/dl-open.c:282
+msgid "empty dynamic string token substitution"
+msgstr ""
+
+#: elf/dl-deps.c:133
+#, c-format
+msgid "cannot load auxiliary `%s' because of empty dynamic string token substitution\n"
+msgstr ""
+
+#: elf/dl-deps.c:474
+#, fuzzy
+msgid "cannot allocate dependency list"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: elf/dl-deps.c:510 elf/dl-deps.c:565
+#, fuzzy
+msgid "cannot allocate symbol search list"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: elf/dl-deps.c:550
+msgid "Filters not supported with LD_TRACE_PRELINKING"
+msgstr ""
+
+#: elf/dl-error.c:77
+msgid "DYNAMIC LINKER BUG!!!"
+msgstr ""
+
+#: elf/dl-error.c:124
+msgid "error while loading shared libraries"
+msgstr "klaida įkeliant bendrąsias bibliotekas"
+
+#: elf/dl-fptr.c:88
+msgid "cannot map pages for fdesc table"
+msgstr ""
+
+#: elf/dl-fptr.c:192
+msgid "cannot map pages for fptr table"
+msgstr ""
+
+#: elf/dl-fptr.c:221
+msgid "internal error: symidx out of range of fptr table"
+msgstr ""
+
+#: elf/dl-load.c:372
+#, fuzzy
+msgid "cannot allocate name record"
+msgstr "Nepavyko išskirti atminties"
+
+#: elf/dl-load.c:474 elf/dl-load.c:582 elf/dl-load.c:667 elf/dl-load.c:780
+#, fuzzy
+msgid "cannot create cache for search path"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: elf/dl-load.c:565
+msgid "cannot create RUNPATH/RPATH copy"
+msgstr ""
+
+#: elf/dl-load.c:653
+#, fuzzy
+msgid "cannot create search path array"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: elf/dl-load.c:864
+#, fuzzy
+msgid "cannot stat shared object"
+msgstr "nepavyko atverti bendrojo objekto failo"
+
+#: elf/dl-load.c:934
+#, fuzzy
+msgid "cannot open zero fill device"
+msgstr "nepavyko atverti duomenų failo „%s“"
+
+#: elf/dl-load.c:979 elf/dl-load.c:2224
+#, fuzzy
+msgid "cannot create shared object descriptor"
+msgstr "nepavyko užverti failo deskriptoriaus"
+
+#: elf/dl-load.c:998 elf/dl-load.c:1656 elf/dl-load.c:1748
+msgid "cannot read file data"
+msgstr "nepavyko nuskaityti failo duomenų"
+
+#: elf/dl-load.c:1042
+msgid "ELF load command alignment not page-aligned"
+msgstr ""
+
+#: elf/dl-load.c:1049
+msgid "ELF load command address/offset not properly aligned"
+msgstr ""
+
+#: elf/dl-load.c:1132
+msgid "cannot allocate TLS data structures for initial thread"
+msgstr ""
+
+#: elf/dl-load.c:1155
+msgid "cannot handle TLS data"
+msgstr "nepavyko apdoroti TLS duomenų"
+
+#: elf/dl-load.c:1174
+msgid "object file has no loadable segments"
+msgstr "objektiniame faile nėra įkeliamų segmentų"
+
+#: elf/dl-load.c:1210
+msgid "failed to map segment from shared object"
+msgstr ""
+
+#: elf/dl-load.c:1236
+#, fuzzy
+msgid "cannot dynamically load executable"
+msgstr "\tne dinaminis paleidžiamasis failas"
+
+#: elf/dl-load.c:1298
+#, fuzzy
+msgid "cannot change memory protections"
+msgstr "nepavyko išskirti atminties programos antraštei"
+
+#: elf/dl-load.c:1317
+msgid "cannot map zero-fill pages"
+msgstr ""
+
+#: elf/dl-load.c:1331
+msgid "object file has no dynamic section"
+msgstr "objektiniame faile nėra dinaminės sekcijos"
+
+#: elf/dl-load.c:1354
+msgid "shared object cannot be dlopen()ed"
+msgstr "bendrasis objektas negali būti atvertas su dlopen()"
+
+#: elf/dl-load.c:1367
+msgid "cannot allocate memory for program header"
+msgstr "nepavyko išskirti atminties programos antraštei"
+
+#: elf/dl-load.c:1384 elf/dl-open.c:218
+#, fuzzy
+msgid "invalid caller"
+msgstr "netaisyklingas kvietėjas"
+
+#: elf/dl-load.c:1423
+msgid "cannot enable executable stack as shared object requires"
+msgstr ""
+
+#: elf/dl-load.c:1436
+msgid "cannot close file descriptor"
+msgstr "nepavyko užverti failo deskriptoriaus"
+
+#: elf/dl-load.c:1478
+msgid "cannot create searchlist"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: elf/dl-load.c:1656
+msgid "file too short"
+msgstr "failas per trumpas"
+
+#: elf/dl-load.c:1685
+msgid "invalid ELF header"
+msgstr "netaisyklinga ELF antraštė"
+
+#: elf/dl-load.c:1697
+#, fuzzy
+msgid "ELF file data encoding not big-endian"
+msgstr "ELF failo duomenų koduotė ne big-endian"
+
+#: elf/dl-load.c:1699
+#, fuzzy
+msgid "ELF file data encoding not little-endian"
+msgstr "ELF failo duomenų koduotė ne big-endian"
+
+#: elf/dl-load.c:1703
+msgid "ELF file version ident does not match current one"
+msgstr "ELF failo versijos identifikatorius neatitinka esamo"
+
+#: elf/dl-load.c:1707
+msgid "ELF file OS ABI invalid"
+msgstr "ELF failo OS ABI netaisyklingas"
+
+#: elf/dl-load.c:1709
+msgid "ELF file ABI version invalid"
+msgstr "ELF failo ABI versioja netaisyklinga"
+
+#: elf/dl-load.c:1712
+#, fuzzy
+msgid "internal error"
+msgstr "Vardų paieškos vidinė klaida"
+
+#: elf/dl-load.c:1719
+msgid "ELF file version does not match current one"
+msgstr "ELF failo versija neatitinka esamos"
+
+#: elf/dl-load.c:1727
+msgid "only ET_DYN and ET_EXEC can be loaded"
+msgstr ""
+
+#: elf/dl-load.c:1733
+msgid "ELF file's phentsize not the expected size"
+msgstr ""
+
+#: elf/dl-load.c:2240
+msgid "wrong ELF class: ELFCLASS64"
+msgstr "klaidinga ELF klasė: ELFCLASS64"
+
+#: elf/dl-load.c:2241
+msgid "wrong ELF class: ELFCLASS32"
+msgstr "klaidinga ELF klasė: ELFCLASS32"
+
+#: elf/dl-load.c:2244
+#, fuzzy
+msgid "cannot open shared object file"
+msgstr "nepavyko atverti bendrojo objekto failo"
+
+#: elf/dl-lookup.c:356
+msgid "relocation error"
+msgstr "relokacijos klaida"
+
+#: elf/dl-lookup.c:384
+msgid "symbol lookup error"
+msgstr "simbolio paieškos klaida"
+
+#: elf/dl-open.c:114
+msgid "cannot extend global scope"
+msgstr ""
+
+#: elf/dl-open.c:512
+msgid "TLS generation counter wrapped! Please report this."
+msgstr "TLS kartų skaitiklis persivertė! Prašytume apie tai pranešti."
+
+#: elf/dl-open.c:549
+#, fuzzy
+msgid "invalid mode for dlopen()"
+msgstr "netaisyklinga veiksena dlopen()"
+
+#: elf/dl-open.c:566
+msgid "no more namespaces available for dlmopen()"
+msgstr ""
+
+#: elf/dl-open.c:579
+#, fuzzy
+msgid "invalid target namespace in dlmopen()"
+msgstr "netaisyklinga veiksena dlopen()"
+
+#: elf/dl-reloc.c:54
+#, fuzzy
+msgid "cannot allocate memory in static TLS block"
+msgstr "Nepavyko išskirti atminties"
+
+#: elf/dl-reloc.c:196
+msgid "cannot make segment writable for relocation"
+msgstr ""
+
+#: elf/dl-reloc.c:277
+#, c-format
+msgid "%s: no PLTREL found in object %s\n"
+msgstr "%s: objekte %s nerasta PLTREL\n"
+
+#: elf/dl-reloc.c:288
+#, c-format
+msgid "%s: out of memory to store relocation results for %s\n"
+msgstr ""
+
+#: elf/dl-reloc.c:304
+msgid "cannot restore segment prot after reloc"
+msgstr ""
+
+#: elf/dl-reloc.c:329
+msgid "cannot apply additional memory protection after relocation"
+msgstr ""
+
+#: elf/dl-sym.c:162
+#, fuzzy
+msgid "RTLD_NEXT used in code not dynamically loaded"
+msgstr "RTLD_SELF panaudotas ne dinamiškai įkeltame kode"
+
+#: elf/dl-sysdep.c:469 elf/dl-sysdep.c:481
+#, fuzzy
+msgid "cannot create capability list"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: elf/dl-tls.c:825
+#, fuzzy
+msgid "cannot create TLS data structures"
+msgstr "nepavyko apdoroti TLS duomenų"
+
+#: elf/dl-version.c:303
+#, fuzzy
+msgid "cannot allocate version reference table"
+msgstr "nepavyko išskirti atminties programos antraštei"
+
+#: elf/ldconfig.c:138
+msgid "Print cache"
+msgstr "Spausdinti podėlį"
+
+#: elf/ldconfig.c:139
+msgid "Generate verbose messages"
+msgstr "Generuoti išsamius pranešimus"
+
+#: elf/ldconfig.c:140
+msgid "Don't build cache"
+msgstr "Nekurti podėlio"
+
+#: elf/ldconfig.c:141
+msgid "Don't generate links"
+msgstr "Nekurti nuorodų"
+
+#: elf/ldconfig.c:142
+msgid "Change to and use ROOT as root directory"
+msgstr "Naudoti ŠAKNĮ kaip šakninį aplanką"
+
+#: elf/ldconfig.c:142
+msgid "ROOT"
+msgstr "ŠAKNIS"
+
+#: elf/ldconfig.c:143
+msgid "CACHE"
+msgstr "PODĖLIS"
+
+#: elf/ldconfig.c:143
+msgid "Use CACHE as cache file"
+msgstr "Naudoti PODĖLĮ kaip podėlio failą"
+
+#: elf/ldconfig.c:144
+msgid "CONF"
+msgstr "KONF"
+
+#: elf/ldconfig.c:144
+msgid "Use CONF as configuration file"
+msgstr "Naudoti KONF kaip konfigūracijos failą"
+
+#: elf/ldconfig.c:145
+msgid "Only process directories specified on the command line. Don't build cache."
+msgstr "Apdoroti tik aplankus, nurodytus komandų eilutėje. Nekurti podėlio."
+
+#: elf/ldconfig.c:146
+msgid "Manually link individual libraries."
+msgstr "Rankiniu būdu susaistyti (link) atskiras bibliotekas."
+
+#: elf/ldconfig.c:147
+msgid "FORMAT"
+msgstr "FORMATAS"
+
+#: elf/ldconfig.c:147
+msgid "Format to use: new, old or compat (default)"
+msgstr "Formatas: new (naujas), old (senas) arba compat (numatytasis)"
+
+#: elf/ldconfig.c:148
+msgid "Ignore auxiliary cache file"
+msgstr "Ignoruoti pagalbinį podėlio failą"
+
+#: elf/ldconfig.c:156
+msgid "Configure Dynamic Linker Run Time Bindings."
+msgstr ""
+
+#: elf/ldconfig.c:319
+#, fuzzy, c-format
+msgid "Path `%s' given more than once"
+msgstr "%s: laukas „%s“ apibrėžtas daugiau negu vieną kartą"
+
+#: elf/ldconfig.c:359
+#, c-format
+msgid "%s is not a known library type"
+msgstr "%s nėra žinomas bibliotekos tipas"
+
+#: elf/ldconfig.c:384
+#, fuzzy, c-format
+msgid "Can't stat %s"
+msgstr "Nepavyko rasti %s"
+
+#: elf/ldconfig.c:458
+#, fuzzy, c-format
+msgid "Can't stat %s\n"
+msgstr "Nepavyko susaistyti (link) %s su %s"
+
+#: elf/ldconfig.c:468
+#, fuzzy, c-format
+msgid "%s is not a symbolic link\n"
+msgstr "simbolinė nuoroda"
+
+#: elf/ldconfig.c:487
+#, fuzzy, c-format
+msgid "Can't unlink %s"
+msgstr "Nepavyko rasti %s"
+
+#: elf/ldconfig.c:493
+#, c-format
+msgid "Can't link %s to %s"
+msgstr "Nepavyko susaistyti (link) %s su %s"
+
+#: elf/ldconfig.c:499
+msgid " (changed)\n"
+msgstr " (pakeista)\n"
+
+#: elf/ldconfig.c:501
+msgid " (SKIPPED)\n"
+msgstr " (PRALEISTA)\n"
+
+#: elf/ldconfig.c:556
+#, c-format
+msgid "Can't find %s"
+msgstr "Nepavyko rasti %s"
+
+#: elf/ldconfig.c:572 elf/ldconfig.c:745 elf/ldconfig.c:793 elf/ldconfig.c:827
+#, fuzzy, c-format
+msgid "Cannot lstat %s"
+msgstr "%s: nepavyko perskaityti: %s"
+
+#: elf/ldconfig.c:579
+#, fuzzy, c-format
+msgid "Ignored file %s since it is not a regular file."
+msgstr "ne paprastas failas"
+
+#: elf/ldconfig.c:588
+#, c-format
+msgid "No link created since soname could not be found for %s"
+msgstr ""
+
+#: elf/ldconfig.c:671
+#, c-format
+msgid "Can't open directory %s"
+msgstr "Nepavyko atverti aplanko %s"
+
+#: elf/ldconfig.c:759
+#, fuzzy, c-format
+msgid "Cannot stat %s"
+msgstr "%s: nepavyko perskaityti: %s"
+
+#: elf/ldconfig.c:814 elf/readlib.c:91
+#, fuzzy, c-format
+msgid "Input file %s not found.\n"
+msgstr "Duomenų failas %s nerastas.\n"
+
+#: elf/ldconfig.c:888
+#, c-format
+msgid "libc5 library %s in wrong directory"
+msgstr "libc5 biblioteka %s ne tame aplanke"
+
+#: elf/ldconfig.c:891
+#, c-format
+msgid "libc6 library %s in wrong directory"
+msgstr "libc6 biblioteka %s ne tame aplanke"
+
+#: elf/ldconfig.c:894
+#, c-format
+msgid "libc4 library %s in wrong directory"
+msgstr "libc4 biblioteka %s ne tame aplanke"
+
+#: elf/ldconfig.c:922
+#, c-format
+msgid "libraries %s and %s in directory %s have same soname but different type."
+msgstr ""
+
+#: elf/ldconfig.c:1031
+#, c-format
+msgid "Can't open configuration file %s"
+msgstr "Nepavyko atverti konfigūracijos failo %s"
+
+#: elf/ldconfig.c:1095
+#, c-format
+msgid "%s:%u: bad syntax in hwcap line"
+msgstr "%s:%u: klaidinga sintaksė hwcap eilutėje"
+
+#: elf/ldconfig.c:1101
+#, c-format
+msgid "%s:%u: hwcap index %lu above maximum %u"
+msgstr ""
+
+#: elf/ldconfig.c:1108 elf/ldconfig.c:1116
+#, c-format
+msgid "%s:%u: hwcap index %lu already defined as %s"
+msgstr ""
+
+#: elf/ldconfig.c:1119
+#, c-format
+msgid "%s:%u: duplicate hwcap %lu %s"
+msgstr ""
+
+#: elf/ldconfig.c:1141
+#, c-format
+msgid "need absolute file name for configuration file when using -r"
+msgstr ""
+
+#: elf/ldconfig.c:1148 locale/programs/xmalloc.c:70 malloc/obstack.c:434
+#: malloc/obstack.c:436 posix/getconf.c:985 posix/getconf.c:1163
+#, c-format
+msgid "memory exhausted"
+msgstr "baigėsi atmintis"
+
+#: elf/ldconfig.c:1178
+#, fuzzy, c-format
+msgid "%s:%u: cannot read directory %s"
+msgstr "nepavyko atverti aplanko %s"
+
+#: elf/ldconfig.c:1223
+#, c-format
+msgid "relative path `%s' used to build cache"
+msgstr ""
+
+#: elf/ldconfig.c:1249
+#, fuzzy, c-format
+msgid "Can't chdir to /"
+msgstr "Nepavyko susaistyti (link) %s su %s"
+
+#: elf/ldconfig.c:1291
+#, c-format
+msgid "Can't open cache file directory %s\n"
+msgstr "Nepavyko atverti podėlio failo aplanko %s\n"
+
+#: elf/ldd.bash.in:43
+msgid "Written by %s and %s.\n"
+msgstr "Parašė %s ir %s.\n"
+
+#: elf/ldd.bash.in:48
+msgid ""
+"Usage: ldd [OPTION]... FILE...\n"
+" --help print this help and exit\n"
+" --version print version information and exit\n"
+" -d, --data-relocs process data relocations\n"
+" -r, --function-relocs process data and function relocations\n"
+" -u, --unused print unused direct dependencies\n"
+" -v, --verbose print all information\n"
+"For bug reporting instructions, please see:\n"
+"<http://www.gnu.org/software/libc/bugs.html>."
+msgstr ""
+
+#: elf/ldd.bash.in:80
+msgid "ldd: option \\`$1' is ambiguous"
+msgstr "ldd: parametras „$1“ dviprasmis"
+
+#: elf/ldd.bash.in:87
+msgid "unrecognized option"
+msgstr "neatpažintas parametras"
+
+#: elf/ldd.bash.in:88 elf/ldd.bash.in:126
+#, fuzzy
+msgid "Try \\`ldd --help' for more information."
+msgstr "Pabandykite „memusage --help“, jei norite gauti daugiau informacijos."
+
+#: elf/ldd.bash.in:125
+msgid "missing file arguments"
+msgstr "trūksta failo argumento"
+
+#. TRANS No such file or directory. This is a ``file doesn't exist'' error
+#. TRANS for ordinary files that are referenced in contexts where they are
+#. TRANS expected to already exist.
+#: elf/ldd.bash.in:148 sysdeps/gnu/errlist.c:36
+msgid "No such file or directory"
+msgstr "Toks failas ar aplankas neegzistuoja"
+
+#: elf/ldd.bash.in:151 inet/rcmd.c:483
+#, fuzzy
+msgid "not regular file"
+msgstr "paprastas failas"
+
+#: elf/ldd.bash.in:154
+msgid "warning: you do not have execution permission for"
+msgstr "įspėjimas: neturite teisės paleisti"
+
+#: elf/ldd.bash.in:183
+msgid "\tnot a dynamic executable"
+msgstr "\tne dinaminis paleidžiamasis failas"
+
+#: elf/ldd.bash.in:191
+msgid "exited with unknown exit code"
+msgstr "išėjo su nežinomu išėjimo kodu"
+
+#: elf/ldd.bash.in:196
+msgid "error: you do not have read permission for"
+msgstr "klaida: neturite skaitymo teisių"
+
+#: elf/readelflib.c:35
+#, c-format
+msgid "file %s is truncated\n"
+msgstr ""
+
+#: elf/readelflib.c:67
+#, c-format
+msgid "%s is a 32 bit ELF file.\n"
+msgstr "%s yra 32 bitų ELF failas.\n"
+
+#: elf/readelflib.c:69
+#, c-format
+msgid "%s is a 64 bit ELF file.\n"
+msgstr "%s yra 64 bitų ELF failas.\n"
+
+#: elf/readelflib.c:71
+#, c-format
+msgid "Unknown ELFCLASS in file %s.\n"
+msgstr "Netaisyklinga ELFCLASS faile %s.\n"
+
+#: elf/readelflib.c:78
+#, c-format
+msgid "%s is not a shared object file (Type: %d).\n"
+msgstr ""
+
+#: elf/readelflib.c:109
+#, c-format
+msgid "more than one dynamic segment\n"
+msgstr "daugiau negu vienas dinaminis segmentas\n"
+
+#: elf/readlib.c:97
+#, fuzzy, c-format
+msgid "Cannot fstat file %s.\n"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: elf/readlib.c:108
+#, c-format
+msgid "File %s is empty, not checked."
+msgstr "Failas %s tuščias, todėl netikrintas."
+
+#: elf/readlib.c:114
+#, c-format
+msgid "File %s is too small, not checked."
+msgstr "Failas %s per mažas, todėl netikrintas."
+
+#: elf/readlib.c:124
+#, fuzzy, c-format
+msgid "Cannot mmap file %s.\n"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: elf/readlib.c:162
+#, c-format
+msgid "%s is not an ELF file - it has the wrong magic bytes at the start.\n"
+msgstr "%s nėra ELF failas - magiškieji baitai failo pradžioje neteisingi.\n"
+
+#: elf/sprof.c:77
+msgid "Output selection:"
+msgstr ""
+
+#: elf/sprof.c:79
+msgid "print list of count paths and their number of use"
+msgstr ""
+
+#: elf/sprof.c:81
+msgid "generate flat profile with counts and ticks"
+msgstr ""
+
+#: elf/sprof.c:82
+msgid "generate call graph"
+msgstr ""
+
+#: elf/sprof.c:89
+msgid ""
+"Read and display shared object profiling data.\vFor bug reporting instructions, please see:\n"
+"<http://www.gnu.org/software/libc/bugs.html>.\n"
+msgstr ""
+
+#: elf/sprof.c:94
+msgid "SHOBJ [PROFDATA]"
+msgstr ""
+
+#: elf/sprof.c:400
+#, fuzzy, c-format
+msgid "failed to load shared object `%s'"
+msgstr "nepavyko atverti bendrojo objekto failo"
+
+#: elf/sprof.c:409
+#, fuzzy, c-format
+msgid "cannot create internal descriptors"
+msgstr "nepavyko užverti failo deskriptoriaus"
+
+#: elf/sprof.c:528
+#, fuzzy, c-format
+msgid "Reopening shared object `%s' failed"
+msgstr "nepavyko atverti bendrojo objekto failo"
+
+#: elf/sprof.c:535 elf/sprof.c:629
+#, fuzzy, c-format
+msgid "reading of section headers failed"
+msgstr "%s pervardinimas į %s nesėkmingas"
+
+#: elf/sprof.c:543 elf/sprof.c:637
+#, c-format
+msgid "reading of section header string table failed"
+msgstr ""
+
+#: elf/sprof.c:569
+#, c-format
+msgid "*** Cannot read debuginfo file name: %m\n"
+msgstr ""
+
+#: elf/sprof.c:589
+#, fuzzy, c-format
+msgid "cannot determine file name"
+msgstr "nepavyko nuskaityti failo duomenų"
+
+#: elf/sprof.c:622
+#, fuzzy, c-format
+msgid "reading of ELF header failed"
+msgstr "%s pervardinimas į %s nesėkmingas"
+
+#: elf/sprof.c:658
+#, c-format
+msgid "*** The file `%s' is stripped: no detailed analysis possible\n"
+msgstr ""
+
+#: elf/sprof.c:688
+#, fuzzy, c-format
+msgid "failed to load symbol data"
+msgstr "failas per trumpas"
+
+#: elf/sprof.c:755
+#, fuzzy, c-format
+msgid "cannot load profiling data"
+msgstr "nepavyko nuskaityti failo duomenų"
+
+#: elf/sprof.c:764
+#, fuzzy, c-format
+msgid "while stat'ing profiling data file"
+msgstr "rašant duomenų bazės failą"
+
+#: elf/sprof.c:772
+#, c-format
+msgid "profiling data file `%s' does not match shared object `%s'"
+msgstr ""
+
+#: elf/sprof.c:783
+#, c-format
+msgid "failed to mmap the profiling data file"
+msgstr ""
+
+#: elf/sprof.c:791
+#, fuzzy, c-format
+msgid "error while closing the profiling data file"
+msgstr "klaida užveriant išvedimo failą"
+
+#: elf/sprof.c:800 elf/sprof.c:870
+#, fuzzy, c-format
+msgid "cannot create internal descriptor"
+msgstr "nepavyko užverti failo deskriptoriaus"
+
+#: elf/sprof.c:846
+#, c-format
+msgid "`%s' is no correct profile data file for `%s'"
+msgstr ""
+
+#: elf/sprof.c:1027 elf/sprof.c:1085
+#, fuzzy, c-format
+msgid "cannot allocate symbol data"
+msgstr "Nepavyko išskirti atminties"
+
+#: iconv/iconv_charmap.c:176 iconv/iconv_prog.c:316
+#, fuzzy, c-format
+msgid "error while closing input `%s'"
+msgstr "klaida užveriant išvedimo failą"
+
+#: iconv/iconv_charmap.c:450
+#, c-format
+msgid "illegal input sequence at position %Zd"
+msgstr ""
+
+#: iconv/iconv_charmap.c:469 iconv/iconv_prog.c:526
+#, c-format
+msgid "incomplete character or shift sequence at end of buffer"
+msgstr ""
+
+#: iconv/iconv_charmap.c:514 iconv/iconv_charmap.c:550 iconv/iconv_prog.c:569
+#: iconv/iconv_prog.c:605
+#, fuzzy, c-format
+msgid "error while reading the input"
+msgstr "klaida įkeliant bendrąsias bibliotekas"
+
+#: iconv/iconv_charmap.c:532 iconv/iconv_prog.c:587
+#, c-format
+msgid "unable to allocate buffer for input"
+msgstr ""
+
+#: iconv/iconv_prog.c:60
+msgid "Input/Output format specification:"
+msgstr ""
+
+#: iconv/iconv_prog.c:61
+msgid "encoding of original text"
+msgstr "originalaus teksto koduotė"
+
+#: iconv/iconv_prog.c:62
+#, fuzzy
+msgid "encoding for output"
+msgstr "originalaus teksto koduotė"
+
+#: iconv/iconv_prog.c:63
+msgid "Information:"
+msgstr "Informacija:"
+
+#: iconv/iconv_prog.c:64
+msgid "list all known coded character sets"
+msgstr ""
+
+#: iconv/iconv_prog.c:65 locale/programs/localedef.c:127
+msgid "Output control:"
+msgstr ""
+
+#: iconv/iconv_prog.c:66
+msgid "omit invalid characters from output"
+msgstr ""
+
+#: iconv/iconv_prog.c:67
+#, fuzzy
+msgid "output file"
+msgstr "Išvesti į failą duotu PAVADINIMU"
+
+#: iconv/iconv_prog.c:68
+#, fuzzy
+msgid "suppress warnings"
+msgstr "įspėjimas: "
+
+#: iconv/iconv_prog.c:69
+#, fuzzy
+msgid "print progress information"
+msgstr "Spausdinti daugiau informacijos"
+
+#: iconv/iconv_prog.c:74
+msgid "Convert encoding of given files from one encoding to another."
+msgstr ""
+
+#: iconv/iconv_prog.c:78
+msgid "[FILE...]"
+msgstr "[FAILAS...]"
+
+#: iconv/iconv_prog.c:200
+#, fuzzy, c-format
+msgid "cannot open output file"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: iconv/iconv_prog.c:242
+#, c-format
+msgid "conversions from `%s' and to `%s' are not supported"
+msgstr ""
+
+#: iconv/iconv_prog.c:247
+#, fuzzy, c-format
+msgid "conversion from `%s' is not supported"
+msgstr "Operacija nepalaikoma"
+
+#: iconv/iconv_prog.c:254
+#, fuzzy, c-format
+msgid "conversion to `%s' is not supported"
+msgstr "Protokolas nepalaikomas"
+
+#: iconv/iconv_prog.c:258
+#, c-format
+msgid "conversion from `%s' to `%s' is not supported"
+msgstr ""
+
+#: iconv/iconv_prog.c:268
+#, c-format
+msgid "failed to start conversion processing"
+msgstr ""
+
+#: iconv/iconv_prog.c:362
+#, c-format
+msgid "error while closing output file"
+msgstr "klaida užveriant išvedimo failą"
+
+#: iconv/iconv_prog.c:471 iconv/iconv_prog.c:497
+#, c-format
+msgid "conversion stopped due to problem in writing the output"
+msgstr ""
+
+#: iconv/iconv_prog.c:522
+#, c-format
+msgid "illegal input sequence at position %ld"
+msgstr ""
+
+#: iconv/iconv_prog.c:530
+#, c-format
+msgid "internal error (illegal descriptor)"
+msgstr "vidinė klaida (nekorektiškas deskriptorius)"
+
+#: iconv/iconv_prog.c:533
+#, fuzzy, c-format
+msgid "unknown iconv() error %d"
+msgstr "nežinoma iconv() klaida %d"
+
+#: iconv/iconv_prog.c:779
+msgid ""
+"The following list contain all the coded character sets known. This does\n"
+"not necessarily mean that all combinations of these names can be used for\n"
+"the FROM and TO command line parameters. One coded character set can be\n"
+"listed with several different names (aliases).\n"
+"\n"
+" "
+msgstr ""
+
+#: iconv/iconvconfig.c:110
+#, fuzzy
+msgid "Create fastloading iconv module configuration file."
+msgstr "Nepavyko atverti konfigūracijos failo %s"
+
+#: iconv/iconvconfig.c:114
+#, fuzzy
+msgid "[DIR...]"
+msgstr "[FAILAS...]"
+
+#: iconv/iconvconfig.c:127
+msgid "Prefix used for all file accesses"
+msgstr ""
+
+#: iconv/iconvconfig.c:128
+msgid "Put output in FILE instead of installed location (--prefix does not apply to FILE)"
+msgstr ""
+
+#: iconv/iconvconfig.c:132
+msgid "Do not search standard directories, only those on the command line"
+msgstr ""
+
+#: iconv/iconvconfig.c:301
+#, c-format
+msgid "Directory arguments required when using --nostdlib"
+msgstr ""
+
+#: iconv/iconvconfig.c:343 locale/programs/localedef.c:291
+#, c-format
+msgid "no output file produced because warnings were issued"
+msgstr ""
+
+#: iconv/iconvconfig.c:429
+#, c-format
+msgid "while inserting in search tree"
+msgstr ""
+
+#: iconv/iconvconfig.c:1238
+#, fuzzy, c-format
+msgid "cannot generate output file"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: inet/rcmd.c:157
+#, fuzzy
+msgid "rcmd: Cannot allocate memory\n"
+msgstr "Nepavyko išskirti atminties"
+
+#: inet/rcmd.c:172
+msgid "rcmd: socket: All ports in use\n"
+msgstr ""
+
+#: inet/rcmd.c:200
+#, c-format
+msgid "connect to address %s: "
+msgstr "jungtis prie adreso %s: "
+
+#: inet/rcmd.c:213
+#, c-format
+msgid "Trying %s...\n"
+msgstr "Bandoma %s...\n"
+
+#: inet/rcmd.c:249
+#, c-format
+msgid "rcmd: write (setting up stderr): %m\n"
+msgstr ""
+
+#: inet/rcmd.c:265
+#, c-format
+msgid "rcmd: poll (setting up stderr): %m\n"
+msgstr ""
+
+#: inet/rcmd.c:268
+msgid "poll: protocol failure in circuit setup\n"
+msgstr ""
+
+#: inet/rcmd.c:301
+msgid "socket: protocol failure in circuit setup\n"
+msgstr ""
+
+#: inet/rcmd.c:325
+#, c-format
+msgid "rcmd: %s: short read"
+msgstr ""
+
+#: inet/rcmd.c:481
+msgid "lstat failed"
+msgstr ""
+
+#: inet/rcmd.c:488
+#, fuzzy
+msgid "cannot open"
+msgstr "nepavyko atverti"
+
+#: inet/rcmd.c:490
+msgid "fstat failed"
+msgstr ""
+
+#: inet/rcmd.c:492
+#, fuzzy
+msgid "bad owner"
+msgstr "blogas jungtukas"
+
+#: inet/rcmd.c:494
+msgid "writeable by other than owner"
+msgstr ""
+
+#: inet/rcmd.c:496
+msgid "hard linked somewhere"
+msgstr ""
+
+#: inet/ruserpass.c:170 inet/ruserpass.c:193
+msgid "out of memory"
+msgstr "baigėsi atmintis"
+
+#: inet/ruserpass.c:184
+msgid "Error: .netrc file is readable by others."
+msgstr ""
+
+#: inet/ruserpass.c:185
+msgid "Remove password or make file unreadable by others."
+msgstr ""
+
+#: inet/ruserpass.c:277
+#, fuzzy, c-format
+msgid "Unknown .netrc keyword %s"
+msgstr "Nežinoma klaida "
+
+#: libidn/nfkc.c:464
+#, fuzzy
+msgid "Character out of range for UTF-8"
+msgstr "Kanalo numeris už ribų"
+
+#: locale/programs/charmap-dir.c:59
+#, fuzzy, c-format
+msgid "cannot read character map directory `%s'"
+msgstr "nepavyko atverti aplanko %s"
+
+#: locale/programs/charmap.c:138
+#, fuzzy, c-format
+msgid "character map file `%s' not found"
+msgstr "Duomenų failas %s nerastas.\n"
+
+#: locale/programs/charmap.c:195
+#, c-format
+msgid "default character map file `%s' not found"
+msgstr ""
+
+#: locale/programs/charmap.c:258
+#, c-format
+msgid "character map `%s' is not ASCII compatible, locale not ISO C compliant\n"
+msgstr ""
+
+#: locale/programs/charmap.c:337
+#, c-format
+msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
+msgstr ""
+
+#: locale/programs/charmap.c:357 locale/programs/charmap.c:374
+#: locale/programs/repertoire.c:174
+#, fuzzy, c-format
+msgid "syntax error in prolog: %s"
+msgstr "sintaksės klaida prologe: %s"
+
+#: locale/programs/charmap.c:358
+#, fuzzy
+msgid "invalid definition"
+msgstr "%s: netaisyklingas parametras --%c\n"
+
+#: locale/programs/charmap.c:375 locale/programs/locfile.c:126
+#: locale/programs/locfile.c:153 locale/programs/repertoire.c:175
+#, fuzzy
+msgid "bad argument"
+msgstr "blogas argumentas"
+
+#: locale/programs/charmap.c:403
+#, c-format
+msgid "duplicate definition of <%s>"
+msgstr "kartotinis <%s> apibrėžimas"
+
+#: locale/programs/charmap.c:410
+#, c-format
+msgid "value for <%s> must be 1 or greater"
+msgstr "<%s> reikšmė turi būti 1 arba didesnė"
+
+#: locale/programs/charmap.c:422
+#, c-format
+msgid "value of <%s> must be greater or equal than the value of <%s>"
+msgstr "<%s> reikšmė turi būti lygi arba didesnė už <%s> reikšmę"
+
+#: locale/programs/charmap.c:445 locale/programs/repertoire.c:183
+#, c-format
+msgid "argument to <%s> must be a single character"
+msgstr "<%s> argumentas turi būti vienas simbolis"
+
+#: locale/programs/charmap.c:471
+msgid "character sets with locking states are not supported"
+msgstr ""
+
+#: locale/programs/charmap.c:498 locale/programs/charmap.c:552
+#: locale/programs/charmap.c:584 locale/programs/charmap.c:678
+#: locale/programs/charmap.c:733 locale/programs/charmap.c:774
+#: locale/programs/charmap.c:815
+#, fuzzy, c-format
+msgid "syntax error in %s definition: %s"
+msgstr "sintaksės klaida prologe: %s"
+
+#: locale/programs/charmap.c:499 locale/programs/charmap.c:679
+#: locale/programs/charmap.c:775 locale/programs/repertoire.c:230
+msgid "no symbolic name given"
+msgstr "neduotas joks simbolinis vardas"
+
+#: locale/programs/charmap.c:553
+msgid "invalid encoding given"
+msgstr "nurodyta netaisyklinga koduotė"
+
+#: locale/programs/charmap.c:562
+msgid "too few bytes in character encoding"
+msgstr "per mažai baitų simbolio koduotėje"
+
+#: locale/programs/charmap.c:564
+msgid "too many bytes in character encoding"
+msgstr "per daug baitų simbolio koduotėje"
+
+#: locale/programs/charmap.c:586 locale/programs/charmap.c:734
+#: locale/programs/charmap.c:817 locale/programs/repertoire.c:296
+#, fuzzy
+msgid "no symbolic name given for end of range"
+msgstr "neduotas joks simbolinis vardas"
+
+#: locale/programs/charmap.c:610 locale/programs/ld-address.c:600
+#: locale/programs/ld-collate.c:2767 locale/programs/ld-collate.c:3924
+#: locale/programs/ld-ctype.c:2232 locale/programs/ld-ctype.c:2984
+#: locale/programs/ld-identification.c:452
+#: locale/programs/ld-measurement.c:238 locale/programs/ld-messages.c:332
+#: locale/programs/ld-monetary.c:943 locale/programs/ld-name.c:307
+#: locale/programs/ld-numeric.c:368 locale/programs/ld-paper.c:241
+#: locale/programs/ld-telephone.c:313 locale/programs/ld-time.c:1221
+#: locale/programs/repertoire.c:313
+#, c-format
+msgid "%1$s: definition does not end with `END %1$s'"
+msgstr "%1$s: apibrėžimas neužbaigtas „END %1$s“"
+
+#: locale/programs/charmap.c:643
+msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
+msgstr ""
+
+#: locale/programs/charmap.c:651 locale/programs/charmap.c:714
+#, c-format
+msgid "value for %s must be an integer"
+msgstr "%s reikšmė turi būti sveikasis skaičius"
+
+#: locale/programs/charmap.c:842
+#, c-format
+msgid "%s: error in state machine"
+msgstr "%s: klaida būsenų automate"
+
+#: locale/programs/charmap.c:850 locale/programs/ld-address.c:616
+#: locale/programs/ld-collate.c:2764 locale/programs/ld-collate.c:4115
+#: locale/programs/ld-ctype.c:2229 locale/programs/ld-ctype.c:3001
+#: locale/programs/ld-identification.c:468
+#: locale/programs/ld-measurement.c:254 locale/programs/ld-messages.c:348
+#: locale/programs/ld-monetary.c:959 locale/programs/ld-name.c:323
+#: locale/programs/ld-numeric.c:384 locale/programs/ld-paper.c:257
+#: locale/programs/ld-telephone.c:329 locale/programs/ld-time.c:1237
+#: locale/programs/locfile.c:826 locale/programs/repertoire.c:324
+#, fuzzy, c-format
+msgid "%s: premature end of file"
+msgstr "%s: failo pabaiga"
+
+#: locale/programs/charmap.c:869 locale/programs/charmap.c:880
+#, c-format
+msgid "unknown character `%s'"
+msgstr "nežinomas simbolis „%s“"
+
+#: locale/programs/charmap.c:888
+#, c-format
+msgid "number of bytes for byte sequence of beginning and end of range not the same: %d vs %d"
+msgstr ""
+
+#: locale/programs/charmap.c:993 locale/programs/ld-collate.c:3047
+#: locale/programs/repertoire.c:419
+#, fuzzy
+msgid "invalid names for character range"
+msgstr "netaisyklingas kabučių simbolis"
+
+#: locale/programs/charmap.c:1005 locale/programs/repertoire.c:431
+msgid "hexadecimal range format should use only capital characters"
+msgstr ""
+
+#: locale/programs/charmap.c:1023 locale/programs/repertoire.c:449
+#, c-format
+msgid "<%s> and <%s> are invalid names for range"
+msgstr ""
+
+#: locale/programs/charmap.c:1029 locale/programs/repertoire.c:456
+msgid "upper limit in range is smaller than lower limit"
+msgstr "viršutinė riba mažesnė už apatinę ribą"
+
+#: locale/programs/charmap.c:1087
+msgid "resulting bytes for range not representable."
+msgstr ""
+
+#: locale/programs/ld-address.c:133 locale/programs/ld-collate.c:1556
+#: locale/programs/ld-ctype.c:420 locale/programs/ld-identification.c:133
+#: locale/programs/ld-measurement.c:94 locale/programs/ld-messages.c:97
+#: locale/programs/ld-monetary.c:194 locale/programs/ld-name.c:94
+#: locale/programs/ld-numeric.c:98 locale/programs/ld-paper.c:91
+#: locale/programs/ld-telephone.c:94 locale/programs/ld-time.c:159
+#, c-format
+msgid "No definition for %s category found"
+msgstr "Nerastas %s kategorijos apibrėžimas"
+
+#: locale/programs/ld-address.c:144 locale/programs/ld-address.c:182
+#: locale/programs/ld-address.c:200 locale/programs/ld-address.c:229
+#: locale/programs/ld-address.c:301 locale/programs/ld-address.c:320
+#: locale/programs/ld-address.c:333 locale/programs/ld-identification.c:146
+#: locale/programs/ld-measurement.c:105 locale/programs/ld-monetary.c:206
+#: locale/programs/ld-monetary.c:250 locale/programs/ld-monetary.c:266
+#: locale/programs/ld-monetary.c:278 locale/programs/ld-name.c:105
+#: locale/programs/ld-name.c:142 locale/programs/ld-numeric.c:112
+#: locale/programs/ld-numeric.c:126 locale/programs/ld-paper.c:102
+#: locale/programs/ld-paper.c:111 locale/programs/ld-telephone.c:105
+#: locale/programs/ld-telephone.c:162 locale/programs/ld-time.c:175
+#: locale/programs/ld-time.c:196
+#, fuzzy, c-format
+msgid "%s: field `%s' not defined"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/ld-address.c:156 locale/programs/ld-address.c:208
+#: locale/programs/ld-address.c:238 locale/programs/ld-address.c:276
+#: locale/programs/ld-name.c:117 locale/programs/ld-telephone.c:117
+#, c-format
+msgid "%s: field `%s' must not be empty"
+msgstr ""
+
+#: locale/programs/ld-address.c:168
+#, c-format
+msgid "%s: invalid escape `%%%c' sequence in field `%s'"
+msgstr ""
+
+#: locale/programs/ld-address.c:219
+#, fuzzy, c-format
+msgid "%s: terminology language code `%s' not defined"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/ld-address.c:244
+#, fuzzy, c-format
+msgid "%s: field `%s' must not be defined"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/ld-address.c:258 locale/programs/ld-address.c:287
+#, fuzzy, c-format
+msgid "%s: language abbreviation `%s' not defined"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/ld-address.c:265 locale/programs/ld-address.c:293
+#: locale/programs/ld-address.c:327 locale/programs/ld-address.c:339
+#, c-format
+msgid "%s: `%s' value does not match `%s' value"
+msgstr ""
+
+#: locale/programs/ld-address.c:312
+#, c-format
+msgid "%s: numeric country code `%d' not valid"
+msgstr ""
+
+#: locale/programs/ld-address.c:508 locale/programs/ld-address.c:545
+#: locale/programs/ld-address.c:583 locale/programs/ld-ctype.c:2608
+#: locale/programs/ld-identification.c:364
+#: locale/programs/ld-measurement.c:221 locale/programs/ld-messages.c:301
+#: locale/programs/ld-monetary.c:701 locale/programs/ld-monetary.c:736
+#: locale/programs/ld-monetary.c:777 locale/programs/ld-name.c:280
+#: locale/programs/ld-numeric.c:263 locale/programs/ld-paper.c:224
+#: locale/programs/ld-telephone.c:288 locale/programs/ld-time.c:1126
+#: locale/programs/ld-time.c:1168
+#, c-format
+msgid "%s: field `%s' declared more than once"
+msgstr "%s: laukas „%s“ apibrėžtas daugiau negu vieną kartą"
+
+#: locale/programs/ld-address.c:512 locale/programs/ld-address.c:550
+#: locale/programs/ld-identification.c:368 locale/programs/ld-messages.c:311
+#: locale/programs/ld-monetary.c:705 locale/programs/ld-monetary.c:740
+#: locale/programs/ld-name.c:284 locale/programs/ld-numeric.c:267
+#: locale/programs/ld-telephone.c:292 locale/programs/ld-time.c:1020
+#: locale/programs/ld-time.c:1089 locale/programs/ld-time.c:1131
+#, c-format
+msgid "%s: unknown character in field `%s'"
+msgstr "%s: nežinomas simbolis lauke „%s“"
+
+#: locale/programs/ld-address.c:597 locale/programs/ld-collate.c:3922
+#: locale/programs/ld-ctype.c:2981 locale/programs/ld-identification.c:449
+#: locale/programs/ld-measurement.c:235 locale/programs/ld-messages.c:330
+#: locale/programs/ld-monetary.c:941 locale/programs/ld-name.c:305
+#: locale/programs/ld-numeric.c:366 locale/programs/ld-paper.c:239
+#: locale/programs/ld-telephone.c:311 locale/programs/ld-time.c:1219
+#, c-format
+msgid "%s: incomplete `END' line"
+msgstr "%s: nepilna „END“ eilutė"
+
+#: locale/programs/ld-address.c:607 locale/programs/ld-collate.c:542
+#: locale/programs/ld-collate.c:594 locale/programs/ld-collate.c:890
+#: locale/programs/ld-collate.c:903 locale/programs/ld-collate.c:2733
+#: locale/programs/ld-collate.c:2754 locale/programs/ld-collate.c:4105
+#: locale/programs/ld-ctype.c:1960 locale/programs/ld-ctype.c:2219
+#: locale/programs/ld-ctype.c:2806 locale/programs/ld-ctype.c:2992
+#: locale/programs/ld-identification.c:459
+#: locale/programs/ld-measurement.c:245 locale/programs/ld-messages.c:339
+#: locale/programs/ld-monetary.c:950 locale/programs/ld-name.c:314
+#: locale/programs/ld-numeric.c:375 locale/programs/ld-paper.c:248
+#: locale/programs/ld-telephone.c:320 locale/programs/ld-time.c:1228
+#, c-format
+msgid "%s: syntax error"
+msgstr "%s: sintaksės klaida"
+
+#: locale/programs/ld-collate.c:417
+#, c-format
+msgid "`%.*s' already defined in charmap"
+msgstr ""
+
+#: locale/programs/ld-collate.c:426
+#, c-format
+msgid "`%.*s' already defined in repertoire"
+msgstr ""
+
+#: locale/programs/ld-collate.c:433
+#, c-format
+msgid "`%.*s' already defined as collating symbol"
+msgstr ""
+
+#: locale/programs/ld-collate.c:440
+#, c-format
+msgid "`%.*s' already defined as collating element"
+msgstr ""
+
+#: locale/programs/ld-collate.c:471 locale/programs/ld-collate.c:497
+#, c-format
+msgid "%s: `forward' and `backward' are mutually excluding each other"
+msgstr ""
+
+#: locale/programs/ld-collate.c:481 locale/programs/ld-collate.c:507
+#: locale/programs/ld-collate.c:523
+#, c-format
+msgid "%s: `%s' mentioned more than once in definition of weight %d"
+msgstr ""
+
+#: locale/programs/ld-collate.c:579
+#, c-format
+msgid "%s: too many rules; first entry only had %d"
+msgstr ""
+
+#: locale/programs/ld-collate.c:615
+#, c-format
+msgid "%s: not enough sorting rules"
+msgstr ""
+
+#: locale/programs/ld-collate.c:780
+#, c-format
+msgid "%s: empty weight string not allowed"
+msgstr ""
+
+#: locale/programs/ld-collate.c:875
+#, c-format
+msgid "%s: weights must use the same ellipsis symbol as the name"
+msgstr ""
+
+#: locale/programs/ld-collate.c:931
+#, fuzzy, c-format
+msgid "%s: too many values"
+msgstr "%s: Per daug argumentų\n"
+
+#: locale/programs/ld-collate.c:1051 locale/programs/ld-collate.c:1226
+#, c-format
+msgid "order for `%.*s' already defined at %s:%Zu"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1101
+#, c-format
+msgid "%s: the start and the end symbol of a range must stand for characters"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1128
+#, c-format
+msgid "%s: byte sequences of first and last character must have the same length"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1170
+#, c-format
+msgid "%s: byte sequence of first character of range is not lower than that of the last character"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1295
+#, c-format
+msgid "%s: symbolic range ellipsis must not directly follow `order_start'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1299
+#, c-format
+msgid "%s: symbolic range ellipsis must not be directly followed by `order_end'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1319 locale/programs/ld-ctype.c:1477
+#, c-format
+msgid "`%s' and `%.*s' are not valid names for symbolic range"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1369 locale/programs/ld-collate.c:3858
+#, c-format
+msgid "%s: order for `%.*s' already defined at %s:%Zu"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1378
+#, fuzzy, c-format
+msgid "%s: `%s' must be a character"
+msgstr "„%s“: trūksta formato simbolio"
+
+#: locale/programs/ld-collate.c:1573
+#, c-format
+msgid "%s: `position' must be used for a specific level in all sections or none"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1598
+#, c-format
+msgid "symbol `%s' not defined"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/ld-collate.c:1674 locale/programs/ld-collate.c:1780
+#, c-format
+msgid "symbol `%s' has the same encoding as"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1678 locale/programs/ld-collate.c:1784
+#, c-format
+msgid "symbol `%s'"
+msgstr "simbolis „%s“"
+
+#: locale/programs/ld-collate.c:1826
+#, c-format
+msgid "no definition of `UNDEFINED'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:1855
+#, c-format
+msgid "too many errors; giving up"
+msgstr "per daug klaidų; pasiduodu"
+
+#: locale/programs/ld-collate.c:2659 locale/programs/ld-collate.c:4044
+#, fuzzy, c-format
+msgid "%s: nested conditionals not supported"
+msgstr "Operacija nepalaikoma"
+
+#: locale/programs/ld-collate.c:2677
+#, c-format
+msgid "%s: more then one 'else'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:2852
+#, fuzzy, c-format
+msgid "%s: duplicate definition of `%s'"
+msgstr "kartotinis <%s> apibrėžimas"
+
+#: locale/programs/ld-collate.c:2888
+#, fuzzy, c-format
+msgid "%s: duplicate declaration of section `%s'"
+msgstr "kartotinis <%s> apibrėžimas"
+
+#: locale/programs/ld-collate.c:3027
+#, fuzzy, c-format
+msgid "%s: unknown character in collating symbol name"
+msgstr "%s: nežinomas simbolis lauke „%s“"
+
+#: locale/programs/ld-collate.c:3159
+#, fuzzy, c-format
+msgid "%s: unknown character in equivalent definition name"
+msgstr "%s: nežinomas simbolis lauke „%s“"
+
+#: locale/programs/ld-collate.c:3172
+#, fuzzy, c-format
+msgid "%s: unknown character in equivalent definition value"
+msgstr "%s: nežinomas simbolis lauke „%s“"
+
+#: locale/programs/ld-collate.c:3182
+#, c-format
+msgid "%s: unknown symbol `%s' in equivalent definition"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3191
+#, fuzzy
+msgid "error while adding equivalent collating symbol"
+msgstr "klaida įkeliant bendrąsias bibliotekas"
+
+#: locale/programs/ld-collate.c:3221
+#, fuzzy, c-format
+msgid "duplicate definition of script `%s'"
+msgstr "kartotinis <%s> apibrėžimas"
+
+#: locale/programs/ld-collate.c:3269
+#, fuzzy, c-format
+msgid "%s: unknown section name `%.*s'"
+msgstr "„%s“: nežinomas funkcijos pavadinimas"
+
+#: locale/programs/ld-collate.c:3298
+#, c-format
+msgid "%s: multiple order definitions for section `%s'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3326
+#, fuzzy, c-format
+msgid "%s: invalid number of sorting rules"
+msgstr "%s: netaisyklingas argumentas"
+
+#: locale/programs/ld-collate.c:3353
+#, c-format
+msgid "%s: multiple order definitions for unnamed section"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3407 locale/programs/ld-collate.c:3537
+#: locale/programs/ld-collate.c:3900
+#, fuzzy, c-format
+msgid "%s: missing `order_end' keyword"
+msgstr "%s: trūksta dvitaškio skirtuko"
+
+#: locale/programs/ld-collate.c:3470
+#, c-format
+msgid "%s: order for collating symbol %.*s not yet defined"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3488
+#, c-format
+msgid "%s: order for collating element %.*s not yet defined"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3499
+#, c-format
+msgid "%s: cannot reorder after %.*s: symbol not known"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3551 locale/programs/ld-collate.c:3912
+#, fuzzy, c-format
+msgid "%s: missing `reorder-end' keyword"
+msgstr "%s: trūksta dvitaškio skirtuko"
+
+#: locale/programs/ld-collate.c:3585 locale/programs/ld-collate.c:3783
+#, fuzzy, c-format
+msgid "%s: section `%.*s' not known"
+msgstr "Duomenų failas %s nerastas.\n"
+
+#: locale/programs/ld-collate.c:3650
+#, c-format
+msgid "%s: bad symbol <%.*s>"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3846
+#, c-format
+msgid "%s: cannot have `%s' as end of ellipsis range"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3896
+#, c-format
+msgid "%s: empty category description not allowed"
+msgstr ""
+
+#: locale/programs/ld-collate.c:3915
+#, c-format
+msgid "%s: missing `reorder-sections-end' keyword"
+msgstr ""
+
+#: locale/programs/ld-collate.c:4077
+#, c-format
+msgid "%s: '%s' without matching 'ifdef' or 'ifndef'"
+msgstr ""
+
+#: locale/programs/ld-collate.c:4095
+#, c-format
+msgid "%s: 'endif' without matching 'ifdef' or 'ifndef'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:439
+#, c-format
+msgid "No character set name specified in charmap"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:468
+#, c-format
+msgid "character L'\\u%0*x' in class `%s' must be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:483
+#, c-format
+msgid "character L'\\u%0*x' in class `%s' must not be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:497 locale/programs/ld-ctype.c:555
+#, c-format
+msgid "internal error in %s, line %u"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:526
+#, c-format
+msgid "character '%s' in class `%s' must be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:542
+#, c-format
+msgid "character '%s' in class `%s' must not be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:572 locale/programs/ld-ctype.c:610
+#, c-format
+msgid "<SP> character not in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:584 locale/programs/ld-ctype.c:621
+#, c-format
+msgid "<SP> character must not be in class `%s'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:599
+#, c-format
+msgid "character <SP> not defined in character map"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:714
+#, c-format
+msgid "`digit' category has not entries in groups of ten"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:763
+#, c-format
+msgid "no input digits defined and none of the standard names in the charmap"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:828
+#, c-format
+msgid "not all characters used in `outdigit' are available in the charmap"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:845
+#, c-format
+msgid "not all characters used in `outdigit' are available in the repertoire"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1245
+#, c-format
+msgid "character class `%s' already defined"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1251
+#, c-format
+msgid "implementation limit: no more than %Zd character classes allowed"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1277
+#, c-format
+msgid "character map `%s' already defined"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1283
+#, c-format
+msgid "implementation limit: no more than %d character maps allowed"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1548 locale/programs/ld-ctype.c:1673
+#: locale/programs/ld-ctype.c:1779 locale/programs/ld-ctype.c:2471
+#: locale/programs/ld-ctype.c:3467
+#, fuzzy, c-format
+msgid "%s: field `%s' does not contain exactly ten entries"
+msgstr "%s: laukas „%s“ apibrėžtas daugiau negu vieną kartą"
+
+#: locale/programs/ld-ctype.c:1576 locale/programs/ld-ctype.c:2150
+#, c-format
+msgid "to-value <U%0*X> of range is smaller than from-value <U%0*X>"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1703
+msgid "start and end character sequence of range must have the same length"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:1710
+msgid "to-value character sequence is smaller than from-value sequence"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2070 locale/programs/ld-ctype.c:2121
+msgid "premature end of `translit_ignore' definition"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2076 locale/programs/ld-ctype.c:2127
+#: locale/programs/ld-ctype.c:2169
+msgid "syntax error"
+msgstr "sintaksės klaida"
+
+#: locale/programs/ld-ctype.c:2303
+#, fuzzy, c-format
+msgid "%s: syntax error in definition of new character class"
+msgstr "sintaksės klaida %s aprašyme: %s"
+
+#: locale/programs/ld-ctype.c:2318
+#, c-format
+msgid "%s: syntax error in definition of new character map"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2493
+msgid "ellipsis range must be marked by two operands of same type"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2502
+msgid "with symbolic name range values the absolute ellipsis `...' must not be used"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2517
+msgid "with UCS range values one must use the hexadecimal symbolic ellipsis `..'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2531
+msgid "with character code range values one must use the absolute ellipsis `...'"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2682
+#, fuzzy, c-format
+msgid "duplicated definition for mapping `%s'"
+msgstr "kartotinis <%s> apibrėžimas"
+
+#: locale/programs/ld-ctype.c:2768 locale/programs/ld-ctype.c:2912
+#, fuzzy, c-format
+msgid "%s: `translit_start' section does not end with `translit_end'"
+msgstr "%1$s: apibrėžimas neužbaigtas „END %1$s“"
+
+#: locale/programs/ld-ctype.c:2863
+#, fuzzy, c-format
+msgid "%s: duplicate `default_missing' definition"
+msgstr "pakartotinis rinkinio apibrėžimas"
+
+#: locale/programs/ld-ctype.c:2868
+msgid "previous definition was here"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:2890
+#, c-format
+msgid "%s: no representable `default_missing' definition found"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:3043 locale/programs/ld-ctype.c:3127
+#: locale/programs/ld-ctype.c:3147 locale/programs/ld-ctype.c:3168
+#: locale/programs/ld-ctype.c:3189 locale/programs/ld-ctype.c:3210
+#: locale/programs/ld-ctype.c:3231 locale/programs/ld-ctype.c:3271
+#: locale/programs/ld-ctype.c:3292 locale/programs/ld-ctype.c:3359
+#: locale/programs/ld-ctype.c:3401 locale/programs/ld-ctype.c:3426
+#, c-format
+msgid "%s: character `%s' not defined while needed as default value"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:3048 locale/programs/ld-ctype.c:3132
+#: locale/programs/ld-ctype.c:3152 locale/programs/ld-ctype.c:3173
+#: locale/programs/ld-ctype.c:3194 locale/programs/ld-ctype.c:3215
+#: locale/programs/ld-ctype.c:3236 locale/programs/ld-ctype.c:3276
+#: locale/programs/ld-ctype.c:3297 locale/programs/ld-ctype.c:3364
+#, c-format
+msgid "%s: character `%s' in charmap not representable with one byte"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:3408 locale/programs/ld-ctype.c:3433
+#, c-format
+msgid "%s: character `%s' needed as default value not representable with one byte"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:3489
+#, c-format
+msgid "no output digits defined and none of the standard names in the charmap"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:3780
+#, c-format
+msgid "%s: transliteration data from locale `%s' not available"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:3881
+#, c-format
+msgid "%s: table for class \"%s\": %lu bytes\n"
+msgstr ""
+
+#: locale/programs/ld-ctype.c:3950
+#, fuzzy, c-format
+msgid "%s: table for map \"%s\": %lu bytes\n"
+msgstr "%s: nepavyko atverti %s: %m\n"
+
+#: locale/programs/ld-ctype.c:4083
+#, c-format
+msgid "%s: table for width: %lu bytes\n"
+msgstr ""
+
+#: locale/programs/ld-identification.c:170
+#, fuzzy, c-format
+msgid "%s: no identification for category `%s'"
+msgstr "Nerastas %s kategorijos apibrėžimas"
+
+#: locale/programs/ld-identification.c:435
+#, fuzzy, c-format
+msgid "%s: duplicate category version definition"
+msgstr "pakartotinis rinkinio apibrėžimas"
+
+#: locale/programs/ld-measurement.c:113
+#, fuzzy, c-format
+msgid "%s: invalid value for field `%s'"
+msgstr "%s: per mažai reikšmių laukui „%s“"
+
+#: locale/programs/ld-messages.c:114 locale/programs/ld-messages.c:148
+#, fuzzy, c-format
+msgid "%s: field `%s' undefined"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/ld-messages.c:121 locale/programs/ld-messages.c:155
+#: locale/programs/ld-monetary.c:256 locale/programs/ld-numeric.c:118
+#, fuzzy, c-format
+msgid "%s: value for field `%s' must not be an empty string"
+msgstr "%s reikšmė turi būti sveikasis skaičius"
+
+#: locale/programs/ld-messages.c:137 locale/programs/ld-messages.c:171
+#, fuzzy, c-format
+msgid "%s: no correct regular expression for field `%s': %s"
+msgstr "%s: nežinomas simbolis lauke „%s“"
+
+#: locale/programs/ld-monetary.c:224
+#, c-format
+msgid "%s: value of field `int_curr_symbol' has wrong length"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:237
+#, c-format
+msgid "%s: value of field `int_curr_symbol' does not correspond to a valid name in ISO 4217"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:285 locale/programs/ld-monetary.c:315
+#, fuzzy, c-format
+msgid "%s: value for field `%s' must be in range %d...%d"
+msgstr "%s reikšmė turi būti sveikasis skaičius"
+
+#: locale/programs/ld-monetary.c:747 locale/programs/ld-numeric.c:274
+#, fuzzy, c-format
+msgid "%s: value for field `%s' must be a single character"
+msgstr "<%s> argumentas turi būti vienas simbolis"
+
+#: locale/programs/ld-monetary.c:844 locale/programs/ld-numeric.c:318
+#, c-format
+msgid "%s: `-1' must be last entry in `%s' field"
+msgstr ""
+
+#: locale/programs/ld-monetary.c:866 locale/programs/ld-numeric.c:335
+#, fuzzy, c-format
+msgid "%s: values for field `%s' must be smaller than 127"
+msgstr "%s: per mažai reikšmių laukui „%s“"
+
+#: locale/programs/ld-monetary.c:909
+msgid "conversion rate value cannot be zero"
+msgstr ""
+
+#: locale/programs/ld-name.c:129 locale/programs/ld-telephone.c:126
+#: locale/programs/ld-telephone.c:149
+#, fuzzy, c-format
+msgid "%s: invalid escape sequence in field `%s'"
+msgstr "%s: nežinomas simbolis lauke „%s“"
+
+#: locale/programs/ld-time.c:247
+#, c-format
+msgid "%s: direction flag in string %Zd in `era' field is not '+' nor '-'"
+msgstr ""
+
+#: locale/programs/ld-time.c:258
+#, c-format
+msgid "%s: direction flag in string %Zd in `era' field is not a single character"
+msgstr ""
+
+#: locale/programs/ld-time.c:271
+#, c-format
+msgid "%s: invalid number for offset in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:279
+#, c-format
+msgid "%s: garbage at end of offset value in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:330
+#, c-format
+msgid "%s: invalid starting date in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:339
+#, c-format
+msgid "%s: garbage at end of starting date in string %Zd in `era' field "
+msgstr ""
+
+#: locale/programs/ld-time.c:358
+#, c-format
+msgid "%s: starting date is invalid in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:407
+#, c-format
+msgid "%s: invalid stopping date in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:416
+#, c-format
+msgid "%s: garbage at end of stopping date in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:435
+#, c-format
+msgid "%s: stopping date is invalid in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:444
+#, c-format
+msgid "%s: missing era name in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:456
+#, c-format
+msgid "%s: missing era format in string %Zd in `era' field"
+msgstr ""
+
+#: locale/programs/ld-time.c:497
+#, c-format
+msgid "%s: third operand for value of field `%s' must not be larger than %d"
+msgstr ""
+
+#: locale/programs/ld-time.c:505 locale/programs/ld-time.c:513
+#: locale/programs/ld-time.c:521
+#, fuzzy, c-format
+msgid "%s: values for field `%s' must not be larger than %d"
+msgstr "%s reikšmė turi būti sveikasis skaičius"
+
+#: locale/programs/ld-time.c:1004
+#, c-format
+msgid "%s: too few values for field `%s'"
+msgstr "%s: per mažai reikšmių laukui „%s“"
+
+#: locale/programs/ld-time.c:1049
+msgid "extra trailing semicolon"
+msgstr "papildomas kabliataškis pabaigoje"
+
+#: locale/programs/ld-time.c:1052
+#, fuzzy, c-format
+msgid "%s: too many values for field `%s'"
+msgstr "%s: per mažai reikšmių laukui „%s“"
+
+#: locale/programs/linereader.c:130
+msgid "trailing garbage at end of line"
+msgstr "šiukšlės eilutės pabaigoje"
+
+#: locale/programs/linereader.c:298
+msgid "garbage at end of number"
+msgstr "šiukšlės skaičiaus pabaigoje"
+
+#: locale/programs/linereader.c:410
+msgid "garbage at end of character code specification"
+msgstr ""
+
+#: locale/programs/linereader.c:496
+#, fuzzy
+msgid "unterminated symbolic name"
+msgstr "neužbaigtas pranešimas"
+
+#: locale/programs/linereader.c:623
+msgid "illegal escape sequence at end of string"
+msgstr ""
+
+#: locale/programs/linereader.c:627 locale/programs/linereader.c:855
+#, fuzzy
+msgid "unterminated string"
+msgstr "neužbaigtas pranešimas"
+
+#: locale/programs/linereader.c:669
+msgid "non-symbolic character value should not be used"
+msgstr ""
+
+#: locale/programs/linereader.c:816
+#, fuzzy, c-format
+msgid "symbol `%.*s' not in charmap"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/linereader.c:837
+#, fuzzy, c-format
+msgid "symbol `%.*s' not in repertoire map"
+msgstr "simbolis „%s“ neapibrėžtas"
+
+#: locale/programs/locale.c:74
+msgid "System information:"
+msgstr "Sistemos informacija:"
+
+#: locale/programs/locale.c:76
+msgid "Write names of available locales"
+msgstr ""
+
+#: locale/programs/locale.c:78
+msgid "Write names of available charmaps"
+msgstr ""
+
+#: locale/programs/locale.c:79
+msgid "Modify output format:"
+msgstr ""
+
+#: locale/programs/locale.c:80
+msgid "Write names of selected categories"
+msgstr ""
+
+#: locale/programs/locale.c:81
+msgid "Write names of selected keywords"
+msgstr ""
+
+#: locale/programs/locale.c:82
+msgid "Print more information"
+msgstr "Spausdinti daugiau informacijos"
+
+#: locale/programs/locale.c:87
+msgid ""
+"Get locale-specific information.\vFor bug reporting instructions, please see:\n"
+"<http://www.gnu.org/software/libc/bugs.html>.\n"
+msgstr ""
+
+#: locale/programs/locale.c:92
+msgid ""
+"NAME\n"
+"[-a|-m]"
+msgstr ""
+
+#: locale/programs/locale.c:193
+#, c-format
+msgid "Cannot set LC_CTYPE to default locale"
+msgstr "Nepavyko nustatyti LC_CTYPE į numatytąją lokalę"
+
+#: locale/programs/locale.c:195
+#, c-format
+msgid "Cannot set LC_MESSAGES to default locale"
+msgstr "Nepavyko nustatyti LC_MESSAGES į numatytąją lokalę"
+
+#: locale/programs/locale.c:208
+#, c-format
+msgid "Cannot set LC_COLLATE to default locale"
+msgstr "Nepavyko nustatyti LC_COLLATE į numatytąją lokalę"
+
+#: locale/programs/locale.c:224
+#, c-format
+msgid "Cannot set LC_ALL to default locale"
+msgstr "Nepavyko nustatyti LC_ALL į numatytąją lokalę"
+
+#: locale/programs/locale.c:500
+#, fuzzy, c-format
+msgid "while preparing output"
+msgstr "skaitant duomenų bazę"
+
+#: locale/programs/localedef.c:120
+msgid "Input Files:"
+msgstr ""
+
+#: locale/programs/localedef.c:122
+msgid "Symbolic character names defined in FILE"
+msgstr ""
+
+#: locale/programs/localedef.c:123
+#, fuzzy
+msgid "Source definitions are found in FILE"
+msgstr "Nerastas %s kategorijos apibrėžimas"
+
+#: locale/programs/localedef.c:125
+msgid "FILE contains mapping from symbolic names to UCS4 values"
+msgstr ""
+
+#: locale/programs/localedef.c:129
+msgid "Create output even if warning messages were issued"
+msgstr ""
+
+#: locale/programs/localedef.c:130
+msgid "Create old-style tables"
+msgstr ""
+
+#: locale/programs/localedef.c:131
+#, fuzzy
+msgid "Optional output file prefix"
+msgstr "netaisyklinga grupė"
+
+#: locale/programs/localedef.c:132
+msgid "Be strictly POSIX conform"
+msgstr ""
+
+#: locale/programs/localedef.c:134
+msgid "Suppress warnings and information messages"
+msgstr ""
+
+#: locale/programs/localedef.c:135
+#, fuzzy
+msgid "Print more messages"
+msgstr "neužbaigtas pranešimas"
+
+#: locale/programs/localedef.c:136
+msgid "Archive control:"
+msgstr ""
+
+#: locale/programs/localedef.c:138
+msgid "Don't add new data to archive"
+msgstr ""
+
+#: locale/programs/localedef.c:140
+msgid "Add locales named by parameters to archive"
+msgstr ""
+
+#: locale/programs/localedef.c:141
+msgid "Replace existing archive content"
+msgstr ""
+
+#: locale/programs/localedef.c:143
+msgid "Remove locales named by parameters from archive"
+msgstr ""
+
+#: locale/programs/localedef.c:144
+msgid "List content of archive"
+msgstr ""
+
+#: locale/programs/localedef.c:146
+msgid "locale.alias file to consult when making archive"
+msgstr ""
+
+#: locale/programs/localedef.c:151
+#, fuzzy
+msgid "Compile locale specification"
+msgstr "%s: nėra baigimo specifikacijos"
+
+#: locale/programs/localedef.c:154
+msgid ""
+"NAME\n"
+"[--add-to-archive|--delete-from-archive] FILE...\n"
+"--list-archive [FILE]"
+msgstr ""
+
+#: locale/programs/localedef.c:232
+#, fuzzy, c-format
+msgid "cannot create directory for output files"
+msgstr "nepavyko atverti aplanko %s"
+
+#: locale/programs/localedef.c:243
+#, c-format
+msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
+msgstr ""
+
+#: locale/programs/localedef.c:257 locale/programs/localedef.c:273
+#: locale/programs/localedef.c:599 locale/programs/localedef.c:619
+#, fuzzy, c-format
+msgid "cannot open locale definition file `%s'"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: locale/programs/localedef.c:285
+#, fuzzy, c-format
+msgid "cannot write output files to `%s'"
+msgstr "%s: nepavyko atverti laikinojo failo: %s"
+
+#: locale/programs/localedef.c:366
+#, c-format
+msgid ""
+"System's directory for character maps : %s\n"
+" repertoire maps: %s\n"
+" locale path : %s\n"
+"%s"
+msgstr ""
+
+#: locale/programs/localedef.c:567
+#, c-format
+msgid "circular dependencies between locale definitions"
+msgstr ""
+
+#: locale/programs/localedef.c:573
+#, c-format
+msgid "cannot add already read locale `%s' a second time"
+msgstr ""
+
+#: locale/programs/locarchive.c:88 locale/programs/locarchive.c:261
+#, c-format
+msgid "cannot create temporary file"
+msgstr ""
+
+#: locale/programs/locarchive.c:118 locale/programs/locarchive.c:307
+#, c-format
+msgid "cannot initialize archive file"
+msgstr ""
+
+#: locale/programs/locarchive.c:125 locale/programs/locarchive.c:314
+#, fuzzy, c-format
+msgid "cannot resize archive file"
+msgstr "%s: nepavyko perskaityti: %s"
+
+#: locale/programs/locarchive.c:134 locale/programs/locarchive.c:323
+#: locale/programs/locarchive.c:527
+#, fuzzy, c-format
+msgid "cannot map archive header"
+msgstr "nepavyko perskaityti antraštės"
+
+#: locale/programs/locarchive.c:156
+#, c-format
+msgid "failed to create new locale archive"
+msgstr ""
+
+#: locale/programs/locarchive.c:168
+#, c-format
+msgid "cannot change mode of new locale archive"
+msgstr ""
+
+#: locale/programs/locarchive.c:255
+#, c-format
+msgid "cannot map locale archive file"
+msgstr ""
+
+#: locale/programs/locarchive.c:331
+#, fuzzy, c-format
+msgid "cannot lock new archive"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: locale/programs/locarchive.c:396
+#, fuzzy, c-format
+msgid "cannot extend locale archive file"
+msgstr "nepavyko atverti duomenų failo"
+
+#: locale/programs/locarchive.c:405
+#, c-format
+msgid "cannot change mode of resized locale archive"
+msgstr ""
+
+#: locale/programs/locarchive.c:413
+#, fuzzy, c-format
+msgid "cannot rename new archive"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: locale/programs/locarchive.c:466
+#, fuzzy, c-format
+msgid "cannot open locale archive \"%s\""
+msgstr "Nepavyko atverti podėlio failo %s\n"
+
+#: locale/programs/locarchive.c:471
+#, fuzzy, c-format
+msgid "cannot stat locale archive \"%s\""
+msgstr "%s: nepavyko perskaityti: %s"
+
+#: locale/programs/locarchive.c:490
+#, fuzzy, c-format
+msgid "cannot lock locale archive \"%s\""
+msgstr "%s: nepavyko perskaityti: %s"
+
+#: locale/programs/locarchive.c:513
+#, fuzzy, c-format
+msgid "cannot read archive header"
+msgstr "nepavyko perskaityti antraštės"
+
+#: locale/programs/locarchive.c:573
+#, c-format
+msgid "locale '%s' already exists"
+msgstr ""
+
+#: locale/programs/locarchive.c:804 locale/programs/locarchive.c:819
+#: locale/programs/locarchive.c:831 locale/programs/locarchive.c:843
+#: locale/programs/locfile.c:344
+#, fuzzy, c-format
+msgid "cannot add to locale archive"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: locale/programs/locarchive.c:998
+#, fuzzy, c-format
+msgid "locale alias file `%s' not found"
+msgstr "Duomenų failas %s nerastas.\n"
+
+#: locale/programs/locarchive.c:1142
+#, fuzzy, c-format
+msgid "Adding %s\n"
+msgstr "skaitomas %s"
+
+#: locale/programs/locarchive.c:1148
+#, c-format
+msgid "stat of \"%s\" failed: %s: ignored"
+msgstr ""
+
+#: locale/programs/locarchive.c:1154
+#, fuzzy, c-format
+msgid "\"%s\" is no directory; ignored"
+msgstr "Aplankas"
+
+#: locale/programs/locarchive.c:1161
+#, fuzzy, c-format
+msgid "cannot open directory \"%s\": %s: ignored"
+msgstr "nepavyko atverti aplanko %s"
+
+#: locale/programs/locarchive.c:1233
+#, c-format
+msgid "incomplete set of locale files in \"%s\""
+msgstr ""
+
+#: locale/programs/locarchive.c:1297
+#, fuzzy, c-format
+msgid "cannot read all files in \"%s\": ignored"
+msgstr "nepavyko nuskaityti failo duomenų"
+
+#: locale/programs/locarchive.c:1367
+#, c-format
+msgid "locale \"%s\" not in archive"
+msgstr ""
+
+#: locale/programs/locfile.c:132
+#, fuzzy, c-format
+msgid "argument to `%s' must be a single character"
+msgstr "<%s> argumentas turi būti vienas simbolis"
+
+#: locale/programs/locfile.c:252
+#, fuzzy
+msgid "syntax error: not inside a locale definition section"
+msgstr "sintaksės klaida %s aprašyme: %s"
+
+#: locale/programs/locfile.c:626
+#, fuzzy, c-format
+msgid "cannot open output file `%s' for category `%s'"
+msgstr "nepavyko atverti duomenų bazės failo „%s“: %s"
+
+#: locale/programs/locfile.c:650
+#, c-format
+msgid "failure while writing data for category `%s'"
+msgstr ""
+
+#: locale/programs/locfile.c:746
+#, fuzzy, c-format
+msgid "cannot create output file `%s' for category `%s'"
+msgstr "nepavyko sukurti laikino failo „here“ dokumentui: %s"
+
+#: locale/programs/locfile.c:782
+#, fuzzy
+msgid "expect string argument for `copy'"
+msgstr "„%s“ trūksta parametro"
+
+#: locale/programs/locfile.c:786
+msgid "locale name should consist only of portable characters"
+msgstr ""
+
+#: locale/programs/locfile.c:805
+msgid "no other keyword shall be specified when `copy' is used"
+msgstr ""
+
+#: locale/programs/locfile.c:819
+#, fuzzy, c-format
+msgid "`%1$s' definition does not end with `END %1$s'"
+msgstr "%1$s: apibrėžimas neužbaigtas „END %1$s“"
+
+#: locale/programs/repertoire.c:229 locale/programs/repertoire.c:270
+#: locale/programs/repertoire.c:295
+#, fuzzy, c-format
+msgid "syntax error in repertoire map definition: %s"
+msgstr "sintaksės klaida prologe: %s"
+
+#: locale/programs/repertoire.c:271
+msgid "no <Uxxxx> or <Uxxxxxxxx> value given"
+msgstr ""
+
+#: locale/programs/repertoire.c:331
+#, c-format
+msgid "cannot save new repertoire map"
+msgstr ""
+
+#: locale/programs/repertoire.c:342
+#, fuzzy, c-format
+msgid "repertoire map file `%s' not found"
+msgstr "Duomenų failas %s nerastas.\n"
+
+#: login/programs/pt_chown.c:74
+#, c-format
+msgid "Set the owner, group and access permission of the slave pseudo terminal corresponding to the master pseudo terminal passed on file descriptor `%d'. This is the helper program for the `grantpt' function. It is not intended to be run directly from the command line.\n"
+msgstr ""
+
+#: login/programs/pt_chown.c:84
+#, c-format
+msgid ""
+"The owner is set to the current user, the group is set to `%s', and the access permission is set to `%o'.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: login/programs/pt_chown.c:161
+#, c-format
+msgid "too many arguments"
+msgstr "per daug argumentų"
+
+#: login/programs/pt_chown.c:169
+#, c-format
+msgid "needs to be installed setuid `root'"
+msgstr "turi būti instaliuota setuid „root“"
+
+#: malloc/mcheck.c:330
+msgid "memory is consistent, library is buggy\n"
+msgstr "atminties turinys korektiškas, bibliotekoje yra klaida\n"
+
+#: malloc/mcheck.c:333
+msgid "memory clobbered before allocated block\n"
+msgstr ""
+
+#: malloc/mcheck.c:336
+msgid "memory clobbered past end of allocated block\n"
+msgstr ""
+
+#: malloc/mcheck.c:339
+msgid "block freed twice\n"
+msgstr "blokas atlaisvintas du kartus\n"
+
+#: malloc/mcheck.c:342
+#, fuzzy
+msgid "bogus mcheck_status, library is buggy\n"
+msgstr "atminties turinys korektiškas, bibliotekoje yra klaida\n"
+
+#: malloc/memusage.sh:27
+msgid "Try \\`memusage --help' for more information."
+msgstr "Pabandykite „memusage --help“, jei norite gauti daugiau informacijos."
+
+#: malloc/memusage.sh:33
+msgid "memusage: option \\`$1' requires an argument"
+msgstr "memusage: parametrui „$1“ reikia argumento"
+
+#: malloc/memusage.sh:39
+msgid ""
+"Usage: memusage [OPTION]... PROGRAM [PROGRAMOPTION]...\n"
+"Profile memory usage of PROGRAM.\n"
+"\n"
+" -n,--progname=NAME Name of the program file to profile\n"
+" -p,--png=FILE Generate PNG graphic and store it in FILE\n"
+" -d,--data=FILE Generate binary data file and store it in FILE\n"
+" -u,--unbuffered Don't buffer output\n"
+" -b,--buffer=SIZE Collect SIZE entries before writing them out\n"
+" --no-timer Don't collect additional information through timer\n"
+" -m,--mmap Also trace mmap & friends\n"
+"\n"
+" -?,--help Print this help and exit\n"
+" --usage Give a short usage message\n"
+" -V,--version Print version information and exit\n"
+"\n"
+" The following options only apply when generating graphical output:\n"
+" -t,--time-based Make graph linear in time\n"
+" -T,--total Also draw graph of total memory use\n"
+" --title=STRING Use STRING as title of the graph\n"
+" -x,--x-size=SIZE Make graphic SIZE pixels wide\n"
+" -y,--y-size=SIZE Make graphic SIZE pixels high\n"
+"\n"
+"Mandatory arguments to long options are also mandatory for any corresponding\n"
+"short options.\n"
+"\n"
+"For bug reporting instructions, please see:\n"
+"<http://www.gnu.org/software/libc/bugs.html>."
+msgstr ""
+
+#: malloc/memusage.sh:99
+msgid ""
+"Syntax: memusage [--data=FILE] [--progname=NAME] [--png=FILE] [--unbuffered]\n"
+" [--buffer=SIZE] [--no-timer] [--time-based] [--total]\n"
+" [--title=STRING] [--x-size=SIZE] [--y-size=SIZE]\n"
+" PROGRAM [PROGRAMOPTION]..."
+msgstr ""
+
+#: malloc/memusage.sh:191
+#, fuzzy
+msgid "memusage: option \\`${1##*=}' is ambiguous"
+msgstr "ldd: parametras „$1“ dviprasmis"
+
+#: malloc/memusage.sh:200
+#, fuzzy
+msgid "memusage: unrecognized option \\`$1'"
+msgstr "%s: neatpažintas parametras „--%s“\n"
+
+#: malloc/memusage.sh:213
+msgid "No program name given"
+msgstr "Nenurodytas programos vardas"
+
+#: malloc/memusagestat.c:54
+#, fuzzy
+msgid "Name output file"
+msgstr "Išvesti į failą duotu PAVADINIMU"
+
+#: malloc/memusagestat.c:55
+msgid "Title string used in output graphic"
+msgstr ""
+
+#: malloc/memusagestat.c:56
+msgid "Generate output linear to time (default is linear to number of function calls)"
+msgstr ""
+
+#: malloc/memusagestat.c:58
+msgid "Also draw graph for total memory consumption"
+msgstr ""
+
+#: malloc/memusagestat.c:59
+msgid "Make output graphic VALUE pixels wide"
+msgstr ""
+
+#: malloc/memusagestat.c:60
+msgid "Make output graphic VALUE pixels high"
+msgstr ""
+
+#: malloc/memusagestat.c:65
+msgid "Generate graphic from memory profiling data"
+msgstr ""
+
+#: malloc/memusagestat.c:68
+msgid "DATAFILE [OUTFILE]"
+msgstr ""
+
+#: misc/error.c:118 timezone/zic.c:417
+msgid "Unknown system error"
+msgstr ""
+
+#: nis/nis_callback.c:189
+#, fuzzy
+msgid "unable to free arguments"
+msgstr "per daug argumentų"
+
+#: nis/nis_error.h:1 nis/ypclnt.c:822 nis/ypclnt.c:910 posix/regcomp.c:132
+#: sysdeps/gnu/errlist.c:20
+msgid "Success"
+msgstr "Sėkmė"
+
+#: nis/nis_error.h:2
+#, fuzzy
+msgid "Probable success"
+msgstr "Dalinė sėkmė"
+
+#: nis/nis_error.h:3
+#, fuzzy
+msgid "Not found"
+msgstr "Duomenų failas %s nerastas.\n"
+
+#: nis/nis_error.h:4
+#, fuzzy
+msgid "Probably not found"
+msgstr "Duomenų failas %s nerastas.\n"
+
+#: nis/nis_error.h:5
+#, fuzzy
+msgid "Cache expired"
+msgstr "Baigėsi rakto galiojimo laikas"
+
+#: nis/nis_error.h:6
+#, fuzzy
+msgid "NIS+ servers unreachable"
+msgstr "Tinklas neprieinamas"
+
+#: nis/nis_error.h:7
+#, fuzzy
+msgid "Unknown object"
+msgstr "Nežinomas serveris"
+
+#: nis/nis_error.h:8
+msgid "Server busy, try again"
+msgstr ""
+
+#: nis/nis_error.h:9
+msgid "Generic system error"
+msgstr ""
+
+#: nis/nis_error.h:10
+msgid "First/next chain broken"
+msgstr ""
+
+#. TRANS Permission denied; the file permissions do not allow the attempted operation.
+#: nis/nis_error.h:11 nis/ypclnt.c:867 sysdeps/gnu/errlist.c:157
+#, fuzzy
+msgid "Permission denied"
+msgstr "Priėjimas uždraustas"
+
+#: nis/nis_error.h:12
+msgid "Not owner"
+msgstr ""
+
+#: nis/nis_error.h:13
+msgid "Name not served by this server"
+msgstr ""
+
+#: nis/nis_error.h:14
+#, fuzzy
+msgid "Server out of memory"
+msgstr "baigėsi atmintis"
+
+#: nis/nis_error.h:15
+msgid "Object with same name exists"
+msgstr ""
+
+#: nis/nis_error.h:16
+msgid "Not master server for this domain"
+msgstr ""
+
+#: nis/nis_error.h:17
+#, fuzzy
+msgid "Invalid object for operation"
+msgstr "netaisyklinga veiksena dlopen()"
+
+#: nis/nis_error.h:18
+#, fuzzy
+msgid "Malformed name, or illegal name"
+msgstr "nekorektiška eilutė ignoruota"
+
+#: nis/nis_error.h:19
+msgid "Unable to create callback"
+msgstr ""
+
+#: nis/nis_error.h:20
+msgid "Results sent to callback proc"
+msgstr ""
+
+#: nis/nis_error.h:21
+msgid "Not found, no such name"
+msgstr ""
+
+#: nis/nis_error.h:22
+msgid "Name/entry isn't unique"
+msgstr ""
+
+#: nis/nis_error.h:23
+#, fuzzy
+msgid "Modification failed"
+msgstr "Atminties išskyrimo klaida"
+
+#: nis/nis_error.h:24
+msgid "Database for table does not exist"
+msgstr ""
+
+#: nis/nis_error.h:25
+msgid "Entry/table type mismatch"
+msgstr ""
+
+#: nis/nis_error.h:26
+msgid "Link points to illegal name"
+msgstr ""
+
+#: nis/nis_error.h:27
+msgid "Partial success"
+msgstr "Dalinė sėkmė"
+
+#: nis/nis_error.h:28
+msgid "Too many attributes"
+msgstr "Per daug atributų"
+
+#: nis/nis_error.h:29
+msgid "Error in RPC subsystem"
+msgstr ""
+
+#: nis/nis_error.h:30
+msgid "Missing or malformed attribute"
+msgstr ""
+
+#: nis/nis_error.h:31
+#, fuzzy
+msgid "Named object is not searchable"
+msgstr "bendrasis objektas neatvertas"
+
+#: nis/nis_error.h:32
+msgid "Error while talking to callback proc"
+msgstr ""
+
+#: nis/nis_error.h:33
+msgid "Non NIS+ namespace encountered"
+msgstr ""
+
+#: nis/nis_error.h:34
+msgid "Illegal object type for operation"
+msgstr ""
+
+#: nis/nis_error.h:35
+msgid "Passed object is not the same object on server"
+msgstr ""
+
+#: nis/nis_error.h:36
+#, fuzzy
+msgid "Modify operation failed"
+msgstr "Atminties išskyrimo klaida"
+
+#: nis/nis_error.h:37
+msgid "Query illegal for named table"
+msgstr ""
+
+#: nis/nis_error.h:38
+msgid "Attempt to remove a non-empty table"
+msgstr ""
+
+#: nis/nis_error.h:39
+msgid "Error in accessing NIS+ cold start file. Is NIS+ installed?"
+msgstr ""
+
+#: nis/nis_error.h:40
+#, fuzzy
+msgid "Full resync required for directory"
+msgstr "Toks failas ar aplankas neegzistuoja"
+
+#: nis/nis_error.h:41
+#, fuzzy
+msgid "NIS+ operation failed"
+msgstr "Operacija nutraukta"
+
+#: nis/nis_error.h:42
+msgid "NIS+ service is unavailable or not installed"
+msgstr ""
+
+#: nis/nis_error.h:43
+msgid "Yes, 42 is the meaning of life"
+msgstr ""
+
+#: nis/nis_error.h:44
+msgid "Unable to authenticate NIS+ server"
+msgstr ""
+
+#: nis/nis_error.h:45
+msgid "Unable to authenticate NIS+ client"
+msgstr ""
+
+#: nis/nis_error.h:46
+#, fuzzy
+msgid "No file space on server"
+msgstr "Įrenginyje neliko vietos"
+
+#: nis/nis_error.h:47
+msgid "Unable to create process on server"
+msgstr ""
+
+#: nis/nis_error.h:48
+msgid "Master server busy, full dump rescheduled."
+msgstr ""
+
+#: nis/nis_local_names.c:122
+#, c-format
+msgid "LOCAL entry for UID %d in directory %s not unique\n"
+msgstr ""
+
+#: nis/nis_print.c:51
+msgid "UNKNOWN"
+msgstr "NEŽINOMA"
+
+#: nis/nis_print.c:109
+msgid "BOGUS OBJECT\n"
+msgstr ""
+
+#: nis/nis_print.c:112
+msgid "NO OBJECT\n"
+msgstr ""
+
+#: nis/nis_print.c:115
+msgid "DIRECTORY\n"
+msgstr ""
+
+#: nis/nis_print.c:118
+msgid "GROUP\n"
+msgstr ""
+
+#: nis/nis_print.c:121
+msgid "TABLE\n"
+msgstr ""
+
+#: nis/nis_print.c:124
+msgid "ENTRY\n"
+msgstr ""
+
+#: nis/nis_print.c:127
+msgid "LINK\n"
+msgstr ""
+
+#: nis/nis_print.c:130
+msgid "PRIVATE\n"
+msgstr ""
+
+#: nis/nis_print.c:133
+#, fuzzy
+msgid "(Unknown object)\n"
+msgstr "Nežinomas serveris"
+
+#: nis/nis_print.c:167
+#, c-format
+msgid "Name : `%s'\n"
+msgstr ""
+
+#: nis/nis_print.c:168
+#, c-format
+msgid "Type : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:173
+msgid "Master Server :\n"
+msgstr ""
+
+#: nis/nis_print.c:175
+msgid "Replicate :\n"
+msgstr ""
+
+#: nis/nis_print.c:176
+#, c-format
+msgid "\tName : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:177
+msgid "\tPublic Key : "
+msgstr ""
+
+#: nis/nis_print.c:181
+msgid "None.\n"
+msgstr ""
+
+#: nis/nis_print.c:184
+#, c-format
+msgid "Diffie-Hellmann (%d bits)\n"
+msgstr ""
+
+#: nis/nis_print.c:189
+#, c-format
+msgid "RSA (%d bits)\n"
+msgstr ""
+
+#: nis/nis_print.c:192
+msgid "Kerberos.\n"
+msgstr ""
+
+#: nis/nis_print.c:195
+#, c-format
+msgid "Unknown (type = %d, bits = %d)\n"
+msgstr ""
+
+#: nis/nis_print.c:206
+#, c-format
+msgid "\tUniversal addresses (%u)\n"
+msgstr ""
+
+#: nis/nis_print.c:228
+msgid "Time to live : "
+msgstr ""
+
+#: nis/nis_print.c:230
+msgid "Default Access rights :\n"
+msgstr ""
+
+#: nis/nis_print.c:239
+#, c-format
+msgid "\tType : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:240
+msgid "\tAccess rights: "
+msgstr ""
+
+#: nis/nis_print.c:254
+msgid "Group Flags :"
+msgstr ""
+
+#: nis/nis_print.c:257
+msgid ""
+"\n"
+"Group Members :\n"
+msgstr ""
+
+#: nis/nis_print.c:269
+#, c-format
+msgid "Table Type : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:270
+#, c-format
+msgid "Number of Columns : %d\n"
+msgstr ""
+
+#: nis/nis_print.c:271
+#, c-format
+msgid "Character Separator : %c\n"
+msgstr ""
+
+#: nis/nis_print.c:272
+#, c-format
+msgid "Search Path : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:273
+msgid "Columns :\n"
+msgstr ""
+
+#: nis/nis_print.c:276
+#, c-format
+msgid "\t[%d]\tName : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:278
+msgid "\t\tAttributes : "
+msgstr ""
+
+#: nis/nis_print.c:280
+msgid "\t\tAccess Rights : "
+msgstr ""
+
+#: nis/nis_print.c:290
+msgid "Linked Object Type : "
+msgstr ""
+
+#: nis/nis_print.c:292
+#, c-format
+msgid "Linked to : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:302
+#, c-format
+msgid "\tEntry data of type %s\n"
+msgstr ""
+
+#: nis/nis_print.c:305
+#, c-format
+msgid "\t[%u] - [%u bytes] "
+msgstr ""
+
+#: nis/nis_print.c:308
+msgid "Encrypted data\n"
+msgstr ""
+
+#: nis/nis_print.c:310
+msgid "Binary data\n"
+msgstr ""
+
+#: nis/nis_print.c:326
+#, c-format
+msgid "Object Name : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:327
+#, c-format
+msgid "Directory : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:328
+#, c-format
+msgid "Owner : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:329
+#, c-format
+msgid "Group : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:330
+msgid "Access Rights : "
+msgstr ""
+
+#: nis/nis_print.c:332
+#, c-format
+msgid ""
+"\n"
+"Time to Live : "
+msgstr ""
+
+#: nis/nis_print.c:335
+#, c-format
+msgid "Creation Time : %s"
+msgstr ""
+
+#: nis/nis_print.c:337
+#, c-format
+msgid "Mod. Time : %s"
+msgstr ""
+
+#: nis/nis_print.c:338
+msgid "Object Type : "
+msgstr ""
+
+#: nis/nis_print.c:358
+#, c-format
+msgid " Data Length = %u\n"
+msgstr ""
+
+#: nis/nis_print.c:372
+#, c-format
+msgid "Status : %s\n"
+msgstr ""
+
+#: nis/nis_print.c:373
+#, c-format
+msgid "Number of objects : %u\n"
+msgstr ""
+
+#: nis/nis_print.c:377
+#, c-format
+msgid "Object #%d:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:117
+#, c-format
+msgid "Group entry for \"%s.%s\" group:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:125
+msgid " Explicit members:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:130
+msgid " No explicit members\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:133
+msgid " Implicit members:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:138
+msgid " No implicit members\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:141
+msgid " Recursive members:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:146
+msgid " No recursive members\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:149
+msgid " Explicit nonmembers:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:154
+msgid " No explicit nonmembers\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:157
+msgid " Implicit nonmembers:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:162
+msgid " No implicit nonmembers\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:165
+msgid " Recursive nonmembers:\n"
+msgstr ""
+
+#: nis/nis_print_group_entry.c:170
+msgid " No recursive nonmembers\n"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:101
+#: nis/nss_nisplus/nisplus-publickey.c:183
+#, c-format
+msgid "DES entry for netname %s not unique\n"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:220
+#, c-format
+msgid "netname2user: missing group id list in `%s'"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:302
+#: nis/nss_nisplus/nisplus-publickey.c:308
+#: nis/nss_nisplus/nisplus-publickey.c:373
+#: nis/nss_nisplus/nisplus-publickey.c:382
+#, c-format
+msgid "netname2user: (nis+ lookup): %s\n"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:321
+#, c-format
+msgid "netname2user: DES entry for %s in directory %s not unique"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:339
+#, c-format
+msgid "netname2user: principal name `%s' too long"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:395
+#, c-format
+msgid "netname2user: LOCAL entry for %s in directory %s not unique"
+msgstr ""
+
+#: nis/nss_nisplus/nisplus-publickey.c:402
+msgid "netname2user: should not have uid 0"
+msgstr ""
+
+#: nis/ypclnt.c:825
+#, fuzzy
+msgid "Request arguments bad"
+msgstr "Užklausa nenutraukta"
+
+#: nis/ypclnt.c:828
+msgid "RPC failure on NIS operation"
+msgstr ""
+
+#: nis/ypclnt.c:831
+msgid "Can't bind to server which serves this domain"
+msgstr ""
+
+#: nis/ypclnt.c:834
+msgid "No such map in server's domain"
+msgstr ""
+
+#: nis/ypclnt.c:837
+#, fuzzy
+msgid "No such key in map"
+msgstr "Tokio įrenginio nėra"
+
+#: nis/ypclnt.c:840
+#, fuzzy
+msgid "Internal NIS error"
+msgstr "Vardų paieškos vidinė klaida"
+
+#: nis/ypclnt.c:843
+#, fuzzy
+msgid "Local resource allocation failure"
+msgstr "Sistemos resursų išskyrimo sutrikimas"
+
+#: nis/ypclnt.c:846
+#, fuzzy
+msgid "No more records in map database"
+msgstr "skaitant duomenų bazę"
+
+#: nis/ypclnt.c:849
+msgid "Can't communicate with portmapper"
+msgstr ""
+
+#: nis/ypclnt.c:852
+msgid "Can't communicate with ypbind"
+msgstr ""
+
+#: nis/ypclnt.c:855
+msgid "Can't communicate with ypserv"
+msgstr ""
+
+#: nis/ypclnt.c:858
+msgid "Local domain name not set"
+msgstr ""
+
+#: nis/ypclnt.c:861
+#, fuzzy
+msgid "NIS map database is bad"
+msgstr "Duomenų bazė užimta"
+
+#: nis/ypclnt.c:864
+msgid "NIS client/server version mismatch - can't supply service"
+msgstr ""
+
+#: nis/ypclnt.c:870
+msgid "Database is busy"
+msgstr "Duomenų bazė užimta"
+
+#: nis/ypclnt.c:873
+#, fuzzy
+msgid "Unknown NIS error code"
+msgstr "Nežinoma klaida "
+
+#: nis/ypclnt.c:913
+msgid "Internal ypbind error"
+msgstr ""
+
+#: nis/ypclnt.c:916
+#, fuzzy
+msgid "Domain not bound"
+msgstr "%s: komanda nerasta"
+
+#: nis/ypclnt.c:919
+msgid "System resource allocation failure"
+msgstr "Sistemos resursų išskyrimo sutrikimas"
+
+#: nis/ypclnt.c:922
+#, fuzzy
+msgid "Unknown ypbind error"
+msgstr "Nežinoma klaida"
+
+#: nis/ypclnt.c:963
+msgid "yp_update: cannot convert host to netname\n"
+msgstr ""
+
+#: nis/ypclnt.c:981
+msgid "yp_update: cannot get server address\n"
+msgstr ""
+
+#: nscd/aicache.c:77 nscd/hstcache.c:468
+#, c-format
+msgid "Haven't found \"%s\" in hosts cache!"
+msgstr ""
+
+#: nscd/aicache.c:79 nscd/hstcache.c:470
+#, c-format
+msgid "Reloading \"%s\" in hosts cache!"
+msgstr ""
+
+#: nscd/cache.c:146
+#, c-format
+msgid "add new entry \"%s\" of type %s for %s to cache%s"
+msgstr ""
+
+#: nscd/cache.c:148
+msgid " (first)"
+msgstr ""
+
+#: nscd/cache.c:256 nscd/connections.c:810
+#, fuzzy, c-format
+msgid "cannot stat() file `%s': %s"
+msgstr "nepavyko atverti duomenų bazės failo „%s“: %s"
+
+#: nscd/cache.c:285
+#, c-format
+msgid "pruning %s cache; time %ld"
+msgstr ""
+
+#: nscd/cache.c:312
+#, c-format
+msgid "considering %s entry \"%s\", timeout %<PRIu64>"
+msgstr ""
+
+#: nscd/connections.c:521 nscd/connections.c:533 nscd/connections.c:545
+#: nscd/connections.c:564
+#, fuzzy, c-format
+msgid "invalid persistent database file \"%s\": %s"
+msgstr "nepavyko atverti duomenų bazės failo „%s“: %s"
+
+#: nscd/connections.c:535
+msgid "header size does not match"
+msgstr ""
+
+#: nscd/connections.c:547
+#, fuzzy
+msgid "file size does not match"
+msgstr "ELF failo versija neatitinka esamos"
+
+#: nscd/connections.c:566
+#, fuzzy
+msgid "verification failed"
+msgstr "Operacija nutraukta"
+
+#: nscd/connections.c:580
+#, c-format
+msgid "suggested size of table for database %s larger than the persistent database's table"
+msgstr ""
+
+#: nscd/connections.c:591 nscd/connections.c:673
+#, c-format
+msgid "cannot create read-only descriptor for \"%s\"; no mmap"
+msgstr ""
+
+#: nscd/connections.c:652
+#, c-format
+msgid "database for %s corrupted or simultaneously used; remove %s manually if necessary and restart"
+msgstr ""
+
+#: nscd/connections.c:659
+#, c-format
+msgid "cannot create %s; no persistent database used"
+msgstr ""
+
+#: nscd/connections.c:662
+#, fuzzy, c-format
+msgid "cannot create %s; no sharing possible"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: nscd/connections.c:733
+#, fuzzy, c-format
+msgid "cannot write to database file %s: %s"
+msgstr "nepavyko atverti duomenų bazės failo „%s“: %s"
+
+#: nscd/connections.c:772
+#, c-format
+msgid "cannot set socket to close on exec: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/connections.c:823
+#, fuzzy, c-format
+msgid "cannot open socket: %s"
+msgstr "nepavyko atverti bendrojo objekto failo"
+
+#: nscd/connections.c:840
+#, c-format
+msgid "cannot change socket to nonblocking mode: %s"
+msgstr ""
+
+#: nscd/connections.c:848
+#, fuzzy, c-format
+msgid "cannot set socket to close on exec: %s"
+msgstr "nepavyko sukurti laikino failo „here“ dokumentui: %s"
+
+#: nscd/connections.c:859
+#, c-format
+msgid "cannot enable socket to accept connections: %s"
+msgstr ""
+
+#: nscd/connections.c:955
+#, c-format
+msgid "provide access to FD %d, for %s"
+msgstr ""
+
+#: nscd/connections.c:967
+#, c-format
+msgid "cannot handle old request version %d; current version is %d"
+msgstr ""
+
+#: nscd/connections.c:1009 nscd/connections.c:1062
+#, fuzzy, c-format
+msgid "cannot write result: %s"
+msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#: nscd/connections.c:1145
+#, fuzzy, c-format
+msgid "error getting caller's id: %s"
+msgstr "rašomas %s"
+
+#: nscd/connections.c:1204
+#, c-format
+msgid "cannot open /proc/self/cmdline: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/connections.c:1218
+#, c-format
+msgid "cannot read /proc/self/cmdline: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/connections.c:1258
+#, c-format
+msgid "cannot change to old UID: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/connections.c:1268
+#, c-format
+msgid "cannot change to old GID: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/connections.c:1281
+#, c-format
+msgid "cannot change to old working directory: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/connections.c:1310
+#, c-format
+msgid "re-exec failed: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/connections.c:1319
+#, fuzzy, c-format
+msgid "cannot change current working directory to \"/\": %s"
+msgstr "<nėra esamo aplanko>"
+
+#: nscd/connections.c:1437
+#, fuzzy, c-format
+msgid "short read while reading request: %s"
+msgstr "problemos skaitant „%s“"
+
+#: nscd/connections.c:1468
+#, c-format
+msgid "key length in request too long: %d"
+msgstr ""
+
+#: nscd/connections.c:1481
+#, c-format
+msgid "short read while reading request key: %s"
+msgstr ""
+
+#: nscd/connections.c:1490
+#, c-format
+msgid "handle_request: request received (Version = %d) from PID %ld"
+msgstr ""
+
+#: nscd/connections.c:1495
+#, c-format
+msgid "handle_request: request received (Version = %d)"
+msgstr ""
+
+#: nscd/connections.c:1856
+#, c-format
+msgid "could only start %d threads; terminating"
+msgstr ""
+
+#: nscd/connections.c:1904 nscd/connections.c:1905 nscd/connections.c:1922
+#: nscd/connections.c:1931 nscd/connections.c:1949 nscd/connections.c:1960
+#: nscd/connections.c:1971
+#, c-format
+msgid "Failed to run nscd as user '%s'"
+msgstr ""
+
+#: nscd/connections.c:1923
+#, c-format
+msgid "initial getgrouplist failed"
+msgstr ""
+
+#: nscd/connections.c:1932
+#, c-format
+msgid "getgrouplist failed"
+msgstr ""
+
+#: nscd/connections.c:1950
+#, c-format
+msgid "setgroups failed"
+msgstr ""
+
+#: nscd/grpcache.c:402 nscd/hstcache.c:418 nscd/initgrcache.c:412
+#: nscd/pwdcache.c:397 nscd/servicescache.c:343
+#, fuzzy, c-format
+msgid "short write in %s: %s"
+msgstr "%s: Klaida rašant %s\n"
+
+#: nscd/grpcache.c:445 nscd/initgrcache.c:78
+#, c-format
+msgid "Haven't found \"%s\" in group cache!"
+msgstr ""
+
+#: nscd/grpcache.c:447 nscd/initgrcache.c:80
+#, c-format
+msgid "Reloading \"%s\" in group cache!"
+msgstr ""
+
+#: nscd/grpcache.c:524
+#, fuzzy, c-format
+msgid "Invalid numeric gid \"%s\"!"
+msgstr "nekorektiška eilutė"
+
+#: nscd/mem.c:383
+#, c-format
+msgid "freed %zu bytes in %s cache"
+msgstr ""
+
+#: nscd/mem.c:512
+#, c-format
+msgid "no more memory for database '%s'"
+msgstr ""
+
+#: nscd/nscd.c:98
+msgid "Read configuration data from NAME"
+msgstr ""
+
+#: nscd/nscd.c:100
+msgid "Do not fork and display messages on the current tty"
+msgstr ""
+
+#: nscd/nscd.c:101
+#, fuzzy
+msgid "NUMBER"
+msgstr "PAVADINIMAS"
+
+#: nscd/nscd.c:101
+msgid "Start NUMBER threads"
+msgstr ""
+
+#: nscd/nscd.c:102
+msgid "Shut the server down"
+msgstr ""
+
+#: nscd/nscd.c:103
+#, fuzzy
+msgid "Print current configuration statistic"
+msgstr "Nepavyko atverti konfigūracijos failo %s"
+
+#: nscd/nscd.c:104
+msgid "TABLE"
+msgstr ""
+
+#: nscd/nscd.c:105
+#, fuzzy
+msgid "Invalidate the specified cache"
+msgstr "%s: netaisyklingas parametras --%c\n"
+
+#: nscd/nscd.c:106
+msgid "TABLE,yes"
+msgstr ""
+
+#: nscd/nscd.c:107
+msgid "Use separate cache for each user"
+msgstr ""
+
+#: nscd/nscd.c:112
+msgid "Name Service Cache Daemon."
+msgstr ""
+
+#: nscd/nscd.c:144 nss/getent.c:858 nss/makedb.c:123
+#, fuzzy, c-format
+msgid "wrong number of arguments"
+msgstr "per daug argumentų"
+
+#: nscd/nscd.c:154
+#, c-format
+msgid "failure while reading configuration file; this is fatal"
+msgstr ""
+
+#: nscd/nscd.c:163
+#, c-format
+msgid "already running"
+msgstr ""
+
+#: nscd/nscd.c:178 nscd/nscd.c:233
+#, c-format
+msgid "cannot fork"
+msgstr ""
+
+#: nscd/nscd.c:241
+#, fuzzy, c-format
+msgid "cannot change current working directory to \"/\""
+msgstr "<nėra esamo aplanko>"
+
+#: nscd/nscd.c:249
+msgid "Could not create log file"
+msgstr ""
+
+#: nscd/nscd.c:302 nscd/nscd.c:327 nscd/nscd_stat.c:172
+#, c-format
+msgid "Only root is allowed to use this option!"
+msgstr ""
+
+#: nscd/nscd.c:364 nscd/nscd_stat.c:191
+#, c-format
+msgid "write incomplete"
+msgstr ""
+
+#: nscd/nscd.c:375
+#, fuzzy, c-format
+msgid "cannot read invalidate ACK"
+msgstr "nepavyko nuskaityti failo duomenų"
+
+#: nscd/nscd.c:381
+#, fuzzy, c-format
+msgid "invalidation failed"
+msgstr "netinkamas mėnesio pavadinimas"
+
+#: nscd/nscd.c:391
+#, c-format
+msgid "secure services not implemented anymore"
+msgstr ""
+
+#: nscd/nscd_conf.c:57
+#, fuzzy, c-format
+msgid "database %s is not supported"
+msgstr "Duomenų bazės %s formatas yra %s.\n"
+
+#: nscd/nscd_conf.c:108
+#, fuzzy, c-format
+msgid "Parse error: %s"
+msgstr "vidinė klaida"
+
+#: nscd/nscd_conf.c:193
+#, c-format
+msgid "Must specify user name for server-user option"
+msgstr ""
+
+#: nscd/nscd_conf.c:200
+#, c-format
+msgid "Must specify user name for stat-user option"
+msgstr ""
+
+#: nscd/nscd_conf.c:244
+#, c-format
+msgid "invalid value for 'reload-count': %u"
+msgstr ""
+
+#: nscd/nscd_conf.c:259
+#, c-format
+msgid "Must specify value for restart-interval option"
+msgstr ""
+
+#: nscd/nscd_conf.c:273
+#, c-format
+msgid "Unknown option: %s %s %s"
+msgstr ""
+
+#: nscd/nscd_conf.c:286
+#, c-format
+msgid "cannot get current working directory: %s; disabling paranoia mode"
+msgstr ""
+
+#: nscd/nscd_conf.c:306
+#, c-format
+msgid "maximum file size for %s database too small"
+msgstr ""
+
+#: nscd/nscd_stat.c:141
+#, fuzzy, c-format
+msgid "cannot write statistics: %s"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: nscd/nscd_stat.c:156
+msgid "yes"
+msgstr ""
+
+#: nscd/nscd_stat.c:157
+msgid "no"
+msgstr ""
+
+#: nscd/nscd_stat.c:168
+#, c-format
+msgid "Only root or %s is allowed to use this option!"
+msgstr ""
+
+#: nscd/nscd_stat.c:179
+#, c-format
+msgid "nscd not running!\n"
+msgstr ""
+
+#: nscd/nscd_stat.c:203
+#, fuzzy, c-format
+msgid "cannot read statistics data"
+msgstr "nepavyko nuskaityti failo duomenų"
+
+#: nscd/nscd_stat.c:206
+#, c-format
+msgid ""
+"nscd configuration:\n"
+"\n"
+"%15d server debug level\n"
+msgstr ""
+
+#: nscd/nscd_stat.c:230
+#, c-format
+msgid "%3ud %2uh %2um %2lus server runtime\n"
+msgstr ""
+
+#: nscd/nscd_stat.c:233
+#, c-format
+msgid " %2uh %2um %2lus server runtime\n"
+msgstr ""
+
+#: nscd/nscd_stat.c:235
+#, c-format
+msgid " %2um %2lus server runtime\n"
+msgstr ""
+
+#: nscd/nscd_stat.c:237
+#, c-format
+msgid " %2lus server runtime\n"
+msgstr ""
+
+#: nscd/nscd_stat.c:239
+#, c-format
+msgid ""
+"%15d current number of threads\n"
+"%15d maximum number of threads\n"
+"%15lu number of times clients had to wait\n"
+"%15s paranoia mode enabled\n"
+"%15lu restart internal\n"
+msgstr ""
+
+#: nscd/nscd_stat.c:273
+#, c-format
+msgid ""
+"\n"
+"%s cache:\n"
+"\n"
+"%15s cache is enabled\n"
+"%15s cache is persistent\n"
+"%15s cache is shared\n"
+"%15zu suggested size\n"
+"%15zu total data pool size\n"
+"%15zu used data pool size\n"
+"%15lu seconds time to live for positive entries\n"
+"%15lu seconds time to live for negative entries\n"
+"%15<PRIuMAX> cache hits on positive entries\n"
+"%15<PRIuMAX> cache hits on negative entries\n"
+"%15<PRIuMAX> cache misses on positive entries\n"
+"%15<PRIuMAX> cache misses on negative entries\n"
+"%15lu%% cache hit rate\n"
+"%15zu current number of cached values\n"
+"%15zu maximum number of cached values\n"
+"%15zu maximum chain length searched\n"
+"%15<PRIuMAX> number of delays on rdlock\n"
+"%15<PRIuMAX> number of delays on wrlock\n"
+"%15<PRIuMAX> memory allocations failed\n"
+"%15s check /etc/%s for changes\n"
+msgstr ""
+
+#: nscd/pwdcache.c:440
+#, c-format
+msgid "Haven't found \"%s\" in password cache!"
+msgstr ""
+
+#: nscd/pwdcache.c:442
+#, c-format
+msgid "Reloading \"%s\" in password cache!"
+msgstr ""
+
+#: nscd/pwdcache.c:520
+#, fuzzy, c-format
+msgid "Invalid numeric uid \"%s\"!"
+msgstr "nekorektiška eilutė"
+
+#: nscd/selinux.c:156
+#, c-format
+msgid "Failed opening connection to the audit subsystem: %m"
+msgstr ""
+
+#: nscd/selinux.c:177
+msgid "Failed to set keep-capabilities"
+msgstr ""
+
+#: nscd/selinux.c:178 nscd/selinux.c:241
+#, c-format
+msgid "prctl(KEEPCAPS) failed"
+msgstr ""
+
+#: nscd/selinux.c:192
+msgid "Failed to initialize drop of capabilities"
+msgstr ""
+
+#: nscd/selinux.c:193
+#, c-format
+msgid "cap_init failed"
+msgstr ""
+
+#: nscd/selinux.c:214 nscd/selinux.c:231
+msgid "Failed to drop capabilities"
+msgstr ""
+
+#: nscd/selinux.c:215 nscd/selinux.c:232
+#, c-format
+msgid "cap_set_proc failed"
+msgstr ""
+
+#: nscd/selinux.c:240
+msgid "Failed to unset keep-capabilities"
+msgstr ""
+
+#: nscd/selinux.c:256
+msgid "Failed to determine if kernel supports SELinux"
+msgstr ""
+
+#: nscd/selinux.c:271
+#, c-format
+msgid "Failed to start AVC thread"
+msgstr ""
+
+#: nscd/selinux.c:293
+#, c-format
+msgid "Failed to create AVC lock"
+msgstr ""
+
+#: nscd/selinux.c:333
+#, fuzzy, c-format
+msgid "Failed to start AVC"
+msgstr "failas per trumpas"
+
+#: nscd/selinux.c:335
+msgid "Access Vector Cache (AVC) started"
+msgstr ""
+
+#: nscd/selinux.c:356
+msgid "Error getting context of socket peer"
+msgstr ""
+
+#: nscd/selinux.c:361
+msgid "Error getting context of nscd"
+msgstr ""
+
+#: nscd/selinux.c:367
+msgid "Error getting sid from context"
+msgstr ""
+
+#: nscd/selinux.c:399
+#, c-format
+msgid ""
+"\n"
+"SELinux AVC Statistics:\n"
+"\n"
+"%15u entry lookups\n"
+"%15u entry hits\n"
+"%15u entry misses\n"
+"%15u entry discards\n"
+"%15u CAV lookups\n"
+"%15u CAV hits\n"
+"%15u CAV probes\n"
+"%15u CAV misses\n"
+msgstr ""
+
+#: nscd/servicescache.c:390
+#, c-format
+msgid "Haven't found \"%s\" in services cache!"
+msgstr ""
+
+#: nscd/servicescache.c:392
+#, c-format
+msgid "Reloading \"%s\" in services cache!"
+msgstr ""
+
+#: nss/getent.c:52
+msgid "database [key ...]"
+msgstr ""
+
+#: nss/getent.c:57
+msgid "Service configuration to be used"
+msgstr ""
+
+#: nss/getent.c:62
+msgid ""
+"Get entries from administrative database.\vFor bug reporting instructions, please see:\n"
+"<http://www.gnu.org/software/libc/bugs.html>.\n"
+msgstr ""
+
+#: nss/getent.c:145 nss/getent.c:394
+#, fuzzy, c-format
+msgid "Enumeration not supported on %s\n"
+msgstr "Operacija nepalaikoma"
+
+#: nss/getent.c:782
+#, c-format
+msgid "Unknown database name"
+msgstr "Nežinomas duomenų bazės vardas"
+
+#: nss/getent.c:808
+msgid "Supported databases:\n"
+msgstr "Palaikomos duomenų bazės:\n"
+
+#: nss/getent.c:868
+#, c-format
+msgid "Unknown database: %s\n"
+msgstr "Nežinoma duomenų bazė: %s\n"
+
+#: nss/makedb.c:60
+msgid "Convert key to lower case"
+msgstr ""
+
+#: nss/makedb.c:63
+msgid "Do not print messages while building database"
+msgstr ""
+
+#: nss/makedb.c:65
+msgid "Print content of database file, one entry a line"
+msgstr ""
+
+#: nss/makedb.c:70
+msgid "Create simple DB database from textual input."
+msgstr ""
+
+#: nss/makedb.c:73
+#, fuzzy
+msgid ""
+"INPUT-FILE OUTPUT-FILE\n"
+"-o OUTPUT-FILE INPUT-FILE\n"
+"-u INPUT-FILE"
+msgstr ""
+"-o IŠVEDIMO-FAILAS [DUOMENŲ-FAILAS]...\n"
+"[IŠVEDIMO-FAILAS [DUOMENŲ-FAILAS]...]"
+
+#: nss/makedb.c:142
+#, c-format
+msgid "No usable database library found."
+msgstr ""
+
+#: nss/makedb.c:149
+#, c-format
+msgid "cannot open database file `%s': %s"
+msgstr "nepavyko atverti duomenų bazės failo „%s“: %s"
+
+#: nss/makedb.c:151
+msgid "incorrectly formatted file"
+msgstr "netaisyklingas failo formatas"
+
+#: nss/makedb.c:331
+msgid "duplicate key"
+msgstr ""
+
+#: nss/makedb.c:337
+#, c-format
+msgid "while writing database file"
+msgstr "rašant duomenų bazės failą"
+
+#: nss/makedb.c:348
+#, c-format
+msgid "problems while reading `%s'"
+msgstr "problemos skaitant „%s“"
+
+#: nss/makedb.c:368 nss/makedb.c:385
+#, c-format
+msgid "while reading database"
+msgstr "skaitant duomenų bazę"
+
+#: posix/getconf.c:945
+#, c-format
+msgid "Usage: %s [-v specification] variable_name [pathname]\n"
+msgstr ""
+
+#: posix/getconf.c:948
+#, c-format
+msgid " %s -a [pathname]\n"
+msgstr ""
+
+#: posix/getconf.c:1067
+#, fuzzy, c-format
+msgid "unknown specification \"%s\""
+msgstr "nežinomas predikatas „%s“"
+
+#: posix/getconf.c:1095
+#, c-format
+msgid "Couldn't execute %s"
+msgstr "Nepavyko paleisti %s"
+
+#: posix/getconf.c:1135 posix/getconf.c:1151
+msgid "undefined"
+msgstr "neapibrėžta"
+
+#: posix/getconf.c:1173
+#, c-format
+msgid "Unrecognized variable `%s'"
+msgstr "Neatpažintas kintamasis „%s“"
+
+#: posix/getopt.c:571 posix/getopt.c:587
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: parametras „%s“ dviprasmis\n"
+
+#: posix/getopt.c:620 posix/getopt.c:624
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: parametras „--%s“ neleidžia argumento\n"
+
+#: posix/getopt.c:633 posix/getopt.c:638
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: parametras „%c%s“ neleidžia argumento\n"
+
+#: posix/getopt.c:681 posix/getopt.c:700 posix/getopt.c:1016
+#: posix/getopt.c:1035
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr ""
+
+#: posix/getopt.c:738 posix/getopt.c:741
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: neatpažintas parametras „--%s“\n"
+
+#: posix/getopt.c:749 posix/getopt.c:752
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: neatpažintas parametras „%c%s“\n"
+
+#: posix/getopt.c:804 posix/getopt.c:807
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: netinkamas parametras -- %c\n"
+
+#: posix/getopt.c:813 posix/getopt.c:816
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr ""
+
+#: posix/getopt.c:868 posix/getopt.c:884 posix/getopt.c:1088
+#: posix/getopt.c:1106
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: parametrui reikia argumento -- %c\n"
+
+#: posix/getopt.c:937 posix/getopt.c:953
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: parametras „-W %s“ dviprasmis\n"
+
+#: posix/getopt.c:977 posix/getopt.c:995
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: parametras „-W %s“ neleidžia argumento\n"
+
+#: posix/regcomp.c:135
+msgid "No match"
+msgstr ""
+
+#: posix/regcomp.c:138
+msgid "Invalid regular expression"
+msgstr "Netaisyklinga reguliarioji išraiška"
+
+#: posix/regcomp.c:141
+msgid "Invalid collation character"
+msgstr ""
+
+#: posix/regcomp.c:144
+msgid "Invalid character class name"
+msgstr ""
+
+#: posix/regcomp.c:147
+msgid "Trailing backslash"
+msgstr ""
+
+#: posix/regcomp.c:150
+msgid "Invalid back reference"
+msgstr ""
+
+#: posix/regcomp.c:153
+msgid "Unmatched [ or [^"
+msgstr ""
+
+#: posix/regcomp.c:156
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: posix/regcomp.c:159
+msgid "Unmatched \\{"
+msgstr ""
+
+#: posix/regcomp.c:162
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: posix/regcomp.c:165
+msgid "Invalid range end"
+msgstr ""
+
+#: posix/regcomp.c:168
+msgid "Memory exhausted"
+msgstr "Baigėsi atmintis"
+
+#: posix/regcomp.c:171
+msgid "Invalid preceding regular expression"
+msgstr ""
+
+#: posix/regcomp.c:174
+msgid "Premature end of regular expression"
+msgstr ""
+
+#: posix/regcomp.c:177
+msgid "Regular expression too big"
+msgstr ""
+
+#: posix/regcomp.c:180
+msgid "Unmatched ) or \\)"
+msgstr "Nesuderintas ) arba \\)"
+
+#: posix/regcomp.c:660
+msgid "No previous regular expression"
+msgstr ""
+
+#: posix/wordexp.c:1798
+#, fuzzy
+msgid "parameter null or not set"
+msgstr "%s: parametras tuščias arba nenustatytas"
+
+#: resolv/herror.c:68
+msgid "Resolver Error 0 (no error)"
+msgstr "Paieškos klaida 0 (jokios klaidos)"
+
+#: resolv/herror.c:69
+msgid "Unknown host"
+msgstr "Nežinomas serveris"
+
+#: resolv/herror.c:70
+msgid "Host name lookup failure"
+msgstr "Adreso paieškos sutrikimas"
+
+#: resolv/herror.c:71
+msgid "Unknown server error"
+msgstr "Nežinoma serverio klaida"
+
+#: resolv/herror.c:72
+msgid "No address associated with name"
+msgstr "Su vardu susietų adresų nėra"
+
+#: resolv/herror.c:107
+msgid "Resolver internal error"
+msgstr "Vardų paieškos vidinė klaida"
+
+#: resolv/herror.c:110
+msgid "Unknown resolver error"
+msgstr "Nežinoma vardų paieškos klaida"
+
+#: resolv/res_hconf.c:124
+#, fuzzy, c-format
+msgid "%s: line %d: cannot specify more than %d trim domains"
+msgstr "%s: apribota: negalima naudoti „/“ komandų pavadinimuose"
+
+#: resolv/res_hconf.c:145
+#, c-format
+msgid "%s: line %d: list delimiter not followed by domain"
+msgstr ""
+
+#: resolv/res_hconf.c:204
+#, fuzzy, c-format
+msgid "%s: line %d: expected `on' or `off', found `%s'\n"
+msgstr "%s: eilutė %d: bloga komanda „%s“\n"
+
+#: resolv/res_hconf.c:247
+#, c-format
+msgid "%s: line %d: bad command `%s'\n"
+msgstr "%s: eilutė %d: bloga komanda „%s“\n"
+
+#: resolv/res_hconf.c:282
+#, c-format
+msgid "%s: line %d: ignoring trailing garbage `%s'\n"
+msgstr ""
+
+#: stdio-common/psignal.c:51
+#, c-format
+msgid "%s%sUnknown signal %d\n"
+msgstr "%s%sNežinomas signalas %d\n"
+
+#: stdio-common/psignal.c:52
+msgid "Unknown signal"
+msgstr "Nežinomas signalas"
+
+#: string/_strerror.c:45 sysdeps/mach/_strerror.c:87
+msgid "Unknown error "
+msgstr "Nežinoma klaida "
+
+#: string/strerror.c:43
+msgid "Unknown error"
+msgstr "Nežinoma klaida"
+
+#: string/strsignal.c:65
+#, fuzzy, c-format
+msgid "Real-time signal %d"
+msgstr "%s: nutrauktas signalo %d"
+
+#: string/strsignal.c:69
+#, c-format
+msgid "Unknown signal %d"
+msgstr "Nežinomas signalas %d"
+
+#: sunrpc/auth_unix.c:114
+msgid "authunix_create: out of memory\n"
+msgstr ""
+
+#: sunrpc/auth_unix.c:350
+msgid "auth_unix.c: Fatal marshalling problem"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:118 sunrpc/clnt_perr.c:139
+#, c-format
+msgid "; low version = %lu, high version = %lu"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:125
+msgid "; why = "
+msgstr "; kodėl ="
+
+#: sunrpc/clnt_perr.c:132
+#, c-format
+msgid "(unknown authentication error - %d)"
+msgstr "(nežinoma autentikacijos klaida - %d)"
+
+#: sunrpc/clnt_perr.c:172
+msgid "RPC: Success"
+msgstr "RPC: Sėkmės"
+
+#: sunrpc/clnt_perr.c:175
+msgid "RPC: Can't encode arguments"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:179
+msgid "RPC: Can't decode result"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:183
+msgid "RPC: Unable to send"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:187
+msgid "RPC: Unable to receive"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:191
+msgid "RPC: Timed out"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:195
+msgid "RPC: Incompatible versions of RPC"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:199
+#, fuzzy
+msgid "RPC: Authentication error"
+msgstr "Autentikacijos klaida"
+
+#: sunrpc/clnt_perr.c:203
+#, fuzzy
+msgid "RPC: Program unavailable"
+msgstr "RPC: Programa neregistruota"
+
+#: sunrpc/clnt_perr.c:207
+#, fuzzy
+msgid "RPC: Program/version mismatch"
+msgstr "netinkama RPC programos versija"
+
+#: sunrpc/clnt_perr.c:211
+#, fuzzy
+msgid "RPC: Procedure unavailable"
+msgstr "Reikalingas raktas nerastas"
+
+#: sunrpc/clnt_perr.c:215
+msgid "RPC: Server can't decode arguments"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:219
+#, fuzzy
+msgid "RPC: Remote system error"
+msgstr "Nutolusio įvedimo/išvedimo klaida"
+
+#: sunrpc/clnt_perr.c:223
+msgid "RPC: Unknown host"
+msgstr "RPC: Nežinomas serveris"
+
+#: sunrpc/clnt_perr.c:227
+#, fuzzy
+msgid "RPC: Unknown protocol"
+msgstr "RPC: Nežinomas serveris"
+
+#: sunrpc/clnt_perr.c:231
+#, fuzzy
+msgid "RPC: Port mapper failure"
+msgstr "Elektros maitinimo sutrikimas"
+
+#: sunrpc/clnt_perr.c:235
+msgid "RPC: Program not registered"
+msgstr "RPC: Programa neregistruota"
+
+#: sunrpc/clnt_perr.c:239
+#, fuzzy
+msgid "RPC: Failed (unspecified error)"
+msgstr "Nesėkmė (nenurodyta klaida)"
+
+#: sunrpc/clnt_perr.c:280
+#, fuzzy
+msgid "RPC: (unknown error code)"
+msgstr "Nežinoma klaida "
+
+#: sunrpc/clnt_perr.c:342
+msgid "Authentication OK"
+msgstr "Autentikacija sėkminga"
+
+#: sunrpc/clnt_perr.c:345
+msgid "Invalid client credential"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:349
+msgid "Server rejected credential"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:353
+#, fuzzy
+msgid "Invalid client verifier"
+msgstr "netaisyklingas naudotojas"
+
+#: sunrpc/clnt_perr.c:357
+msgid "Server rejected verifier"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:361
+msgid "Client credential too weak"
+msgstr ""
+
+#: sunrpc/clnt_perr.c:365
+#, fuzzy
+msgid "Invalid server verifier"
+msgstr "nekorektiška eilutė"
+
+#: sunrpc/clnt_perr.c:369
+msgid "Failed (unspecified error)"
+msgstr "Nesėkmė (nenurodyta klaida)"
+
+#: sunrpc/clnt_raw.c:117
+msgid "clnt_raw.c: fatal header serialization error"
+msgstr ""
+
+#: sunrpc/clnt_tcp.c:131
+#, fuzzy
+msgid "clnttcp_create: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/clnt_udp.c:139
+#, fuzzy
+msgid "clntudp_create: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/clnt_unix.c:128
+msgid "clntunix_create: out of memory\n"
+msgstr ""
+
+#: sunrpc/pm_getmaps.c:83
+msgid "pmap_getmaps.c: rpc problem"
+msgstr ""
+
+#: sunrpc/pmap_clnt.c:129
+msgid "Cannot register service"
+msgstr "Nepavyko užregistruoti tarnybos"
+
+#: sunrpc/pmap_rmt.c:248
+#, fuzzy
+msgid "Cannot create socket for broadcast rpc"
+msgstr "nepavyko sukurti paieškos sąrašo"
+
+#: sunrpc/pmap_rmt.c:255
+msgid "Cannot set socket option SO_BROADCAST"
+msgstr ""
+
+#: sunrpc/pmap_rmt.c:307
+msgid "Cannot send broadcast packet"
+msgstr ""
+
+#: sunrpc/pmap_rmt.c:332
+msgid "Broadcast poll problem"
+msgstr ""
+
+#: sunrpc/pmap_rmt.c:345
+msgid "Cannot receive reply to broadcast"
+msgstr ""
+
+#: sunrpc/rpc_main.c:286
+#, c-format
+msgid "%s: output would overwrite %s\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:293
+#, c-format
+msgid "%s: unable to open %s: %m\n"
+msgstr "%s: nepavyko atverti %s: %m\n"
+
+#: sunrpc/rpc_main.c:305
+#, fuzzy, c-format
+msgid "%s: while writing output %s: %m"
+msgstr "%s: nepavyko atverti %s: %m\n"
+
+#: sunrpc/rpc_main.c:340
+#, fuzzy, c-format
+msgid "cannot find C preprocessor: %s \n"
+msgstr "nepavyko atverti bendrojo objekto failo"
+
+#: sunrpc/rpc_main.c:348
+msgid "cannot find any C preprocessor (cpp)\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:417
+#, c-format
+msgid "%s: C preprocessor failed with signal %d\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:420
+#, c-format
+msgid "%s: C preprocessor failed with exit code %d\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:460
+#, c-format
+msgid "illegal nettype: `%s'\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1122
+#, c-format
+msgid "rpcgen: too many defines\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1134
+#, c-format
+msgid "rpcgen: arglist coding error\n"
+msgstr ""
+
+#. TRANS: the file will not be removed; this is an
+#. TRANS: informative message.
+#: sunrpc/rpc_main.c:1167
+#, c-format
+msgid "file `%s' already exists and may be overwritten\n"
+msgstr "failas „%s“ jau egzistuoja ir gali būti perrašytas\n"
+
+#: sunrpc/rpc_main.c:1212
+#, fuzzy, c-format
+msgid "Cannot specify more than one input file!\n"
+msgstr "Kelias „%s“ nurodytas daugiau negu vieną kartą"
+
+#: sunrpc/rpc_main.c:1382
+msgid "This implementation doesn't support newstyle or MT-safe code!\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1391
+#, c-format
+msgid "Cannot use netid flag with inetd flag!\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1403
+msgid "Cannot use netid flag without TIRPC!\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1410
+msgid "Cannot use table flags with newstyle!\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1429
+#, c-format
+msgid "\"infile\" is required for template generation flags.\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1434
+#, fuzzy, c-format
+msgid "Cannot have more than one file generation flag!\n"
+msgstr "Kelias „%s“ nurodytas daugiau negu vieną kartą"
+
+#: sunrpc/rpc_main.c:1443
+#, c-format
+msgid "usage: %s infile\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1444
+#, c-format
+msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1446
+#, c-format
+msgid "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1448
+#, c-format
+msgid "\t%s [-s nettype]* [-o outfile] [infile]\n"
+msgstr ""
+
+#: sunrpc/rpc_main.c:1449
+#, c-format
+msgid "\t%s [-n netid]* [-o outfile] [infile]\n"
+msgstr ""
+
+#: sunrpc/rpc_scan.c:114
+msgid "constant or identifier expected"
+msgstr ""
+
+#: sunrpc/rpc_scan.c:310
+msgid "illegal character in file: "
+msgstr "netaisyklingas simbolis faile: "
+
+#: sunrpc/rpc_scan.c:349 sunrpc/rpc_scan.c:375
+#, fuzzy
+msgid "unterminated string constant"
+msgstr "neužbaigtas pranešimas"
+
+#: sunrpc/rpc_scan.c:381
+msgid "empty char string"
+msgstr "tuščia simbolių eilutė"
+
+#: sunrpc/rpc_scan.c:523 sunrpc/rpc_scan.c:533
+#, fuzzy
+msgid "preprocessor error"
+msgstr "relokacijos klaida"
+
+#: sunrpc/rpcinfo.c:237 sunrpc/rpcinfo.c:383
+#, fuzzy, c-format
+msgid "program %lu is not available\n"
+msgstr "RPC programa nerasta"
+
+#: sunrpc/rpcinfo.c:264 sunrpc/rpcinfo.c:310 sunrpc/rpcinfo.c:333
+#: sunrpc/rpcinfo.c:407 sunrpc/rpcinfo.c:453 sunrpc/rpcinfo.c:476
+#: sunrpc/rpcinfo.c:510
+#, c-format
+msgid "program %lu version %lu is not available\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:515
+#, c-format
+msgid "program %lu version %lu ready and waiting\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:556 sunrpc/rpcinfo.c:563
+msgid "rpcinfo: can't contact portmapper"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:570
+#, fuzzy
+msgid "No remote programs registered.\n"
+msgstr "RPC: Programa neregistruota"
+
+#: sunrpc/rpcinfo.c:574
+msgid " program vers proto port\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:613
+msgid "(unknown)"
+msgstr "(nežinoma)"
+
+#: sunrpc/rpcinfo.c:637
+#, c-format
+msgid "rpcinfo: broadcast failed: %s\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:658
+msgid "Sorry. You are not root\n"
+msgstr "Atsiprašome. Jūs nesate administratorius\n"
+
+#: sunrpc/rpcinfo.c:665
+#, c-format
+msgid "rpcinfo: Could not delete registration for prog %s version %s\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:674
+msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:676
+msgid " rpcinfo [ -n portnum ] -t host prognum [ versnum ]\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:678
+msgid " rpcinfo -p [ host ]\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:679
+msgid " rpcinfo -b prognum versnum\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:680
+msgid " rpcinfo -d prognum versnum\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:695
+#, c-format
+msgid "rpcinfo: %s is unknown service\n"
+msgstr ""
+
+#: sunrpc/rpcinfo.c:732
+#, c-format
+msgid "rpcinfo: %s is unknown host\n"
+msgstr ""
+
+#: sunrpc/svc_run.c:70
+#, fuzzy
+msgid "svc_run: - out of memory"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/svc_run.c:90
+msgid "svc_run: - poll failed"
+msgstr ""
+
+#: sunrpc/svc_simple.c:87
+#, c-format
+msgid "can't reassign procedure number %ld\n"
+msgstr ""
+
+#: sunrpc/svc_simple.c:97
+msgid "couldn't create an rpc server\n"
+msgstr ""
+
+#: sunrpc/svc_simple.c:105
+#, c-format
+msgid "couldn't register prog %ld vers %ld\n"
+msgstr ""
+
+#: sunrpc/svc_simple.c:113
+#, fuzzy
+msgid "registerrpc: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/svc_simple.c:173
+#, c-format
+msgid "trouble replying to prog %d\n"
+msgstr ""
+
+#: sunrpc/svc_simple.c:182
+#, c-format
+msgid "never registered prog %d\n"
+msgstr ""
+
+#: sunrpc/svc_tcp.c:155
+msgid "svc_tcp.c - tcp socket creation problem"
+msgstr ""
+
+#: sunrpc/svc_tcp.c:170
+msgid "svc_tcp.c - cannot getsockname or listen"
+msgstr ""
+
+#: sunrpc/svc_tcp.c:179
+#, fuzzy
+msgid "svctcp_create: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/svc_tcp.c:218
+msgid "svc_tcp: makefd_xprt: out of memory\n"
+msgstr ""
+
+#: sunrpc/svc_udp.c:128
+msgid "svcudp_create: socket creation problem"
+msgstr ""
+
+#: sunrpc/svc_udp.c:142
+msgid "svcudp_create - cannot getsockname"
+msgstr ""
+
+#: sunrpc/svc_udp.c:152
+#, fuzzy
+msgid "svcudp_create: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/svc_udp.c:174
+msgid "svcudp_create: xp_pad is too small for IP_PKTINFO\n"
+msgstr ""
+
+#: sunrpc/svc_udp.c:474
+msgid "enablecache: cache already enabled"
+msgstr ""
+
+#: sunrpc/svc_udp.c:480
+msgid "enablecache: could not allocate cache"
+msgstr ""
+
+#: sunrpc/svc_udp.c:489
+msgid "enablecache: could not allocate cache data"
+msgstr ""
+
+#: sunrpc/svc_udp.c:497
+msgid "enablecache: could not allocate cache fifo"
+msgstr ""
+
+#: sunrpc/svc_udp.c:532
+#, fuzzy
+msgid "cache_set: victim not found"
+msgstr "%s: komanda nerasta"
+
+#: sunrpc/svc_udp.c:543
+msgid "cache_set: victim alloc failed"
+msgstr ""
+
+#: sunrpc/svc_udp.c:550
+msgid "cache_set: could not allocate new rpc_buffer"
+msgstr ""
+
+#: sunrpc/svc_unix.c:150
+msgid "svc_unix.c - AF_UNIX socket creation problem"
+msgstr ""
+
+#: sunrpc/svc_unix.c:166
+msgid "svc_unix.c - cannot getsockname or listen"
+msgstr ""
+
+#: sunrpc/svc_unix.c:176
+#, fuzzy
+msgid "svcunix_create: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/svc_unix.c:215
+msgid "svc_unix: makefd_xprt: out of memory\n"
+msgstr ""
+
+#: sunrpc/xdr.c:566
+#, fuzzy
+msgid "xdr_bytes: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/xdr.c:718
+#, fuzzy
+msgid "xdr_string: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/xdr_array.c:106
+#, fuzzy
+msgid "xdr_array: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/xdr_rec.c:156
+#, fuzzy
+msgid "xdrrec_create: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sunrpc/xdr_ref.c:86
+#, fuzzy
+msgid "xdr_reference: out of memory\n"
+msgstr "baigėsi atmintis"
+
+#: sysdeps/generic/siglist.h:29 sysdeps/unix/siglist.c:27
+msgid "Hangup"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:30 sysdeps/unix/siglist.c:28
+msgid "Interrupt"
+msgstr "Pertraukimas"
+
+#: sysdeps/generic/siglist.h:31 sysdeps/unix/siglist.c:29
+msgid "Quit"
+msgstr "Išeita"
+
+#: sysdeps/generic/siglist.h:32 sysdeps/unix/siglist.c:30
+msgid "Illegal instruction"
+msgstr "Netaisyklinga instrukcija"
+
+#: sysdeps/generic/siglist.h:33 sysdeps/unix/siglist.c:31
+msgid "Trace/breakpoint trap"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:34
+msgid "Aborted"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:35 sysdeps/unix/siglist.c:34
+msgid "Floating point exception"
+msgstr "Slankaus kablelio klaida"
+
+#: sysdeps/generic/siglist.h:36 sysdeps/unix/siglist.c:35
+msgid "Killed"
+msgstr "Nutraukta"
+
+#: sysdeps/generic/siglist.h:37 sysdeps/unix/siglist.c:36
+msgid "Bus error"
+msgstr "Magistralės klaida"
+
+#: sysdeps/generic/siglist.h:38 sysdeps/unix/siglist.c:37
+msgid "Segmentation fault"
+msgstr "Segmentavimo klaida"
+
+#. TRANS Broken pipe; there is no process reading from the other end of a pipe.
+#. TRANS Every library function that returns this error code also generates a
+#. TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled
+#. TRANS or blocked. Thus, your program will never actually see @code{EPIPE}
+#. TRANS unless it has handled or blocked @code{SIGPIPE}.
+#: sysdeps/generic/siglist.h:39 sysdeps/gnu/errlist.c:359
+#: sysdeps/unix/siglist.c:39
+msgid "Broken pipe"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:40 sysdeps/unix/siglist.c:40
+msgid "Alarm clock"
+msgstr "Žadintuvas"
+
+#: sysdeps/generic/siglist.h:41 sysdeps/unix/siglist.c:41
+#, fuzzy
+msgid "Terminated"
+msgstr "Užbaigta"
+
+#: sysdeps/generic/siglist.h:42 sysdeps/unix/siglist.c:42
+msgid "Urgent I/O condition"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:43 sysdeps/unix/siglist.c:43
+msgid "Stopped (signal)"
+msgstr "Sustabdyta (signalas)"
+
+#: sysdeps/generic/siglist.h:44 sysdeps/unix/siglist.c:44
+msgid "Stopped"
+msgstr "Sustabdyta"
+
+#: sysdeps/generic/siglist.h:45 sysdeps/unix/siglist.c:45
+msgid "Continued"
+msgstr "Pratęsta"
+
+#: sysdeps/generic/siglist.h:46 sysdeps/unix/siglist.c:46
+#, fuzzy
+msgid "Child exited"
+msgstr "Failas jau egzistuoja"
+
+#: sysdeps/generic/siglist.h:47 sysdeps/unix/siglist.c:47
+#, fuzzy
+msgid "Stopped (tty input)"
+msgstr "Sustabdyta (signalas)"
+
+#: sysdeps/generic/siglist.h:48 sysdeps/unix/siglist.c:48
+msgid "Stopped (tty output)"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:49 sysdeps/unix/siglist.c:49
+msgid "I/O possible"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:50 sysdeps/unix/siglist.c:50
+msgid "CPU time limit exceeded"
+msgstr "Viršyta CPU laiko riba"
+
+#: sysdeps/generic/siglist.h:51 sysdeps/unix/siglist.c:51
+msgid "File size limit exceeded"
+msgstr "Viršyta failo dydžio riba"
+
+#: sysdeps/generic/siglist.h:52 sysdeps/unix/siglist.c:52
+msgid "Virtual timer expired"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:53 sysdeps/unix/siglist.c:53
+msgid "Profiling timer expired"
+msgstr ""
+
+#: sysdeps/generic/siglist.h:54 sysdeps/unix/siglist.c:54
+msgid "Window changed"
+msgstr "Langas pasikeitė"
+
+#: sysdeps/generic/siglist.h:55 sysdeps/unix/siglist.c:56
+msgid "User defined signal 1"
+msgstr "Naudotojo apibrėžtas signalas 1"
+
+#: sysdeps/generic/siglist.h:56 sysdeps/unix/siglist.c:57
+msgid "User defined signal 2"
+msgstr "Naudotojo apibrėžtas signalas 2"
+
+#: sysdeps/generic/siglist.h:60 sysdeps/unix/siglist.c:33
+msgid "EMT trap"
+msgstr "EMT gaudyklė"
+
+#: sysdeps/generic/siglist.h:63 sysdeps/unix/siglist.c:38
+msgid "Bad system call"
+msgstr "Blogas sisteminis kvietimas"
+
+#: sysdeps/generic/siglist.h:66
+msgid "Stack fault"
+msgstr "Steko klaida"
+
+#: sysdeps/generic/siglist.h:69
+msgid "Information request"
+msgstr "Informacijos užklausa"
+
+#: sysdeps/generic/siglist.h:71
+msgid "Power failure"
+msgstr "Elektros maitinimo sutrikimas"
+
+#: sysdeps/generic/siglist.h:74 sysdeps/unix/siglist.c:55
+msgid "Resource lost"
+msgstr "Resursas prarastas"
+
+#. TRANS Operation not permitted; only the owner of the file (or other resource)
+#. TRANS or processes with special privileges can perform the operation.
+#: sysdeps/gnu/errlist.c:25
+msgid "Operation not permitted"
+msgstr "Operacija neleidžiama"
+
+#. TRANS No process matches the specified process ID.
+#: sysdeps/gnu/errlist.c:45
+msgid "No such process"
+msgstr "Tokio proceso nėra"
+
+#. TRANS Interrupted function call; an asynchronous signal occurred and prevented
+#. TRANS completion of the call. When this happens, you should try the call
+#. TRANS again.
+#. TRANS
+#. TRANS You can choose to have functions resume after a signal that is handled,
+#. TRANS rather than failing with @code{EINTR}; see @ref{Interrupted
+#. TRANS Primitives}.
+#: sysdeps/gnu/errlist.c:60
+msgid "Interrupted system call"
+msgstr "Nutrauktas sistemos iškvietimas"
+
+#. TRANS Input/output error; usually used for physical read or write errors.
+#: sysdeps/gnu/errlist.c:69
+msgid "Input/output error"
+msgstr "Įvedimo/išvedimo klaida"
+
+#. TRANS No such device or address. The system tried to use the device
+#. TRANS represented by a file you specified, and it couldn't find the device.
+#. TRANS This can mean that the device file was installed incorrectly, or that
+#. TRANS the physical device is missing or not correctly attached to the
+#. TRANS computer.
+#: sysdeps/gnu/errlist.c:82
+msgid "No such device or address"
+msgstr "Nėra tokio įrenginio ar adreso"
+
+#. TRANS Argument list too long; used when the arguments passed to a new program
+#. TRANS being executed with one of the @code{exec} functions (@pxref{Executing a
+#. TRANS File}) occupy too much memory space. This condition never arises in the
+#. TRANS GNU system.
+#: sysdeps/gnu/errlist.c:94
+msgid "Argument list too long"
+msgstr "Argumentų sąrašas per ilgas"
+
+#. TRANS Invalid executable file format. This condition is detected by the
+#. TRANS @code{exec} functions; see @ref{Executing a File}.
+#: sysdeps/gnu/errlist.c:104
+#, fuzzy
+msgid "Exec format error"
+msgstr "relokacijos klaida"
+
+#. TRANS Bad file descriptor; for example, I/O on a descriptor that has been
+#. TRANS closed or reading from a descriptor open only for writing (or vice
+#. TRANS versa).
+#: sysdeps/gnu/errlist.c:115
+#, fuzzy
+msgid "Bad file descriptor"
+msgstr "nepavyko užverti failo deskriptoriaus"
+
+#. TRANS There are no child processes. This error happens on operations that are
+#. TRANS supposed to manipulate child processes, when there aren't any processes
+#. TRANS to manipulate.
+#: sysdeps/gnu/errlist.c:126
+#, fuzzy
+msgid "No child processes"
+msgstr "Tokio proceso nėra"
+
+#. TRANS Deadlock avoided; allocating a system resource would have resulted in a
+#. TRANS deadlock situation. The system does not guarantee that it will notice
+#. TRANS all such situations. This error means you got lucky and the system
+#. TRANS noticed; it might just hang. @xref{File Locks}, for an example.
+#: sysdeps/gnu/errlist.c:138
+msgid "Resource deadlock avoided"
+msgstr ""
+
+#. TRANS No memory available. The system cannot allocate more virtual memory
+#. TRANS because its capacity is full.
+#: sysdeps/gnu/errlist.c:148
+msgid "Cannot allocate memory"
+msgstr "Nepavyko išskirti atminties"
+
+#. TRANS Bad address; an invalid pointer was detected.
+#. TRANS In the GNU system, this error never happens; you get a signal instead.
+#: sysdeps/gnu/errlist.c:167
+msgid "Bad address"
+msgstr "Blogas adresas"
+
+#. TRANS A file that isn't a block special file was given in a situation that
+#. TRANS requires one. For example, trying to mount an ordinary file as a file
+#. TRANS system in Unix gives this error.
+#: sysdeps/gnu/errlist.c:178
+msgid "Block device required"
+msgstr "Reikalingas blokinis įrenginys"
+
+#. TRANS Resource busy; a system resource that can't be shared is already in use.
+#. TRANS For example, if you try to delete a file that is the root of a currently
+#. TRANS mounted filesystem, you get this error.
+#: sysdeps/gnu/errlist.c:189
+msgid "Device or resource busy"
+msgstr "Įrenginys ar resursas užimtas"
+
+#. TRANS File exists; an existing file was specified in a context where it only
+#. TRANS makes sense to specify a new file.
+#: sysdeps/gnu/errlist.c:199
+msgid "File exists"
+msgstr "Failas jau egzistuoja"
+
+#. TRANS An attempt to make an improper link across file systems was detected.
+#. TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but
+#. TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}).
+#: sysdeps/gnu/errlist.c:210
+#, fuzzy
+msgid "Invalid cross-device link"
+msgstr "netaisyklingas naudotojas"
+
+#. TRANS The wrong type of device was given to a function that expects a
+#. TRANS particular sort of device.
+#: sysdeps/gnu/errlist.c:220
+msgid "No such device"
+msgstr "Tokio įrenginio nėra"
+
+#. TRANS A file that isn't a directory was specified when a directory is required.
+#: sysdeps/gnu/errlist.c:229
+#, fuzzy
+msgid "Not a directory"
+msgstr "Ne aplankas"
+
+#. TRANS File is a directory; you cannot open a directory for writing,
+#. TRANS or create or remove hard links to it.
+#: sysdeps/gnu/errlist.c:239
+#, fuzzy
+msgid "Is a directory"
+msgstr "Aplankas"
+
+#. TRANS Invalid argument. This is used to indicate various kinds of problems
+#. TRANS with passing the wrong argument to a library function.
+#: sysdeps/gnu/errlist.c:249
+#, fuzzy
+msgid "Invalid argument"
+msgstr "Galimi argumentai:"
+
+#. TRANS The current process has too many files open and can't open any more.
+#. TRANS Duplicate descriptors do count toward this limit.
+#. TRANS
+#. TRANS In BSD and GNU, the number of open files is controlled by a resource
+#. TRANS limit that can usually be increased. If you get this error, you might
+#. TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited;
+#. TRANS @pxref{Limits on Resources}.
+#: sysdeps/gnu/errlist.c:264
+msgid "Too many open files"
+msgstr "Per daug atvertų failų"
+
+#. TRANS There are too many distinct file openings in the entire system. Note
+#. TRANS that any number of linked channels count as just one file opening; see
+#. TRANS @ref{Linked Channels}. This error never occurs in the GNU system.
+#: sysdeps/gnu/errlist.c:275
+msgid "Too many open files in system"
+msgstr "Sistemoje per daug atvertų failų"
+
+#. TRANS Inappropriate I/O control operation, such as trying to set terminal
+#. TRANS modes on an ordinary file.
+#: sysdeps/gnu/errlist.c:285
+#, fuzzy
+msgid "Inappropriate ioctl for device"
+msgstr "Netinkamas failo tipas ar formatas"
+
+#. TRANS An attempt to execute a file that is currently open for writing, or
+#. TRANS write to a file that is currently being executed. Often using a
+#. TRANS debugger to run a program is considered having it open for writing and
+#. TRANS will cause this error. (The name stands for ``text file busy''.) This
+#. TRANS is not an error in the GNU system; the text is copied as necessary.
+#: sysdeps/gnu/errlist.c:298
+msgid "Text file busy"
+msgstr "Tekstinis failas užimtas"
+
+#. TRANS File too big; the size of a file would be larger than allowed by the system.
+#: sysdeps/gnu/errlist.c:307
+#, fuzzy
+msgid "File too large"
+msgstr "Failas per didelis"
+
+#. TRANS No space left on device; write operation on a file failed because the
+#. TRANS disk is full.
+#: sysdeps/gnu/errlist.c:317
+msgid "No space left on device"
+msgstr "Įrenginyje neliko vietos"
+
+#. TRANS Invalid seek operation (such as on a pipe).
+#: sysdeps/gnu/errlist.c:326
+msgid "Illegal seek"
+msgstr ""
+
+#. TRANS An attempt was made to modify something on a read-only file system.
+#: sysdeps/gnu/errlist.c:335
+msgid "Read-only file system"
+msgstr "Failų sistema tik skaitymui"
+
+#. TRANS Too many links; the link count of a single file would become too large.
+#. TRANS @code{rename} can cause this error if the file being renamed already has
+#. TRANS as many links as it can take (@pxref{Renaming Files}).
+#: sysdeps/gnu/errlist.c:346
+msgid "Too many links"
+msgstr "Per daug nuorodų"
+
+#. TRANS Domain error; used by mathematical functions when an argument value does
+#. TRANS not fall into the domain over which the function is defined.
+#: sysdeps/gnu/errlist.c:369
+msgid "Numerical argument out of domain"
+msgstr "Skaitinis argumentas už apibrėžimo srities"
+
+#. TRANS Range error; used by mathematical functions when the result value is
+#. TRANS not representable because of overflow or underflow.
+#: sysdeps/gnu/errlist.c:379
+msgid "Numerical result out of range"
+msgstr "Skaitinis rezultatas už ribų"
+
+#. TRANS Resource temporarily unavailable; the call might work if you try again
+#. TRANS later. The macro @code{EWOULDBLOCK} is another name for @code{EAGAIN};
+#. TRANS they are always the same in the GNU C library.
+#. TRANS
+#. TRANS This error can happen in a few different situations:
+#. TRANS
+#. TRANS @itemize @bullet
+#. TRANS @item
+#. TRANS An operation that would block was attempted on an object that has
+#. TRANS non-blocking mode selected. Trying the same operation again will block
+#. TRANS until some external condition makes it possible to read, write, or
+#. TRANS connect (whatever the operation). You can use @code{select} to find out
+#. TRANS when the operation will be possible; @pxref{Waiting for I/O}.
+#. TRANS
+#. TRANS @strong{Portability Note:} In many older Unix systems, this condition
+#. TRANS was indicated by @code{EWOULDBLOCK}, which was a distinct error code
+#. TRANS different from @code{EAGAIN}. To make your program portable, you should
+#. TRANS check for both codes and treat them the same.
+#. TRANS
+#. TRANS @item
+#. TRANS A temporary resource shortage made an operation impossible. @code{fork}
+#. TRANS can return this error. It indicates that the shortage is expected to
+#. TRANS pass, so your program can try the call again later and it may succeed.
+#. TRANS It is probably a good idea to delay for a few seconds before trying it
+#. TRANS again, to allow time for other processes to release scarce resources.
+#. TRANS Such shortages are usually fairly serious and affect the whole system,
+#. TRANS so usually an interactive program should report the error to the user
+#. TRANS and return to its command loop.
+#. TRANS @end itemize
+#: sysdeps/gnu/errlist.c:416
+msgid "Resource temporarily unavailable"
+msgstr "Resursas laikinai neprieinamas"
+
+#. TRANS In the GNU C library, this is another name for @code{EAGAIN} (above).
+#. TRANS The values are always the same, on every operating system.
+#. TRANS
+#. TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a
+#. TRANS separate error code.
+#: sysdeps/gnu/errlist.c:429
+msgid "Operation would block"
+msgstr "Operacija blokuotųsi"
+
+#. TRANS An operation that cannot complete immediately was initiated on an object
+#. TRANS that has non-blocking mode selected. Some functions that must always
+#. TRANS block (such as @code{connect}; @pxref{Connecting}) never return
+#. TRANS @code{EAGAIN}. Instead, they return @code{EINPROGRESS} to indicate that
+#. TRANS the operation has begun and will take some time. Attempts to manipulate
+#. TRANS the object before the call completes return @code{EALREADY}. You can
+#. TRANS use the @code{select} function to find out when the pending operation
+#. TRANS has completed; @pxref{Waiting for I/O}.
+#: sysdeps/gnu/errlist.c:445
+msgid "Operation now in progress"
+msgstr "Operacija dabar vykdoma"
+
+#. TRANS An operation is already in progress on an object that has non-blocking
+#. TRANS mode selected.
+#: sysdeps/gnu/errlist.c:455
+msgid "Operation already in progress"
+msgstr "Operacija jau vykdoma"
+
+#. TRANS A file that isn't a socket was specified when a socket is required.
+#: sysdeps/gnu/errlist.c:464
+msgid "Socket operation on non-socket"
+msgstr "Lizdo operacija taikoma ne lizdui"
+
+#. TRANS The size of a message sent on a socket was larger than the supported
+#. TRANS maximum size.
+#: sysdeps/gnu/errlist.c:474
+msgid "Message too long"
+msgstr "Pranešimas per ilgas"
+
+#. TRANS The socket type does not support the requested communications protocol.
+#: sysdeps/gnu/errlist.c:483
+msgid "Protocol wrong type for socket"
+msgstr ""
+
+#. TRANS You specified a socket option that doesn't make sense for the
+#. TRANS particular protocol being used by the socket. @xref{Socket Options}.
+#: sysdeps/gnu/errlist.c:493
+#, fuzzy
+msgid "Protocol not available"
+msgstr "Protokolas nepalaikomas"
+
+#. TRANS The socket domain does not support the requested communications protocol
+#. TRANS (perhaps because the requested protocol is completely invalid).
+#. TRANS @xref{Creating a Socket}.
+#: sysdeps/gnu/errlist.c:504
+msgid "Protocol not supported"
+msgstr "Protokolas nepalaikomas"
+
+#. TRANS The socket type is not supported.
+#: sysdeps/gnu/errlist.c:513
+msgid "Socket type not supported"
+msgstr "Lizdo tipas nepalaikomas"
+
+#. TRANS The operation you requested is not supported. Some socket functions
+#. TRANS don't make sense for all types of sockets, and others may not be
+#. TRANS implemented for all communications protocols. In the GNU system, this
+#. TRANS error can happen for many calls when the object does not support the
+#. TRANS particular operation; it is a generic indication that the server knows
+#. TRANS nothing to do for that call.
+#: sysdeps/gnu/errlist.c:527
+#, fuzzy
+msgid "Operation not supported"
+msgstr "Operacija neleidžiama"
+
+#. TRANS The socket communications protocol family you requested is not supported.
+#: sysdeps/gnu/errlist.c:536
+msgid "Protocol family not supported"
+msgstr "Protokolo šeima nepalaikoma"
+
+#. TRANS The address family specified for a socket is not supported; it is
+#. TRANS inconsistent with the protocol being used on the socket. @xref{Sockets}.
+#: sysdeps/gnu/errlist.c:546
+msgid "Address family not supported by protocol"
+msgstr "Adreso šeima nepalaikoma protokolo"
+
+#. TRANS The requested socket address is already in use. @xref{Socket Addresses}.
+#: sysdeps/gnu/errlist.c:555
+msgid "Address already in use"
+msgstr "Adresas jau naudojamas"
+
+#. TRANS The requested socket address is not available; for example, you tried
+#. TRANS to give a socket a name that doesn't match the local host name.
+#. TRANS @xref{Socket Addresses}.
+#: sysdeps/gnu/errlist.c:566
+msgid "Cannot assign requested address"
+msgstr "Nepavyko priskirti prašomo adreso"
+
+#. TRANS A socket operation failed because the network was down.
+#: sysdeps/gnu/errlist.c:575
+msgid "Network is down"
+msgstr "Tinklas išjungtas"
+
+#. TRANS A socket operation failed because the subnet containing the remote host
+#. TRANS was unreachable.
+#: sysdeps/gnu/errlist.c:585
+msgid "Network is unreachable"
+msgstr "Tinklas neprieinamas"
+
+#. TRANS A network connection was reset because the remote host crashed.
+#: sysdeps/gnu/errlist.c:594
+msgid "Network dropped connection on reset"
+msgstr ""
+
+#. TRANS A network connection was aborted locally.
+#: sysdeps/gnu/errlist.c:603
+msgid "Software caused connection abort"
+msgstr ""
+
+#. TRANS A network connection was closed for reasons outside the control of the
+#. TRANS local host, such as by the remote machine rebooting or an unrecoverable
+#. TRANS protocol violation.
+#: sysdeps/gnu/errlist.c:614
+msgid "Connection reset by peer"
+msgstr "Prisijungimas nutrauktas kito serverio"
+
+#. TRANS The kernel's buffers for I/O operations are all in use. In GNU, this
+#. TRANS error is always synonymous with @code{ENOMEM}; you may get one or the
+#. TRANS other from network operations.
+#: sysdeps/gnu/errlist.c:625
+msgid "No buffer space available"
+msgstr "Nėra vietos buferyje"
+
+#. TRANS You tried to connect a socket that is already connected.
+#. TRANS @xref{Connecting}.
+#: sysdeps/gnu/errlist.c:635
+msgid "Transport endpoint is already connected"
+msgstr "Transporto galinis taškas jau prijungtas"
+
+#. TRANS The socket is not connected to anything. You get this error when you
+#. TRANS try to transmit data over a socket, without first specifying a
+#. TRANS destination for the data. For a connectionless socket (for datagram
+#. TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead.
+#: sysdeps/gnu/errlist.c:647
+msgid "Transport endpoint is not connected"
+msgstr "Transporto galinis taškas neprijungtas"
+
+#. TRANS No default destination address was set for the socket. You get this
+#. TRANS error when you try to transmit data over a connectionless socket,
+#. TRANS without first specifying a destination for the data with @code{connect}.
+#: sysdeps/gnu/errlist.c:658
+msgid "Destination address required"
+msgstr "Reikia paskirties adreso"
+
+#. TRANS The socket has already been shut down.
+#: sysdeps/gnu/errlist.c:667
+msgid "Cannot send after transport endpoint shutdown"
+msgstr "Negalima siųsti po transporto galinio taško išjungimo (shutdown)"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:676
+#, fuzzy
+msgid "Too many references: cannot splice"
+msgstr "Per daug nuorodų: negalima skaidyti"
+
+#. TRANS A socket operation with a specified timeout received no response during
+#. TRANS the timeout period.
+#: sysdeps/gnu/errlist.c:686
+msgid "Connection timed out"
+msgstr "Baigėsi prisijungimo laukimo laikas"
+
+#. TRANS A remote host refused to allow the network connection (typically because
+#. TRANS it is not running the requested service).
+#: sysdeps/gnu/errlist.c:696
+msgid "Connection refused"
+msgstr "Prisijungimas atmestas"
+
+#. TRANS Too many levels of symbolic links were encountered in looking up a file name.
+#. TRANS This often indicates a cycle of symbolic links.
+#: sysdeps/gnu/errlist.c:706
+msgid "Too many levels of symbolic links"
+msgstr "Per daug simbolinių nuorodų lygmenų"
+
+#. TRANS Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for
+#. TRANS Files}) or host name too long (in @code{gethostname} or
+#. TRANS @code{sethostname}; @pxref{Host Identification}).
+#: sysdeps/gnu/errlist.c:717
+msgid "File name too long"
+msgstr "Failo vardas per ilgas"
+
+#. TRANS The remote host for a requested network connection is down.
+#: sysdeps/gnu/errlist.c:726
+msgid "Host is down"
+msgstr "Serveris neveikia"
+
+#. TRANS The remote host for a requested network connection is not reachable.
+#: sysdeps/gnu/errlist.c:735
+msgid "No route to host"
+msgstr "Nėra kelio iki serverio"
+
+#. TRANS Directory not empty, where an empty directory was expected. Typically,
+#. TRANS this error occurs when you are trying to delete a directory.
+#: sysdeps/gnu/errlist.c:745
+msgid "Directory not empty"
+msgstr "Aplankas netuščias"
+
+#. TRANS This means that the per-user limit on new process would be exceeded by
+#. TRANS an attempted @code{fork}. @xref{Limits on Resources}, for details on
+#. TRANS the @code{RLIMIT_NPROC} limit.
+#: sysdeps/gnu/errlist.c:756
+msgid "Too many processes"
+msgstr "Per daug procesų"
+
+#. TRANS The file quota system is confused because there are too many users.
+#. TRANS @c This can probably happen in a GNU system when using NFS.
+#: sysdeps/gnu/errlist.c:766
+msgid "Too many users"
+msgstr "Per daug naudotojų"
+
+#. TRANS The user's disk quota was exceeded.
+#: sysdeps/gnu/errlist.c:775
+msgid "Disk quota exceeded"
+msgstr "Viršyta disko kvota"
+
+#. TRANS Stale NFS file handle. This indicates an internal confusion in the NFS
+#. TRANS system which is due to file system rearrangements on the server host.
+#. TRANS Repairing this condition usually requires unmounting and remounting
+#. TRANS the NFS file system on the local host.
+#: sysdeps/gnu/errlist.c:787
+msgid "Stale NFS file handle"
+msgstr ""
+
+#. TRANS An attempt was made to NFS-mount a remote file system with a file name that
+#. TRANS already specifies an NFS-mounted file.
+#. TRANS (This is an error on some operating systems, but we expect it to work
+#. TRANS properly on the GNU system, making this error code impossible.)
+#: sysdeps/gnu/errlist.c:799
+msgid "Object is remote"
+msgstr "Objektas nutolęs"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:808
+msgid "RPC struct is bad"
+msgstr "bloga RPC struktūra"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:817
+msgid "RPC version wrong"
+msgstr "netinkama RPC versija"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:826
+#, fuzzy
+msgid "RPC program not available"
+msgstr "RPC: Programa neregistruota"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:835
+msgid "RPC program version wrong"
+msgstr "netinkama RPC programos versija"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:844
+msgid "RPC bad procedure for program"
+msgstr ""
+
+#. TRANS No locks available. This is used by the file locking facilities; see
+#. TRANS @ref{File Locks}. This error is never generated by the GNU system, but
+#. TRANS it can result from an operation to an NFS server running another
+#. TRANS operating system.
+#: sysdeps/gnu/errlist.c:856
+#, fuzzy
+msgid "No locks available"
+msgstr "Nėra vietos buferyje"
+
+#. TRANS Inappropriate file type or format. The file was the wrong type for the
+#. TRANS operation, or a data file had the wrong format.
+#. TRANS
+#. TRANS On some systems @code{chmod} returns this error if you try to set the
+#. TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}.
+#: sysdeps/gnu/errlist.c:869
+msgid "Inappropriate file type or format"
+msgstr "Netinkamas failo tipas ar formatas"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:878
+msgid "Authentication error"
+msgstr "Autentikacijos klaida"
+
+#. TRANS ???
+#: sysdeps/gnu/errlist.c:887
+#, fuzzy
+msgid "Need authenticator"
+msgstr "Autentikacijos klaida"
+
+#. TRANS Function not implemented. This indicates that the function called is
+#. TRANS not implemented at all, either in the C library itself or in the
+#. TRANS operating system. When you get this error, you can be sure that this
+#. TRANS particular function will always fail with @code{ENOSYS} unless you
+#. TRANS install a new version of the C library or the operating system.
+#: sysdeps/gnu/errlist.c:900
+msgid "Function not implemented"
+msgstr "Funkcija nerealizuota"
+
+#. TRANS Not supported. A function returns this error when certain parameter
+#. TRANS values are valid, but the functionality they request is not available.
+#. TRANS This can mean that the function does not implement a particular command
+#. TRANS or option value or flag bit at all. For functions that operate on some
+#. TRANS object given in a parameter, such as a file descriptor or a port, it
+#. TRANS might instead mean that only @emph{that specific object} (file
+#. TRANS descriptor, port, etc.) is unable to support the other parameters given;
+#. TRANS different file descriptors might support different ranges of parameter
+#. TRANS values.
+#. TRANS
+#. TRANS If the entire function is not available at all in the implementation,
+#. TRANS it returns @code{ENOSYS} instead.
+#: sysdeps/gnu/errlist.c:920
+msgid "Not supported"
+msgstr "Nepalaikoma"
+
+#. TRANS While decoding a multibyte character the function came along an invalid
+#. TRANS or an incomplete sequence of bytes or the given wide character is invalid.
+#: sysdeps/gnu/errlist.c:930
+msgid "Invalid or incomplete multibyte or wide character"
+msgstr "Netaisyklingas arba nepilnas daugiabaitis simbolis"
+
+#. TRANS In the GNU system, servers supporting the @code{term} protocol return
+#. TRANS this error for certain operations when the caller is not in the
+#. TRANS foreground process group of the terminal. Users do not usually see this
+#. TRANS error because functions such as @code{read} and @code{write} translate
+#. TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal. @xref{Job Control},
+#. TRANS for information on process groups and these signals.
+#: sysdeps/gnu/errlist.c:944
+msgid "Inappropriate operation for background process"
+msgstr ""
+
+#. TRANS In the GNU system, opening a file returns this error when the file is
+#. TRANS translated by a program and the translator program dies while starting
+#. TRANS up, before it has connected to the file.
+#: sysdeps/gnu/errlist.c:955
+msgid "Translator died"
+msgstr ""
+
+#. TRANS The experienced user will know what is wrong.
+#. TRANS @c This error code is a joke. Its perror text is part of the joke.
+#. TRANS @c Don't change it.
+#: sysdeps/gnu/errlist.c:966
+msgid "?"
+msgstr "?"
+
+#. TRANS You did @strong{what}?
+#: sysdeps/gnu/errlist.c:975
+msgid "You really blew it this time"
+msgstr "Šįkart susimovei kaip reikiant"
+
+#. TRANS Go home and have a glass of warm, dairy-fresh milk.
+#: sysdeps/gnu/errlist.c:984
+msgid "Computer bought the farm"
+msgstr "Kompiuteris nupirko fermą"
+
+#. TRANS This error code has no purpose.
+#: sysdeps/gnu/errlist.c:993
+#, fuzzy
+msgid "Gratuitous error"
+msgstr "relokacijos klaida"
+
+#: sysdeps/gnu/errlist.c:1001
+#, fuzzy
+msgid "Bad message"
+msgstr "neužbaigtas pranešimas"
+
+#: sysdeps/gnu/errlist.c:1009
+msgid "Identifier removed"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1017
+msgid "Multihop attempted"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1025
+#, fuzzy
+msgid "No data available"
+msgstr "Nėra vietos buferyje"
+
+#: sysdeps/gnu/errlist.c:1033
+#, fuzzy
+msgid "Link has been severed"
+msgstr "Raktas atšauktas"
+
+#: sysdeps/gnu/errlist.c:1041
+msgid "No message of desired type"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1049
+msgid "Out of streams resources"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1057
+msgid "Device not a stream"
+msgstr "Įrenginys nėra srautas"
+
+#: sysdeps/gnu/errlist.c:1065
+msgid "Value too large for defined data type"
+msgstr "Reikšmė per didelė apibrėžtam duomenų tipui"
+
+#: sysdeps/gnu/errlist.c:1073
+msgid "Protocol error"
+msgstr "Protokolo klaida"
+
+#: sysdeps/gnu/errlist.c:1081
+#, fuzzy
+msgid "Timer expired"
+msgstr "Baigėsi rakto galiojimo laikas"
+
+#. TRANS Operation canceled; an asynchronous operation was canceled before it
+#. TRANS completed. @xref{Asynchronous I/O}. When you call @code{aio_cancel},
+#. TRANS the normal result is for the operations affected to complete with this
+#. TRANS error; @pxref{Cancel AIO Operations}.
+#: sysdeps/gnu/errlist.c:1093
+msgid "Operation canceled"
+msgstr "Operacija nutraukta"
+
+#: sysdeps/gnu/errlist.c:1101
+msgid "Interrupted system call should be restarted"
+msgstr "Pertrauktas sistemos iškvietimas turėtų būti įvykdytas iš naujo"
+
+#: sysdeps/gnu/errlist.c:1109
+msgid "Channel number out of range"
+msgstr "Kanalo numeris už ribų"
+
+#: sysdeps/gnu/errlist.c:1117
+msgid "Level 2 not synchronized"
+msgstr "2 lygmuo nesinchonizuotas"
+
+#: sysdeps/gnu/errlist.c:1125
+msgid "Level 3 halted"
+msgstr "3 lygmuo sustabdytas"
+
+#: sysdeps/gnu/errlist.c:1133
+#, fuzzy
+msgid "Level 3 reset"
+msgstr "3 lygmuo sustabdytas"
+
+#: sysdeps/gnu/errlist.c:1141
+#, fuzzy
+msgid "Link number out of range"
+msgstr "%s: eilutės numeris už ribų"
+
+#: sysdeps/gnu/errlist.c:1149
+#, fuzzy
+msgid "Protocol driver not attached"
+msgstr "Protokolas nepalaikomas"
+
+#: sysdeps/gnu/errlist.c:1157
+#, fuzzy
+msgid "No CSI structure available"
+msgstr "Nėra vietos buferyje"
+
+#: sysdeps/gnu/errlist.c:1165
+msgid "Level 2 halted"
+msgstr "2 lygmuo sustabdytas"
+
+#: sysdeps/gnu/errlist.c:1173
+#, fuzzy
+msgid "Invalid exchange"
+msgstr "netaisyklingas kvietėjas"
+
+#: sysdeps/gnu/errlist.c:1181
+#, fuzzy
+msgid "Invalid request descriptor"
+msgstr "Blogas failo deskriptorius"
+
+#: sysdeps/gnu/errlist.c:1189
+msgid "Exchange full"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1197
+msgid "No anode"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1205
+#, fuzzy
+msgid "Invalid request code"
+msgstr "Visos užklausos baigtos"
+
+#: sysdeps/gnu/errlist.c:1213
+#, fuzzy
+msgid "Invalid slot"
+msgstr "netaisyklingas kvietėjas"
+
+#: sysdeps/gnu/errlist.c:1221
+msgid "File locking deadlock error"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1229
+msgid "Bad font file format"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1237
+msgid "Machine is not on the network"
+msgstr "Kompiuterio nėra tinkle"
+
+#: sysdeps/gnu/errlist.c:1245
+msgid "Package not installed"
+msgstr "Paketas neįdiegtas"
+
+#: sysdeps/gnu/errlist.c:1253
+#, fuzzy
+msgid "Advertise error"
+msgstr "vidinė klaida"
+
+#: sysdeps/gnu/errlist.c:1261
+#, fuzzy
+msgid "Srmount error"
+msgstr "Protokolo klaida"
+
+#: sysdeps/gnu/errlist.c:1269
+msgid "Communication error on send"
+msgstr "Komunikacijos klaida siunčiant"
+
+#: sysdeps/gnu/errlist.c:1277
+msgid "RFS specific error"
+msgstr "RFS specifinė klaida"
+
+#: sysdeps/gnu/errlist.c:1285
+msgid "Name not unique on network"
+msgstr "Vardas tinkle neunikalus"
+
+#: sysdeps/gnu/errlist.c:1293
+#, fuzzy
+msgid "File descriptor in bad state"
+msgstr "Failo deskriptorius nekorektiškoje būsenoje"
+
+#: sysdeps/gnu/errlist.c:1301
+msgid "Remote address changed"
+msgstr "Nutolęs adresas pasikeitė"
+
+#: sysdeps/gnu/errlist.c:1309
+msgid "Can not access a needed shared library"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1317
+msgid "Accessing a corrupted shared library"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1325
+msgid ".lib section in a.out corrupted"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1333
+#, fuzzy
+msgid "Attempting to link in too many shared libraries"
+msgstr "klaida įkeliant bendrąsias bibliotekas"
+
+#: sysdeps/gnu/errlist.c:1341
+msgid "Cannot exec a shared library directly"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1349
+msgid "Streams pipe error"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1357
+msgid "Structure needs cleaning"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1365
+msgid "Not a XENIX named type file"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1373
+#, fuzzy
+msgid "No XENIX semaphores available"
+msgstr "Nėra vietos buferyje"
+
+#: sysdeps/gnu/errlist.c:1381
+msgid "Is a named type file"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1389
+msgid "Remote I/O error"
+msgstr "Nutolusio įvedimo/išvedimo klaida"
+
+#: sysdeps/gnu/errlist.c:1397
+#, fuzzy
+msgid "No medium found"
+msgstr "Nerasta laikmena"
+
+#: sysdeps/gnu/errlist.c:1405
+msgid "Wrong medium type"
+msgstr "Netinkamas laikmenos tipas"
+
+#: sysdeps/gnu/errlist.c:1413
+msgid "Required key not available"
+msgstr "Reikalingas raktas nerastas"
+
+#: sysdeps/gnu/errlist.c:1421
+msgid "Key has expired"
+msgstr "Baigėsi rakto galiojimo laikas"
+
+#: sysdeps/gnu/errlist.c:1429
+msgid "Key has been revoked"
+msgstr "Raktas atšauktas"
+
+#: sysdeps/gnu/errlist.c:1437
+msgid "Key was rejected by service"
+msgstr "Raktas atmestas tarnybos"
+
+#: sysdeps/gnu/errlist.c:1445
+msgid "Owner died"
+msgstr ""
+
+#: sysdeps/gnu/errlist.c:1453
+msgid "State not recoverable"
+msgstr ""
+
+#: sysdeps/mach/_strerror.c:57
+msgid "Error in unknown error system: "
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:1
+msgid "Address family for hostname not supported"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:2
+msgid "Temporary failure in name resolution"
+msgstr "Laikinas vardų paieškos sutrikimas"
+
+#: sysdeps/posix/gai_strerror-strs.h:3
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:4
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:5
+msgid "ai_family not supported"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:6
+msgid "Memory allocation failure"
+msgstr "Atminties išskyrimo klaida"
+
+#: sysdeps/posix/gai_strerror-strs.h:7
+msgid "No address associated with hostname"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:8
+msgid "Name or service not known"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:9
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:10
+msgid "ai_socktype not supported"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:11
+msgid "System error"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:12
+msgid "Processing request in progress"
+msgstr ""
+
+#: sysdeps/posix/gai_strerror-strs.h:13
+msgid "Request canceled"
+msgstr "Užklausa nutraukta"
+
+#: sysdeps/posix/gai_strerror-strs.h:14
+msgid "Request not canceled"
+msgstr "Užklausa nenutraukta"
+
+#: sysdeps/posix/gai_strerror-strs.h:15
+msgid "All requests done"
+msgstr "Visos užklausos baigtos"
+
+#: sysdeps/posix/gai_strerror-strs.h:16
+msgid "Interrupted by a signal"
+msgstr "Nutraukta signalo"
+
+#: sysdeps/posix/gai_strerror-strs.h:17
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: sysdeps/unix/siglist.c:26
+msgid "Signal 0"
+msgstr ""
+
+#: sysdeps/unix/siglist.c:32
+#, fuzzy
+msgid "IOT trap"
+msgstr "EMT gaudyklė"
+
+#: sysdeps/unix/sysv/linux/i386/readelflib.c:49
+#, fuzzy, c-format
+msgid "%s is for unknown machine %d.\n"
+msgstr "Rasta %d bibliotekų podėlyje „%s“\n"
+
+#: sysdeps/unix/sysv/linux/ia64/makecontext.c:63
+#, c-format
+msgid "makecontext: does not know how to handle more than 8 arguments\n"
+msgstr ""
+
+#: sysdeps/unix/sysv/linux/lddlibc4.c:64
+#, fuzzy, c-format
+msgid "cannot open `%s'"
+msgstr "nepavyko atverti"
+
+#: sysdeps/unix/sysv/linux/lddlibc4.c:68
+#, fuzzy, c-format
+msgid "cannot read header from `%s'"
+msgstr "nepavyko perskaityti antraštės"
+
+#: timezone/zdump.c:211
+#, fuzzy
+msgid "lacks alphabetic at start"
+msgstr "laiko zonos santrumpos pradžioje nėra raidės"
+
+#: timezone/zdump.c:213
+#, fuzzy
+msgid "has fewer than 3 alphabetics"
+msgstr "laiko zonos santrumpoje yra daugiau negu 3 raidės"
+
+#: timezone/zdump.c:215
+#, fuzzy
+msgid "has more than 6 alphabetics"
+msgstr "laiko zonos santrumpoje yra daugiau negu 3 raidės"
+
+#: timezone/zdump.c:223
+msgid "differs from POSIX standard"
+msgstr ""
+
+#: timezone/zdump.c:229
+#, c-format
+msgid "%s: warning: zone \"%s\" abbreviation \"%s\" %s\n"
+msgstr ""
+
+#: timezone/zdump.c:280
+#, c-format
+msgid "%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"
+msgstr ""
+
+#: timezone/zdump.c:297
+#, fuzzy, c-format
+msgid "%s: wild -c argument %s\n"
+msgstr "%s: Per daug argumentų\n"
+
+#: timezone/zdump.c:388
+#, fuzzy
+msgid "Error writing to standard output"
+msgstr "standartinis išvedimas"
+
+#: timezone/zdump.c:411
+#, c-format
+msgid "%s: use of -v on system with floating time_t other than float or double\n"
+msgstr ""
+
+#: timezone/zic.c:392
+#, fuzzy, c-format
+msgid "%s: Memory exhausted: %s\n"
+msgstr "Baigėsi atmintis"
+
+#: timezone/zic.c:451
+#, c-format
+msgid "\"%s\", line %d: %s"
+msgstr ""
+
+#: timezone/zic.c:454
+#, c-format
+msgid " (rule from \"%s\", line %d)"
+msgstr ""
+
+#: timezone/zic.c:466
+#, fuzzy
+msgid "warning: "
+msgstr "įspėjimas: "
+
+#: timezone/zic.c:476
+#, c-format
+msgid ""
+"%s: usage is %s [ --version ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n"
+"\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"
+msgstr ""
+
+#: timezone/zic.c:511
+#, fuzzy
+msgid "wild compilation-time specification of zic_t"
+msgstr "%s: nėra baigimo specifikacijos"
+
+#: timezone/zic.c:528
+#, fuzzy, c-format
+msgid "%s: More than one -d option specified\n"
+msgstr "%s: nėra baigimo specifikacijos"
+
+#: timezone/zic.c:538
+#, fuzzy, c-format
+msgid "%s: More than one -l option specified\n"
+msgstr "%s: nėra baigimo specifikacijos"
+
+#: timezone/zic.c:548
+#, fuzzy, c-format
+msgid "%s: More than one -p option specified\n"
+msgstr "%s: nėra baigimo specifikacijos"
+
+#: timezone/zic.c:558
+#, fuzzy, c-format
+msgid "%s: More than one -y option specified\n"
+msgstr "%s: nėra baigimo specifikacijos"
+
+#: timezone/zic.c:568
+#, fuzzy, c-format
+msgid "%s: More than one -L option specified\n"
+msgstr "%s: nėra baigimo specifikacijos"
+
+#: timezone/zic.c:617
+msgid "link to link"
+msgstr ""
+
+#: timezone/zic.c:682
+msgid "hard link failed, symbolic link used"
+msgstr ""
+
+#: timezone/zic.c:690
+#, fuzzy, c-format
+msgid "%s: Can't link from %s to %s: %s\n"
+msgstr "Nepavyko susaistyti (link) %s su %s"
+
+#: timezone/zic.c:762 timezone/zic.c:764
+msgid "same rule name in multiple files"
+msgstr ""
+
+#: timezone/zic.c:805
+msgid "unruly zone"
+msgstr ""
+
+#: timezone/zic.c:812
+#, c-format
+msgid "%s in ruleless zone"
+msgstr ""
+
+#: timezone/zic.c:833
+msgid "standard input"
+msgstr ""
+
+#: timezone/zic.c:838
+#, fuzzy, c-format
+msgid "%s: Can't open %s: %s\n"
+msgstr "nepavyko atverti"
+
+#: timezone/zic.c:849
+#, fuzzy
+msgid "line too long"
+msgstr "Failo vardas per ilgas"
+
+#: timezone/zic.c:869
+msgid "input line of unknown type"
+msgstr ""
+
+#: timezone/zic.c:885
+#, c-format
+msgid "%s: Leap line in non leap seconds file %s\n"
+msgstr ""
+
+#: timezone/zic.c:892 timezone/zic.c:1329 timezone/zic.c:1351
+#, c-format
+msgid "%s: panic: Invalid l_value %d\n"
+msgstr ""
+
+#: timezone/zic.c:900
+#, fuzzy, c-format
+msgid "%s: Error reading %s\n"
+msgstr "%s: Klaida rašant %s\n"
+
+#: timezone/zic.c:907
+#, fuzzy, c-format
+msgid "%s: Error closing %s: %s\n"
+msgstr "%s: Klaida rašant %s\n"
+
+#: timezone/zic.c:912
+msgid "expected continuation line not found"
+msgstr ""
+
+#: timezone/zic.c:956 timezone/zic.c:2489 timezone/zic.c:2508
+msgid "time overflow"
+msgstr ""
+
+#: timezone/zic.c:960
+msgid "24:00 not handled by pre-1998 versions of zic"
+msgstr ""
+
+#: timezone/zic.c:963
+msgid "values over 24 hours not handled by pre-2007 versions of zic"
+msgstr ""
+
+#: timezone/zic.c:976
+msgid "wrong number of fields on Rule line"
+msgstr ""
+
+#: timezone/zic.c:980
+msgid "nameless rule"
+msgstr ""
+
+#: timezone/zic.c:985
+#, fuzzy
+msgid "invalid saved time"
+msgstr "netaisyklingas kvietėjas"
+
+#: timezone/zic.c:1006
+msgid "wrong number of fields on Zone line"
+msgstr ""
+
+#: timezone/zic.c:1012
+#, c-format
+msgid "\"Zone %s\" line and -l option are mutually exclusive"
+msgstr ""
+
+#: timezone/zic.c:1020
+#, c-format
+msgid "\"Zone %s\" line and -p option are mutually exclusive"
+msgstr ""
+
+#: timezone/zic.c:1032
+#, c-format
+msgid "duplicate zone name %s (file \"%s\", line %d)"
+msgstr ""
+
+#: timezone/zic.c:1048
+msgid "wrong number of fields on Zone continuation line"
+msgstr ""
+
+#: timezone/zic.c:1088
+#, fuzzy
+msgid "invalid UTC offset"
+msgstr "netaisyklingas kvietėjas"
+
+#: timezone/zic.c:1091
+#, fuzzy
+msgid "invalid abbreviation format"
+msgstr "netinkamas mėnesio pavadinimas"
+
+#: timezone/zic.c:1120
+msgid "Zone continuation line end time is not after end time of previous line"
+msgstr ""
+
+#: timezone/zic.c:1148
+msgid "wrong number of fields on Leap line"
+msgstr ""
+
+#: timezone/zic.c:1157
+#, fuzzy
+msgid "invalid leaping year"
+msgstr "nurodyta netaisyklinga koduotė"
+
+#: timezone/zic.c:1177 timezone/zic.c:1283
+#, fuzzy
+msgid "invalid month name"
+msgstr "netaisyklinga veiksena"
+
+#: timezone/zic.c:1190 timezone/zic.c:1396 timezone/zic.c:1410
+msgid "invalid day of month"
+msgstr "netinkama mėnesio diena"
+
+#: timezone/zic.c:1195
+msgid "time before zero"
+msgstr ""
+
+#: timezone/zic.c:1199
+msgid "time too small"
+msgstr ""
+
+#: timezone/zic.c:1203
+#, fuzzy
+msgid "time too large"
+msgstr "Failas per didelis"
+
+#: timezone/zic.c:1207 timezone/zic.c:1312
+#, fuzzy
+msgid "invalid time of day"
+msgstr "netaisyklinga veiksena"
+
+#: timezone/zic.c:1226
+msgid "illegal CORRECTION field on Leap line"
+msgstr ""
+
+#: timezone/zic.c:1231
+msgid "illegal Rolling/Stationary field on Leap line"
+msgstr ""
+
+#: timezone/zic.c:1247
+msgid "wrong number of fields on Link line"
+msgstr ""
+
+#: timezone/zic.c:1251
+msgid "blank FROM field on Link line"
+msgstr ""
+
+#: timezone/zic.c:1255
+msgid "blank TO field on Link line"
+msgstr ""
+
+#: timezone/zic.c:1333
+#, fuzzy
+msgid "invalid starting year"
+msgstr "netaisyklingas naudotojas"
+
+#: timezone/zic.c:1355
+#, fuzzy
+msgid "invalid ending year"
+msgstr "nurodyta netaisyklinga koduotė"
+
+#: timezone/zic.c:1359
+msgid "starting year greater than ending year"
+msgstr ""
+
+#: timezone/zic.c:1366
+msgid "typed single year"
+msgstr ""
+
+#: timezone/zic.c:1401
+#, fuzzy
+msgid "invalid weekday name"
+msgstr "netinkamas mėnesio pavadinimas"
+
+#: timezone/zic.c:1579
+#, fuzzy, c-format
+msgid "%s: Can't remove %s: %s\n"
+msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#: timezone/zic.c:1589
+#, fuzzy, c-format
+msgid "%s: Can't create %s: %s\n"
+msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#: timezone/zic.c:1739
+#, c-format
+msgid "%s: Error writing %s\n"
+msgstr "%s: Klaida rašant %s\n"
+
+#: timezone/zic.c:2031
+msgid "no POSIX environment variable for zone"
+msgstr ""
+
+#: timezone/zic.c:2185
+msgid "can't determine time zone abbreviation to use just after until time"
+msgstr ""
+
+#: timezone/zic.c:2231
+#, fuzzy
+msgid "too many transitions?!"
+msgstr "per daug keliamųjų sekundžių"
+
+#: timezone/zic.c:2250
+msgid "internal error - addtype called with bad isdst"
+msgstr ""
+
+#: timezone/zic.c:2254
+msgid "internal error - addtype called with bad ttisstd"
+msgstr ""
+
+#: timezone/zic.c:2258
+msgid "internal error - addtype called with bad ttisgmt"
+msgstr ""
+
+#: timezone/zic.c:2277
+msgid "too many local time types"
+msgstr "per daug lokalaus laiko tipų"
+
+#: timezone/zic.c:2281
+#, fuzzy
+msgid "UTC offset out of range"
+msgstr "UTC poslinkis už ribų"
+
+#: timezone/zic.c:2309
+msgid "too many leap seconds"
+msgstr "per daug keliamųjų sekundžių"
+
+#: timezone/zic.c:2315
+msgid "repeated leap second moment"
+msgstr "Pakartotinis keliamosios sekundės momentas"
+
+#: timezone/zic.c:2367
+msgid "Wild result from command execution"
+msgstr ""
+
+#: timezone/zic.c:2368
+#, c-format
+msgid "%s: command was '%s', result was %d\n"
+msgstr ""
+
+#: timezone/zic.c:2466
+msgid "Odd number of quotation marks"
+msgstr "Nelyginis kabučių skaičius"
+
+#: timezone/zic.c:2555
+msgid "use of 2/29 in non leap-year"
+msgstr "vasario 29 d. nekeliamuosiuose metuose"
+
+#: timezone/zic.c:2590
+msgid "rule goes past start/end of month--will not work with pre-2004 versions of zic"
+msgstr ""
+
+#: timezone/zic.c:2622
+msgid "time zone abbreviation lacks alphabetic at start"
+msgstr "laiko zonos santrumpos pradžioje nėra raidės"
+
+#: timezone/zic.c:2624
+msgid "time zone abbreviation has more than 3 alphabetics"
+msgstr "laiko zonos santrumpoje yra daugiau negu 3 raidės"
+
+#: timezone/zic.c:2626
+#, fuzzy
+msgid "time zone abbreviation has too many alphabetics"
+msgstr "laiko zonos santrumpoje yra daugiau negu 3 raidės"
+
+#: timezone/zic.c:2636
+#, fuzzy
+msgid "time zone abbreviation differs from POSIX standard"
+msgstr "laiko zonos santrumpos pradžioje nėra raidės"
+
+#: timezone/zic.c:2648
+msgid "too many, or too long, time zone abbreviations"
+msgstr ""
+
+#: timezone/zic.c:2689
+#, fuzzy, c-format
+msgid "%s: Can't create directory %s: %s\n"
+msgstr "Nepavyko atverti aplanko %s"
+
+#: timezone/zic.c:2711
+#, c-format
+msgid "%s: %d did not sign extend correctly\n"
+msgstr ""
+
+#~ msgid "%s: first non-whitespace character is not `\"'"
+#~ msgstr "%s: pirmas ne tarpo simbolis nėra „\"“"
+
+#~ msgid "no closing `%c' in %s"
+#~ msgstr "nėra uždarančiojo „%c“ %s"
+
+#, fuzzy
+#~ msgid "%s: cannot read: %s"
+#~ msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#~ msgid "%s is not bound to any keys.\n"
+#~ msgstr "%s nėra priskirtas jokiam klavišui.\n"
+
+#~ msgid "%s can be invoked via "
+#~ msgstr "%s gali būti iškviestas su"
+
+#~ msgid "only meaningful in a `for', `while', or `until' loop"
+#~ msgstr "prasminga tik „for“, „while“ arba „until“ cikle"
+
+#~ msgid " "
+#~ msgstr " "
+
+#~ msgid "HOME not set"
+#~ msgstr "HOME nenustatytas"
+
+#~ msgid "OLDPWD not set"
+#~ msgstr "OLDPWD nenustatytas"
+
+#, fuzzy
+#~ msgid "%s: option requires an argument"
+#~ msgstr "%s: parametrui „%s“ reikia argumento\n"
+
+#~ msgid "%s: numeric argument required"
+#~ msgstr "%s: reikia skaitinio argumento"
+
+#, fuzzy
+#~ msgid "%s: invalid option name"
+#~ msgstr "%s: netaisyklingas parametras --%c\n"
+
+#~ msgid "`%s': not a valid identifier"
+#~ msgstr "`%s': netaisyklingas identifikatorius"
+
+#, fuzzy
+#~ msgid "%s: invalid number"
+#~ msgstr "nekorektiška eilutė"
+
+#, fuzzy
+#~ msgid "%s: invalid signal specification"
+#~ msgstr "netaisyklingas apibrėžimas"
+
+#~ msgid "`%s': not a pid or valid job spec"
+#~ msgstr "„%s“: ne pid'as ar taisyklinga darbo specifikacija"
+
+#~ msgid "%s: readonly variable"
+#~ msgstr "%s: kintamasis tik skaitymui"
+
+#, fuzzy
+#~ msgid "%s: %s out of range"
+#~ msgstr "UTC poslinkis už ribų"
+
+#~ msgid "%s: no such job"
+#~ msgstr "%s: nėra tokio darbo"
+
+#~ msgid "%s: no job control"
+#~ msgstr "%s: nėra darbų valdymo"
+
+#~ msgid "no job control"
+#~ msgstr "nėra darbų valdymo"
+
+#~ msgid "%s: restricted"
+#~ msgstr "%s: apribota"
+
+#, fuzzy
+#~ msgid "%s: not a shell builtin"
+#~ msgstr "%s nėra simbolinė nuoroda\n"
+
+#, fuzzy
+#~ msgid "%s: error retrieving current directory: %s: %s\n"
+#~ msgstr "%s: Nepavyko sukurti aplanko %s: %s\n"
+
+#~ msgid "%s: ambiguous job spec"
+#~ msgstr "%s: dviprasmis darbo aprašymas"
+
+#~ msgid "warning: -F option may not work as you expect"
+#~ msgstr "įspėjimas: parametras -F gali neveikti taip, kaip tikitės"
+
+#~ msgid "warning: -C option may not work as you expect"
+#~ msgstr "įspėjimas: parametras -C gali neveikti taip, kaip tikitės"
+
+#~ msgid "can only be used in a function"
+#~ msgstr "galima naudoti tik funkcijoje"
+
+#~ msgid "cannot use `-f' to make functions"
+#~ msgstr "negalima naudoti „-f“ funkcijoms kurti"
+
+#~ msgid "%s: readonly function"
+#~ msgstr "%s: funkcija tik skaitymui"
+
+#~ msgid "%s: cannot destroy array variables in this way"
+#~ msgstr "%s: negalima tokiu būdu sunaikinti masyvų kintamųjų"
+
+#, fuzzy
+#~ msgid "%s: not dynamically loaded"
+#~ msgstr "nepavyko dinamiškai įkelti paleidžiamojo failo"
+
+#, fuzzy
+#~ msgid "%s: cannot delete: %s"
+#~ msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#~ msgid "There are stopped jobs.\n"
+#~ msgstr "Yra sustabdytų darbų.\n"
+
+#~ msgid "%s: hash table empty\n"
+#~ msgstr "%s: maišos lentelė tuščia\n"
+
+#~ msgid "no help topics match `%s'. Try `help help' or `man -k %s' or `info %s'."
+#~ msgstr "nėra žinyno temų, atitinkančių „%s“. Bandykite „help help“, „man -k %s“ arba „info %s“."
+
+#~ msgid "missing hex digit for \\x"
+#~ msgstr "trūksta šešioliktainio skaitmens išraiškoje \\x"
+
+#, fuzzy
+#~ msgid "no other directory"
+#~ msgstr "Ne aplankas"
+
+#, fuzzy
+#~ msgid "<no current directory>"
+#~ msgstr "Ne aplankas"
+
+#, fuzzy
+#~ msgid "%s: invalid file descriptor specification"
+#~ msgstr "Blogas failo deskriptorius"
+
+#~ msgid "read error: %d: %s"
+#~ msgstr "skaitymo klaida: %d: %s"
+
+#~ msgid "can only `return' from a function or sourced script"
+#~ msgstr "galima grįžti (return) tik iš funkcijos ar scenarijaus"
+
+#, fuzzy
+#~ msgid "%s: cannot unset: readonly %s"
+#~ msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#~ msgid "%s: not an array variable"
+#~ msgstr "%s: ne masyvo kintamasis"
+
+#~ msgid "%s: not a function"
+#~ msgstr "%s: ne funkcija"
+
+#~ msgid "shift count"
+#~ msgstr "postūmių skaičius"
+
+#, fuzzy
+#~ msgid "%s: invalid shell option name"
+#~ msgstr "%s: netaisyklingas parametras --%c\n"
+
+#~ msgid "filename argument required"
+#~ msgstr "reikia failo pavadinimo argumento"
+
+#, fuzzy
+#~ msgid "cannot suspend a login shell"
+#~ msgstr "nepavyko atverti duomenų failo"
+
+#~ msgid "%s is aliased to `%s'\n"
+#~ msgstr "%s yra „%s“ sinonimas\n"
+
+#~ msgid "%s is a shell keyword\n"
+#~ msgstr "%s yra aplinkos raktinis žodis\n"
+
+#~ msgid "%s is a function\n"
+#~ msgstr "%s yra funkcija\n"
+
+#, fuzzy
+#~ msgid "%s is a shell builtin\n"
+#~ msgstr "%s nėra simbolinė nuoroda\n"
+
+#~ msgid "%s is %s\n"
+#~ msgstr "%s yra %s\n"
+
+#, fuzzy
+#~ msgid "%s: invalid limit argument"
+#~ msgstr "Netaisyklingas argumentas"
+
+#~ msgid "`%c': bad command"
+#~ msgstr "`%c': bloga komanda"
+
+#, fuzzy
+#~ msgid "%s: cannot get limit: %s"
+#~ msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#, fuzzy
+#~ msgid "%s: cannot modify limit: %s"
+#~ msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#, fuzzy
+#~ msgid "octal number"
+#~ msgstr "netaisyklingas rinkinio numeris"
+
+#, fuzzy
+#~ msgid "`%c': invalid symbolic mode character"
+#~ msgstr "netaisyklingas kabučių simbolis"
+
+#~ msgid "last command: %s\n"
+#~ msgstr "paskutinė komanda: %s\n"
+
+#~ msgid "Aborting..."
+#~ msgstr "Nutraukiama..."
+
+#~ msgid "bad command type"
+#~ msgstr "blogas komandos tipas"
+
+#, fuzzy
+#~ msgid "bad jump"
+#~ msgstr "blogas argumentas"
+
+#~ msgid "%s: unbound variable"
+#~ msgstr "%s: nepriskirtas kintamasis"
+
+#~ msgid "\atimed out waiting for input: auto-logout\n"
+#~ msgstr "\alaukiant įvedimo baigėsi laikas: automatiškai atsijungta\n"
+
+#, fuzzy
+#~ msgid "TIMEFORMAT: `%c': invalid format character"
+#~ msgstr "netaisyklingas kabučių simbolis"
+
+#~ msgid "%s: %s: bad interpreter"
+#~ msgstr "%s: %s: blogas interpretatorius"
+
+#~ msgid "expression recursion level exceeded"
+#~ msgstr "viršytas išraiškos rekursijos lygis"
+
+#~ msgid "recursion stack underflow"
+#~ msgstr "rekursijos steko atvirkštinis perpildymas"
+
+#~ msgid "attempted assignment to non-variable"
+#~ msgstr "bandymas priskirti ne kintamajam"
+
+#~ msgid "division by 0"
+#~ msgstr "dalyba iš 0"
+
+#~ msgid "bug: bad expassign token"
+#~ msgstr "klaida: bloga expassign leksema"
+
+#~ msgid "`:' expected for conditional expression"
+#~ msgstr "sąlygos išraiškoje tikėtasi „:“"
+
+#~ msgid "exponent less than 0"
+#~ msgstr "eksponentas mažesnis už 0"
+
+#~ msgid "missing `)'"
+#~ msgstr "Trūksta „)“"
+
+#~ msgid "syntax error: operand expected"
+#~ msgstr "sintaksės klaida: tikėtasi operando"
+
+#~ msgid "syntax error: invalid arithmetic operator"
+#~ msgstr "sintaksės klaida: netaisyklingas aritmetinis operatorius"
+
+#, fuzzy
+#~ msgid "invalid arithmetic base"
+#~ msgstr "netaisyklinga vardų sritis"
+
+#~ msgid "value too great for base"
+#~ msgstr "per didelė pagrindo reikšmė"
+
+#~ msgid "getcwd: cannot access parent directories"
+#~ msgstr "getcwd: nepavyko pasiekti aukštesnių aplankų"
+
+#~ msgid "describe_pid: %ld: no such pid"
+#~ msgstr "describe_pid: %ld: tokio pid nėra"
+
+#~ msgid "wait_for: No record of process %ld"
+#~ msgstr "wait_for: nėra proceso %ld įrašo"
+
+#~ msgid "wait_for_job: job %d is stopped"
+#~ msgstr "wait_for_job: darbas %d yra sustabdytas"
+
+#~ msgid "%s: job has terminated"
+#~ msgstr "%s: darbas baigtas"
+
+#~ msgid "%s: job %d already in background"
+#~ msgstr "%s: darbas %d jau fone"
+
+#~ msgid "no job control in this shell"
+#~ msgstr "šioje aplinkoje nėra darbų valdymo"
+
+#~ msgid "malloc: failed assertion: %s\n"
+#~ msgstr "malloc: pažeista prielaida: %s\n"
+
+#~ msgid ""
+#~ "\r\n"
+#~ "malloc: %s:%d: assertion botched\r\n"
+#~ msgstr ""
+#~ "\r\n"
+#~ "malloc: %s:%d: prielaida pažeista\r\n"
+
+#~ msgid "allocated"
+#~ msgstr "išskirta"
+
+#~ msgid "freed"
+#~ msgstr "atlaisvinta"
+
+#~ msgid "requesting resize"
+#~ msgstr "prašoma dydžio keitimo"
+
+#~ msgid "just resized"
+#~ msgstr "tik ką pakeistas dydis"
+
+#, fuzzy
+#~ msgid "bug: unknown operation"
+#~ msgstr "RPC: Nežinomas protokolas"
+
+#, fuzzy
+#~ msgid "%s: host unknown"
+#~ msgstr "nežinoma"
+
+#~ msgid "%s: bad network path specification"
+#~ msgstr "%s: netaisyklingas tinklo kelias"
+
+#~ msgid "You have mail in $_"
+#~ msgstr "Turite laiškų $_"
+
+#~ msgid "You have new mail in $_"
+#~ msgstr "Turite naujų laiškų $_"
+
+#~ msgid "The mail in %s has been read\n"
+#~ msgstr "Paštas %s perskaitytas\n"
+
+#~ msgid "syntax error: arithmetic expression required"
+#~ msgstr "sintaksės klaida: reikia aritmetinės išraiškos"
+
+#~ msgid "syntax error: `;' unexpected"
+#~ msgstr "sintaksės klaida: netikėtas „;“"
+
+#, fuzzy
+#~ msgid "syntax error: `((%s))'"
+#~ msgstr "sintaksės klaida prologe: %s"
+
+#~ msgid "make_here_document: bad instruction type %d"
+#~ msgstr "make_here_document: blogas instrukcijos tipas %d"
+
+#~ msgid "make_redirection: redirection instruction `%d' out of range"
+#~ msgstr "make_redirection: nukreipimo instrukcija „%d“ už ribų"
+
+#~ msgid "unexpected EOF while looking for matching `%c'"
+#~ msgstr "netikėta failo pabaiga ieškant atitinkamo „%c“"
+
+#~ msgid "unexpected EOF while looking for `]]'"
+#~ msgstr "netikėta failo pabaiga ieškant „]]“"
+
+#~ msgid "syntax error in conditional expression: unexpected token `%s'"
+#~ msgstr "sintaksės klaida sąlygos išraiškoje: netikėta leksema „%s“"
+
+#~ msgid "unexpected token `%s', expected `)'"
+#~ msgstr "netikėta leksema „%s“, tikėtasi „)“"
+
+#~ msgid "expected `)'"
+#~ msgstr "tikėtasi „)“"
+
+#~ msgid "unexpected argument `%s' to conditional unary operator"
+#~ msgstr "netikėtas argumentas „%s“ sąlygos unariniam operatoriui"
+
+#~ msgid "unexpected argument to conditional unary operator"
+#~ msgstr "netikėtas argumentas sąlygos unariniam operatoriui"
+
+#~ msgid "unexpected token `%s', conditional binary operator expected"
+#~ msgstr "netikėta leksema „%s“, tikėtasi sąlyginio binarinio operatoriaus"
+
+#~ msgid "conditional binary operator expected"
+#~ msgstr "tikėtasi sąlygos binarinio operatoriaus"
+
+#~ msgid "unexpected argument `%s' to conditional binary operator"
+#~ msgstr "netikėtas argumentas „%s“ sąlygos binariniam operatoriui"
+
+#~ msgid "unexpected argument to conditional binary operator"
+#~ msgstr "netikėtas argumentas sąlygos binariniam operatoriui"
+
+#~ msgid "unexpected token `%c' in conditional command"
+#~ msgstr "netikėta leksema „%c“ sąlygos komandoje"
+
+#~ msgid "unexpected token `%s' in conditional command"
+#~ msgstr "netikėta leksema „%s“ sąlygos komandoje"
+
+#~ msgid "unexpected token %d in conditional command"
+#~ msgstr "netikėta leksema %d sąlygos komandoje"
+
+#, fuzzy
+#~ msgid "syntax error near unexpected token `%s'"
+#~ msgstr "sintaksės klaida prologe: %s"
+
+#, fuzzy
+#~ msgid "syntax error: unexpected end of file"
+#~ msgstr "%s: per ankstyva failo pabaiga"
+
+#~ msgid "Use \"%s\" to leave the shell.\n"
+#~ msgstr "Naudokite „%s“, jei norite išeiti iš ap.\n"
+
+#~ msgid "unexpected EOF while looking for matching `)'"
+#~ msgstr "netikėta failo pabaiga ieškant atitinkamo „)“"
+
+#~ msgid "progcomp_insert: %s: NULL COMPSPEC"
+#~ msgstr "progcomp_insert: %s: NULL COMPSPEC"
+
+#~ msgid "print_command: bad connector `%d'"
+#~ msgstr "print_command: blogas jungtukas  „%d“"
+
+#, fuzzy
+#~ msgid "cprintf: `%c': invalid format character"
+#~ msgstr "netaisyklingas kabučių simbolis"
+
+#~ msgid "%s: ambiguous redirect"
+#~ msgstr "%s: ambiguous redirect"
+
+#, fuzzy
+#~ msgid "%s: cannot overwrite existing file"
+#~ msgstr "nepavyko atverti duomenų failo"
+
+#, fuzzy
+#~ msgid "%s: restricted: cannot redirect output"
+#~ msgstr "%s:%u: nepavyko perskaityti aplanko %s"
+
+#~ msgid "/dev/(tcp|udp)/host/port not supported without networking"
+#~ msgstr "/dev/(tcp|udp)/komp/prievadas nepalaikoma be tinklo"
+
+#~ msgid "redirection error: cannot duplicate fd"
+#~ msgstr "nukreipimo klaida: nepavyko dublikuoti fd"
+
+#~ msgid "could not find /tmp, please create!"
+#~ msgstr "nepavyko rasti /tmp, sukurkite šį aplanką!"
+
+#~ msgid "/tmp must be a valid directory name"
+#~ msgstr "/tmp turi būti taisyklingas aplanko pavadinimas"
+
+#, fuzzy
+#~ msgid "%c%c: invalid option"
+#~ msgstr "%s: netaisyklingas parametras --%c\n"
+
+#~ msgid "I have no name!"
+#~ msgstr "Neturiu vardo!"
+
+#, fuzzy
+#~ msgid "Type `%s -c \"help set\"' for more information about shell options.\n"
+#~ msgstr "Bandykite „%s --help“ arba „%s --usage“, jei norite gauti daugiau informacijos.\n"
+
+#, fuzzy
+#~ msgid "Type `%s -c help' for more information about shell builtin commands.\n"
+#~ msgstr "Bandykite „ldd --help“, jei norite daugiau informacijos."
+
+#~ msgid "sigprocmask: %d: invalid operation"
+#~ msgstr "sigprocmask: %d: netaisyklinga operacija"
+
+#, fuzzy
+#~ msgid "cannot duplicate named pipe %s as fd %d"
+#~ msgstr "nepavyko išskirti vardo įrašo"
+
+#~ msgid "$%s: cannot assign in this way"
+#~ msgstr "$%s: negalima tokiu būdu priskirti"
+
+#, fuzzy
+#~ msgid "no match: %s"
+#~ msgstr "Atitikmenų nėra"
+
+#~ msgid "argument expected"
+#~ msgstr "tikėtasi argumento"
+
+#~ msgid "%s: integer expression expected"
+#~ msgstr "%s: tikėtasi skaitinės išraiškos"
+
+#~ msgid "`)' expected"
+#~ msgstr "tikėtasi „)“"
+
+#~ msgid "`)' expected, found %s"
+#~ msgstr "tikėtasi „)“, rasta %s"
+
+#~ msgid "%s: unary operator expected"
+#~ msgstr "%s: tikėtasi unarinio operatoriaus"
+
+#~ msgid "%s: binary operator expected"
+#~ msgstr "%s: tikėtasi binarinio operatoriaus"
+
+#~ msgid "missing `]'"
+#~ msgstr "trūksta „]“"
+
+#, fuzzy
+#~ msgid "invalid signal number"
+#~ msgstr "netaisyklingas kvietėjas"
+
+#~ msgid "run_pending_traps: bad value in trap_list[%d]: %p"
+#~ msgstr "run_pending_traps: bloga trap_list[%d] reikšmė: %p"
+
+#~ msgid "trap_handler: bad signal %d"
+#~ msgstr "trap_handler: blogas signalas %d"
+
+#~ msgid "error importing function definition for `%s'"
+#~ msgstr "klaida importuojant funkcijos apibrėžimą „%s“"
+
+#, fuzzy
+#~ msgid "make_local_variable: no function context at current scope"
+#~ msgstr "make_local_variable: "
+
+#~ msgid "Copyright (C) 2006 Free Software Foundation, Inc.\n"
+#~ msgstr "Autorinės teisės (C) 2006 Free Software Foundation, Inc.\n"
+
+#~ msgid "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"
+#~ msgstr "xmalloc: nepavyko išskirti %lu baitų (%lu baitų išskirta)"
+
+#~ msgid "xmalloc: cannot allocate %lu bytes"
+#~ msgstr "xmalloc: nepavyko išskirti %lu baitų"
+
+#~ msgid "xrealloc: cannot allocate %lu bytes"
+#~ msgstr "xrealloc: nepavyko išskirti %lu baitų"
+
+#~ msgid "xmalloc: %s:%d: cannot allocate %lu bytes"
+#~ msgstr "xmalloc: %s:%d: nepavyko išskirti %lu baitų"
+
+#~ msgid "xrealloc: %s:%d: cannot allocate %lu bytes"
+#~ msgstr "xrealloc: %s:%d: nepavyko išskirti %lu baitų"
diff --git a/posix/regcomp.c b/posix/regcomp.c
index f4eab3adbd..8ba7668e8b 100644
--- a/posix/regcomp.c
+++ b/posix/regcomp.c
@@ -1038,7 +1038,9 @@ optimize_utf8 (re_dfa_t *dfa)
case BUF_LAST:
break;
default:
- /* Word anchors etc. cannot be handled. */
+ /* Word anchors etc. cannot be handled. It's okay to test
+ opr.ctx_type since constraints (for all DFA nodes) are
+ created by ORing one or more opr.ctx_type values. */
return;
}
break;
@@ -1318,6 +1320,8 @@ calc_first (void *extra, bin_tree_t *node)
node->node_idx = re_dfa_add_node (dfa, node->token);
if (BE (node->node_idx == -1, 0))
return REG_ESPACE;
+ if (node->token.type == ANCHOR)
+ dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type;
}
return REG_NOERROR;
}
@@ -1446,22 +1450,17 @@ duplicate_node_closure (re_dfa_t *dfa, int top_org_node, int top_clone_node,
destination. */
org_dest = dfa->edests[org_node].elems[0];
re_node_set_empty (dfa->edests + clone_node);
- if (dfa->nodes[org_node].type == ANCHOR)
+ /* If the node is root_node itself, it means the epsilon clsoure
+ has a loop. Then tie it to the destination of the root_node. */
+ if (org_node == root_node && clone_node != org_node)
{
- /* In case of the node has another constraint, append it. */
- if (org_node == root_node && clone_node != org_node)
- {
- /* ...but if the node is root_node itself, it means the
- epsilon closure have a loop, then tie it to the
- destination of the root_node. */
- ret = re_node_set_insert (dfa->edests + clone_node,
- org_dest);
- if (BE (ret < 0, 0))
- return REG_ESPACE;
- break;
- }
- constraint |= dfa->nodes[org_node].opr.ctx_type;
+ ret = re_node_set_insert (dfa->edests + clone_node, org_dest);
+ if (BE (ret < 0, 0))
+ return REG_ESPACE;
+ break;
}
+ /* In case of the node has another constraint, add it. */
+ constraint |= dfa->nodes[org_node].constraint;
clone_dest = duplicate_node (dfa, org_dest, constraint);
if (BE (clone_dest == -1, 0))
return REG_ESPACE;
@@ -1479,7 +1478,7 @@ duplicate_node_closure (re_dfa_t *dfa, int top_org_node, int top_clone_node,
clone_dest = search_duplicated_node (dfa, org_dest, constraint);
if (clone_dest == -1)
{
- /* There are no such a duplicated node, create a new one. */
+ /* There is no such duplicated node, create a new one. */
reg_errcode_t err;
clone_dest = duplicate_node (dfa, org_dest, constraint);
if (BE (clone_dest == -1, 0))
@@ -1494,7 +1493,7 @@ duplicate_node_closure (re_dfa_t *dfa, int top_org_node, int top_clone_node,
}
else
{
- /* There are a duplicated node which satisfy the constraint,
+ /* There is a duplicated node which satisfies the constraint,
use it to avoid infinite loop. */
ret = re_node_set_insert (dfa->edests + clone_node, clone_dest);
if (BE (ret < 0, 0))
@@ -1543,8 +1542,7 @@ duplicate_node (re_dfa_t *dfa, int org_idx, unsigned int constraint)
if (BE (dup_idx != -1, 1))
{
dfa->nodes[dup_idx].constraint = constraint;
- if (dfa->nodes[org_idx].type == ANCHOR)
- dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].opr.ctx_type;
+ dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint;
dfa->nodes[dup_idx].duplicated = 1;
/* Store the index of the original node. */
@@ -1624,7 +1622,6 @@ static reg_errcode_t
calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, int node, int root)
{
reg_errcode_t err;
- unsigned int constraint;
int i, incomplete;
re_node_set eclosure;
incomplete = 0;
@@ -1636,15 +1633,14 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, int node, int root)
We reference this value to avoid infinite loop. */
dfa->eclosures[node].nelem = -1;
- constraint = ((dfa->nodes[node].type == ANCHOR)
- ? dfa->nodes[node].opr.ctx_type : 0);
- /* If the current node has constraints, duplicate all nodes.
- Since they must inherit the constraints. */
- if (constraint
+ /* If the current node has constraints, duplicate all nodes
+ since they must inherit the constraints. */
+ if (dfa->nodes[node].constraint
&& dfa->edests[node].nelem
&& !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
{
- err = duplicate_node_closure (dfa, node, node, node, constraint);
+ err = duplicate_node_closure (dfa, node, node, node,
+ dfa->nodes[node].constraint);
if (BE (err != REG_NOERROR, 0))
return err;
}
diff --git a/posix/regex_internal.c b/posix/regex_internal.c
index 66154e0cea..01a432e801 100644
--- a/posix/regex_internal.c
+++ b/posix/regex_internal.c
@@ -1665,11 +1665,9 @@ create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
for (i = 0 ; i < nodes->nelem ; i++)
{
- unsigned int constraint = 0;
re_token_t *node = dfa->nodes + nodes->elems[i];
re_token_type_t type = node->type;
- if (node->constraint)
- constraint = node->constraint;
+ unsigned int constraint = node->constraint;
if (type == CHARACTER && !constraint)
continue;
@@ -1682,8 +1680,6 @@ create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
newstate->halt = 1;
else if (type == OP_BACK_REF)
newstate->has_backref = 1;
- else if (type == ANCHOR)
- constraint = node->opr.ctx_type;
if (constraint)
{
diff --git a/posix/tst-rfc3484-2.c b/posix/tst-rfc3484-2.c
index 56c0277b17..c85fdd0742 100644
--- a/posix/tst-rfc3484-2.c
+++ b/posix/tst-rfc3484-2.c
@@ -18,24 +18,35 @@ __check_pf (bool *p1, bool *p2, struct in6addrinfo **in6ai, size_t *in6ailen)
*in6ai = NULL;
*in6ailen = 0;
}
+
void
attribute_hidden
__check_native (uint32_t a1_index, int *a1_native,
uint32_t a2_index, int *a2_native)
{
}
+
int
+attribute_hidden
__idna_to_ascii_lz (const char *input, char **output, int flags)
{
return 0;
}
+
int
+attribute_hidden
__idna_to_unicode_lzlz (const char *input, char **output, int flags)
{
*output = NULL;
return 0;
}
+void
+attribute_hidden
+_res_hconf_init (void)
+{
+}
+
#include "../sysdeps/posix/getaddrinfo.c"
service_user *__nss_hosts_database attribute_hidden;
diff --git a/posix/tst-rfc3484-3.c b/posix/tst-rfc3484-3.c
index 616722eb1c..3aa4563c0c 100644
--- a/posix/tst-rfc3484-3.c
+++ b/posix/tst-rfc3484-3.c
@@ -18,24 +18,35 @@ __check_pf (bool *p1, bool *p2, struct in6addrinfo **in6ai, size_t *in6ailen)
*in6ai = NULL;
*in6ailen = 0;
}
+
void
attribute_hidden
__check_native (uint32_t a1_index, int *a1_native,
uint32_t a2_index, int *a2_native)
{
}
+
int
+attribute_hidden
__idna_to_ascii_lz (const char *input, char **output, int flags)
{
return 0;
}
+
int
+attribute_hidden
__idna_to_unicode_lzlz (const char *input, char **output, int flags)
{
*output = NULL;
return 0;
}
+void
+attribute_hidden
+_res_hconf_init (void)
+{
+}
+
#include "../sysdeps/posix/getaddrinfo.c"
service_user *__nss_hosts_database attribute_hidden;
diff --git a/posix/tst-rfc3484.c b/posix/tst-rfc3484.c
index 4df5b2951b..15d0c94a5e 100644
--- a/posix/tst-rfc3484.c
+++ b/posix/tst-rfc3484.c
@@ -18,24 +18,35 @@ __check_pf (bool *p1, bool *p2, struct in6addrinfo **in6ai, size_t *in6ailen)
*in6ai = NULL;
*in6ailen = 0;
}
+
void
attribute_hidden
__check_native (uint32_t a1_index, int *a1_native,
uint32_t a2_index, int *a2_native)
{
}
+
int
+attribute_hidden
__idna_to_ascii_lz (const char *input, char **output, int flags)
{
return 0;
}
+
int
+attribute_hidden
__idna_to_unicode_lzlz (const char *input, char **output, int flags)
{
*output = NULL;
return 0;
}
+void
+attribute_hidden
+_res_hconf_init (void)
+{
+}
+
#include "../sysdeps/posix/getaddrinfo.c"
service_user *__nss_hosts_database attribute_hidden;
diff --git a/resolv/Versions b/resolv/Versions
index fc2111a1cb..355d95d606 100644
--- a/resolv/Versions
+++ b/resolv/Versions
@@ -89,6 +89,7 @@ libnss_dns {
_nss_dns_gethostbyname_r; _nss_dns_getnetbyaddr_r;
_nss_dns_getnetbyname_r; _nss_dns_getcanonname_r;
_nss_dns_gethostbyaddr2_r;
+ _nss_dns_gethostbyname4_r;
}
}
diff --git a/resolv/gethnamaddr.c b/resolv/gethnamaddr.c
index 7be23158d0..2a9bd0b3c2 100644
--- a/resolv/gethnamaddr.c
+++ b/resolv/gethnamaddr.c
@@ -621,7 +621,7 @@ gethostbyname2(name, af)
buf.buf = origbuf = (querybuf *) alloca (1024);
if ((n = __libc_res_nsearch(&_res, name, C_IN, type, buf.buf->buf, 1024,
- &buf.ptr)) < 0) {
+ &buf.ptr, NULL, NULL)) < 0) {
if (buf.buf != origbuf)
free (buf.buf);
Dprintf("res_nsearch failed (%d)\n", n);
@@ -716,12 +716,12 @@ gethostbyaddr(addr, len, af)
buf.buf = orig_buf = (querybuf *) alloca (1024);
n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf, 1024,
- &buf.ptr);
+ &buf.ptr, NULL, NULL);
if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0) {
strcpy(qp, "ip6.int");
n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf,
buf.buf != orig_buf ? MAXPACKET : 1024,
- &buf.ptr);
+ &buf.ptr, NULL, NULL);
}
if (n < 0) {
if (buf.buf != orig_buf)
diff --git a/resolv/nss_dns/dns-canon.c b/resolv/nss_dns/dns-canon.c
index fca6cd8997..47949b862f 100644
--- a/resolv/nss_dns/dns-canon.c
+++ b/resolv/nss_dns/dns-canon.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2004, 2006, 2008 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -61,7 +61,7 @@ _nss_dns_getcanonname_r (const char *name, char *buffer, size_t buflen,
for (int i = 0; i < nqtypes; ++i)
{
int r = __libc_res_nquery (&_res, name, ns_c_in, qtypes[i],
- buf, sizeof (buf), &ansp.ptr);
+ buf, sizeof (buf), &ansp.ptr, NULL, NULL);
if (r > 0)
{
/* We need to decode the response. Just one question record.
diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c
index dfdf9c5dcb..c52f9f7f84 100644
--- a/resolv/nss_dns/dns-host.c
+++ b/resolv/nss_dns/dns-host.c
@@ -71,6 +71,7 @@
* --Copyright--
*/
+#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <netdb.h>
@@ -127,6 +128,14 @@ static enum nss_status getanswer_r (const querybuf *answer, int anslen,
size_t buflen, int *errnop, int *h_errnop,
int map, int32_t *ttlp, char **canonp);
+static enum nss_status gaih_getanswer (const querybuf *answer1, int anslen1,
+ const querybuf *answer2, int anslen2,
+ const char *qname,
+ struct gaih_addrtuple **pat,
+ char *buffer, size_t buflen,
+ int *errnop, int *h_errnop,
+ int32_t *ttlp);
+
extern enum nss_status _nss_dns_gethostbyname3_r (const char *name, int af,
struct hostent *result,
char *buffer, size_t buflen,
@@ -186,11 +195,11 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result,
host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024);
n = __libc_res_nsearch (&_res, name, C_IN, type, host_buffer.buf->buf,
- 1024, &host_buffer.ptr);
+ 1024, &host_buffer.ptr, NULL, NULL);
if (n < 0)
{
- enum nss_status status = (errno == ECONNREFUSED
- ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND);
+ status = (errno == ECONNREFUSED
+ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND);
*h_errnop = h_errno;
if (h_errno == TRY_AGAIN)
*errnop = EAGAIN;
@@ -203,7 +212,8 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result,
if (af == AF_INET6 && (_res.options & RES_USE_INET6))
n = __libc_res_nsearch (&_res, name, C_IN, T_A, host_buffer.buf->buf,
host_buffer.buf != orig_host_buffer
- ? MAXPACKET : 1024, &host_buffer.ptr);
+ ? MAXPACKET : 1024, &host_buffer.ptr,
+ NULL, NULL);
if (n < 0)
{
@@ -255,6 +265,70 @@ _nss_dns_gethostbyname_r (const char *name, struct hostent *result,
}
+enum nss_status
+_nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
+ char *buffer, size_t buflen, int *errnop,
+ int *herrnop, int32_t *ttlp)
+{
+ if (__res_maybe_init (&_res, 0) == -1)
+ return NSS_STATUS_UNAVAIL;
+
+ char tmp[NS_MAXDNAME];
+
+ /*
+ * if there aren't any dots, it could be a user-level alias.
+ * this is also done in res_query() since we are not the only
+ * function that looks up host names.
+ */
+ if (strchr (name, '.') == NULL)
+ {
+ const char *cp = res_hostalias (&_res, name, tmp, sizeof (tmp));
+ if (cp != NULL)
+ name = cp;
+ }
+
+ union
+ {
+ querybuf *buf;
+ u_char *ptr;
+ } host_buffer;
+ querybuf *orig_host_buffer;
+ host_buffer.buf = orig_host_buffer = (querybuf *) alloca (2048);
+ u_char *ans2p = NULL;
+ int nans2p = 0;
+
+ int olderr = errno;
+ enum nss_status status;
+ int n = __libc_res_nsearch (&_res, name, C_IN, T_UNSPEC,
+ host_buffer.buf->buf, 2048, &host_buffer.ptr,
+ &ans2p, &nans2p);
+ if (n < 0)
+ {
+ status = (errno == ECONNREFUSED
+ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND);
+ *herrnop = h_errno;
+ if (h_errno == TRY_AGAIN)
+ *errnop = EAGAIN;
+ else
+ __set_errno (olderr);
+
+ if (host_buffer.buf != orig_host_buffer)
+ free (host_buffer.buf);
+
+ return status;
+ }
+
+ status = gaih_getanswer(host_buffer.buf, n, (const querybuf *) ans2p,
+ nans2p, name, pat, buffer, buflen,
+ errnop, herrnop, ttlp);
+
+ if (host_buffer.buf != orig_host_buffer)
+ free (host_buffer.buf);
+
+ return status;
+}
+
+
extern enum nss_status _nss_dns_gethostbyaddr2_r (const void *addr,
socklen_t len, int af,
struct hostent *result,
@@ -342,7 +416,8 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af,
qp += sprintf (qp, "%02hhx", uaddr[n]);
strcpy (qp, "].ip6.arpa");
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR,
- host_buffer.buf->buf, 1024, &host_buffer.ptr);
+ host_buffer.buf->buf, 1024, &host_buffer.ptr,
+ NULL, NULL);
if (n >= 0)
goto got_it_already;
}
@@ -363,13 +438,14 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af,
}
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
- 1024, &host_buffer.ptr);
+ 1024, &host_buffer.ptr, NULL, NULL);
if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0)
{
strcpy (qp, "ip6.int");
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
host_buffer.buf != orig_host_buffer
- ? MAXPACKET : 1024, &host_buffer.ptr);
+ ? MAXPACKET : 1024, &host_buffer.ptr,
+ NULL, NULL);
}
if (n < 0)
{
@@ -555,7 +631,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
if (n > 0 && bp[0] == '.')
bp[0] = '\0';
- if (n < 0 || (*name_ok) (bp) == 0)
+ if (__builtin_expect (n < 0 || ((*name_ok) (bp) == 0 && (errno = EBADMSG)),
+ 0))
{
*errnop = errno;
*h_errnop = NO_RECOVERY;
@@ -629,7 +706,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
continue; /* XXX - had_error++ ? */
}
- if ((qtype ==T_A || qtype == T_AAAA) && type == T_CNAME)
+ if ((qtype == T_A || qtype == T_AAAA) && type == T_CNAME)
{
if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1])
continue;
@@ -857,3 +934,245 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
return ((qtype == T_A || qtype == T_AAAA) && ap != host_data->aliases
? NSS_STATUS_NOTFOUND : NSS_STATUS_TRYAGAIN);
}
+
+
+static enum nss_status
+gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
+ struct gaih_addrtuple ***patp,
+ char **bufferp, size_t *buflenp,
+ int *errnop, int *h_errnop, int32_t *ttlp, int *firstp)
+{
+ char *buffer = *bufferp;
+ size_t buflen = *buflenp;
+
+ struct gaih_addrtuple **pat = *patp;
+ const HEADER *hp = &answer->hdr;
+ int ancount = ntohs (hp->ancount);
+ int qdcount = ntohs (hp->qdcount);
+ const u_char *cp = answer->buf + HFIXEDSZ;
+ const u_char *end_of_message = answer->buf + anslen;
+ if (__builtin_expect (qdcount != 1, 0))
+ {
+ *h_errnop = NO_RECOVERY;
+ return NSS_STATUS_UNAVAIL;
+ }
+
+ u_char packtmp[NS_MAXCDNAME];
+ int n = __ns_name_unpack (answer->buf, end_of_message, cp,
+ packtmp, sizeof packtmp);
+ /* We unpack the name to check it for validity. But we do not need
+ it later. */
+ if (n != -1 && __ns_name_ntop (packtmp, buffer, buflen) == -1)
+ {
+ if (__builtin_expect (errno, 0) == EMSGSIZE)
+ {
+ too_small:
+ *errnop = ERANGE;
+ *h_errnop = NETDB_INTERNAL;
+ return NSS_STATUS_TRYAGAIN;
+ }
+
+ n = -1;
+ }
+
+ if (__builtin_expect (n < 0 || (res_hnok (buffer) == 0
+ && (errno = EBADMSG)), 0))
+ {
+ *errnop = errno;
+ *h_errnop = NO_RECOVERY;
+ return NSS_STATUS_UNAVAIL;
+ }
+ cp += n + QFIXEDSZ;
+
+ int haveanswer = 0;
+ int had_error = 0;
+ char *canon = NULL;
+ char *h_name = NULL;
+ int h_namelen = 0;
+
+ while (ancount-- > 0 && cp < end_of_message && had_error == 0)
+ {
+ n = __ns_name_unpack (answer->buf, end_of_message, cp,
+ packtmp, sizeof packtmp);
+ if (n != -1 &&
+ (h_namelen = __ns_name_ntop (packtmp, buffer, buflen)) == -1)
+ {
+ if (__builtin_expect (errno, 0) == EMSGSIZE)
+ goto too_small;
+
+ n = -1;
+ }
+ if (n < 0 || res_hnok (buffer) == 0)
+ {
+ ++had_error;
+ continue;
+ }
+ if (*firstp)
+ {
+ h_name = buffer;
+ buffer += h_namelen;
+ buflen -= h_namelen;
+ }
+
+ cp += n; /* name */
+ int type = ns_get16 (cp);
+ cp += INT16SZ; /* type */
+ int class = ns_get16 (cp);
+ cp += INT16SZ; /* class */
+ int32_t ttl = ns_get32 (cp);
+ cp += INT32SZ; /* TTL */
+ n = ns_get16 (cp);
+ cp += INT16SZ; /* len */
+
+ if (class != C_IN)
+ {
+ cp += n;
+ continue;
+ }
+
+ if (type == T_CNAME)
+ {
+ char tbuf[MAXDNAME];
+ n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
+ if (n < 0 || res_hnok (tbuf) == 0)
+ {
+ ++had_error;
+ continue;
+ }
+ cp += n;
+
+ if (*firstp)
+ {
+ /* Reclaim buffer space. */
+ if (h_name + h_namelen == buffer)
+ {
+ buffer = h_name;
+ buflen += h_namelen;
+ }
+
+ n = strlen (tbuf) + 1;
+ if (__builtin_expect (n > buflen, 0))
+ goto too_small;
+ if (__builtin_expect (n >= MAXHOSTNAMELEN, 0))
+ {
+ ++had_error;
+ continue;
+ }
+
+ canon = buffer;
+ buffer = __mempcpy (buffer, tbuf, n);
+ buflen -= n;
+ h_namelen = 0;
+ }
+ continue;
+ }
+ if (__builtin_expect (type == T_SIG, 0)
+ || __builtin_expect (type == T_KEY, 0)
+ || __builtin_expect (type == T_NXT, 0)
+ || __builtin_expect (type == T_PTR, 0))
+ {
+ /* We don't support DNSSEC yet. For now, ignore the record
+ and send a low priority message to syslog.
+
+ We also don't expect T_PTR messages. */
+ syslog (LOG_DEBUG | LOG_AUTH,
+ "getaddrinfo*.gaih_getanswer: got type \"%s\"",
+ p_type (type));
+ cp += n;
+ continue;
+ }
+ if (type != T_A && type != T_AAAA)
+ abort ();
+
+ if (*pat == NULL)
+ {
+ uintptr_t pad = (-(uintptr_t) buffer
+ % __alignof__ (struct gaih_addrtuple));
+ buffer += pad;
+ buflen = buflen > pad ? buflen - pad : 0;
+
+ if (__builtin_expect (buflen < sizeof (struct gaih_addrtuple),
+ 0))
+ {
+ *errnop = ERANGE;
+ *h_errnop = NETDB_INTERNAL;
+ return NSS_STATUS_TRYAGAIN;
+ }
+
+ *pat = (struct gaih_addrtuple *) buffer;
+ buffer += sizeof (struct gaih_addrtuple);
+ buflen -= sizeof (struct gaih_addrtuple);
+ }
+
+ (*pat)->name = NULL;
+ (*pat)->next = NULL;
+
+ if (*firstp)
+ {
+ if (ttl != 0 && ttlp != NULL)
+ *ttlp = ttl;
+
+ if (canon != NULL)
+ {
+ (*pat)->name = canon;
+
+ /* Reclaim buffer space. */
+ if (h_name + h_namelen == buffer)
+ {
+ buffer = h_name;
+ buflen += h_namelen;
+ }
+ }
+ else
+ (*pat)->name = h_name;
+
+ *firstp = 0;
+ }
+
+ (*pat)->family = type == T_A ? AF_INET : AF_INET6;
+ memcpy ((*pat)->addr, cp, n);
+ cp += n;
+ (*pat)->scopeid = 0;
+
+ pat = &((*pat)->next);
+
+ haveanswer = 1;
+ }
+
+ if (haveanswer)
+ {
+ *patp = pat;
+ *bufferp = buffer;
+ *buflenp = buflen;
+
+ *h_errnop = NETDB_SUCCESS;
+ return NSS_STATUS_SUCCESS;
+ }
+
+ /* Special case here: if the resolver sent a result but it only
+ contains a CNAME while we are looking for a T_A or T_AAAA record,
+ we fail with NOTFOUND instead of TRYAGAIN. */
+ return canon == NULL ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND;
+}
+
+
+static enum nss_status
+gaih_getanswer (const querybuf *answer1, int anslen1, const querybuf *answer2,
+ int anslen2, const char *qname,
+ struct gaih_addrtuple **pat, char *buffer, size_t buflen,
+ int *errnop, int *h_errnop, int32_t *ttlp)
+{
+ int first = 1;
+
+ enum nss_status status = gaih_getanswer_slice(answer1, anslen1, qname,
+ &pat, &buffer, &buflen,
+ errnop, h_errnop, ttlp,
+ &first);
+ if ((status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND)
+ && answer2 != NULL)
+ status = gaih_getanswer_slice(answer2, anslen2, qname,
+ &pat, &buffer, &buflen,
+ errnop, h_errnop, ttlp, &first);
+
+ return status;
+}
diff --git a/resolv/nss_dns/dns-network.c b/resolv/nss_dns/dns-network.c
index 4552b5b678..40736fbe94 100644
--- a/resolv/nss_dns/dns-network.c
+++ b/resolv/nss_dns/dns-network.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999, 2002, 2004, 2007
+/* Copyright (C) 1996, 1997, 1998, 1999, 2002, 2004, 2007, 2008
Free Software Foundation, Inc.
This file is part of the GNU C Library.
Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -130,7 +130,7 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result,
net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024);
anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf,
- 1024, &net_buffer.ptr);
+ 1024, &net_buffer.ptr, NULL, NULL);
if (anslen < 0)
{
/* Nothing found. */
@@ -206,7 +206,7 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024);
anslen = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf,
- 1024, &net_buffer.ptr);
+ 1024, &net_buffer.ptr, NULL, NULL);
if (anslen < 0)
{
/* Nothing found. */
diff --git a/resolv/res_mkquery.c b/resolv/res_mkquery.c
index 3fa597fecd..416bf1c32b 100644
--- a/resolv/res_mkquery.c
+++ b/resolv/res_mkquery.c
@@ -238,17 +238,13 @@ __res_nopt(res_state statp,
*cp++ = 0; /* "." */
- ns_put16(T_OPT, cp); /* TYPE */
- cp += INT16SZ;
- ns_put16(anslen & 0xffff, cp); /* CLASS = UDP payload size */
- cp += INT16SZ;
+ NS_PUT16(T_OPT, cp); /* TYPE */
+ NS_PUT16(anslen & 0xffff, cp); /* CLASS = UDP payload size */
*cp++ = NOERROR; /* extended RCODE */
*cp++ = 0; /* EDNS version */
/* XXX Once we support DNSSEC we change the flag value here. */
- ns_put16(flags, cp);
- cp += INT16SZ;
- ns_put16(0, cp); /* RDLEN */
- cp += INT16SZ;
+ NS_PUT16(flags, cp);
+ NS_PUT16(0, cp); /* RDLEN */
hp->arcount = htons(ntohs(hp->arcount) + 1);
return cp - buf;
diff --git a/resolv/res_query.c b/resolv/res_query.c
index 4371af5b05..a8e8d7b739 100644
--- a/resolv/res_query.c
+++ b/resolv/res_query.c
@@ -97,7 +97,7 @@ static const char rcsid[] = "$BINDId: res_query.c,v 8.20 2000/02/29 05:39:12 vix
static int
__libc_res_nquerydomain(res_state statp, const char *name, const char *domain,
int class, int type, u_char *answer, int anslen,
- u_char **answerp);
+ u_char **answerp, u_char **answerp2, int *nanswerp2);
/*
* Formulate a normal query, send, and await answer.
@@ -115,15 +115,20 @@ __libc_res_nquery(res_state statp,
int class, int type, /* class and type of query */
u_char *answer, /* buffer to put answer */
int anslen, /* size of answer buffer */
- u_char **answerp) /* if buffer needs to be enlarged */
+ u_char **answerp, /* if buffer needs to be enlarged */
+ u_char **answerp2,
+ int *nanswerp2)
{
- u_char *buf;
HEADER *hp = (HEADER *) answer;
int n, use_malloc = 0;
u_int oflags = statp->_flags;
- size_t bufsize = QUERYSIZE;
- buf = alloca (bufsize);
+ size_t bufsize = (type == T_UNSPEC ? 2 : 1) * QUERYSIZE;
+ u_char *buf = alloca (bufsize);
+ u_char *query1 = buf;
+ int nquery1 = -1;
+ u_char *query2 = NULL;
+ int nquery2 = 0;
again:
hp->rcode = NOERROR; /* default */
@@ -133,18 +138,47 @@ __libc_res_nquery(res_state statp,
printf(";; res_query(%s, %d, %d)\n", name, class, type);
#endif
- n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL,
- buf, bufsize);
- if (n > 0
- && (oflags & RES_F_EDNS0ERR) == 0
- && (statp->options & RES_USE_EDNS0) != 0)
- n = __res_nopt(statp, n, buf, bufsize, anslen);
+ if (type == T_UNSPEC)
+ {
+ n = res_nmkquery(statp, QUERY, name, class, T_A, NULL, 0, NULL,
+ query1, bufsize);
+ if (n > 0)
+ {
+ if ((oflags & RES_F_EDNS0ERR) == 0
+ && (statp->options & RES_USE_EDNS0) != 0)
+ n = __res_nopt(statp, n, query1, bufsize, anslen / 2);
+
+ nquery1 = n;
+ query2 = buf + nquery1;
+ n = res_nmkquery(statp, QUERY, name, class, T_AAAA, NULL, 0,
+ NULL, query2, bufsize - n);
+ if (n > 0
+ && (oflags & RES_F_EDNS0ERR) == 0
+ && (statp->options & RES_USE_EDNS0) != 0)
+ n = __res_nopt(statp, n, query2, bufsize - n, anslen / 2);
+ nquery2 = n;
+ }
+ }
+ else
+ {
+ n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL,
+ query1, bufsize);
+
+ if (n > 0
+ && (oflags & RES_F_EDNS0ERR) == 0
+ && (statp->options & RES_USE_EDNS0) != 0)
+ n = __res_nopt(statp, n, query1, bufsize, anslen);
+
+ nquery1 = n;
+ }
+
if (__builtin_expect (n <= 0, 0) && !use_malloc) {
/* Retry just in case res_nmkquery failed because of too
short buffer. Shouldn't happen. */
- bufsize = MAXPACKET;
+ bufsize = (type == T_UNSPEC ? 2 : 1) * MAXPACKET;
buf = malloc (bufsize);
if (buf != NULL) {
+ query1 = buf;
use_malloc = 1;
goto again;
}
@@ -168,7 +202,8 @@ __libc_res_nquery(res_state statp,
return (n);
}
assert (answerp == NULL || (void *) *answerp == (void *) answer);
- n = __libc_res_nsend(statp, buf, n, answer, anslen, answerp);
+ n = __libc_res_nsend(statp, query1, nquery1, query2, nquery2, answer,
+ anslen, answerp, answerp2, nanswerp2);
if (use_malloc)
free (buf);
if (n < 0) {
@@ -184,20 +219,37 @@ __libc_res_nquery(res_state statp,
/* __libc_res_nsend might have reallocated the buffer. */
hp = (HEADER *) *answerp;
- if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
+ /* We simplify the following tests by assigning HP to HP2. It
+ is easy to verify that this is the same as ignoring all
+ tests of HP2. */
+ HEADER *hp2 = answerp2 ? (HEADER *) *answerp2 : hp;
+
+ if ((hp->rcode != NOERROR || ntohs(hp->ancount) == 0)
+ && (hp2->rcode != NOERROR || ntohs(hp2->ancount) == 0)) {
#ifdef DEBUG
- if (statp->options & RES_DEBUG)
+ if (statp->options & RES_DEBUG) {
printf(";; rcode = %d, ancount=%d\n", hp->rcode,
ntohs(hp->ancount));
+ if (hp != hp2)
+ printf(";; rcode2 = %d, ancount2=%d\n", hp2->rcode,
+ ntohs(hp2->ancount));
+ }
#endif
- switch (hp->rcode) {
+ switch (hp->rcode == NOERROR ? hp2->rcode : hp->rcode) {
case NXDOMAIN:
+ if ((hp->rcode == NOERROR && ntohs (hp->ancount) != 0)
+ || (hp2->rcode == NOERROR
+ && ntohs (hp2->ancount) != 0))
+ goto success;
RES_SET_H_ERRNO(statp, HOST_NOT_FOUND);
break;
case SERVFAIL:
RES_SET_H_ERRNO(statp, TRY_AGAIN);
break;
case NOERROR:
+ if (ntohs (hp->ancount) != 0
+ || ntohs (hp2->ancount) != 0)
+ goto success;
RES_SET_H_ERRNO(statp, NO_DATA);
break;
case FORMERR:
@@ -209,6 +261,7 @@ __libc_res_nquery(res_state statp,
}
return (-1);
}
+ success:
return (n);
}
libresolv_hidden_def (__libc_res_nquery)
@@ -221,7 +274,7 @@ res_nquery(res_state statp,
int anslen) /* size of answer buffer */
{
return __libc_res_nquery(statp, name, class, type, answer, anslen,
- NULL);
+ NULL, NULL, NULL);
}
libresolv_hidden_def (res_nquery)
@@ -233,11 +286,13 @@ libresolv_hidden_def (res_nquery)
*/
int
__libc_res_nsearch(res_state statp,
- const char *name, /* domain name */
- int class, int type, /* class and type of query */
- u_char *answer, /* buffer to put answer */
- int anslen, /* size of answer */
- u_char **answerp)
+ const char *name, /* domain name */
+ int class, int type, /* class and type of query */
+ u_char *answer, /* buffer to put answer */
+ int anslen, /* size of answer */
+ u_char **answerp,
+ u_char **answerp2,
+ int *nanswerp2)
{
const char *cp, * const *domain;
HEADER *hp = (HEADER *) answer;
@@ -260,7 +315,8 @@ __libc_res_nsearch(res_state statp,
/* If there aren't any dots, it could be a user-level alias. */
if (!dots && (cp = res_hostalias(statp, name, tmp, sizeof tmp))!= NULL)
return (__libc_res_nquery(statp, cp, class, type, answer,
- anslen, answerp));
+ anslen, answerp, answerp2,
+ nanswerp2));
#ifdef DEBUG
if (statp->options & RES_DEBUG)
@@ -276,7 +332,8 @@ __libc_res_nsearch(res_state statp,
saved_herrno = -1;
if (dots >= statp->ndots || trailing_dot) {
ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
- answer, anslen, answerp);
+ answer, anslen, answerp,
+ answerp2, nanswerp2);
if (ret > 0 || trailing_dot)
return (ret);
saved_herrno = h_errno;
@@ -285,6 +342,12 @@ __libc_res_nsearch(res_state statp,
answer = *answerp;
anslen = MAXPACKET;
}
+ if (answerp2
+ && (*answerp2 < answer || *answerp2 >= answer + anslen))
+ {
+ free (*answerp2);
+ *answerp2 = NULL;
+ }
}
/*
@@ -307,7 +370,8 @@ __libc_res_nsearch(res_state statp,
ret = __libc_res_nquerydomain(statp, name, *domain,
class, type,
- answer, anslen, answerp);
+ answer, anslen, answerp,
+ answerp2, nanswerp2);
if (ret > 0)
return (ret);
@@ -315,6 +379,13 @@ __libc_res_nsearch(res_state statp,
answer = *answerp;
anslen = MAXPACKET;
}
+ if (answerp2
+ && (*answerp2 < answer
+ || *answerp2 >= answer + anslen))
+ {
+ free (*answerp2);
+ *answerp2 = NULL;
+ }
/*
* If no server present, give up.
@@ -368,7 +439,8 @@ __libc_res_nsearch(res_state statp,
*/
if (dots && !(tried_as_is || root_on_list)) {
ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
- answer, anslen, answerp);
+ answer, anslen, answerp,
+ answerp2, nanswerp2);
if (ret > 0)
return (ret);
}
@@ -380,6 +452,11 @@ __libc_res_nsearch(res_state statp,
* else send back meaningless H_ERRNO, that being the one from
* the last DNSRCH we did.
*/
+ if (answerp2 && (*answerp2 < answer || *answerp2 >= answer + anslen))
+ {
+ free (*answerp2);
+ *answerp2 = NULL;
+ }
if (saved_herrno != -1)
RES_SET_H_ERRNO(statp, saved_herrno);
else if (got_nodata)
@@ -398,7 +475,7 @@ res_nsearch(res_state statp,
int anslen) /* size of answer */
{
return __libc_res_nsearch(statp, name, class, type, answer,
- anslen, NULL);
+ anslen, NULL, NULL, NULL);
}
libresolv_hidden_def (res_nsearch)
@@ -408,12 +485,14 @@ libresolv_hidden_def (res_nsearch)
*/
static int
__libc_res_nquerydomain(res_state statp,
- const char *name,
- const char *domain,
- int class, int type, /* class and type of query */
- u_char *answer, /* buffer to put answer */
- int anslen, /* size of answer */
- u_char **answerp)
+ const char *name,
+ const char *domain,
+ int class, int type, /* class and type of query */
+ u_char *answer, /* buffer to put answer */
+ int anslen, /* size of answer */
+ u_char **answerp,
+ u_char **answerp2,
+ int *nanswerp2)
{
char nbuf[MAXDNAME];
const char *longname = nbuf;
@@ -450,7 +529,7 @@ __libc_res_nquerydomain(res_state statp,
sprintf(nbuf, "%s.%s", name, domain);
}
return (__libc_res_nquery(statp, longname, class, type, answer,
- anslen, answerp));
+ anslen, answerp, answerp2, nanswerp2));
}
int
@@ -462,7 +541,7 @@ res_nquerydomain(res_state statp,
int anslen) /* size of answer */
{
return __libc_res_nquerydomain(statp, name, domain, class, type,
- answer, anslen, NULL);
+ answer, anslen, NULL, NULL, NULL);
}
libresolv_hidden_def (res_nquerydomain)
diff --git a/resolv/res_send.c b/resolv/res_send.c
index 23306a2fb4..b3dbd702a2 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -176,10 +176,14 @@ evNowTime(struct timespec *res) {
/* Forward. */
static int send_vc(res_state, const u_char *, int,
- u_char **, int *, int *, int, u_char **);
+ const u_char *, int,
+ u_char **, int *, int *, int, u_char **,
+ u_char **, int *, int *);
static int send_dg(res_state, const u_char *, int,
+ const u_char *, int,
u_char **, int *, int *, int,
- int *, int *, u_char **);
+ int *, int *, u_char **,
+ u_char **, int *, int *);
#ifdef DEBUG
static void Aerror(const res_state, FILE *, const char *, int,
const struct sockaddr *);
@@ -334,33 +338,41 @@ libresolv_hidden_def (res_queriesmatch)
int
__libc_res_nsend(res_state statp, const u_char *buf, int buflen,
- u_char *ans, int anssiz, u_char **ansp)
+ const u_char *buf2, int buflen2,
+ u_char *ans, int anssiz, u_char **ansp, u_char **ansp2,
+ int *nansp2)
{
- int gotsomewhere, terrno, try, v_circuit, resplen, ns, n;
+ int gotsomewhere, terrno, try, v_circuit, resplen, resplen2, ns, n;
if (statp->nscount == 0) {
__set_errno (ESRCH);
return (-1);
}
- if (anssiz < HFIXEDSZ) {
+ if (anssiz < (buf2 == NULL ? 1 : 2) * HFIXEDSZ) {
__set_errno (EINVAL);
return (-1);
}
- if ((statp->qhook || statp->rhook) && anssiz < MAXPACKET && ansp) {
- u_char *buf = malloc (MAXPACKET);
- if (buf == NULL)
- return (-1);
- memcpy (buf, ans, HFIXEDSZ);
- *ansp = buf;
- ans = buf;
- anssiz = MAXPACKET;
+#ifdef USE_HOOKS
+ if (__builtin_expect (statp->qhook || statp->rhook, 0)) {
+ if (anssiz < MAXPACKET && ansp) {
+ u_char *buf = malloc (MAXPACKET);
+ if (buf == NULL)
+ return (-1);
+ memcpy (buf, ans, HFIXEDSZ);
+ *ansp = buf;
+ ans = buf;
+ anssiz = MAXPACKET;
+ }
}
+#endif
DprintQ((statp->options & RES_DEBUG) || (statp->pfcode & RES_PRF_QUERY),
(stdout, ";; res_send()\n"), buf, buflen);
- v_circuit = (statp->options & RES_USEVC) || buflen > PACKETSZ;
+ v_circuit = ((statp->options & RES_USEVC)
+ || buflen > PACKETSZ
+ || buflen2 > PACKETSZ);
gotsomewhere = 0;
terrno = ETIMEDOUT;
@@ -442,7 +454,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
* Some resolvers want to even out the load on their nameservers.
* Note that RES_BLAST overrides RES_ROTATE.
*/
- if ((statp->options & RES_ROTATE) != 0 &&
+ if (__builtin_expect ((statp->options & RES_ROTATE) != 0, 0) &&
(statp->options & RES_BLAST) == 0) {
struct sockaddr_in6 *ina;
unsigned int map;
@@ -479,8 +491,9 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
if (nsap == NULL)
goto next_ns;
- same_ns:
- if (statp->qhook) {
+ same_ns:
+#ifdef USE_HOOKS
+ if (__builtin_expect (statp->qhook != NULL, 0)) {
int done = 0, loops = 0;
do {
@@ -512,6 +525,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
}
} while (!done);
}
+#endif
#ifdef DEBUG
char tmpbuf[40];
@@ -521,29 +535,34 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
ns + 1, inet_ntop(AF_INET6, &nsap->sin6_addr,
tmpbuf, sizeof (tmpbuf))));
- if (v_circuit) {
+ if (__builtin_expect (v_circuit, 0)) {
/* Use VC; at most one attempt per server. */
try = statp->retry;
- n = send_vc(statp, buf, buflen, &ans, &anssiz, &terrno,
- ns, ansp);
+ n = send_vc(statp, buf, buflen, buf2, buflen2,
+ &ans, &anssiz, &terrno,
+ ns, ansp, ansp2, nansp2, &resplen2);
if (n < 0)
return (-1);
if (n == 0)
goto next_ns;
- resplen = n;
} else {
/* Use datagrams. */
- n = send_dg(statp, buf, buflen, &ans, &anssiz, &terrno,
- ns, &v_circuit, &gotsomewhere, ansp);
+ n = send_dg(statp, buf, buflen, buf2, buflen2,
+ &ans, &anssiz, &terrno,
+ ns, &v_circuit, &gotsomewhere, ansp,
+ ansp2, nansp2, &resplen2);
if (n < 0)
return (-1);
if (n == 0)
goto next_ns;
if (v_circuit)
+ // XXX Check whether both requests failed or
+ // XXX whether one have been answered successfully
goto same_ns;
- resplen = n;
}
+ resplen = n;
+
Dprint((statp->options & RES_DEBUG) ||
((statp->pfcode & RES_PRF_REPLY) &&
(statp->pfcode & RES_PRF_HEAD1)),
@@ -553,6 +572,11 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
(statp->pfcode & RES_PRF_REPLY),
(stdout, "%s", ""),
ans, (resplen > anssiz) ? anssiz : resplen);
+ if (buf2 != NULL)
+ DprintQ((statp->options & RES_DEBUG) ||
+ (statp->pfcode & RES_PRF_REPLY),
+ (stdout, "%s", ""),
+ *ansp2, (resplen2 > *nansp2) ? *nansp2 : resplen2);
/*
* If we have temporarily opened a virtual circuit,
@@ -563,7 +587,8 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
(statp->options & RES_STAYOPEN) == 0) {
__res_iclose(statp, false);
}
- if (statp->rhook) {
+#ifdef USE_HOOKS
+ if (__builtin_expect (statp->rhook, 0)) {
int done = 0, loops = 0;
do {
@@ -593,6 +618,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
} while (!done);
}
+#endif
return (resplen);
next_ns: ;
} /*foreach ns*/
@@ -612,7 +638,8 @@ int
res_nsend(res_state statp,
const u_char *buf, int buflen, u_char *ans, int anssiz)
{
- return __libc_res_nsend(statp, buf, buflen, ans, anssiz, NULL);
+ return __libc_res_nsend(statp, buf, buflen, NULL, 0, ans, anssiz,
+ NULL, NULL, NULL);
}
libresolv_hidden_def (res_nsend)
@@ -620,17 +647,23 @@ libresolv_hidden_def (res_nsend)
static int
send_vc(res_state statp,
- const u_char *buf, int buflen, u_char **ansp, int *anssizp,
- int *terrno, int ns, u_char **anscp)
+ const u_char *buf, int buflen, const u_char *buf2, int buflen2,
+ u_char **ansp, int *anssizp,
+ int *terrno, int ns, u_char **anscp, u_char **ansp2, int *anssizp2,
+ int *resplen2)
{
const HEADER *hp = (HEADER *) buf;
+ const HEADER *hp2 = (HEADER *) buf2;
u_char *ans = *ansp;
- int anssiz = *anssizp;
+ int orig_anssizp = *anssizp;
+ // XXX REMOVE
+ // int anssiz = *anssizp;
HEADER *anhp = (HEADER *) ans;
struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
int truncating, connreset, resplen, n;
- struct iovec iov[2];
+ struct iovec iov[4];
u_short len;
+ u_short len2;
u_char *cp;
connreset = 0;
@@ -677,11 +710,19 @@ send_vc(res_state statp,
/*
* Send length & message
*/
- ns_put16((u_short)buflen, (u_char*)&len);
+ len = htons ((u_short) buflen);
evConsIovec(&len, INT16SZ, &iov[0]);
evConsIovec((void*)buf, buflen, &iov[1]);
- if (TEMP_FAILURE_RETRY (writev(statp->_vcsock, iov, 2))
- != (INT16SZ + buflen)) {
+ int niov = 2;
+ ssize_t explen = INT16SZ + buflen;
+ if (buf2 != NULL) {
+ len2 = htons ((u_short) buflen2);
+ evConsIovec(&len2, INT16SZ, &iov[2]);
+ evConsIovec((void*)buf2, buflen2, &iov[3]);
+ niov = 4;
+ explen += INT16SZ + buflen2;
+ }
+ if (TEMP_FAILURE_RETRY (writev(statp->_vcsock, iov, niov)) != explen) {
*terrno = errno;
Perror(statp, stderr, "write failed", errno);
__res_iclose(statp, false);
@@ -690,6 +731,8 @@ send_vc(res_state statp,
/*
* Receive length & response
*/
+ int recvresp1 = 0;
+ int recvresp2 = buf2 == NULL;
read_len:
cp = ans;
len = INT16SZ;
@@ -718,30 +761,66 @@ send_vc(res_state statp,
}
return (0);
}
+#ifdef _STRING_ARCH_unaligned
+ resplen = ntohs (*(uint16_t *) ans);
+#else
resplen = ns_get16(ans);
- if (resplen > anssiz) {
+#endif
+
+ int *thisanssizp;
+ u_char **thisansp;
+ int *thisresplenp;
+ if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) {
+ thisanssizp = anssizp;
+ thisansp = anscp ?: ansp;
+ assert (anscp != NULL || ansp2 == NULL);
+ thisresplenp = &resplen;
+ } else {
+ if (*anssizp != MAXPACKET) {
+ /* No buffer allocated for the first
+ reply. We can try to use the rest
+ of the user-provided buffer. */
+ *anssizp2 = orig_anssizp - resplen;
+ *ansp2 = *ansp + resplen;
+ } else {
+ /* The first reply did not fit into the
+ user-provided buffer. Maybe the second
+ answer will. */
+ *anssizp2 = orig_anssizp;
+ *ansp2 = *ansp;
+ }
+
+ thisanssizp = anssizp2;
+ thisansp = ansp2;
+ thisresplenp = resplen2;
+ }
+ anhp = (HEADER *) *thisansp;
+
+ *thisresplenp = resplen;
+ if (resplen > *thisanssizp) {
+ /* Yes, we test ANSCP here. If we have two buffers
+ both will be allocatable. */
if (anscp) {
- ans = malloc (MAXPACKET);
- if (ans == NULL) {
+ u_char *newp = malloc (MAXPACKET);
+ if (newp == NULL) {
*terrno = ENOMEM;
__res_iclose(statp, false);
return (0);
}
- anssiz = MAXPACKET;
- *anssizp = MAXPACKET;
- *ansp = ans;
- *anscp = ans;
- anhp = (HEADER *) ans;
+ *thisanssizp = MAXPACKET;
+ *thisansp = newp;
+ anhp = (HEADER *) newp;
len = resplen;
} else {
Dprint(statp->options & RES_DEBUG,
(stdout, ";; response truncated\n")
);
truncating = 1;
- len = anssiz;
+ len = *thisanssizp;
}
} else
len = resplen;
+
if (len < HFIXEDSZ) {
/*
* Undersized message.
@@ -752,7 +831,8 @@ send_vc(res_state statp,
__res_iclose(statp, false);
return (0);
}
- cp = ans;
+
+ cp = *thisansp;
while (len != 0 && (n = read(statp->_vcsock, (char *)cp, (int)len)) > 0){
cp += n;
len -= n;
@@ -768,7 +848,7 @@ send_vc(res_state statp,
* Flush rest of answer so connection stays in synch.
*/
anhp->tc = 1;
- len = resplen - anssiz;
+ len = resplen - *thisanssizp;
while (len != 0) {
char junk[PACKETSZ];
@@ -787,14 +867,25 @@ send_vc(res_state statp,
* itself confused, then drop the packet and
* wait for the correct one.
*/
- if (hp->id != anhp->id) {
+ if ((recvresp1 || hp->id != anhp->id)
+ && (recvresp2 || hp2->id != anhp->id)) {
DprintQ((statp->options & RES_DEBUG) ||
(statp->pfcode & RES_PRF_REPLY),
(stdout, ";; old answer (unexpected):\n"),
- ans, (resplen > anssiz) ? anssiz: resplen);
+ *thisansp,
+ (resplen > *thisanssiz) ? *thisanssiz: resplen);
goto read_len;
}
+ /* Mark which reply we received. */
+ if (recvresp1 == 0 && hp->id == anhp->id)
+ recvresp1 = 1;
+ else
+ recvresp2 = 1;
+ /* Repeat waiting if we have a second answer to arrive. */
+ if ((recvresp1 & recvresp2) == 0)
+ goto read_len;
+
/*
* All is well, or the error is fatal. Signal that the
* next nameserver ought not be tried.
@@ -804,19 +895,20 @@ send_vc(res_state statp,
static int
send_dg(res_state statp,
- const u_char *buf, int buflen, u_char **ansp, int *anssizp,
- int *terrno, int ns, int *v_circuit, int *gotsomewhere, u_char **anscp)
+ const u_char *buf, int buflen, const u_char *buf2, int buflen2,
+ u_char **ansp, int *anssizp,
+ int *terrno, int ns, int *v_circuit, int *gotsomewhere, u_char **anscp,
+ u_char **ansp2, int *anssizp2, int *resplen2)
{
const HEADER *hp = (HEADER *) buf;
+ const HEADER *hp2 = (HEADER *) buf2;
u_char *ans = *ansp;
- int anssiz = *anssizp;
- HEADER *anhp = (HEADER *) ans;
+ int orig_anssizp = *anssizp;
struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
struct timespec now, timeout, finish;
struct pollfd pfd[1];
int ptimeout;
struct sockaddr_in6 from;
- socklen_t fromlen;
int resplen, seconds, n;
if (EXT(statp).nssocks[ns] == -1) {
@@ -879,6 +971,8 @@ send_dg(res_state statp,
evAddTime(&finish, &now, &timeout);
int need_recompute = 0;
int nwritten = 0;
+ int recvresp1 = 0;
+ int recvresp2 = buf2 == NULL;
pfd[0].fd = EXT(statp).nssocks[ns];
pfd[0].events = POLLOUT;
wait:
@@ -918,35 +1012,73 @@ send_dg(res_state statp,
}
__set_errno (0);
if (pfd[0].revents & POLLOUT) {
- if (send (pfd[0].fd, buf, buflen, MSG_NOSIGNAL) != buflen) {
+ ssize_t sr;
+ if (nwritten != 0)
+ sr = send (pfd[0].fd, buf2, buflen2, MSG_NOSIGNAL);
+ else
+ sr = send (pfd[0].fd, buf, buflen, MSG_NOSIGNAL);
+
+ if (sr != buflen) {
if (errno == EINTR || errno == EAGAIN)
goto recompute_resend;
Perror(statp, stderr, "send", errno);
goto err_out;
}
- pfd[0].events = POLLIN;
+ if (nwritten != 0 || buf2 == NULL)
+ pfd[0].events = POLLIN;
+ else
+ pfd[0].events = POLLIN | POLLOUT;
++nwritten;
goto wait;
} else if (pfd[0].revents & POLLIN) {
- fromlen = sizeof(struct sockaddr_in6);
- if (anssiz < MAXPACKET
+ int *thisanssizp;
+ u_char **thisansp;
+ int *thisresplenp;
+
+ if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) {
+ thisanssizp = anssizp;
+ thisansp = anscp ?: ansp;
+ assert (anscp != NULL || ansp2 == NULL);
+ thisresplenp = &resplen;
+ } else {
+ if (*anssizp != MAXPACKET) {
+ /* No buffer allocated for the first
+ reply. We can try to use the rest
+ of the user-provided buffer. */
+ *anssizp2 = orig_anssizp - resplen;
+ *ansp2 = *ansp + resplen;
+ } else {
+ /* The first reply did not fit into the
+ user-provided buffer. Maybe the second
+ answer will. */
+ *anssizp2 = orig_anssizp;
+ *ansp2 = *ansp;
+ }
+
+ thisanssizp = anssizp2;
+ thisansp = ansp2;
+ thisresplenp = resplen2;
+ }
+
+ if (*thisanssizp < MAXPACKET
+ /* Yes, we test ANSCP here. If we have two buffers
+ both will be allocatable. */
&& anscp
- && (ioctl (pfd[0].fd, FIONREAD, &resplen) < 0
- || anssiz < resplen)) {
- ans = malloc (MAXPACKET);
- if (ans == NULL)
- ans = *ansp;
- else {
- anssiz = MAXPACKET;
+ && (ioctl (pfd[0].fd, FIONREAD, thisresplenp) < 0
+ || *thisanssizp < *thisresplenp)) {
+ u_char *newp = malloc (MAXPACKET);
+ if (newp != NULL) {
*anssizp = MAXPACKET;
- *ansp = ans;
- *anscp = ans;
- anhp = (HEADER *) ans;
+ *thisansp = ans = newp;
}
}
- resplen = recvfrom(pfd[0].fd, (char*)ans, anssiz,0,
- (struct sockaddr *)&from, &fromlen);
- if (resplen <= 0) {
+ HEADER *anhp = (HEADER *) *thisansp;
+ socklen_t fromlen = sizeof(struct sockaddr_in6);
+ assert (sizeof(from) <= fromlen);
+ *thisresplenp = recvfrom(pfd[0].fd, (char*)*thisansp,
+ *thisanssizp, 0,
+ (struct sockaddr *)&from, &fromlen);
+ if (*thisresplenp <= 0) {
if (errno == EINTR || errno == EAGAIN) {
need_recompute = 1;
goto wait;
@@ -955,17 +1087,18 @@ send_dg(res_state statp,
goto err_out;
}
*gotsomewhere = 1;
- if (resplen < HFIXEDSZ) {
+ if (*thisresplenp < HFIXEDSZ) {
/*
* Undersized message.
*/
Dprint(statp->options & RES_DEBUG,
(stdout, ";; undersized: %d\n",
- resplen));
+ *thisresplen));
*terrno = EMSGSIZE;
goto err_out;
}
- if (hp->id != anhp->id) {
+ if ((recvresp1 || hp->id != anhp->id)
+ && (recvresp2 || hp2->id != anhp->id)) {
/*
* response from old query, ignore it.
* XXX - potential security hazard could
@@ -974,7 +1107,9 @@ send_dg(res_state statp,
DprintQ((statp->options & RES_DEBUG) ||
(statp->pfcode & RES_PRF_REPLY),
(stdout, ";; old answer:\n"),
- ans, (resplen > anssiz) ? anssiz : resplen);
+ thisansp,
+ (*thisresplen > *thisanssiz)
+ ? *thisanssiz : *thisresplen);
goto wait;
}
if (!(statp->options & RES_INSECURE1) &&
@@ -987,14 +1122,16 @@ send_dg(res_state statp,
DprintQ((statp->options & RES_DEBUG) ||
(statp->pfcode & RES_PRF_REPLY),
(stdout, ";; not our server:\n"),
- ans, (resplen > anssiz) ? anssiz : resplen);
+ thisansp,
+ (*thisresplen > *thisanssiz)
+ ? *thisanssiz : *thisresplen);
goto wait;
}
#ifdef RES_USE_EDNS0
if (anhp->rcode == FORMERR
&& (statp->options & RES_USE_EDNS0) != 0U) {
/*
- * Do not retry if the server do not understand
+ * Do not retry if the server does not understand
* EDNS0. The case has to be captured here, as
* FORMERR packet do not carry query section, hence
* res_queriesmatch() returns 0.
@@ -1002,15 +1139,23 @@ send_dg(res_state statp,
DprintQ(statp->options & RES_DEBUG,
(stdout,
"server rejected query with EDNS0:\n"),
- ans, (resplen > anssiz) ? anssiz : resplen);
+ thisans,
+ (*thisresplen > *thisanssiz)
+ ? *thisanssiz : *thisresplen);
/* record the error */
statp->_flags |= RES_F_EDNS0ERR;
goto err_out;
}
#endif
- if (!(statp->options & RES_INSECURE2) &&
- !res_queriesmatch(buf, buf + buflen,
- ans, ans + anssiz)) {
+ if (!(statp->options & RES_INSECURE2)
+ && (recvresp1 || !res_queriesmatch(buf, buf + buflen,
+ *thisansp,
+ *thisansp
+ + *thisanssizp))
+ && (recvresp2 || !res_queriesmatch(buf2, buf2 + buflen2,
+ *thisansp,
+ *thisansp
+ + *thisanssizp))) {
/*
* response contains wrong query? ignore it.
* XXX - potential security hazard could
@@ -1019,7 +1164,9 @@ send_dg(res_state statp,
DprintQ((statp->options & RES_DEBUG) ||
(statp->pfcode & RES_PRF_REPLY),
(stdout, ";; wrong query name:\n"),
- ans, (resplen > anssiz) ? anssiz : resplen);
+ thisansp,
+ (*thisresplen > *thisanssiz)
+ ? *thisanssiz : *thisresplen);
goto wait;
}
if (anhp->rcode == SERVFAIL ||
@@ -1027,7 +1174,9 @@ send_dg(res_state statp,
anhp->rcode == REFUSED) {
DprintQ(statp->options & RES_DEBUG,
(stdout, "server rejected query:\n"),
- ans, (resplen > anssiz) ? anssiz : resplen);
+ thisansp,
+ (*thisresplen > *thisanssiz)
+ ? *thisanssiz : *thisresplen);
next_ns:
__res_iclose(statp, false);
/* don't retry if called from dig */
@@ -1038,7 +1187,9 @@ send_dg(res_state statp,
&& anhp->aa == 0 && anhp->ra == 0 && anhp->arcount == 0) {
DprintQ(statp->options & RES_DEBUG,
(stdout, "referred query:\n"),
- ans, (resplen > anssiz) ? anssiz : resplen);
+ thisansp,
+ (*thisresplen > *thisanssiz)
+ ? *thisanssiz : *thisresplen);
goto next_ns;
}
if (!(statp->options & RES_IGNTC) && anhp->tc) {
@@ -1050,8 +1201,18 @@ send_dg(res_state statp,
(stdout, ";; truncated answer\n"));
*v_circuit = 1;
__res_iclose(statp, false);
+ // XXX if we have received one reply we could
+ // XXX use it and not repeat it over TCP...
return (1);
}
+ /* Mark which reply we received. */
+ if (recvresp1 == 0 && hp->id == anhp->id)
+ recvresp1 = 1;
+ else
+ recvresp2 = 1;
+ /* Repeat waiting if we have a second answer to arrive. */
+ if ((recvresp1 & recvresp2) == 0)
+ goto wait;
/*
* All is well, or the error is fatal. Signal that the
* next nameserver ought not be tried.
diff --git a/stdlib/tst-setcontext.c b/stdlib/tst-setcontext.c
index 28bf230264..beec23a686 100644
--- a/stdlib/tst-setcontext.c
+++ b/stdlib/tst-setcontext.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001,2002,2004,2006 Free Software Foundation, Inc.
+/* Copyright (C) 2001,2002,2004,2006,2007,2008 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
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <string.h>
#include <ucontext.h>
+#include <unistd.h>
static ucontext_t ctx[3];
diff --git a/string/Makefile b/string/Makefile
index d4ec22457d..a15ae14644 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-2002, 2005, 2006, 2007 Free Software Foundation, Inc.
+# Copyright (C) 1991-2002, 2005-2007, 2008 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
@@ -54,8 +54,9 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \
bug-strtok1 $(addprefix test-,$(strop-tests)) \
- bug-envz1 tst-strxfrm2
-distribute := memcopy.h pagecopy.h tst-svc.expect test-string.h
+ bug-envz1 tst-strxfrm2 tst-endian
+distribute := memcopy.h pagecopy.h tst-svc.expect test-string.h \
+ str-two-way.h
include ../Rules
diff --git a/string/endian.h b/string/endian.h
index 2f7bce100b..430fb3a5c4 100644
--- a/string/endian.h
+++ b/string/endian.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1996, 1997, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1996, 1997, 2000, 2008 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
@@ -55,4 +55,40 @@
# define __LONG_LONG_PAIR(HI, LO) HI, LO
#endif
+
+/* Conversion interfaces. */
+#include <bits/byteswap.h>
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define htobe16(x) __bswap_16 (x)
+# define htole16(x) (x)
+# define be16toh(x) __bswap_16 (x)
+# define le16toh(x) (x)
+
+# define htobe32(x) __bswap_32 (x)
+# define htole32(x) (x)
+# define be32toh(x) __bswap_32 (x)
+# define le32toh(x) (x)
+
+# define htobe64(x) __bswap_64 (x)
+# define htole64(x) (x)
+# define be64toh(x) __bswap_64 (x)
+# define le64toh(x) (x)
+#else
+# define htobe16(x) (x)
+# define htole16(x) __bswap_16 (x)
+# define be16toh(x) (x)
+# define le16toh(x) __bswap_16 (x)
+
+# define htobe32(x) (x)
+# define htole32(x) __bswap_32 (x)
+# define be32toh(x) (x)
+# define le32toh(x) __bswap_32 (x)
+
+# define htobe64(x) (x)
+# define htole64(x) __bswap_64 (x)
+# define be64toh(x) (x)
+# define le64toh(x) __bswap_64 (x)
+#endif
+
#endif /* endian.h */
diff --git a/string/memmem.c b/string/memmem.c
index c40462104a..3176ab7755 100644
--- a/string/memmem.c
+++ b/string/memmem.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,93,94,96,97,98,2000,2004 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,94,96,97,98,2000,2004,2008 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
@@ -16,26 +16,36 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <stddef.h>
+/* This particular implementation was written by Eric Blake, 2008. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Specification of memmem. */
#include <string.h>
#ifndef _LIBC
# define __builtin_expect(expr, val) (expr)
#endif
+#define RETURN_TYPE void *
+#define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l))
+#include "str-two-way.h"
+
#undef memmem
-/* Return the first occurrence of NEEDLE in HAYSTACK. */
+/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK
+ if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
+ HAYSTACK. */
void *
-memmem (haystack, haystack_len, needle, needle_len)
- const void *haystack;
- size_t haystack_len;
- const void *needle;
- size_t needle_len;
+memmem (const void *haystack_start, size_t haystack_len,
+ const void *needle_start, size_t needle_len)
{
- const char *begin;
- const char *const last_possible
- = (const char *) haystack + haystack_len - needle_len;
+ /* Abstract memory is considered to be an array of 'unsigned char' values,
+ not an array of 'char' values. See ISO C 99 section 6.2.6.1. */
+ const unsigned char *haystack = (const unsigned char *) haystack_start;
+ const unsigned char *needle = (const unsigned char *) needle_start;
if (needle_len == 0)
/* The first occurrence of the empty string is deemed to occur at
@@ -47,12 +57,22 @@ memmem (haystack, haystack_len, needle, needle_len)
if (__builtin_expect (haystack_len < needle_len, 0))
return NULL;
- for (begin = (const char *) haystack; begin <= last_possible; ++begin)
- if (begin[0] == ((const char *) needle)[0] &&
- !memcmp ((const void *) &begin[1],
- (const void *) ((const char *) needle + 1),
- needle_len - 1))
- return (void *) begin;
-
- return NULL;
+ /* Use optimizations in memchr when possible, to reduce the search
+ size of haystack using a linear algorithm with a smaller
+ coefficient. However, avoid memchr for long needles, since we
+ can often achieve sublinear performance. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ {
+ haystack = memchr (haystack, *needle, haystack_len);
+ if (!haystack || __builtin_expect (needle_len == 1, 0))
+ return (void *) haystack;
+ haystack_len -= haystack - (const unsigned char *) haystack_start;
+ if (haystack_len < needle_len)
+ return NULL;
+ return two_way_short_needle (haystack, haystack_len, needle, needle_len);
+ }
+ else
+ return two_way_long_needle (haystack, haystack_len, needle, needle_len);
}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/string/str-two-way.h b/string/str-two-way.h
new file mode 100644
index 0000000000..87ed8a0366
--- /dev/null
+++ b/string/str-two-way.h
@@ -0,0 +1,430 @@
+/* Byte-wise substring search, using the Two-Way algorithm.
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Eric Blake <ebb9@byu.net>, 2008.
+
+ 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. */
+
+/* Before including this file, you need to include <string.h> (and
+ <config.h> before that, if not part of libc), and define:
+ RESULT_TYPE A macro that expands to the return type.
+ AVAILABLE(h, h_l, j, n_l)
+ A macro that returns nonzero if there are
+ at least N_L bytes left starting at H[J].
+ H is 'unsigned char *', H_L, J, and N_L
+ are 'size_t'; H_L is an lvalue. For
+ NUL-terminated searches, H_L can be
+ modified each iteration to avoid having
+ to compute the end of H up front.
+
+ For case-insensitivity, you may optionally define:
+ CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L
+ characters of P1 and P2 are equal.
+ CANON_ELEMENT(c) A macro that canonicalizes an element right after
+ it has been fetched from one of the two strings.
+ The argument is an 'unsigned char'; the result
+ must be an 'unsigned char' as well.
+
+ This file undefines the macros documented above, and defines
+ LONG_NEEDLE_THRESHOLD.
+*/
+
+#include <limits.h>
+#include <stdint.h>
+
+/* We use the Two-Way string matching algorithm, which guarantees
+ linear complexity with constant space. Additionally, for long
+ needles, we also use a bad character shift table similar to the
+ Boyer-Moore algorithm to achieve improved (potentially sub-linear)
+ performance.
+
+ See http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260
+ and http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm
+*/
+
+/* Point at which computing a bad-byte shift table is likely to be
+ worthwhile. Small needles should not compute a table, since it
+ adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a
+ speedup no greater than a factor of NEEDLE_LEN. The larger the
+ needle, the better the potential performance gain. On the other
+ hand, on non-POSIX systems with CHAR_BIT larger than eight, the
+ memory required for the table is prohibitive. */
+#if CHAR_BIT < 10
+# define LONG_NEEDLE_THRESHOLD 32U
+#else
+# define LONG_NEEDLE_THRESHOLD SIZE_MAX
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a < b) ? (b) : (a))
+#endif
+
+#ifndef CANON_ELEMENT
+# define CANON_ELEMENT(c) c
+#endif
+#ifndef CMP_FUNC
+# define CMP_FUNC memcmp
+#endif
+
+/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN.
+ Return the index of the first byte in the right half, and set
+ *PERIOD to the global period of the right half.
+
+ The global period of a string is the smallest index (possibly its
+ length) at which all remaining bytes in the string are repetitions
+ of the prefix (the last repetition may be a subset of the prefix).
+
+ When NEEDLE is factored into two halves, a local period is the
+ length of the smallest word that shares a suffix with the left half
+ and shares a prefix with the right half. All factorizations of a
+ non-empty NEEDLE have a local period of at least 1 and no greater
+ than NEEDLE_LEN.
+
+ A critical factorization has the property that the local period
+ equals the global period. All strings have at least one critical
+ factorization with the left half smaller than the global period.
+
+ Given an ordered alphabet, a critical factorization can be computed
+ in linear time, with 2 * NEEDLE_LEN comparisons, by computing the
+ larger of two ordered maximal suffixes. The ordered maximal
+ suffixes are determined by lexicographic comparison of
+ periodicity. */
+static size_t
+critical_factorization (const unsigned char *needle, size_t needle_len,
+ size_t *period)
+{
+ /* Index of last byte of left half, or SIZE_MAX. */
+ size_t max_suffix, max_suffix_rev;
+ size_t j; /* Index into NEEDLE for current candidate suffix. */
+ size_t k; /* Offset into current period. */
+ size_t p; /* Intermediate period. */
+ unsigned char a, b; /* Current comparison bytes. */
+
+ /* Invariants:
+ 0 <= j < NEEDLE_LEN - 1
+ -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed)
+ min(max_suffix, max_suffix_rev) < global period of NEEDLE
+ 1 <= p <= global period of NEEDLE
+ p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j]
+ 1 <= k <= p
+ */
+
+ /* Perform lexicographic search. */
+ max_suffix = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix + k]);
+ if (a < b)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* b < a */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix = j++;
+ k = p = 1;
+ }
+ }
+ *period = p;
+
+ /* Perform reverse lexicographic search. */
+ max_suffix_rev = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix_rev + k]);
+ if (b < a)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix_rev;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* a < b */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix_rev = j++;
+ k = p = 1;
+ }
+ }
+
+ /* Choose the longer suffix. Return the first byte of the right
+ half, rather than the last byte of the left half. */
+ if (max_suffix_rev + 1 < max_suffix + 1)
+ return max_suffix + 1;
+ *period = p;
+ return max_suffix_rev + 1;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 2 * NEEDLE_LEN comparisons.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */
+static RETURN_TYPE
+two_way_short_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch can only advance by the
+ period, so use memory to avoid rescanning known occurrences
+ of the period. */
+ size_t memory = 0;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = MAX (suffix, memory);
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = suffix;
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching,
+ and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and
+ sublinear performance is not possible. */
+static RETURN_TYPE
+two_way_long_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+ size_t shift_table[1U << CHAR_BIT]; /* See below. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Populate shift_table. For each possible byte value c,
+ shift_table[c] is the distance from the last occurrence of c to
+ the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE.
+ shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */
+ for (i = 0; i < 1U << CHAR_BIT; i++)
+ shift_table[i] = needle_len;
+ for (i = 0; i < needle_len; i++)
+ shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1;
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch can only advance by the
+ period, so use memory to avoid rescanning known occurrences
+ of the period. */
+ size_t memory = 0;
+ size_t shift;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ if (memory && shift < period)
+ {
+ /* Since needle is periodic, but the last period has
+ a byte out of place, there can be no match until
+ after the mismatch. */
+ shift = needle_len - period;
+ memory = 0;
+ }
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = MAX (suffix, memory);
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ size_t shift;
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = suffix;
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+#undef AVAILABLE
+#undef CANON_ELEMENT
+#undef CMP_FUNC
+#undef MAX
+#undef RETURN_TYPE
diff --git a/string/strcasestr.c b/string/strcasestr.c
index 1dde43c606..9de19aafa8 100644
--- a/string/strcasestr.c
+++ b/string/strcasestr.c
@@ -1,5 +1,5 @@
/* Return the offset of one string within another.
- Copyright (C) 1994, 1996-2000, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1994, 1996-2000, 2004, 2008 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
@@ -30,113 +30,71 @@
# include <config.h>
#endif
+/* Specification. */
+#include <string.h>
+
#include <ctype.h>
+#include <stdbool.h>
+#include <strings.h>
-#if defined _LIBC || defined HAVE_STRING_H
-# include <string.h>
-#endif
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
-#ifdef _LIBC
-# include <locale/localeinfo.h>
-# define TOLOWER(c) __tolower_l ((unsigned char) c, loc)
-#else
-# define TOLOWER(c) _tolower (c)
-#endif
-
-typedef unsigned chartype;
+/* Two-Way algorithm. */
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#define CANON_ELEMENT(c) TOLOWER (c)
+#define CMP_FUNC(p1, p2, l) \
+ strncasecmp ((const char *) (p1), (const char *) (p2), l)
+#include "str-two-way.h"
#undef strcasestr
#undef __strcasestr
+/* Find the first occurrence of NEEDLE in HAYSTACK, using
+ case-insensitive comparison. This function gives unspecified
+ results in multibyte locales. */
char *
-__strcasestr (phaystack, pneedle)
- const char *phaystack;
- const char *pneedle;
+__strcasestr (const char *haystack_start, const char *needle_start)
{
- register const unsigned char *haystack, *needle;
- register chartype b, c;
-#ifdef _LIBC
- __locale_t loc = _NL_CURRENT_LOCALE;
-#endif
-
- haystack = (const unsigned char *) phaystack;
- needle = (const unsigned char *) pneedle;
-
- b = TOLOWER (*needle);
- if (b != '\0')
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
{
- haystack--; /* possible ANSI violation */
- do
- {
- c = *++haystack;
- if (c == '\0')
- goto ret0;
- }
- while (TOLOWER (c) != (int) b);
-
- c = TOLOWER (*++needle);
- if (c == '\0')
- goto foundneedle;
- ++needle;
- goto jin;
-
- for (;;)
- {
- register chartype a;
- register const unsigned char *rhaystack, *rneedle;
-
- do
- {
- a = *++haystack;
- if (a == '\0')
- goto ret0;
- if (TOLOWER (a) == (int) b)
- break;
- a = *++haystack;
- if (a == '\0')
- goto ret0;
-shloop:
- ;
- }
- while (TOLOWER (a) != (int) b);
-
-jin: a = *++haystack;
- if (a == '\0')
- goto ret0;
-
- if (TOLOWER (a) != (int) c)
- goto shloop;
-
- rhaystack = haystack-- + 1;
- rneedle = needle;
- a = TOLOWER (*rneedle);
-
- if (TOLOWER (*rhaystack) == (int) a)
- do
- {
- if (a == '\0')
- goto foundneedle;
- ++rhaystack;
- a = TOLOWER (*++needle);
- if (TOLOWER (*rhaystack) != (int) a)
- break;
- if (a == '\0')
- goto foundneedle;
- ++rhaystack;
- a = TOLOWER (*++needle);
- }
- while (TOLOWER (*rhaystack) == (int) a);
-
- needle = rneedle; /* took the register-poor approach */
-
- if (a == '\0')
- break;
- }
+ ok &= (TOLOWER ((unsigned char) *haystack)
+ == TOLOWER ((unsigned char) *needle));
+ haystack++;
+ needle++;
}
-foundneedle:
- return (char*) haystack;
-ret0:
- return 0;
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+ needle_len = needle - needle_start;
+ haystack = haystack_start + 1;
+ haystack_len = needle_len - 1;
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
}
+#undef LONG_NEEDLE_THRESHOLD
+
weak_alias (__strcasestr, strcasestr)
diff --git a/string/strstr.c b/string/strstr.c
index fce1f2a756..a9dc312992 100644
--- a/string/strstr.c
+++ b/string/strstr.c
@@ -1,5 +1,5 @@
/* Return the offset of one string within another.
- Copyright (C) 1994,1996,1997,2000,2001,2003 Free Software Foundation, Inc.
+ Copyright (C) 1994,1996,1997,2000,2001,2003,2008 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
@@ -17,107 +17,71 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-/*
- * My personal strstr() implementation that beats most other algorithms.
- * Until someone tells me otherwise, I assume that this is the
- * fastest implementation of strstr() in C.
- * I deliberately chose not to comment it. You should have at least
- * as much fun trying to understand it, as I had to write it :-).
- *
- * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
+/* This particular implementation was written by Eric Blake, 2008. */
-#if HAVE_CONFIG_H
+#ifndef _LIBC
# include <config.h>
#endif
-#if defined _LIBC || defined HAVE_STRING_H
-# include <string.h>
+/* Specification of strstr. */
+#include <string.h>
+
+#include <stdbool.h>
+
+#ifndef _LIBC
+# define __builtin_expect(expr, val) (expr)
#endif
-typedef unsigned chartype;
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#include "str-two-way.h"
#undef strstr
+/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK
+ if NEEDLE is empty, otherwise NULL if NEEDLE is not found in
+ HAYSTACK. */
char *
-strstr (phaystack, pneedle)
- const char *phaystack;
- const char *pneedle;
+strstr (const char *haystack_start, const char *needle_start)
{
- const unsigned char *haystack, *needle;
- chartype b;
- const unsigned char *rneedle;
-
- haystack = (const unsigned char *) phaystack;
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
- if ((b = *(needle = (const unsigned char *) pneedle)))
- {
- chartype c;
- haystack--; /* possible ANSI violation */
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ ok &= *haystack++ == *needle++;
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
- {
- chartype a;
- do
- if (!(a = *++haystack))
- goto ret0;
- while (a != b);
- }
+ /* Reduce the size of haystack using strchr, since it has a smaller
+ linear coefficient than the Two-Way algorithm. */
+ needle_len = needle - needle_start;
+ haystack = strchr (haystack_start + 1, *needle_start);
+ if (!haystack || __builtin_expect (needle_len == 1, 0))
+ return (char *) haystack;
+ needle -= needle_len;
+ haystack_len = (haystack > haystack_start + needle_len ? 1
+ : needle_len + haystack_start - haystack);
- if (!(c = *++needle))
- goto foundneedle;
- ++needle;
- goto jin;
-
- for (;;)
- {
- {
- chartype a;
- if (0)
- jin:{
- if ((a = *++haystack) == c)
- goto crest;
- }
- else
- a = *++haystack;
- do
- {
- for (; a != b; a = *++haystack)
- {
- if (!a)
- goto ret0;
- if ((a = *++haystack) == b)
- break;
- if (!a)
- goto ret0;
- }
- }
- while ((a = *++haystack) != c);
- }
- crest:
- {
- chartype a;
- {
- const unsigned char *rhaystack;
- if (*(rhaystack = haystack-- + 1) == (a = *(rneedle = needle)))
- do
- {
- if (!a)
- goto foundneedle;
- if (*++rhaystack != (a = *++needle))
- break;
- if (!a)
- goto foundneedle;
- }
- while (*++rhaystack == (a = *++needle));
- needle = rneedle; /* took the register-poor aproach */
- }
- if (!a)
- break;
- }
- }
- }
-foundneedle:
- return (char *) haystack;
-ret0:
- return 0;
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle, needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle, needle_len);
}
libc_hidden_builtin_def (strstr)
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/string/tester.c b/string/tester.c
index 1c0efe07d4..773e969a35 100644
--- a/string/tester.c
+++ b/string/tester.c
@@ -985,15 +985,33 @@ test_strsep (void)
static void
test_memcmp (void)
{
+ int cnt = 1;
+ char one[21];
+ char two[21];
+
it = "memcmp";
- check(memcmp("a", "a", 1) == 0, 1); /* Identity. */
- check(memcmp("abc", "abc", 3) == 0, 2); /* Multicharacter. */
- check(memcmp("abcd", "abce", 4) < 0, 3); /* Honestly unequal. */
- check(memcmp("abce", "abcd", 4) > 0, 4);
- check(memcmp("alph", "beta", 4) < 0, 5);
- check(memcmp("a\203", "a\003", 2) > 0, 6);
- check(memcmp("abce", "abcd", 3) == 0, 7); /* Count limited. */
- check(memcmp("abc", "def", 0) == 0, 8); /* Zero count. */
+ check(memcmp("a", "a", 1) == 0, cnt++); /* Identity. */
+ check(memcmp("abc", "abc", 3) == 0, cnt++); /* Multicharacter. */
+ check(memcmp("abcd", "abcf", 4) < 0, cnt++); /* Honestly unequal. */
+ check(memcmp("abcf", "abcd", 4) > 0, cnt++);
+ check(memcmp("alph", "cold", 4) < 0, cnt++);
+ check(memcmp("a\203", "a\003", 2) > 0, cnt++);
+ check(memcmp("a\003", "a\203", 2) < 0, cnt++);
+ check(memcmp("a\003bc", "a\203bc", 2) < 0, cnt++);
+ check(memcmp("abc\203", "abc\003", 4) > 0, cnt++);
+ check(memcmp("abc\003", "abc\203", 4) < 0, cnt++);
+ check(memcmp("abcf", "abcd", 3) == 0, cnt++); /* Count limited. */
+ check(memcmp("abc", "def", 0) == 0, cnt++); /* Zero count. */
+ /* Comparisons with shifting 4-byte boundaries. */
+ for (int i = 0; i < 4; ++i)
+ {
+ char *a = one + i;
+ char *b = two + i;
+ strncpy(a, "--------11112222", 16);
+ strncpy(b, "--------33334444", 16);
+ check(memcmp(b, a, 16) > 0, cnt++);
+ check(memcmp(a, b, 16) < 0, cnt++);
+ }
}
static void
diff --git a/string/tst-endian.c b/string/tst-endian.c
new file mode 100644
index 0000000000..c34dc456a7
--- /dev/null
+++ b/string/tst-endian.c
@@ -0,0 +1,112 @@
+#include <byteswap.h>
+#include <endian.h>
+#include <inttypes.h>
+#include <stdio.h>
+
+
+static int
+do_test (void)
+{
+ int result = 0;
+
+ for (uint64_t i = 0; i < (~UINT64_C (0)) >> 2; i = (i << 1) + 3)
+ {
+ if (i < UINT64_C (65536))
+ {
+ if (htobe16 (be16toh (i)) != i)
+ {
+ printf ("htobe16 (be16toh (%" PRIx64 ")) == %" PRIx16 "\n",
+ i, (uint16_t) htobe16 (be16toh (i)));
+ result = 1;
+ }
+ if (htole16 (le16toh (i)) != i)
+ {
+ printf ("htole16 (le16toh (%" PRIx64 ")) == %" PRIx16 "\n",
+ i, (uint16_t) htole16 (le16toh (i)));
+ result = 1;
+ }
+
+ uint16_t n[2];
+ n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_16 (i);
+ n[__BYTE_ORDER == __BIG_ENDIAN] = i;
+ if (htole16 (i) != n[0])
+ {
+ printf ("htole16 (%" PRIx64 ") == %" PRIx16 " != %" PRIx16 "\n",
+ i, (uint16_t) htole16 (i), n[0]);
+ result = 1;
+ }
+ if (htobe16 (i) != n[1])
+ {
+ printf ("htobe16 (%" PRIx64 ") == %" PRIx16 " != %" PRIx16 "\n",
+ i, (uint16_t) htobe16 (i), n[1]);
+ result = 1;
+ }
+ }
+
+ if (i < UINT64_C (4294967296))
+ {
+ if (htobe32 (be32toh (i)) != i)
+ {
+ printf ("htobe32 (be32toh (%" PRIx64 ")) == %" PRIx32 "\n",
+ i, (uint32_t) htobe32 (be32toh (i)));
+ result = 1;
+ }
+ if (htole32 (le32toh (i)) != i)
+ {
+ printf ("htole32 (le32toh (%" PRIx64 ")) == %" PRIx32 "\n",
+ i, (uint32_t) htole32 (le32toh (i)));
+ result = 1;
+ }
+
+ uint32_t n[2];
+ n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_32 (i);
+ n[__BYTE_ORDER == __BIG_ENDIAN] = i;
+ if (htole32 (i) != n[0])
+ {
+ printf ("htole32 (%" PRIx64 ") == %" PRIx32 " != %" PRIx32 "\n",
+ i, (uint32_t) htole32 (i), n[0]);
+ result = 1;
+ }
+ if (htobe32 (i) != n[1])
+ {
+ printf ("htobe32 (%" PRIx64 ") == %" PRIx32 " != %" PRIx32 "\n",
+ i, (uint32_t) htobe32 (i), n[1]);
+ result = 1;
+ }
+ }
+
+ if (htobe64 (be64toh (i)) != i)
+ {
+ printf ("htobe64 (be64toh (%" PRIx64 ")) == %" PRIx64 "\n",
+ i, htobe64 (be64toh (i)));
+ result = 1;
+ }
+ if (htole64 (le64toh (i)) != i)
+ {
+ printf ("htole64 (le64toh (%" PRIx64 ")) == %" PRIx64 "\n",
+ i, htole64 (le64toh (i)));
+ result = 1;
+ }
+
+ uint64_t n[2];
+ n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_64 (i);
+ n[__BYTE_ORDER == __BIG_ENDIAN] = i;
+ if (htole64 (i) != n[0])
+ {
+ printf ("htole64 (%" PRIx64 ") == %" PRIx64 " != %" PRIx64 "\n",
+ i, htole64 (i), n[0]);
+ result = 1;
+ }
+ if (htobe64 (i) != n[1])
+ {
+ printf ("htobe64 (%" PRIx64 ") == %" PRIx64 " != %" PRIx64 "\n",
+ i, htobe64 (i), n[1]);
+ result = 1;
+ }
+ }
+
+ return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile
index e192b91dbd..5f0d9bea21 100644
--- a/sysdeps/i386/Makefile
+++ b/sysdeps/i386/Makefile
@@ -73,3 +73,13 @@ CFLAGS-.o += -mno-tls-direct-seg-refs
CPPFLAGS-.oS += -DNO_TLS_DIRECT_SEG_REFS
CFLAGS-.oS += -mno-tls-direct-seg-refs
endif
+
+ifeq ($(subdir),elf)
+sysdep-dl-routines += tlsdesc dl-tlsdesc
+sysdep_routines += tlsdesc dl-tlsdesc
+sysdep-rtld-routines += tlsdesc dl-tlsdesc
+endif
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tlsdesc.sym
+endif
diff --git a/sysdeps/i386/bits/byteswap.h b/sysdeps/i386/bits/byteswap.h
index 7f2ddc2dc5..1f3fc5e524 100644
--- a/sysdeps/i386/bits/byteswap.h
+++ b/sysdeps/i386/bits/byteswap.h
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007
+ Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -18,7 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
#endif
diff --git a/sysdeps/i386/bits/linkmap.h b/sysdeps/i386/bits/linkmap.h
index 3be9b7eae8..978d52621e 100644
--- a/sysdeps/i386/bits/linkmap.h
+++ b/sysdeps/i386/bits/linkmap.h
@@ -2,4 +2,5 @@ struct link_map_machine
{
Elf32_Addr plt; /* Address of .plt + 0x16 */
Elf32_Addr gotplt; /* Address of .got + 0x0c */
+ void *tlsdesc_table; /* Address of TLS descriptor hash table. */
};
diff --git a/sysdeps/i386/dl-lookupcfg.h b/sysdeps/i386/dl-lookupcfg.h
new file mode 100644
index 0000000000..2af2b9e8fa
--- /dev/null
+++ b/sysdeps/i386/dl-lookupcfg.h
@@ -0,0 +1,28 @@
+/* Configuration of lookup functions.
+ Copyright (C) 2005, 2008 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
+ 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. */
+
+#define DL_UNMAP_IS_SPECIAL
+
+#include_next <dl-lookupcfg.h>
+
+struct link_map;
+
+extern void internal_function _dl_unmap (struct link_map *map);
+
+#define DL_UNMAP(map) _dl_unmap (map)
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index 04296d2a9a..e3342d8e12 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -25,6 +25,7 @@
#include <sys/param.h>
#include <sysdep.h>
#include <tls.h>
+#include <dl-tlsdesc.h>
/* Return nonzero iff ELF header is compatible with the running host. */
static inline int __attribute__ ((unused))
@@ -246,7 +247,7 @@ _dl_start_user:\n\
# define elf_machine_type_class(type) \
((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \
|| (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32 \
- || (type) == R_386_TLS_TPOFF) \
+ || (type) == R_386_TLS_TPOFF || (type) == R_386_TLS_DESC) \
* ELF_RTYPE_CLASS_PLT) \
| (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY))
#else
@@ -373,6 +374,38 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
*reloc_addr = sym->st_value;
# endif
break;
+ case R_386_TLS_DESC:
+ {
+ struct tlsdesc volatile *td =
+ (struct tlsdesc volatile *)reloc_addr;
+
+# ifndef RTLD_BOOTSTRAP
+ if (! sym)
+ td->entry = _dl_tlsdesc_undefweak;
+ else
+# endif
+ {
+# ifndef RTLD_BOOTSTRAP
+# ifndef SHARED
+ CHECK_STATIC_TLS (map, sym_map);
+# else
+ if (!TRY_STATIC_TLS (map, sym_map))
+ {
+ td->arg = _dl_make_tlsdesc_dynamic
+ (sym_map, sym->st_value + (ElfW(Word))td->arg);
+ td->entry = _dl_tlsdesc_dynamic;
+ }
+ else
+# endif
+# endif
+ {
+ td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
+ + (ElfW(Word))td->arg);
+ td->entry = _dl_tlsdesc_return;
+ }
+ }
+ break;
+ }
case R_386_TLS_TPOFF32:
/* The offset is positive, backward from the thread pointer. */
# ifdef RTLD_BOOTSTRAP
@@ -485,6 +518,41 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
Therefore the offset is already correct. */
*reloc_addr = (sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
break;
+ case R_386_TLS_DESC:
+ {
+ struct tlsdesc volatile *td =
+ (struct tlsdesc volatile *)reloc_addr;
+
+# ifndef RTLD_BOOTSTRAP
+ if (!sym)
+ {
+ td->arg = (void*)reloc->r_addend;
+ td->entry = _dl_tlsdesc_undefweak;
+ }
+ else
+# endif
+ {
+# ifndef RTLD_BOOTSTRAP
+# ifndef SHARED
+ CHECK_STATIC_TLS (map, sym_map);
+# else
+ if (!TRY_STATIC_TLS (map, sym_map))
+ {
+ td->arg = _dl_make_tlsdesc_dynamic
+ (sym_map, sym->st_value + reloc->r_addend);
+ td->entry = _dl_tlsdesc_dynamic;
+ }
+ else
+# endif
+# endif
+ {
+ td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
+ + reloc->r_addend);
+ td->entry = _dl_tlsdesc_return;
+ }
+ }
+ }
+ break;
case R_386_TLS_TPOFF32:
/* The offset is positive, backward from the thread pointer. */
/* We know the offset of object the symbol is contained in.
@@ -578,6 +646,53 @@ elf_machine_lazy_rel (struct link_map *map,
*reloc_addr = (map->l_mach.plt
+ (((Elf32_Addr) reloc_addr) - map->l_mach.gotplt) * 4);
}
+ else if (__builtin_expect (r_type == R_386_TLS_DESC, 1))
+ {
+ struct tlsdesc volatile * __attribute__((__unused__)) td =
+ (struct tlsdesc volatile *)reloc_addr;
+
+ /* Handle relocations that reference the local *ABS* in a simple
+ way, so as to preserve a potential addend. */
+ if (ELF32_R_SYM (reloc->r_info) == 0)
+ td->entry = _dl_tlsdesc_resolve_abs_plus_addend;
+ /* Given a known-zero addend, we can store a pointer to the
+ reloc in the arg position. */
+ else if (td->arg == 0)
+ {
+ td->arg = (void*)reloc;
+ td->entry = _dl_tlsdesc_resolve_rel;
+ }
+ else
+ {
+ /* We could handle non-*ABS* relocations with non-zero addends
+ by allocating dynamically an arg to hold a pointer to the
+ reloc, but that sounds pointless. */
+ const Elf32_Rel *const r = reloc;
+ /* The code below was borrowed from elf_dynamic_do_rel(). */
+ const ElfW(Sym) *const symtab =
+ (const void *) D_PTR (map, l_info[DT_SYMTAB]);
+
+#ifdef RTLD_BOOTSTRAP
+ /* The dynamic linker always uses versioning. */
+ assert (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL);
+#else
+ if (map->l_info[VERSYMIDX (DT_VERSYM)])
+#endif
+ {
+ const ElfW(Half) *const version =
+ (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
+ ElfW(Half) ndx = version[ELFW(R_SYM) (r->r_info)] & 0x7fff;
+ elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)],
+ &map->l_versions[ndx],
+ (void *) (l_addr + r->r_offset));
+ }
+#ifndef RTLD_BOOTSTRAP
+ else
+ elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
+ (void *) (l_addr + r->r_offset));
+#endif
+ }
+ }
else
_dl_reloc_bad_type (map, r_type, 1);
}
@@ -589,6 +704,20 @@ __attribute__ ((always_inline))
elf_machine_lazy_rela (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rela *reloc)
{
+ Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+ const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+ if (__builtin_expect (r_type == R_386_JMP_SLOT, 1))
+ ;
+ else if (__builtin_expect (r_type == R_386_TLS_DESC, 1))
+ {
+ struct tlsdesc volatile * __attribute__((__unused__)) td =
+ (struct tlsdesc volatile *)reloc_addr;
+
+ td->arg = (void*)reloc;
+ td->entry = _dl_tlsdesc_resolve_rela;
+ }
+ else
+ _dl_reloc_bad_type (map, r_type, 1);
}
#endif /* !RTLD_BOOTSTRAP */
diff --git a/sysdeps/i386/dl-tls.h b/sysdeps/i386/dl-tls.h
index a1707197ce..58705c778d 100644
--- a/sysdeps/i386/dl-tls.h
+++ b/sysdeps/i386/dl-tls.h
@@ -19,7 +19,7 @@
/* Type used for the representation of TLS information in the GOT. */
-typedef struct
+typedef struct dl_tls_index
{
unsigned long int ti_module;
unsigned long int ti_offset;
diff --git a/sysdeps/i386/dl-tlsdesc.S b/sysdeps/i386/dl-tlsdesc.S
new file mode 100644
index 0000000000..db5005d9f4
--- /dev/null
+++ b/sysdeps/i386/dl-tlsdesc.S
@@ -0,0 +1,290 @@
+/* Thread-local storage handling in the ELF dynamic linker. i386 version.
+ Copyright (C) 2004, 2005, 2008 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
+ 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 <sysdep.h>
+#include <tls.h>
+#include "tlsdesc.h"
+
+ .text
+
+ /* This function is used to compute the TP offset for symbols in
+ Static TLS, i.e., whose TP offset is the same for all
+ threads.
+
+ The incoming %eax points to the TLS descriptor, such that
+ 0(%eax) points to _dl_tlsdesc_return itself, and 4(%eax) holds
+ the TP offset of the symbol corresponding to the object
+ denoted by the argument. */
+
+ .hidden _dl_tlsdesc_return
+ .global _dl_tlsdesc_return
+ .type _dl_tlsdesc_return,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_return:
+ movl 4(%eax), %eax
+ ret
+ cfi_endproc
+ .size _dl_tlsdesc_return, .-_dl_tlsdesc_return
+
+ /* This function is used for undefined weak TLS symbols, for
+ which the base address (i.e., disregarding any addend) should
+ resolve to NULL.
+
+ %eax points to the TLS descriptor, such that 0(%eax) points to
+ _dl_tlsdesc_undefweak itself, and 4(%eax) holds the addend.
+ We return the addend minus the TP, such that, when the caller
+ adds TP, it gets the addend back. If that's zero, as usual,
+ that's most likely a NULL pointer. */
+
+ .hidden _dl_tlsdesc_undefweak
+ .global _dl_tlsdesc_undefweak
+ .type _dl_tlsdesc_undefweak,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_undefweak:
+ movl 4(%eax), %eax
+ subl %gs:0, %eax
+ ret
+ cfi_endproc
+ .size _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak
+
+#ifdef SHARED
+ .hidden _dl_tlsdesc_dynamic
+ .global _dl_tlsdesc_dynamic
+ .type _dl_tlsdesc_dynamic,@function
+
+ /* This function is used for symbols that need dynamic TLS.
+
+ %eax points to the TLS descriptor, such that 0(%eax) points to
+ _dl_tlsdesc_dynamic itself, and 4(%eax) points to a struct
+ tlsdesc_dynamic_arg object. It must return in %eax the offset
+ between the thread pointer and the object denoted by the
+ argument, without clobbering any registers.
+
+ The assembly code that follows is a rendition of the following
+ C code, hand-optimized a little bit.
+
+ptrdiff_t
+__attribute__ ((__regparm__ (1)))
+_dl_tlsdesc_dynamic (struct tlsdesc *tdp)
+{
+ struct tlsdesc_dynamic_arg *td = tdp->arg;
+ dtv_t *dtv = *(dtv_t **)((char *)__thread_pointer + DTV_OFFSET);
+ if (__builtin_expect (td->gen_count <= dtv[0].counter
+ && (dtv[td->tlsinfo.ti_module].pointer.val
+ != TLS_DTV_UNALLOCATED),
+ 1))
+ return dtv[td->tlsinfo.ti_module].pointer.val + td->tlsinfo.ti_offset
+ - __thread_pointer;
+
+ return ___tls_get_addr (&td->tlsinfo) - __thread_pointer;
+}
+*/
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_dynamic:
+ /* Like all TLS resolvers, preserve call-clobbered registers.
+ We need two scratch regs anyway. */
+ subl $28, %esp
+ cfi_adjust_cfa_offset (28)
+ movl %ecx, 20(%esp)
+ movl %edx, 24(%esp)
+ movl TLSDESC_ARG(%eax), %eax
+ movl %gs:DTV_OFFSET, %edx
+ movl TLSDESC_GEN_COUNT(%eax), %ecx
+ cmpl (%edx), %ecx
+ ja .Lslow
+ movl TLSDESC_MODID(%eax), %ecx
+ movl (%edx,%ecx,8), %edx
+ cmpl $-1, %edx
+ je .Lslow
+ movl TLSDESC_MODOFF(%eax), %eax
+ addl %edx, %eax
+.Lret:
+ movl 20(%esp), %ecx
+ subl %gs:0, %eax
+ movl 24(%esp), %edx
+ addl $28, %esp
+ cfi_adjust_cfa_offset (-28)
+ ret
+ .p2align 4,,7
+.Lslow:
+ cfi_adjust_cfa_offset (28)
+ movl %ebx, 16(%esp)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+ call ___tls_get_addr@PLT
+ movl 16(%esp), %ebx
+ jmp .Lret
+ cfi_endproc
+ .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
+#endif /* SHARED */
+
+ /* This function is a wrapper for a lazy resolver for TLS_DESC
+ REL relocations that reference the *ABS* segment in their own
+ link maps. %ebx points to the caller's GOT. %eax points to a
+ TLS descriptor, such that 0(%eax) holds the address of the
+ resolver wrapper itself (unless some other thread beat us to
+ it) and 4(%eax) holds the addend in the relocation.
+
+ When the actual resolver returns, it will have adjusted the
+ TLS descriptor such that we can tail-call it for it to return
+ the TP offset of the symbol. */
+
+ .hidden _dl_tlsdesc_resolve_abs_plus_addend
+ .global _dl_tlsdesc_resolve_abs_plus_addend
+ .type _dl_tlsdesc_resolve_abs_plus_addend,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_resolve_abs_plus_addend:
+0:
+ pushl %eax
+ cfi_adjust_cfa_offset (4)
+ pushl %ecx
+ cfi_adjust_cfa_offset (4)
+ pushl %edx
+ cfi_adjust_cfa_offset (4)
+ movl $1f - 0b, %ecx
+ movl 4(%ebx), %edx
+ call _dl_tlsdesc_resolve_abs_plus_addend_fixup
+1:
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ popl %ecx
+ cfi_adjust_cfa_offset (-4)
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ jmp *(%eax)
+ cfi_endproc
+ .size _dl_tlsdesc_resolve_abs_plus_addend, .-_dl_tlsdesc_resolve_abs_plus_addend
+
+ /* This function is a wrapper for a lazy resolver for TLS_DESC
+ REL relocations that had zero addends. %ebx points to the
+ caller's GOT. %eax points to a TLS descriptor, such that
+ 0(%eax) holds the address of the resolver wrapper itself
+ (unless some other thread beat us to it) and 4(%eax) holds a
+ pointer to the relocation.
+
+ When the actual resolver returns, it will have adjusted the
+ TLS descriptor such that we can tail-call it for it to return
+ the TP offset of the symbol. */
+
+ .hidden _dl_tlsdesc_resolve_rel
+ .global _dl_tlsdesc_resolve_rel
+ .type _dl_tlsdesc_resolve_rel,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_resolve_rel:
+0:
+ pushl %eax
+ cfi_adjust_cfa_offset (4)
+ pushl %ecx
+ cfi_adjust_cfa_offset (4)
+ pushl %edx
+ cfi_adjust_cfa_offset (4)
+ movl $1f - 0b, %ecx
+ movl 4(%ebx), %edx
+ call _dl_tlsdesc_resolve_rel_fixup
+1:
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ popl %ecx
+ cfi_adjust_cfa_offset (-4)
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ jmp *(%eax)
+ cfi_endproc
+ .size _dl_tlsdesc_resolve_rel, .-_dl_tlsdesc_resolve_rel
+
+ /* This function is a wrapper for a lazy resolver for TLS_DESC
+ RELA relocations. %ebx points to the caller's GOT. %eax
+ points to a TLS descriptor, such that 0(%eax) holds the
+ address of the resolver wrapper itself (unless some other
+ thread beat us to it) and 4(%eax) holds a pointer to the
+ relocation.
+
+ When the actual resolver returns, it will have adjusted the
+ TLS descriptor such that we can tail-call it for it to return
+ the TP offset of the symbol. */
+
+ .hidden _dl_tlsdesc_resolve_rela
+ .global _dl_tlsdesc_resolve_rela
+ .type _dl_tlsdesc_resolve_rela,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_resolve_rela:
+0:
+ pushl %eax
+ cfi_adjust_cfa_offset (4)
+ pushl %ecx
+ cfi_adjust_cfa_offset (4)
+ pushl %edx
+ cfi_adjust_cfa_offset (4)
+ movl $1f - 0b, %ecx
+ movl 4(%ebx), %edx
+ call _dl_tlsdesc_resolve_rela_fixup
+1:
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ popl %ecx
+ cfi_adjust_cfa_offset (-4)
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ jmp *(%eax)
+ cfi_endproc
+ .size _dl_tlsdesc_resolve_rela, .-_dl_tlsdesc_resolve_rela
+
+ /* This function is a placeholder for lazy resolving of TLS
+ relocations. Once some thread starts resolving a TLS
+ relocation, it sets up the TLS descriptor to use this
+ resolver, such that other threads that would attempt to
+ resolve it concurrently may skip the call to the original lazy
+ resolver and go straight to a condition wait.
+
+ When the actual resolver returns, it will have adjusted the
+ TLS descriptor such that we can tail-call it for it to return
+ the TP offset of the symbol. */
+
+ .hidden _dl_tlsdesc_resolve_hold
+ .global _dl_tlsdesc_resolve_hold
+ .type _dl_tlsdesc_resolve_hold,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_resolve_hold:
+0:
+ pushl %eax
+ cfi_adjust_cfa_offset (4)
+ pushl %ecx
+ cfi_adjust_cfa_offset (4)
+ pushl %edx
+ cfi_adjust_cfa_offset (4)
+ movl $1f - 0b, %ecx
+ movl 4(%ebx), %edx
+ call _dl_tlsdesc_resolve_hold_fixup
+1:
+ popl %edx
+ cfi_adjust_cfa_offset (-4)
+ popl %ecx
+ cfi_adjust_cfa_offset (-4)
+ popl %eax
+ cfi_adjust_cfa_offset (-4)
+ jmp *(%eax)
+ cfi_endproc
+ .size _dl_tlsdesc_resolve_hold, .-_dl_tlsdesc_resolve_hold
diff --git a/sysdeps/i386/dl-tlsdesc.h b/sysdeps/i386/dl-tlsdesc.h
new file mode 100644
index 0000000000..df4a646fe9
--- /dev/null
+++ b/sysdeps/i386/dl-tlsdesc.h
@@ -0,0 +1,61 @@
+/* Thread-local storage descriptor handling in the ELF dynamic linker.
+ i386 version.
+ Copyright (C) 2005, 2008 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
+ 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. */
+
+#ifndef _I386_DL_TLSDESC_H
+# define _I386_DL_TLSDESC_H 1
+
+/* Type used to represent a TLS descriptor in the GOT. */
+struct tlsdesc
+{
+ ptrdiff_t __attribute__ ((regparm (1))) (*entry) (struct tlsdesc *);
+ void *arg;
+};
+
+typedef struct dl_tls_index
+{
+ unsigned long int ti_module;
+ unsigned long int ti_offset;
+} tls_index;
+
+/* Type used as the argument in a TLS descriptor for a symbol that
+ needs dynamic TLS offsets. */
+struct tlsdesc_dynamic_arg
+{
+ tls_index tlsinfo;
+ size_t gen_count;
+};
+
+extern ptrdiff_t attribute_hidden __attribute__ ((regparm (1)))
+ _dl_tlsdesc_return (struct tlsdesc *),
+ _dl_tlsdesc_undefweak (struct tlsdesc *),
+ _dl_tlsdesc_resolve_abs_plus_addend (struct tlsdesc *),
+ _dl_tlsdesc_resolve_rel (struct tlsdesc *),
+ _dl_tlsdesc_resolve_rela (struct tlsdesc *),
+ _dl_tlsdesc_resolve_hold (struct tlsdesc *);
+
+# ifdef SHARED
+extern void *internal_function _dl_make_tlsdesc_dynamic (struct link_map *map,
+ size_t ti_offset);
+
+extern ptrdiff_t attribute_hidden __attribute__ ((regparm (1)))
+ _dl_tlsdesc_dynamic (struct tlsdesc *);
+# endif
+
+#endif
diff --git a/sysdeps/i386/tlsdesc.c b/sysdeps/i386/tlsdesc.c
new file mode 100644
index 0000000000..28287d574b
--- /dev/null
+++ b/sysdeps/i386/tlsdesc.c
@@ -0,0 +1,269 @@
+/* Manage TLS descriptors. i386 version.
+ Copyright (C) 2005, 2008 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
+ 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 <link.h>
+#include <ldsodefs.h>
+#include <elf/dynamic-link.h>
+#include <tls.h>
+#include <dl-tlsdesc.h>
+#include <tlsdeschtab.h>
+
+/* The following 4 functions take an entry_check_offset argument.
+ It's computed by the caller as an offset between its entry point
+ and the call site, such that by adding the built-in return address
+ that is implicitly passed to the function with this offset, we can
+ easily obtain the caller's entry point to compare with the entry
+ point given in the TLS descriptor. If it's changed, we want to
+ return immediately. */
+
+/* This function is used to lazily resolve TLS_DESC REL relocations
+ that reference the *ABS* segment in their own link maps. The
+ argument is the addend originally stored there. */
+
+void
+__attribute__ ((regparm (3))) attribute_hidden
+_dl_tlsdesc_resolve_abs_plus_addend_fixup (struct tlsdesc volatile *td,
+ struct link_map *l,
+ ptrdiff_t entry_check_offset)
+{
+ ptrdiff_t addend = (ptrdiff_t) td->arg;
+
+ if (_dl_tlsdesc_resolve_early_return_p (td, __builtin_return_address (0)
+ - entry_check_offset))
+ return;
+
+#ifndef SHARED
+ CHECK_STATIC_TLS (l, l);
+#else
+ if (!TRY_STATIC_TLS (l, l))
+ {
+ td->arg = _dl_make_tlsdesc_dynamic (l, addend);
+ td->entry = _dl_tlsdesc_dynamic;
+ }
+ else
+#endif
+ {
+ td->arg = (void*) (addend - l->l_tls_offset);
+ td->entry = _dl_tlsdesc_return;
+ }
+
+ _dl_tlsdesc_wake_up_held_fixups ();
+}
+
+/* This function is used to lazily resolve TLS_DESC REL relocations
+ that originally had zero addends. The argument location, that
+ originally held the addend, is used to hold a pointer to the
+ relocation, but it has to be restored before we call the function
+ that applies relocations. */
+
+void
+__attribute__ ((regparm (3))) attribute_hidden
+_dl_tlsdesc_resolve_rel_fixup (struct tlsdesc volatile *td,
+ struct link_map *l,
+ ptrdiff_t entry_check_offset)
+{
+ const ElfW(Rel) *reloc = td->arg;
+
+ if (_dl_tlsdesc_resolve_early_return_p (td, __builtin_return_address (0)
+ - entry_check_offset))
+ return;
+
+ /* The code below was borrowed from _dl_fixup(),
+ except for checking for STB_LOCAL. */
+ const ElfW(Sym) *const symtab
+ = (const void *) D_PTR (l, l_info[DT_SYMTAB]);
+ const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
+ const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
+ lookup_t result;
+
+ /* Look up the target symbol. If the normal lookup rules are not
+ used don't look in the global scope. */
+ if (ELFW(ST_BIND) (sym->st_info) != STB_LOCAL
+ && __builtin_expect (ELFW(ST_VISIBILITY) (sym->st_other), 0) == 0)
+ {
+ const struct r_found_version *version = NULL;
+
+ if (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
+ {
+ const ElfW(Half) *vernum =
+ (const void *) D_PTR (l, l_info[VERSYMIDX (DT_VERSYM)]);
+ ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)] & 0x7fff;
+ version = &l->l_versions[ndx];
+ if (version->hash == 0)
+ version = NULL;
+ }
+
+ result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym,
+ l->l_scope, version, ELF_RTYPE_CLASS_PLT,
+ DL_LOOKUP_ADD_DEPENDENCY, NULL);
+ }
+ else
+ {
+ /* We already found the symbol. The module (and therefore its load
+ address) is also known. */
+ result = l;
+ }
+
+ if (!sym)
+ {
+ td->arg = 0;
+ td->entry = _dl_tlsdesc_undefweak;
+ }
+ else
+ {
+# ifndef SHARED
+ CHECK_STATIC_TLS (l, result);
+# else
+ if (!TRY_STATIC_TLS (l, result))
+ {
+ td->arg = _dl_make_tlsdesc_dynamic (result, sym->st_value);
+ td->entry = _dl_tlsdesc_dynamic;
+ }
+ else
+# endif
+ {
+ td->arg = (void*)(sym->st_value - result->l_tls_offset);
+ td->entry = _dl_tlsdesc_return;
+ }
+ }
+
+ _dl_tlsdesc_wake_up_held_fixups ();
+}
+
+/* This function is used to lazily resolve TLS_DESC RELA relocations.
+ The argument location is used to hold a pointer to the relocation. */
+
+void
+__attribute__ ((regparm (3))) attribute_hidden
+_dl_tlsdesc_resolve_rela_fixup (struct tlsdesc volatile *td,
+ struct link_map *l,
+ ptrdiff_t entry_check_offset)
+{
+ const ElfW(Rela) *reloc = td->arg;
+
+ if (_dl_tlsdesc_resolve_early_return_p (td, __builtin_return_address (0)
+ - entry_check_offset))
+ return;
+
+ /* The code below was borrowed from _dl_fixup(),
+ except for checking for STB_LOCAL. */
+ const ElfW(Sym) *const symtab
+ = (const void *) D_PTR (l, l_info[DT_SYMTAB]);
+ const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
+ const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
+ lookup_t result;
+
+ /* Look up the target symbol. If the normal lookup rules are not
+ used don't look in the global scope. */
+ if (ELFW(ST_BIND) (sym->st_info) != STB_LOCAL
+ && __builtin_expect (ELFW(ST_VISIBILITY) (sym->st_other), 0) == 0)
+ {
+ const struct r_found_version *version = NULL;
+
+ if (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
+ {
+ const ElfW(Half) *vernum =
+ (const void *) D_PTR (l, l_info[VERSYMIDX (DT_VERSYM)]);
+ ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)] & 0x7fff;
+ version = &l->l_versions[ndx];
+ if (version->hash == 0)
+ version = NULL;
+ }
+
+ result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym,
+ l->l_scope, version, ELF_RTYPE_CLASS_PLT,
+ DL_LOOKUP_ADD_DEPENDENCY, NULL);
+ }
+ else
+ {
+ /* We already found the symbol. The module (and therefore its load
+ address) is also known. */
+ result = l;
+ }
+
+ if (!sym)
+ {
+ td->arg = (void*) reloc->r_addend;
+ td->entry = _dl_tlsdesc_undefweak;
+ }
+ else
+ {
+# ifndef SHARED
+ CHECK_STATIC_TLS (l, result);
+# else
+ if (!TRY_STATIC_TLS (l, result))
+ {
+ td->arg = _dl_make_tlsdesc_dynamic (result, sym->st_value
+ + reloc->r_addend);
+ td->entry = _dl_tlsdesc_dynamic;
+ }
+ else
+# endif
+ {
+ td->arg = (void*) (sym->st_value - result->l_tls_offset
+ + reloc->r_addend);
+ td->entry = _dl_tlsdesc_return;
+ }
+ }
+
+ _dl_tlsdesc_wake_up_held_fixups ();
+}
+
+/* This function is used to avoid busy waiting for other threads to
+ complete the lazy relocation. Once another thread wins the race to
+ relocate a TLS descriptor, it sets the descriptor up such that this
+ function is called to wait until the resolver releases the
+ lock. */
+
+void
+__attribute__ ((regparm (3))) attribute_hidden
+_dl_tlsdesc_resolve_hold_fixup (struct tlsdesc volatile *td,
+ struct link_map *l __attribute__((__unused__)),
+ ptrdiff_t entry_check_offset)
+{
+ /* Maybe we're lucky and can return early. */
+ if (__builtin_return_address (0) - entry_check_offset != td->entry)
+ return;
+
+ /* Locking here will stop execution until the running resolver runs
+ _dl_tlsdesc_wake_up_held_fixups(), releasing the lock.
+
+ FIXME: We'd be better off waiting on a condition variable, such
+ that we didn't have to hold the lock throughout the relocation
+ processing. */
+ __rtld_lock_lock_recursive (GL(dl_load_lock));
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+}
+
+
+/* Unmap the dynamic object, but also release its TLS descriptor table
+ if there is one. */
+
+void
+internal_function
+_dl_unmap (struct link_map *map)
+{
+ __munmap ((void *) (map)->l_map_start,
+ (map)->l_map_end - (map)->l_map_start);
+
+#if SHARED
+ if (map->l_mach.tlsdesc_table)
+ htab_delete (map->l_mach.tlsdesc_table);
+#endif
+}
diff --git a/sysdeps/i386/tlsdesc.sym b/sysdeps/i386/tlsdesc.sym
new file mode 100644
index 0000000000..33854975d0
--- /dev/null
+++ b/sysdeps/i386/tlsdesc.sym
@@ -0,0 +1,17 @@
+#include <stddef.h>
+#include <sysdep.h>
+#include <tls.h>
+#include <link.h>
+#include <dl-tlsdesc.h>
+
+--
+
+-- Abuse tls.h macros to derive offsets relative to the thread register.
+
+DTV_OFFSET offsetof(struct pthread, header.dtv)
+
+TLSDESC_ARG offsetof(struct tlsdesc, arg)
+
+TLSDESC_GEN_COUNT offsetof(struct tlsdesc_dynamic_arg, gen_count)
+TLSDESC_MODID offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_module)
+TLSDESC_MODOFF offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_offset)
diff --git a/sysdeps/ia64/bits/byteswap.h b/sysdeps/ia64/bits/byteswap.h
index 6862aa0b60..d64914f36e 100644
--- a/sysdeps/ia64/bits/byteswap.h
+++ b/sysdeps/ia64/bits/byteswap.h
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1997,1998,2000,2002,2003,2008 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
@@ -17,7 +17,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
#endif
diff --git a/sysdeps/ieee754/flt-32/w_expf.c b/sysdeps/ieee754/flt-32/w_expf.c
index ad38fac0f3..4ba21c7c42 100644
--- a/sysdeps/ieee754/flt-32/w_expf.c
+++ b/sysdeps/ieee754/flt-32/w_expf.c
@@ -29,7 +29,7 @@ static const float
#else
static float
#endif
-o_threshold= 8.8721679688e+01, /* 0x42b17180 */
+o_threshold= 8.8722831726e+01, /* 0x42b17217 */
u_threshold= -1.0397208405e+02; /* 0xc2cff1b5 */
#ifdef __STDC__
diff --git a/sysdeps/ieee754/ldbl-128/e_j0l.c b/sysdeps/ieee754/ldbl-128/e_j0l.c
index f235372916..bcd57e2b06 100644
--- a/sysdeps/ieee754/ldbl-128/e_j0l.c
+++ b/sysdeps/ieee754/ldbl-128/e_j0l.c
@@ -679,7 +679,7 @@ __ieee754_j0l (long double x)
{
long double xx, xinv, z, p, q, c, s, cc, ss;
- if (! finitel (x))
+ if (! __finitel (x))
{
if (x != x)
return x;
@@ -816,7 +816,7 @@ long double
{
long double xx, xinv, z, p, q, c, s, cc, ss;
- if (! finitel (x))
+ if (! __finitel (x))
{
if (x != x)
return x;
diff --git a/sysdeps/ieee754/ldbl-128/e_j1l.c b/sysdeps/ieee754/ldbl-128/e_j1l.c
index 7ec073d9e2..7b73e2e799 100644
--- a/sysdeps/ieee754/ldbl-128/e_j1l.c
+++ b/sysdeps/ieee754/ldbl-128/e_j1l.c
@@ -685,7 +685,7 @@ __ieee754_j1l (long double x)
{
long double xx, xinv, z, p, q, c, s, cc, ss;
- if (! finitel (x))
+ if (! __finitel (x))
{
if (x != x)
return x;
@@ -823,7 +823,7 @@ __ieee754_y1l (long double x)
{
long double xx, xinv, z, p, q, c, s, cc, ss;
- if (! finitel (x))
+ if (! __finitel (x))
{
if (x != x)
return x;
diff --git a/sysdeps/ieee754/ldbl-128/s_expm1l.c b/sysdeps/ieee754/ldbl-128/s_expm1l.c
index f373e1e6a9..78bbe65b53 100644
--- a/sysdeps/ieee754/ldbl-128/s_expm1l.c
+++ b/sysdeps/ieee754/ldbl-128/s_expm1l.c
@@ -153,7 +153,7 @@ __expm1l (long double x)
exp(x) - 1 = 2^k (qx + 1) - 1
= 2^k qx + 2^k - 1. */
- px = ldexpl (1.0L, k);
+ px = __ldexpl (1.0L, k);
x = px * qx + (px - 1.0);
return x;
}
diff --git a/sysdeps/ieee754/ldbl-128/s_log1pl.c b/sysdeps/ieee754/ldbl-128/s_log1pl.c
index 64d5146139..defbe76f5e 100644
--- a/sysdeps/ieee754/ldbl-128/s_log1pl.c
+++ b/sysdeps/ieee754/ldbl-128/s_log1pl.c
@@ -120,13 +120,6 @@ static const long double maxlog = 1.1356523406294143949491931077970764891253E4L;
static const long double big = 2e4932L;
static const long double zero = 0.0L;
-#if 1
-/* Make sure these are prototyped. */
-long double frexpl (long double, int *);
-long double ldexpl (long double, int);
-#endif
-
-
long double
__log1pl (long double xm1)
{
@@ -160,7 +153,7 @@ __log1pl (long double xm1)
/* Separate mantissa from exponent. */
/* Use frexp used so that denormal numbers will be handled properly. */
- x = frexpl (x, &e);
+ x = __frexpl (x, &e);
/* Logarithm using log(x) = z + z^3 P(z^2)/Q(z^2),
where z = 2(x-1)/x+1). */
diff --git a/sysdeps/mach/hurd/bits/ioctls.h b/sysdeps/mach/hurd/bits/ioctls.h
index c9d313519c..8718aacd83 100644
--- a/sysdeps/mach/hurd/bits/ioctls.h
+++ b/sysdeps/mach/hurd/bits/ioctls.h
@@ -25,6 +25,46 @@
/* These macros are also defined in <bits/termios.h> (with numerically
identical values) but this serves to shut up cpp's complaining. */
+
+#ifdef NL0
+# undef NL0
+#endif
+#ifdef NL1
+# undef NL1
+#endif
+#ifdef TAB0
+# undef TAB0
+#endif
+#ifdef TAB1
+# undef TAB1
+#endif
+#ifdef TAB2
+# undef TAB2
+#endif
+#ifdef CR0
+# undef CR0
+#endif
+#ifdef CR1
+# undef CR1
+#endif
+#ifdef CR2
+# undef CR2
+#endif
+#ifdef CR3
+# undef CR3
+#endif
+#ifdef FF0
+# undef FF0
+#endif
+#ifdef FF1
+# undef FF1
+#endif
+#ifdef BS0
+# undef BS0
+#endif
+#ifdef BS1
+# undef BS1
+#endif
#ifdef MDMBUF
# undef MDMBUF
#endif
@@ -284,31 +324,25 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 };
#define ODDP 0x00000040 /* get/send odd parity */
#define EVENP 0x00000080 /* get/send even parity */
#define ANYP 0x000000c0 /* get any parity/send none */
-#define NLDLY 0x00000300 /* \n delay */
-#define NLDELAY NLDLY /* traditional BSD name */
+#define NLDELAY 0x00000300 /* \n delay */
#define NL0 0x00000000
#define NL1 0x00000100 /* tty 37 */
#define NL2 0x00000200 /* vt05 */
#define NL3 0x00000300
-#define TABDLY 0x00000c00 /* horizontal tab delay */
-#define TBDELAY TABDLY /* traditional BSD name */
+#define TBDELAY 0x00000c00 /* horizontal tab delay */
#define TAB0 0x00000000
#define TAB1 0x00000400 /* tty 37 */
#define TAB2 0x00000800
-#define TAB3 0x00000c00
#define XTABS 0x00000c00 /* expand tabs on output */
-#define CRDLY 0x00003000 /* \r delay */
-#define CRDELAY CRDLY /* traditional BSD name */
+#define CRDELAY 0x00003000 /* \r delay */
#define CR0 0x00000000
#define CR1 0x00001000 /* tn 300 */
#define CR2 0x00002000 /* tty 37 */
#define CR3 0x00003000 /* concept 100 */
-#define VTDLY 0x00004000 /* vertical tab delay */
-#define VTDELAY VTDLY /* traditional BSD name */
+#define VTDELAY 0x00004000 /* vertical tab delay */
#define FF0 0x00000000
#define FF1 0x00004000 /* tty 37 */
-#define BSDLY 0x00008000 /* \b delay */
-#define BSDELAY BSDLY /* traditional BSD name */
+#define BSDELAY 0x00008000 /* \b delay */
#define BS0 0x00000000
#define BS1 0x00008000
#define ALLDELAY (NLDELAY|TBDELAY|CRDELAY|VTDELAY|BSDELAY)
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 9a27efdf83..8908fc10c3 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -40,6 +40,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <errno.h>
#include <ifaddrs.h>
#include <netdb.h>
+#include <nss.h>
#include <resolv.h>
#include <stdbool.h>
#include <stdio.h>
@@ -60,6 +61,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <not-cancel.h>
#include <nscd/nscd-client.h>
#include <nscd/nscd_proto.h>
+#include <resolv/res_hconf.h>
#ifdef HAVE_LIBIDN
extern int __idna_to_ascii_lz (const char *input, char **output, int flags);
@@ -91,21 +93,14 @@ struct gaih_servtuple
static const struct gaih_servtuple nullserv;
-struct gaih_addrtuple
- {
- struct gaih_addrtuple *next;
- char *name;
- int family;
- uint32_t addr[4];
- uint32_t scopeid;
- };
struct gaih_typeproto
{
int socktype;
int protocol;
- char name[4];
- int protoflag;
+ uint8_t protoflag;
+ bool defaultflag;
+ char name[8];
};
/* Values for `protoflag'. */
@@ -114,11 +109,21 @@ struct gaih_typeproto
static const struct gaih_typeproto gaih_inet_typeproto[] =
{
- { 0, 0, "", 0 },
- { SOCK_STREAM, IPPROTO_TCP, "tcp", 0 },
- { SOCK_DGRAM, IPPROTO_UDP, "udp", 0 },
- { SOCK_RAW, 0, "raw", GAI_PROTO_PROTOANY|GAI_PROTO_NOSERVICE },
- { 0, 0, "", 0 }
+ { 0, 0, 0, false, "" },
+ { SOCK_STREAM, IPPROTO_TCP, 0, true, "tcp" },
+ { SOCK_DGRAM, IPPROTO_UDP, 0, true, "udp" },
+#if defined SOCK_DCCP && defined IPPROTO_DCCP
+ { SOCK_DCCP, IPPROTO_DCCP, 0, false, "dccp" },
+#endif
+#ifdef IPPROTO_UDPLITE
+ { SOCK_DGRAM, IPPROTO_UDPLITE, 0, false, "udplite" },
+#endif
+#ifdef IPPROTO_SCTP
+ { SOCK_STREAM, IPPROTO_SCTP, 0, false, "sctp" },
+ { SOCK_SEQPACKET, IPPROTO_SCTP, 0, false, "sctp" },
+#endif
+ { SOCK_RAW, 0, GAI_PROTO_PROTOANY|GAI_PROTO_NOSERVICE, true, "raw" },
+ { 0, 0, 0, false, "" }
};
struct gaih
@@ -202,6 +207,7 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp,
if (herrno == NETDB_INTERNAL) \
{ \
__set_h_errno (herrno); \
+ _res.options = old_res_options; \
return -EAI_SYSTEM; \
} \
if (herrno == TRY_AGAIN) \
@@ -246,6 +252,10 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp,
}
+typedef enum nss_status (*nss_gethostbyname4_r)
+ (const char *name, struct gaih_addrtuple **pat,
+ char *buffer, size_t buflen, int *errnop,
+ int *h_errnop, int32_t *ttlp);
typedef enum nss_status (*nss_gethostbyname3_r)
(const char *name, int af, struct hostent *host,
char *buffer, size_t buflen, int *errnop,
@@ -365,18 +375,19 @@ gaih_inet (const char *name, const struct gaih_service *service,
we know about. */
struct gaih_servtuple **lastp = &st;
for (++tp; tp->name[0]; ++tp)
- {
- struct gaih_servtuple *newp;
+ if (tp->defaultflag)
+ {
+ struct gaih_servtuple *newp;
- newp = __alloca (sizeof (struct gaih_servtuple));
- newp->next = NULL;
- newp->socktype = tp->socktype;
- newp->protocol = tp->protocol;
- newp->port = port;
+ newp = __alloca (sizeof (struct gaih_servtuple));
+ newp->next = NULL;
+ newp->socktype = tp->socktype;
+ newp->protocol = tp->protocol;
+ newp->port = port;
- *lastp = newp;
- lastp = &newp->next;
- }
+ *lastp = newp;
+ lastp = &newp->next;
+ }
}
}
@@ -685,87 +696,132 @@ gaih_inet (const char *name, const struct gaih_service *service,
while (!no_more)
{
- nss_gethostbyname3_r fct = NULL;
- if (req->ai_flags & AI_CANONNAME)
- /* No need to use this function if we do not look for
- the canonical name. The function does not exist in
- all NSS modules and therefore the lookup would
- often fail. */
- fct = __nss_lookup_function (nip, "gethostbyname3_r");
- if (fct == NULL)
- /* We are cheating here. The gethostbyname2_r function does
- not have the same interface as gethostbyname3_r but the
- extra arguments the latter takes are added at the end.
- So the gethostbyname2_r code will just ignore them. */
- fct = __nss_lookup_function (nip, "gethostbyname2_r");
-
- if (fct != NULL)
+ nss_gethostbyname4_r fct4
+ = __nss_lookup_function (nip, "gethostbyname4_r");
+ if (fct4 != NULL)
{
- if (req->ai_family == AF_INET6
- || req->ai_family == AF_UNSPEC)
+ int herrno;
+
+ while (1)
{
- gethosts (AF_INET6, struct in6_addr);
- no_inet6_data = no_data;
- inet6_status = status;
+ rc = 0;
+ status = DL_CALL_FCT (fct4, (name, pat, tmpbuf,
+ tmpbuflen, &rc, &herrno,
+ NULL));
+ if (status != NSS_STATUS_TRYAGAIN
+ || rc != ERANGE || herrno != NETDB_INTERNAL)
+ {
+ if (herrno == NETDB_INTERNAL)
+ {
+ __set_h_errno (herrno);
+ _res.options = old_res_options;
+ return -EAI_SYSTEM;
+ }
+ if (herrno == TRY_AGAIN)
+ no_data = EAI_AGAIN;
+ else
+ no_data = herrno == NO_DATA;
+ break;
+ }
+ tmpbuf = extend_alloca (tmpbuf,
+ tmpbuflen, 2 * tmpbuflen);
}
- if (req->ai_family == AF_INET
- || req->ai_family == AF_UNSPEC
- || (req->ai_family == AF_INET6
- && (req->ai_flags & AI_V4MAPPED)
- /* Avoid generating the mapped addresses if we
- know we are not going to need them. */
- && ((req->ai_flags & AI_ALL) || !got_ipv6)))
+
+ if (status == NSS_STATUS_SUCCESS)
{
- gethosts (AF_INET, struct in_addr);
+ canon = (*pat)->name;
- if (req->ai_family == AF_INET)
+ while (*pat != NULL)
+ pat = &((*pat)->next);
+ }
+ }
+ else
+ {
+ nss_gethostbyname3_r fct = NULL;
+ if (req->ai_flags & AI_CANONNAME)
+ /* No need to use this function if we do not look for
+ the canonical name. The function does not exist in
+ all NSS modules and therefore the lookup would
+ often fail. */
+ fct = __nss_lookup_function (nip, "gethostbyname3_r");
+ if (fct == NULL)
+ /* We are cheating here. The gethostbyname2_r
+ function does not have the same interface as
+ gethostbyname3_r but the extra arguments the
+ latter takes are added at the end. So the
+ gethostbyname2_r code will just ignore them. */
+ fct = __nss_lookup_function (nip, "gethostbyname2_r");
+
+ if (fct != NULL)
+ {
+ if (req->ai_family == AF_INET6
+ || req->ai_family == AF_UNSPEC)
{
+ gethosts (AF_INET6, struct in6_addr);
no_inet6_data = no_data;
inet6_status = status;
}
- }
-
- /* If we found one address for AF_INET or AF_INET6,
- don't continue the search. */
- if (inet6_status == NSS_STATUS_SUCCESS
- || status == NSS_STATUS_SUCCESS)
- {
- if ((req->ai_flags & AI_CANONNAME) != 0 && canon == NULL)
+ if (req->ai_family == AF_INET
+ || req->ai_family == AF_UNSPEC
+ || (req->ai_family == AF_INET6
+ && (req->ai_flags & AI_V4MAPPED)
+ /* Avoid generating the mapped addresses if we
+ know we are not going to need them. */
+ && ((req->ai_flags & AI_ALL) || !got_ipv6)))
{
- /* If we need the canonical name, get it
- from the same service as the result. */
- nss_getcanonname_r cfct;
- int herrno;
+ gethosts (AF_INET, struct in_addr);
- cfct = __nss_lookup_function (nip, "getcanonname_r");
- if (cfct != NULL)
+ if (req->ai_family == AF_INET)
{
- const size_t max_fqdn_len = 256;
- char *buf = alloca (max_fqdn_len);
- char *s;
-
- if (DL_CALL_FCT (cfct, (at->name ?: name, buf,
- max_fqdn_len, &s, &rc,
- &herrno))
- == NSS_STATUS_SUCCESS)
- canon = s;
- else
- /* Set to name now to avoid using
- gethostbyaddr. */
- canon = name;
+ no_inet6_data = no_data;
+ inet6_status = status;
}
}
- break;
- }
+ /* If we found one address for AF_INET or AF_INET6,
+ don't continue the search. */
+ if (inet6_status == NSS_STATUS_SUCCESS
+ || status == NSS_STATUS_SUCCESS)
+ {
+ if ((req->ai_flags & AI_CANONNAME) != 0
+ && canon == NULL)
+ {
+ /* If we need the canonical name, get it
+ from the same service as the result. */
+ nss_getcanonname_r cfct;
+ int herrno;
+
+ cfct = __nss_lookup_function (nip,
+ "getcanonname_r");
+ if (cfct != NULL)
+ {
+ const size_t max_fqdn_len = 256;
+ char *buf = alloca (max_fqdn_len);
+ char *s;
+
+ if (DL_CALL_FCT (cfct, (at->name ?: name,
+ buf, max_fqdn_len,
+ &s, &rc, &herrno))
+ == NSS_STATUS_SUCCESS)
+ canon = s;
+ else
+ /* Set to name now to avoid using
+ gethostbyaddr. */
+ canon = name;
+ }
+ }
+
+ break;
+ }
- /* We can have different states for AF_INET and
- AF_INET6. Try to find a useful one for both. */
- if (inet6_status == NSS_STATUS_TRYAGAIN)
- status = NSS_STATUS_TRYAGAIN;
- else if (status == NSS_STATUS_UNAVAIL
- && inet6_status != NSS_STATUS_UNAVAIL)
- status = inet6_status;
+ /* We can have different states for AF_INET and
+ AF_INET6. Try to find a useful one for both. */
+ if (inet6_status == NSS_STATUS_TRYAGAIN)
+ status = NSS_STATUS_TRYAGAIN;
+ else if (status == NSS_STATUS_UNAVAIL
+ && inet6_status != NSS_STATUS_UNAVAIL)
+ status = inet6_status;
+ }
}
if (nss_next_action (nip, status) == NSS_ACTION_RETURN)
@@ -1056,7 +1112,10 @@ get_scope (const struct sockaddr_in6 *in6)
{
if (! IN6_IS_ADDR_MULTICAST (&in6->sin6_addr))
{
- if (IN6_IS_ADDR_LINKLOCAL (&in6->sin6_addr))
+ if (IN6_IS_ADDR_LINKLOCAL (&in6->sin6_addr)
+ /* RFC 4291 2.5.3 says that the loopback address is to be
+ treated like a link-local address. */
+ || IN6_IS_ADDR_LOOPBACK (&in6->sin6_addr))
scope = 2;
else if (IN6_IS_ADDR_SITELOCAL (&in6->sin6_addr))
scope = 5;
@@ -1189,20 +1248,14 @@ match_prefix (const struct sockaddr_in6 *in6,
{
const struct sockaddr_in *in = (const struct sockaddr_in *) in6;
- /* Convert to IPv6 address. */
+ /* Construct a V4-to-6 mapped address. */
in6_mem.sin6_family = PF_INET6;
in6_mem.sin6_port = in->sin_port;
in6_mem.sin6_flowinfo = 0;
- if (in->sin_addr.s_addr == htonl (0x7f000001))
- in6_mem.sin6_addr = (struct in6_addr) IN6ADDR_LOOPBACK_INIT;
- else
- {
- /* Construct a V4-to-6 mapped address. */
- memset (&in6_mem.sin6_addr, '\0', sizeof (in6_mem.sin6_addr));
- in6_mem.sin6_addr.s6_addr16[5] = 0xffff;
- in6_mem.sin6_addr.s6_addr32[3] = in->sin_addr.s_addr;
- in6_mem.sin6_scope_id = 0;
- }
+ memset (&in6_mem.sin6_addr, '\0', sizeof (in6_mem.sin6_addr));
+ in6_mem.sin6_addr.s6_addr16[5] = 0xffff;
+ in6_mem.sin6_addr.s6_addr32[3] = in->sin_addr.s_addr;
+ in6_mem.sin6_scope_id = 0;
in6 = &in6_mem;
}
@@ -2034,6 +2087,10 @@ getaddrinfo (const char *name, const char *service,
if ((hints->ai_flags & AI_CANONNAME) && name == NULL)
return EAI_BADFLAGS;
+ /* Initialize configurations. */
+ if (__builtin_expect (!_res_hconf.initialized, 0))
+ _res_hconf_init ();
+
struct in6addrinfo *in6ai = NULL;
size_t in6ailen = 0;
bool seen_ipv4 = false;
diff --git a/sysdeps/s390/bits/byteswap.h b/sysdeps/s390/bits/byteswap.h
index d0e31b8364..4bfd5fa064 100644
--- a/sysdeps/s390/bits/byteswap.h
+++ b/sysdeps/s390/bits/byteswap.h
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values. s390 version.
- Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -18,7 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
#endif
diff --git a/sysdeps/sparc/sparc32/Makefile b/sysdeps/sparc/sparc32/Makefile
index ed4fba7418..6529ad897b 100644
--- a/sysdeps/sparc/sparc32/Makefile
+++ b/sysdeps/sparc/sparc32/Makefile
@@ -20,6 +20,10 @@ ifeq ($(subdir),gnulib)
sysdep_routines = dotmul umul $(divrem) alloca
endif # gnulib
+ifeq ($(subdir),csu)
+CFLAGS-initfini.s += -mcpu=v7
+endif
+
# We distribute these files, even though they are generated,
# so as to avoid the need for a functioning m4 to build the library.
divrem := sdiv udiv rem urem
diff --git a/sysdeps/sparc/sparc64/Makefile b/sysdeps/sparc/sparc64/Makefile
index c1df31727c..3bb0238832 100644
--- a/sysdeps/sparc/sparc64/Makefile
+++ b/sysdeps/sparc/sparc64/Makefile
@@ -2,3 +2,7 @@ ifeq ($(subdir),csu)
sysdep_routines += hp-timing
elide-routines.os += hp-timing
endif
+
+ifeq ($(subdir),csu)
+CFLAGS-initfini.s += -mcpu=v9
+endif
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/resource.h b/sysdeps/unix/sysv/linux/alpha/bits/resource.h
index 2163745840..92d0199dcd 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/resource.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/resource.h
@@ -158,8 +158,16 @@ enum __rusage_who
#define RUSAGE_SELF RUSAGE_SELF
/* All of its terminated child processes. */
- RUSAGE_CHILDREN = -1
+ RUSAGE_CHILDREN = -1,
#define RUSAGE_CHILDREN RUSAGE_CHILDREN
+
+#ifdef __USE_GNU
+ /* The calling thread. */
+ RUSAGE_THREAD = 1
+# define RUSAGE_THREAD RUSAGE_THREAD
+ /* Name for the same functionality on Solaris. */
+# define RUSAGE_LWP RUSAGE_THREAD
+#endif
};
#define __need_timeval
diff --git a/sysdeps/unix/sysv/linux/bits/resource.h b/sysdeps/unix/sysv/linux/bits/resource.h
index 526cdaf53c..95d64ed77f 100644
--- a/sysdeps/unix/sysv/linux/bits/resource.h
+++ b/sysdeps/unix/sysv/linux/bits/resource.h
@@ -158,8 +158,16 @@ enum __rusage_who
#define RUSAGE_SELF RUSAGE_SELF
/* All of its terminated child processes. */
- RUSAGE_CHILDREN = -1
+ RUSAGE_CHILDREN = -1,
#define RUSAGE_CHILDREN RUSAGE_CHILDREN
+
+#ifdef __USE_GNU
+ /* The calling thread. */
+ RUSAGE_THREAD = 1
+# define RUSAGE_THREAD RUSAGE_THREAD
+ /* Name for the same functionality on Solaris. */
+# define RUSAGE_LWP RUSAGE_THREAD
+#endif
};
#define __need_timeval
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
index ceb60133e3..3dda3d1c29 100644
--- a/sysdeps/unix/sysv/linux/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/bits/socket.h
@@ -1,5 +1,5 @@
/* System-specific socket constants and types. Linux version.
- Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007
+ Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -52,6 +52,8 @@ enum __socket_type
SOCK_SEQPACKET = 5, /* Sequenced, reliable, connection-based,
datagrams of fixed maximum length. */
#define SOCK_SEQPACKET SOCK_SEQPACKET
+ SOCK_DCCP = 6,
+#define SOCK_DCCP SOCK_DCCP /* Datagram Congestion Control Protocol. */
SOCK_PACKET = 10 /* Linux specific way of getting packets
at the dev level. For writing rarp and
other similar things on the user level. */
diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h
index 582412e300..275a0730c8 100644
--- a/sysdeps/unix/sysv/linux/dl-osinfo.h
+++ b/sysdeps/unix/sysv/linux/dl-osinfo.h
@@ -20,6 +20,7 @@
#include <errno.h>
#include <kernel-features.h>
#include <dl-sysdep.h>
+#include <fcntl.h>
#include <stdint.h>
#include <hp-timing.h>
#include <endian.h>
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/resource.h b/sysdeps/unix/sysv/linux/sparc/bits/resource.h
index 3f2c600141..22c087da46 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/resource.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/resource.h
@@ -174,8 +174,16 @@ enum __rusage_who
#define RUSAGE_SELF RUSAGE_SELF
/* All of its terminated child processes. */
- RUSAGE_CHILDREN = -1
+ RUSAGE_CHILDREN = -1,
#define RUSAGE_CHILDREN RUSAGE_CHILDREN
+
+#ifdef __USE_GNU
+ /* The calling thread. */
+ RUSAGE_THREAD = 1
+# define RUSAGE_THREAD RUSAGE_THREAD
+ /* Name for the same functionality on Solaris. */
+# define RUSAGE_LWP RUSAGE_THREAD
+#endif
};
#define __need_timeval
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
index cd1b3fb793..8f7e76be2a 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
@@ -2,6 +2,10 @@ asm-CPPFLAGS = -D__ASSEMBLY__
ASFLAGS-.os += -fPIC
LD += -melf32_sparc
+ifeq ($(subdir),stdlib)
+gen-as-const-headers += ucontext_i.sym
+endif
+
# When I get this to work, this is the right thing
ifeq ($(subdir),elf)
CFLAGS-rtld.c += -mcpu=v8
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S
new file mode 100644
index 0000000000..f8664a7975
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S
@@ -0,0 +1,85 @@
+/* Save current context.
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by David S. Miller <davem@davemloft.net>, 2008.
+
+ 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 <sysdep.h>
+
+#include "ucontext_i.h"
+
+/* int __getcontext (ucontext_t *ucp)
+
+ Saves the machine context in UCP such that when it is activated,
+ it appears as if __getcontext() returned again.
+
+ This implementation is intended to be used for *synchronous* context
+ switches only. Therefore, it does not have to save anything
+ other than the PRESERVED state. */
+
+
+ENTRY(__getcontext)
+ save %sp, -112, %sp
+ st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PSR]
+
+ /* In reality, we only use the GREG_PC value when setting
+ or swapping contexts. But we fill in NPC for completeness. */
+ add %i7, 8, %o0
+ st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PC]
+ add %o0, 4, %o0
+ st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_NPC]
+
+ rd %y, %o1
+ st %o1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y]
+
+ st %g1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G1]
+ st %g2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2]
+ st %g3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3]
+ st %g4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4]
+ st %g5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5]
+ st %g6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6]
+ st %g7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7]
+
+ mov SIG_BLOCK, %o0
+ clr %o1
+ add %i0, UC_SIGMASK, %o2
+ mov 8, %o3
+ mov __NR_rt_sigprocmask, %g1
+ ta 0x10
+
+ /* Zero, success, return value. */
+ st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O0]
+ st %i1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1]
+ st %i2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2]
+ st %i3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3]
+ st %i4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4]
+ st %i5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5]
+ st %i6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6]
+ st %i7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O7]
+
+ st %g0, [%i0 + UC_MCONTEXT + MC_GWINS]
+
+ /* Do not save FPU state, it is volatile across calls. */
+ stb %g0, [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN]
+
+ st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_ID]
+ st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_PTR]
+ jmpl %i7 + 8, %g0
+ restore %g0, %g0, %o0
+END(__getcontext)
+
+weak_alias (__getcontext, getcontext)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c b/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c
new file mode 100644
index 0000000000..9b48dade63
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c
@@ -0,0 +1,93 @@
+/* Create new context.
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by David S. Miller <davem@davemloft.net>, 2008.
+
+ 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 <sysdep.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <ucontext.h>
+
+/* Sets up the outgoing arguments and the program counter for a user
+ context for the requested function call.
+
+ Returning to the correct parent context is pretty simple on
+ Sparc. We only need to link up the register windows correctly.
+ Since global registers are clobbered by calls, we need not be
+ concernred about those, and thus is all could be worked out without
+ using a trampoline.
+
+ Except that we must deal with the signal mask, thus a trampoline
+ is unavoidable. 32-bit stackframe layout:
+ +-----------------------------------------+
+ | 7th and further parameters |
+ +-----------------------------------------+
+ | backup storage for initial 6 parameters |
+ +-----------------------------------------+
+ | struct return pointer |
+ +-----------------------------------------+
+ | 8 incoming registers |
+ +-----------------------------------------+
+ | 8 local registers |
+ %sp --> +-----------------------------------------+
+
+*/
+
+void
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
+{
+ extern void __start_context (void);
+ unsigned long int *sp;
+ va_list ap;
+ int i;
+
+ sp = (unsigned long int *) (ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
+ sp -= 16 + 7 + argc;
+ sp = (unsigned long int *) (((uintptr_t) sp) & ~(8 - 1));
+
+ for (i = 0; i < 8; i++)
+ sp[i + 8] = ucp->uc_mcontext.gregs[REG_O0 + i];
+
+ /* The struct return pointer is essentially unused, so we can
+ place the link there. */
+ sp[16] = (unsigned long int) ucp->uc_link;
+
+ va_start (ap, argc);
+
+ /* Fill in outgoing arguments, including those which will
+ end up being passed on the stack. */
+ for (i = 0; i < argc; i++)
+ {
+ unsigned long int arg = va_arg (ap, unsigned long int);
+ if (i < 6)
+ ucp->uc_mcontext.gregs[REG_O0 + i] = arg;
+ else
+ sp[i + 23] = arg;
+ }
+
+ va_end (ap);
+
+ ucp->uc_mcontext.gregs[REG_O6] = (unsigned long int) sp;
+
+ ucp->uc_mcontext.gregs[REG_O7] = ((unsigned long int) __start_context) - 8;
+
+ ucp->uc_mcontext.gregs[REG_PC] = (unsigned long int) func;
+ ucp->uc_mcontext.gregs[REG_nPC] = ucp->uc_mcontext.gregs[REG_PC] + 4;
+}
+
+weak_alias (__makecontext, makecontext)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
new file mode 100644
index 0000000000..33e40ac65a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
@@ -0,0 +1,119 @@
+/* Install given context.
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by David S. Miller <davem@davemloft.net>, 2008.
+
+ 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 <sysdep.h>
+#include <sys/trap.h>
+
+#include "ucontext_i.h"
+
+
+/* int __setcontext (const ucontext_t *ucp)
+
+ Restores the machine context in UCP and thereby resumes execution
+ in that context.
+
+ This implementation is intended to be used for *synchronous* context
+ switches only. Therefore, it does not have to restore anything
+ other than the PRESERVED state. */
+
+ENTRY(__setcontext)
+ save %sp, -112, %sp
+
+ mov SIG_SETMASK, %o0
+ add %i0, UC_SIGMASK, %o1
+ clr %o2
+ mov 8, %o3
+ mov __NR_rt_sigprocmask, %g1
+ ta 0x10
+
+ /* This is a bit on the expensive side, and we could optimize
+ the unwind similar to how the 32-bit sparc longjmp code
+ does if performance of this routine really matters. */
+ ta ST_FLUSH_WINDOWS
+
+ ldub [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN], %g1
+ cmp %g1, 0
+ be 1f
+ nop
+ ld [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_FSR], %fsr
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D0], %f0
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D2], %f2
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D4], %f4
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D6], %f6
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D8], %f8
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D10], %f10
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D12], %f12
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D14], %f14
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D16], %f16
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D18], %f18
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D20], %f20
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D22], %f22
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D24], %f24
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D26], %f26
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D28], %f28
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D30], %f30
+1:
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y], %g1
+ wr %g1, 0x0, %y
+
+ /* We specifically do not restore %g1 since we need it here as
+ a temporary. */
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2], %g2
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3], %g3
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4], %g4
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5], %g5
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6], %g6
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7], %g7
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1], %i1
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2], %i2
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3], %i3
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4], %i4
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5], %i5
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6], %i6
+ restore
+ ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O7], %o7
+ ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_PC], %g1
+ jmpl %g1, %g0
+ ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O0], %o0
+END(__setcontext)
+
+weak_alias (__setcontext, setcontext)
+
+/* This is the helper code which gets called if a function which is
+ registered with 'makecontext' returns. In this case we have to
+ install the context listed in the uc_link element of the context
+ 'makecontext' manipulated at the time of the 'makecontext' call.
+ If the pointer is NULL the process must terminate. */
+
+ENTRY(__start_context)
+ ld [%sp + (16 * 4)], %g1
+ cmp %g1, 0
+ be,a 1f
+ clr %o0
+ call __setcontext
+ mov %g1, %o0
+ /* If this returns (which can happen if the syscall fails) we'll
+ exit the program with the return error value (-1). */
+1: call exit
+ nop
+ /* The 'exit' call should never return. In case it does cause
+ the process to terminate. */
+ unimp
+END(__start_context)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S
new file mode 100644
index 0000000000..154746689a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S
@@ -0,0 +1,119 @@
+/* Save current context and install the given one.
+ Copyright (C) 2008 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by David S. Miller <davem@davemloft.net>, 2008.
+
+ 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 <sysdep.h>
+#include <sys/trap.h>
+
+#include "ucontext_i.h"
+
+
+/* int __swapcontext (ucontext_t *oucp, const ucontext_t *ucp);
+
+ Saves the machine context in oucp such that when it is activated,
+ it appears as if __swapcontext() returned again, restores the
+ machine context in ucp and thereby resumes execution in that
+ context.
+
+ This implementation is intended to be used for *synchronous* context
+ switches only. Therefore, it does not have to save anything
+ other than the PRESERVED state. */
+
+ENTRY(__swapcontext)
+ save %sp, -112, %sp
+ ta ST_FLUSH_WINDOWS
+ st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PSR]
+ add %i7, 8, %o0
+ st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PC]
+ add %o0, 4, %o0
+ st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_NPC]
+ rd %y, %o1
+ st %o1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y]
+ st %g1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G1]
+ st %g2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2]
+ st %g3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3]
+ st %g4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4]
+ st %g5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5]
+ st %g6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6]
+ st %g7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7]
+ st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O0]
+ st %i1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1]
+ st %i2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2]
+ st %i3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3]
+ st %i4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4]
+ st %i5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5]
+ st %i6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6]
+ st %i7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O7]
+ st %g0, [%i0 + UC_MCONTEXT + MC_GWINS]
+ stb %g0, [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN]
+ st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_ID]
+ st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_PTR]
+
+ mov SIG_SETMASK, %o0
+ add %i1, UC_SIGMASK, %o1
+ add %i0, UC_SIGMASK, %o2
+ mov 8, %o3
+ mov __NR_rt_sigprocmask, %g1
+ ta 0x10
+
+ mov %i1, %i0
+ ldub [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN], %g1
+ cmp %g1, 0
+ be 1f
+ nop
+ ld [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_FSR], %fsr
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D0], %f0
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D2], %f2
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D4], %f4
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D6], %f6
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D8], %f8
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D10], %f10
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D12], %f12
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D14], %f14
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D16], %f16
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D18], %f18
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D20], %f20
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D22], %f22
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D24], %f24
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D26], %f26
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D28], %f28
+ ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D30], %f30
+1:
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y], %g1
+ wr %g1, 0x0, %y
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2], %g2
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3], %g3
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4], %g4
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5], %g5
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6], %g6
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7], %g7
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1], %i1
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2], %i2
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3], %i3
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4], %i4
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5], %i5
+ ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6], %i6
+ restore
+ ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O7], %o7
+ ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_PC], %g1
+ jmpl %g1, %g0
+ ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O0], %o0
+END(__swapcontext)
+
+weak_alias (__swapcontext, swapcontext)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S
index 1610745524..5786880f26 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S
@@ -27,6 +27,7 @@ ENTRY(syscall)
mov %o3, %o2
mov %o4, %o3
mov %o5, %o4
+ ld [%sp + 92], %o5
ta 0x10
bcc 1f
mov %o7, %g1
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
new file mode 100644
index 0000000000..544030ce8b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
@@ -0,0 +1,61 @@
+#include <stddef.h>
+#include <signal.h>
+#include <sys/ucontext.h>
+
+--
+
+SIG_BLOCK
+SIG_SETMASK
+
+UC_FLAGS offsetof (ucontext_t, uc_flags)
+UC_LINK offsetof (ucontext_t, uc_link)
+UC_SIGMASK offsetof (ucontext_t, uc_sigmask)
+UC_STACK offsetof (ucontext_t, uc_stack)
+UC_MCONTEXT offsetof (ucontext_t, uc_mcontext)
+MC_GREGS offsetof (mcontext_t, gregs)
+MC_GWINS offsetof (mcontext_t, gwins)
+MC_FPREGS offsetof (mcontext_t, fpregs)
+MC_XRS offsetof (mcontext_t, xrs)
+MC_FILLER offsetof (mcontext_t, filler)
+GREG_PSR (REG_PSR * sizeof(greg_t))
+GREG_PC (REG_PC * sizeof(greg_t))
+GREG_NPC (REG_nPC * sizeof(greg_t))
+GREG_Y (REG_Y * sizeof(greg_t))
+GREG_G1 (REG_G1 * sizeof(greg_t))
+GREG_G2 (REG_G2 * sizeof(greg_t))
+GREG_G3 (REG_G3 * sizeof(greg_t))
+GREG_G4 (REG_G4 * sizeof(greg_t))
+GREG_G5 (REG_G5 * sizeof(greg_t))
+GREG_G6 (REG_G6 * sizeof(greg_t))
+GREG_G7 (REG_G7 * sizeof(greg_t))
+GREG_O0 (REG_O0 * sizeof(greg_t))
+GREG_O1 (REG_O1 * sizeof(greg_t))
+GREG_O2 (REG_O2 * sizeof(greg_t))
+GREG_O3 (REG_O3 * sizeof(greg_t))
+GREG_O4 (REG_O4 * sizeof(greg_t))
+GREG_O5 (REG_O5 * sizeof(greg_t))
+GREG_O6 (REG_O6 * sizeof(greg_t))
+GREG_O7 (REG_O7 * sizeof(greg_t))
+FPU_D0 offsetof (fpregset_t, fpu_fr.fpu_dregs[0])
+FPU_D2 offsetof (fpregset_t, fpu_fr.fpu_dregs[1])
+FPU_D4 offsetof (fpregset_t, fpu_fr.fpu_dregs[2])
+FPU_D6 offsetof (fpregset_t, fpu_fr.fpu_dregs[3])
+FPU_D8 offsetof (fpregset_t, fpu_fr.fpu_dregs[4])
+FPU_D10 offsetof (fpregset_t, fpu_fr.fpu_dregs[5])
+FPU_D12 offsetof (fpregset_t, fpu_fr.fpu_dregs[6])
+FPU_D14 offsetof (fpregset_t, fpu_fr.fpu_dregs[7])
+FPU_D16 offsetof (fpregset_t, fpu_fr.fpu_dregs[8])
+FPU_D18 offsetof (fpregset_t, fpu_fr.fpu_dregs[9])
+FPU_D20 offsetof (fpregset_t, fpu_fr.fpu_dregs[10])
+FPU_D22 offsetof (fpregset_t, fpu_fr.fpu_dregs[11])
+FPU_D24 offsetof (fpregset_t, fpu_fr.fpu_dregs[12])
+FPU_D26 offsetof (fpregset_t, fpu_fr.fpu_dregs[13])
+FPU_D28 offsetof (fpregset_t, fpu_fr.fpu_dregs[14])
+FPU_D30 offsetof (fpregset_t, fpu_fr.fpu_dregs[15])
+FPU_Q offsetof (fpregset_t, fpu_q)
+FPU_FSR offsetof (fpregset_t, fpu_fsr)
+FPU_QCNT offsetof (fpregset_t, fpu_qcnt)
+FPU_Q_ENTRY_SZ offsetof (fpregset_t, fpu_q_entrysize)
+FPU_EN offsetof (fpregset_t, fpu_en)
+XRS_ID offsetof (xrs_t, xrs_id)
+XRS_PTR offsetof (xrs_t, xrs_ptr)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S
index 27487d8ed9..2c89558b2d 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S
@@ -27,6 +27,7 @@ ENTRY(syscall)
mov %o3,%o2
mov %o4,%o3
mov %o5,%o4
+ ldx [%sp + STACK_BIAS + 176],%o5
ta 0x6d
diff --git a/sysdeps/unix/sysv/linux/sys/user.h b/sysdeps/unix/sysv/linux/sys/user.h
index 30e9b57ab7..03e56c3d7f 100644
--- a/sysdeps/unix/sysv/linux/sys/user.h
+++ b/sysdeps/unix/sysv/linux/sys/user.h
@@ -1 +1 @@
-#include <linux/user.h>
+#error "This file is machine-dependent and not provided for this machine."
diff --git a/sysdeps/unix/sysv/linux/times.c b/sysdeps/unix/sysv/linux/times.c
new file mode 100644
index 0000000000..42d265dc87
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/times.c
@@ -0,0 +1,59 @@
+/* Copyright (C) 2008 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
+ 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 <errno.h>
+#include <sys/times.h>
+#include <sysdep.h>
+
+
+clock_t
+__times (struct tms *buf)
+{
+ INTERNAL_SYSCALL_DECL (err);
+ clock_t ret = INTERNAL_SYSCALL (times, err, 1, buf);
+ if (INTERNAL_SYSCALL_ERROR_P (ret, err)
+ && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0))
+ {
+ /* This might be an error or not. For architectures which have
+ no separate return value and error indicators we cannot
+ distinguish a return value of -1 from an error. Do it the
+ hard way. We crash applications which pass in an invalid BUF
+ pointer. */
+#define touch(v) \
+ do { \
+ clock_t temp = v; \
+ asm volatile ("" : "+r" (temp)); \
+ v = temp; \
+ } while (0)
+ touch (buf->tms_utime);
+ touch (buf->tms_stime);
+ touch (buf->tms_cutime);
+ touch (buf->tms_cstime);
+
+ /* If we come here the memory is valid and the kernel did not
+ return an EFAULT error. Return the value given by the kernel. */
+ }
+
+ /* Return value (clock_t) -1 signals an error, but if there wasn't any,
+ return the following value. */
+ if (ret == (clock_t) -1)
+ return (clock_t) 0;
+
+ return ret;
+}
+weak_alias (__times, times)
diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile
index edbdac0e34..da82093381 100644
--- a/sysdeps/x86_64/Makefile
+++ b/sysdeps/x86_64/Makefile
@@ -13,3 +13,13 @@ endif
ifeq ($(subdir),string)
sysdep_routines += cacheinfo
endif
+
+ifeq ($(subdir),elf)
+sysdep-dl-routines += tlsdesc dl-tlsdesc
+sysdep_routines += tlsdesc dl-tlsdesc
+sysdep-rtld-routines += tlsdesc dl-tlsdesc
+endif
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tlsdesc.sym
+endif
diff --git a/sysdeps/x86_64/bits/byteswap.h b/sysdeps/x86_64/bits/byteswap.h
index ec2b17889d..08b38e8523 100644
--- a/sysdeps/x86_64/bits/byteswap.h
+++ b/sysdeps/x86_64/bits/byteswap.h
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007
+ Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007, 2008
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -18,7 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H
# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
#endif
diff --git a/sysdeps/x86_64/bits/linkmap.h b/sysdeps/x86_64/bits/linkmap.h
index 8ea7157156..dd0d140874 100644
--- a/sysdeps/x86_64/bits/linkmap.h
+++ b/sysdeps/x86_64/bits/linkmap.h
@@ -3,6 +3,7 @@ struct link_map_machine
{
Elf64_Addr plt; /* Address of .plt + 0x16 */
Elf64_Addr gotplt; /* Address of .got + 0x18 */
+ void *tlsdesc_table; /* Address of TLS descriptor hash table. */
};
#else
@@ -10,5 +11,6 @@ struct link_map_machine
{
Elf32_Addr plt; /* Address of .plt + 0x16 */
Elf32_Addr gotplt; /* Address of .got + 0x0c */
+ void *tlsdesc_table; /* Address of TLS descriptor hash table. */
};
#endif
diff --git a/sysdeps/x86_64/dl-lookupcfg.h b/sysdeps/x86_64/dl-lookupcfg.h
new file mode 100644
index 0000000000..2af2b9e8fa
--- /dev/null
+++ b/sysdeps/x86_64/dl-lookupcfg.h
@@ -0,0 +1,28 @@
+/* Configuration of lookup functions.
+ Copyright (C) 2005, 2008 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
+ 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. */
+
+#define DL_UNMAP_IS_SPECIAL
+
+#include_next <dl-lookupcfg.h>
+
+struct link_map;
+
+extern void internal_function _dl_unmap (struct link_map *map);
+
+#define DL_UNMAP(map) _dl_unmap (map)
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
index 31a7013d50..959b1328d7 100644
--- a/sysdeps/x86_64/dl-machine.h
+++ b/sysdeps/x86_64/dl-machine.h
@@ -26,6 +26,7 @@
#include <sys/param.h>
#include <sysdep.h>
#include <tls.h>
+#include <dl-tlsdesc.h>
/* Return nonzero iff ELF header is compatible with the running host. */
static inline int __attribute__ ((unused))
@@ -131,6 +132,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
got[2] = (Elf64_Addr) &_dl_runtime_resolve;
}
+ if (l->l_info[ADDRIDX (DT_TLSDESC_GOT)] && lazy)
+ *(Elf64_Addr*)(D_PTR (l, l_info[ADDRIDX (DT_TLSDESC_GOT)]) + l->l_addr)
+ = (Elf64_Addr) &_dl_tlsdesc_resolve_rela;
+
return lazy;
}
@@ -194,7 +199,9 @@ _dl_start_user:\n\
# define elf_machine_type_class(type) \
((((type) == R_X86_64_JUMP_SLOT \
|| (type) == R_X86_64_DTPMOD64 \
- || (type) == R_X86_64_DTPOFF64 || (type) == R_X86_64_TPOFF64) \
+ || (type) == R_X86_64_DTPOFF64 \
+ || (type) == R_X86_64_TPOFF64 \
+ || (type) == R_X86_64_TLSDESC) \
* ELF_RTYPE_CLASS_PLT) \
| (((type) == R_X86_64_COPY) * ELF_RTYPE_CLASS_COPY))
#else
@@ -323,6 +330,41 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
*reloc_addr = sym->st_value + reloc->r_addend;
# endif
break;
+ case R_X86_64_TLSDESC:
+ {
+ struct tlsdesc volatile *td =
+ (struct tlsdesc volatile *)reloc_addr;
+
+# ifndef RTLD_BOOTSTRAP
+ if (! sym)
+ {
+ td->arg = (void*)reloc->r_addend;
+ td->entry = _dl_tlsdesc_undefweak;
+ }
+ else
+# endif
+ {
+# ifndef RTLD_BOOTSTRAP
+# ifndef SHARED
+ CHECK_STATIC_TLS (map, sym_map);
+# else
+ if (!TRY_STATIC_TLS (map, sym_map))
+ {
+ td->arg = _dl_make_tlsdesc_dynamic
+ (sym_map, sym->st_value + reloc->r_addend);
+ td->entry = _dl_tlsdesc_dynamic;
+ }
+ else
+# endif
+# endif
+ {
+ td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
+ + reloc->r_addend);
+ td->entry = _dl_tlsdesc_return;
+ }
+ }
+ break;
+ }
case R_X86_64_TPOFF64:
/* The offset is negative, forward from the thread pointer. */
# ifndef RTLD_BOOTSTRAP
@@ -435,6 +477,15 @@ elf_machine_lazy_rel (struct link_map *map,
map->l_mach.plt
+ (((Elf64_Addr) reloc_addr) - map->l_mach.gotplt) * 2;
}
+ else if (__builtin_expect (r_type == R_X86_64_TLSDESC, 1))
+ {
+ struct tlsdesc volatile * __attribute__((__unused__)) td =
+ (struct tlsdesc volatile *)reloc_addr;
+
+ td->arg = (void*)reloc;
+ td->entry = (void*)(D_PTR (map, l_info[ADDRIDX (DT_TLSDESC_PLT)])
+ + map->l_addr);
+ }
else
_dl_reloc_bad_type (map, r_type, 1);
}
diff --git a/sysdeps/x86_64/dl-tls.h b/sysdeps/x86_64/dl-tls.h
index 3e4768dc1f..9b389edb4a 100644
--- a/sysdeps/x86_64/dl-tls.h
+++ b/sysdeps/x86_64/dl-tls.h
@@ -1,5 +1,5 @@
/* Thread-local storage handling in the ELF dynamic linker. x86-64 version.
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2005 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
@@ -19,7 +19,7 @@
/* Type used for the representation of TLS information in the GOT. */
-typedef struct
+typedef struct dl_tls_index
{
unsigned long int ti_module;
unsigned long int ti_offset;
diff --git a/sysdeps/x86_64/dl-tlsdesc.S b/sysdeps/x86_64/dl-tlsdesc.S
new file mode 100644
index 0000000000..5eac1f2a5b
--- /dev/null
+++ b/sysdeps/x86_64/dl-tlsdesc.S
@@ -0,0 +1,245 @@
+/* Thread-local storage handling in the ELF dynamic linker. x86_64 version.
+ Copyright (C) 2004, 2005, 2008 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
+ 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 <sysdep.h>
+#include <tls.h>
+#include "tlsdesc.h"
+
+ .text
+
+ /* This function is used to compute the TP offset for symbols in
+ Static TLS, i.e., whose TP offset is the same for all
+ threads.
+
+ The incoming %rax points to the TLS descriptor, such that
+ 0(%rax) points to _dl_tlsdesc_return itself, and 8(%rax) holds
+ the TP offset of the symbol corresponding to the object
+ denoted by the argument. */
+
+ .hidden _dl_tlsdesc_return
+ .global _dl_tlsdesc_return
+ .type _dl_tlsdesc_return,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_return:
+ movq 8(%rax), %rax
+ ret
+ cfi_endproc
+ .size _dl_tlsdesc_return, .-_dl_tlsdesc_return
+
+ /* This function is used for undefined weak TLS symbols, for
+ which the base address (i.e., disregarding any addend) should
+ resolve to NULL.
+
+ %rax points to the TLS descriptor, such that 0(%rax) points to
+ _dl_tlsdesc_undefweak itself, and 8(%rax) holds the addend.
+ We return the addend minus the TP, such that, when the caller
+ adds TP, it gets the addend back. If that's zero, as usual,
+ that's most likely a NULL pointer. */
+
+ .hidden _dl_tlsdesc_undefweak
+ .global _dl_tlsdesc_undefweak
+ .type _dl_tlsdesc_undefweak,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_undefweak:
+ movq 8(%rax), %rax
+ subq %fs:0, %rax
+ ret
+ cfi_endproc
+ .size _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak
+
+#ifdef SHARED
+ .hidden _dl_tlsdesc_dynamic
+ .global _dl_tlsdesc_dynamic
+ .type _dl_tlsdesc_dynamic,@function
+
+ /* %rax points to the TLS descriptor, such that 0(%rax) points to
+ _dl_tlsdesc_dynamic itself, and 8(%rax) points to a struct
+ tlsdesc_dynamic_arg object. It must return in %rax the offset
+ between the thread pointer and the object denoted by the
+ argument, without clobbering any registers.
+
+ The assembly code that follows is a rendition of the following
+ C code, hand-optimized a little bit.
+
+ptrdiff_t
+_dl_tlsdesc_dynamic (register struct tlsdesc *tdp asm ("%rax"))
+{
+ struct tlsdesc_dynamic_arg *td = tdp->arg;
+ dtv_t *dtv = *(dtv_t **)((char *)__thread_pointer + DTV_OFFSET);
+ if (__builtin_expect (td->gen_count <= dtv[0].counter
+ && (dtv[td->tlsinfo.ti_module].pointer.val
+ != TLS_DTV_UNALLOCATED),
+ 1))
+ return dtv[td->tlsinfo.ti_module].pointer.val + td->tlsinfo.ti_offset
+ - __thread_pointer;
+
+ return __tls_get_addr_internal (&td->tlsinfo) - __thread_pointer;
+}
+*/
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_dynamic:
+ /* Preserve call-clobbered registers that we modify.
+ We need two scratch regs anyway. */
+ movq %rsi, -16(%rsp)
+ movq %fs:DTV_OFFSET, %rsi
+ movq %rdi, -8(%rsp)
+ movq TLSDESC_ARG(%rax), %rdi
+ movq (%rsi), %rax
+ cmpq %rax, TLSDESC_GEN_COUNT(%rdi)
+ ja .Lslow
+ movq TLSDESC_MODID(%rdi), %rax
+ salq $4, %rax
+ movq (%rax,%rsi), %rax
+ cmpq $-1, %rax
+ je .Lslow
+ addq TLSDESC_MODOFF(%rdi), %rax
+.Lret:
+ movq -16(%rsp), %rsi
+ subq %fs:0, %rax
+ movq -8(%rsp), %rdi
+ ret
+.Lslow:
+ /* Besides rdi and rsi, saved above, save rdx, rcx, r8, r9,
+ r10 and r11. Also, align the stack, that's off by 8 bytes. */
+ subq $72, %rsp
+ cfi_adjust_cfa_offset (72)
+ movq %rdx, 8(%rsp)
+ movq %rcx, 16(%rsp)
+ movq %r8, 24(%rsp)
+ movq %r9, 32(%rsp)
+ movq %r10, 40(%rsp)
+ movq %r11, 48(%rsp)
+ /* %rdi already points to the tlsinfo data structure. */
+ call __tls_get_addr@PLT
+ movq 8(%rsp), %rdx
+ movq 16(%rsp), %rcx
+ movq 24(%rsp), %r8
+ movq 32(%rsp), %r9
+ movq 40(%rsp), %r10
+ movq 48(%rsp), %r11
+ addq $72, %rsp
+ cfi_adjust_cfa_offset (-72)
+ jmp .Lret
+ cfi_endproc
+ .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
+#endif /* SHARED */
+
+ /* This function is a wrapper for a lazy resolver for TLS_DESC
+ RELA relocations. The incoming 0(%rsp) points to the caller's
+ link map, pushed by the dynamic object's internal lazy TLS
+ resolver front-end before tail-calling us. We need to pop it
+ ourselves. %rax points to a TLS descriptor, such that 0(%rax)
+ holds the address of the internal resolver front-end (unless
+ some other thread beat us to resolving it) and 8(%rax) holds a
+ pointer to the relocation.
+
+ When the actual resolver returns, it will have adjusted the
+ TLS descriptor such that we can tail-call it for it to return
+ the TP offset of the symbol. */
+
+ .hidden _dl_tlsdesc_resolve_rela
+ .global _dl_tlsdesc_resolve_rela
+ .type _dl_tlsdesc_resolve_rela,@function
+ cfi_startproc
+ .align 16
+ /* The PLT entry will have pushed the link_map pointer. */
+_dl_tlsdesc_resolve_rela:
+ cfi_adjust_cfa_offset (8)
+ /* Save all call-clobbered registers. */
+ subq $72, %rsp
+ cfi_adjust_cfa_offset (72)
+ movq %rax, (%rsp)
+ movq %rdi, 8(%rsp)
+ movq %rax, %rdi /* Pass tlsdesc* in %rdi. */
+ movq %rsi, 16(%rsp)
+ movq 72(%rsp), %rsi /* Pass link_map* in %rsi. */
+ movq %r8, 24(%rsp)
+ movq %r9, 32(%rsp)
+ movq %r10, 40(%rsp)
+ movq %r11, 48(%rsp)
+ movq %rdx, 56(%rsp)
+ movq %rcx, 64(%rsp)
+ call _dl_tlsdesc_resolve_rela_fixup
+ movq (%rsp), %rax
+ movq 8(%rsp), %rdi
+ movq 16(%rsp), %rsi
+ movq 24(%rsp), %r8
+ movq 32(%rsp), %r9
+ movq 40(%rsp), %r10
+ movq 48(%rsp), %r11
+ movq 56(%rsp), %rdx
+ movq 64(%rsp), %rcx
+ addq $80, %rsp
+ cfi_adjust_cfa_offset (-80)
+ jmp *(%rax)
+ cfi_endproc
+ .size _dl_tlsdesc_resolve_rela, .-_dl_tlsdesc_resolve_rela
+
+ /* This function is a placeholder for lazy resolving of TLS
+ relocations. Once some thread starts resolving a TLS
+ relocation, it sets up the TLS descriptor to use this
+ resolver, such that other threads that would attempt to
+ resolve it concurrently may skip the call to the original lazy
+ resolver and go straight to a condition wait.
+
+ When the actual resolver returns, it will have adjusted the
+ TLS descriptor such that we can tail-call it for it to return
+ the TP offset of the symbol. */
+
+ .hidden _dl_tlsdesc_resolve_hold
+ .global _dl_tlsdesc_resolve_hold
+ .type _dl_tlsdesc_resolve_hold,@function
+ cfi_startproc
+ .align 16
+_dl_tlsdesc_resolve_hold:
+0:
+ /* Save all call-clobbered registers. */
+ subq $72, %rsp
+ cfi_adjust_cfa_offset (72)
+ movq %rax, (%rsp)
+ movq %rdi, 8(%rsp)
+ movq %rax, %rdi /* Pass tlsdesc* in %rdi. */
+ movq %rsi, 16(%rsp)
+ /* Pass _dl_tlsdesc_resolve_hold's address in %rsi. */
+ leaq . - _dl_tlsdesc_resolve_hold(%rip), %rsi
+ movq %r8, 24(%rsp)
+ movq %r9, 32(%rsp)
+ movq %r10, 40(%rsp)
+ movq %r11, 48(%rsp)
+ movq %rdx, 56(%rsp)
+ movq %rcx, 64(%rsp)
+ call _dl_tlsdesc_resolve_hold_fixup
+1:
+ movq (%rsp), %rax
+ movq 8(%rsp), %rdi
+ movq 16(%rsp), %rsi
+ movq 24(%rsp), %r8
+ movq 32(%rsp), %r9
+ movq 40(%rsp), %r10
+ movq 48(%rsp), %r11
+ movq 56(%rsp), %rdx
+ movq 64(%rsp), %rcx
+ addq $72, %rsp
+ cfi_adjust_cfa_offset (-72)
+ jmp *(%eax)
+ cfi_endproc
+ .size _dl_tlsdesc_resolve_hold, .-_dl_tlsdesc_resolve_hold
diff --git a/sysdeps/x86_64/dl-tlsdesc.h b/sysdeps/x86_64/dl-tlsdesc.h
new file mode 100644
index 0000000000..9e64aab5a7
--- /dev/null
+++ b/sysdeps/x86_64/dl-tlsdesc.h
@@ -0,0 +1,64 @@
+/* Thread-local storage descriptor handling in the ELF dynamic linker.
+ x86_64 version.
+ Copyright (C) 2005, 2008 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
+ 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. */
+
+#ifndef _X86_64_DL_TLSDESC_H
+# define _X86_64_DL_TLSDESC_H 1
+
+/* Use this to access DT_TLSDESC_PLT and DT_TLSDESC_GOT. */
+#ifndef ADDRIDX
+# define ADDRIDX(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM \
+ + DT_EXTRANUM + DT_VALNUM + DT_ADDRTAGIDX (tag))
+#endif
+
+/* Type used to represent a TLS descriptor in the GOT. */
+struct tlsdesc
+{
+ ptrdiff_t (*entry)(struct tlsdesc *on_rax);
+ void *arg;
+};
+
+typedef struct dl_tls_index
+{
+ unsigned long int ti_module;
+ unsigned long int ti_offset;
+} tls_index;
+
+/* Type used as the argument in a TLS descriptor for a symbol that
+ needs dynamic TLS offsets. */
+struct tlsdesc_dynamic_arg
+{
+ tls_index tlsinfo;
+ size_t gen_count;
+};
+
+extern ptrdiff_t attribute_hidden
+ _dl_tlsdesc_return(struct tlsdesc *on_rax),
+ _dl_tlsdesc_undefweak(struct tlsdesc *on_rax),
+ _dl_tlsdesc_resolve_rela(struct tlsdesc *on_rax),
+ _dl_tlsdesc_resolve_hold(struct tlsdesc *on_rax);
+
+# ifdef SHARED
+extern void *internal_function _dl_make_tlsdesc_dynamic (struct link_map *map,
+ size_t ti_offset);
+
+extern ptrdiff_t attribute_hidden _dl_tlsdesc_dynamic(struct tlsdesc *);
+# endif
+
+#endif
diff --git a/sysdeps/x86_64/tlsdesc.c b/sysdeps/x86_64/tlsdesc.c
new file mode 100644
index 0000000000..0cc32aab69
--- /dev/null
+++ b/sysdeps/x86_64/tlsdesc.c
@@ -0,0 +1,151 @@
+/* Manage TLS descriptors. x86_64 version.
+ Copyright (C) 2005, 2008 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
+ 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 <link.h>
+#include <ldsodefs.h>
+#include <elf/dynamic-link.h>
+#include <tls.h>
+#include <dl-tlsdesc.h>
+#include <tlsdeschtab.h>
+
+/* The following 2 functions take a caller argument, that contains the
+ address expected to be in the TLS descriptor. If it's changed, we
+ want to return immediately. */
+
+/* This function is used to lazily resolve TLS_DESC RELA relocations.
+ The argument location is used to hold a pointer to the relocation. */
+
+void
+attribute_hidden
+_dl_tlsdesc_resolve_rela_fixup (struct tlsdesc volatile *td,
+ struct link_map *l)
+{
+ const ElfW(Rela) *reloc = td->arg;
+
+ if (_dl_tlsdesc_resolve_early_return_p
+ (td, (void*)(D_PTR (l, l_info[ADDRIDX (DT_TLSDESC_PLT)]) + l->l_addr)))
+ return;
+
+ /* The code below was borrowed from _dl_fixup(). */
+ const ElfW(Sym) *const symtab
+ = (const void *) D_PTR (l, l_info[DT_SYMTAB]);
+ const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
+ const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
+ lookup_t result;
+
+ /* Look up the target symbol. If the normal lookup rules are not
+ used don't look in the global scope. */
+ if (ELFW(ST_BIND) (sym->st_info) != STB_LOCAL
+ && __builtin_expect (ELFW(ST_VISIBILITY) (sym->st_other), 0) == 0)
+ {
+ const struct r_found_version *version = NULL;
+
+ if (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
+ {
+ const ElfW(Half) *vernum =
+ (const void *) D_PTR (l, l_info[VERSYMIDX (DT_VERSYM)]);
+ ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)] & 0x7fff;
+ version = &l->l_versions[ndx];
+ if (version->hash == 0)
+ version = NULL;
+ }
+
+ result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym,
+ l->l_scope, version, ELF_RTYPE_CLASS_PLT,
+ DL_LOOKUP_ADD_DEPENDENCY, NULL);
+ }
+ else
+ {
+ /* We already found the symbol. The module (and therefore its load
+ address) is also known. */
+ result = l;
+ }
+
+ if (! sym)
+ {
+ td->arg = (void*)reloc->r_addend;
+ td->entry = _dl_tlsdesc_undefweak;
+ }
+ else
+ {
+# ifndef SHARED
+ CHECK_STATIC_TLS (l, result);
+# else
+ if (!TRY_STATIC_TLS (l, result))
+ {
+ td->arg = _dl_make_tlsdesc_dynamic (result, sym->st_value
+ + reloc->r_addend);
+ td->entry = _dl_tlsdesc_dynamic;
+ }
+ else
+# endif
+ {
+ td->arg = (void*)(sym->st_value - result->l_tls_offset
+ + reloc->r_addend);
+ td->entry = _dl_tlsdesc_return;
+ }
+ }
+
+ _dl_tlsdesc_wake_up_held_fixups ();
+}
+
+/* This function is used to avoid busy waiting for other threads to
+ complete the lazy relocation. Once another thread wins the race to
+ relocate a TLS descriptor, it sets the descriptor up such that this
+ function is called to wait until the resolver releases the
+ lock. */
+
+void
+attribute_hidden
+_dl_tlsdesc_resolve_hold_fixup (struct tlsdesc volatile *td,
+ void *caller)
+{
+ /* Maybe we're lucky and can return early. */
+ if (caller != td->entry)
+ return;
+
+ /* Locking here will stop execution until the running resolver runs
+ _dl_tlsdesc_wake_up_held_fixups(), releasing the lock.
+
+ FIXME: We'd be better off waiting on a condition variable, such
+ that we didn't have to hold the lock throughout the relocation
+ processing. */
+ __rtld_lock_lock_recursive (GL(dl_load_lock));
+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
+}
+
+/* Unmap the dynamic object, but also release its TLS descriptor table
+ if there is one. */
+
+void
+internal_function
+_dl_unmap (struct link_map *map)
+{
+ __munmap ((void *) (map)->l_map_start,
+ (map)->l_map_end - (map)->l_map_start);
+
+#if SHARED
+ /* _dl_unmap is only called for dlopen()ed libraries, for which
+ calling free() is safe, or before we've completed the initial
+ relocation, in which case calling free() is probably pointless,
+ but still safe. */
+ if (map->l_mach.tlsdesc_table)
+ htab_delete (map->l_mach.tlsdesc_table);
+#endif
+}
diff --git a/sysdeps/x86_64/tlsdesc.sym b/sysdeps/x86_64/tlsdesc.sym
new file mode 100644
index 0000000000..33854975d0
--- /dev/null
+++ b/sysdeps/x86_64/tlsdesc.sym
@@ -0,0 +1,17 @@
+#include <stddef.h>
+#include <sysdep.h>
+#include <tls.h>
+#include <link.h>
+#include <dl-tlsdesc.h>
+
+--
+
+-- Abuse tls.h macros to derive offsets relative to the thread register.
+
+DTV_OFFSET offsetof(struct pthread, header.dtv)
+
+TLSDESC_ARG offsetof(struct tlsdesc, arg)
+
+TLSDESC_GEN_COUNT offsetof(struct tlsdesc_dynamic_arg, gen_count)
+TLSDESC_MODID offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_module)
+TLSDESC_MODOFF offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_offset)
diff --git a/version.h b/version.h
index 97aa661e6e..4bb7ab359c 100644
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
/* This file just defines the current version number of libc. */
-#define RELEASE "stable"
-#define VERSION "2.8"
+#define RELEASE "development"
+#define VERSION "2.8.90"