about summary refs log tree commit diff
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
parentef73dbc1301bc42c132d15ae6ca866233c0beeb4 (diff)
downloadglibc-78463734c14d180e4d8e16c6e66fb213fc3479c0.tar.gz
glibc-78463734c14d180e4d8e16c6e66fb213fc3479c0.tar.xz
glibc-78463734c14d180e4d8e16c6e66fb213fc3479c0.zip
Updated to fedora-glibc-20080515T0735 cvs/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"