From 78463734c14d180e4d8e16c6e66fb213fc3479c0 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 15 May 2008 07:57:49 +0000 Subject: Updated to fedora-glibc-20080515T0735 --- ChangeLog | 304 + NEWS | 20 +- bits/byteswap.h | 4 +- bits/termios.h | 94 +- configure | 2 +- configure.in | 2 +- elf/dl-conflict.c | 9 +- elf/dl-reloc.c | 42 +- elf/dl-tls.c | 99 +- elf/dynamic-link.h | 27 +- elf/elf.h | 22 +- elf/tlsdeschtab.h | 157 + fedora/branch.mk | 4 +- fedora/glibc.spec.in | 18 +- fedora/glibc_post_upgrade.c | 4 +- iconv/gconv_simple.c | 18 +- iconvdata/Makefile | 3 + iconvdata/bug-iconv6.c | 2 +- iconvdata/run-iconv-test.sh | 4 +- include/arpa/nameser_compat.h | 7 + include/inline-hashtab.h | 302 + include/resolv.h | 8 +- inet/netinet/in.h | 6 +- io/openat.c | 2 +- io/openat64.c | 2 +- localedata/ChangeLog | 18 + localedata/charmaps/UTF-8 | 133 +- localedata/locales/be_BY | 2 +- localedata/locales/i18n | 412 +- localedata/locales/iso14651_t1_common | 273 + math/libm-test.inc | 1 + misc/truncate64.c | 2 +- nis/Versions | 3 +- nis/nss_nis/nis-hosts.c | 118 +- nis/nss_nisplus/nisplus-hosts.c | 222 +- nptl/ChangeLog | 14 + .../sysv/linux/i386/i486/pthread_rwlock_rdlock.S | 8 +- .../linux/i386/i486/pthread_rwlock_timedrdlock.S | 8 +- .../linux/i386/i486/pthread_rwlock_timedwrlock.S | 8 +- .../sysv/linux/i386/i486/pthread_rwlock_unlock.S | 6 +- .../sysv/linux/i386/i486/pthread_rwlock_wrlock.S | 8 +- nscd/Makefile | 2 +- nscd/aicache.c | 496 +- nscd/cache.c | 7 +- nscd/grpcache.c | 28 +- nscd/hstcache.c | 15 +- nscd/initgrcache.c | 15 +- nscd/mem.c | 2 +- nscd/pwdcache.c | 29 +- nscd/servicescache.c | 15 +- nss/Versions | 1 + nss/getent.c | 16 + nss/nss.h | 14 +- nss/nss_files/files-hosts.c | 133 +- po/lt.po | 7082 ++++++++++++++++++++ posix/regcomp.c | 48 +- posix/regex_internal.c | 6 +- posix/tst-rfc3484-2.c | 11 + posix/tst-rfc3484-3.c | 11 + posix/tst-rfc3484.c | 11 + resolv/Versions | 1 + resolv/gethnamaddr.c | 6 +- resolv/nss_dns/dns-canon.c | 4 +- resolv/nss_dns/dns-host.c | 337 +- resolv/nss_dns/dns-network.c | 6 +- resolv/res_mkquery.c | 12 +- resolv/res_query.c | 149 +- resolv/res_send.c | 323 +- stdlib/tst-setcontext.c | 3 +- string/Makefile | 7 +- string/endian.h | 38 +- string/memmem.c | 58 +- string/str-two-way.h | 430 ++ string/strcasestr.c | 152 +- string/strstr.c | 142 +- string/tester.c | 34 +- string/tst-endian.c | 112 + sysdeps/i386/Makefile | 10 + sysdeps/i386/bits/byteswap.h | 4 +- sysdeps/i386/bits/linkmap.h | 1 + sysdeps/i386/dl-lookupcfg.h | 28 + sysdeps/i386/dl-machine.h | 131 +- sysdeps/i386/dl-tls.h | 2 +- sysdeps/i386/dl-tlsdesc.S | 290 + sysdeps/i386/dl-tlsdesc.h | 61 + sysdeps/i386/tlsdesc.c | 269 + sysdeps/i386/tlsdesc.sym | 17 + sysdeps/ia64/bits/byteswap.h | 4 +- sysdeps/ieee754/flt-32/w_expf.c | 2 +- sysdeps/ieee754/ldbl-128/e_j0l.c | 4 +- sysdeps/ieee754/ldbl-128/e_j1l.c | 4 +- sysdeps/ieee754/ldbl-128/s_expm1l.c | 2 +- sysdeps/ieee754/ldbl-128/s_log1pl.c | 9 +- sysdeps/mach/hurd/bits/ioctls.h | 56 +- sysdeps/posix/getaddrinfo.c | 261 +- sysdeps/s390/bits/byteswap.h | 4 +- sysdeps/sparc/sparc32/Makefile | 4 + sysdeps/sparc/sparc64/Makefile | 4 + sysdeps/unix/sysv/linux/alpha/bits/resource.h | 10 +- sysdeps/unix/sysv/linux/bits/resource.h | 10 +- sysdeps/unix/sysv/linux/bits/socket.h | 4 +- sysdeps/unix/sysv/linux/dl-osinfo.h | 1 + sysdeps/unix/sysv/linux/sparc/bits/resource.h | 10 +- sysdeps/unix/sysv/linux/sparc/sparc32/Makefile | 4 + sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S | 85 + .../unix/sysv/linux/sparc/sparc32/makecontext.c | 93 + sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S | 119 + .../unix/sysv/linux/sparc/sparc32/swapcontext.S | 119 + sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S | 1 + .../unix/sysv/linux/sparc/sparc32/ucontext_i.sym | 61 + sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S | 1 + sysdeps/unix/sysv/linux/sys/user.h | 2 +- sysdeps/unix/sysv/linux/times.c | 59 + sysdeps/x86_64/Makefile | 10 + sysdeps/x86_64/bits/byteswap.h | 4 +- sysdeps/x86_64/bits/linkmap.h | 2 + sysdeps/x86_64/dl-lookupcfg.h | 28 + sysdeps/x86_64/dl-machine.h | 53 +- sysdeps/x86_64/dl-tls.h | 4 +- sysdeps/x86_64/dl-tlsdesc.S | 245 + sysdeps/x86_64/dl-tlsdesc.h | 64 + sysdeps/x86_64/tlsdesc.c | 151 + sysdeps/x86_64/tlsdesc.sym | 17 + version.h | 4 +- 124 files changed, 13219 insertions(+), 1263 deletions(-) create mode 100644 elf/tlsdeschtab.h create mode 100644 include/inline-hashtab.h create mode 100644 po/lt.po create mode 100644 string/str-two-way.h create mode 100644 string/tst-endian.c create mode 100644 sysdeps/i386/dl-lookupcfg.h create mode 100644 sysdeps/i386/dl-tlsdesc.S create mode 100644 sysdeps/i386/dl-tlsdesc.h create mode 100644 sysdeps/i386/tlsdesc.c create mode 100644 sysdeps/i386/tlsdesc.sym create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym create mode 100644 sysdeps/unix/sysv/linux/times.c create mode 100644 sysdeps/x86_64/dl-lookupcfg.h create mode 100644 sysdeps/x86_64/dl-tlsdesc.S create mode 100644 sysdeps/x86_64/dl-tlsdesc.h create mode 100644 sysdeps/x86_64/tlsdesc.c create mode 100644 sysdeps/x86_64/tlsdesc.sym diff --git a/ChangeLog b/ChangeLog index 826b080137..097f3173f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,291 @@ +2008-05-14 Ulrich Drepper + + * string/Makefile (distribute): Add str-two-way.h. + +2008-03-29 Eric Blake + + 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 + + * 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 + + [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 . + * 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 + + * iconvdata/Makefile (bug-iconv6-ENV, tst-iconv7-ENV): Define. + +2008-05-14 Ulrich Drepper + + * 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 + + * po/lt.po: New file. From Lituanian translation team. + +2008-01-30 Alexandre Oliva + + 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 + + * 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 + + [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 + + * 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 . + + * string/tester.c (test_memcmp): Add a few more tests. + Patch by Mats Erik Andersson . + +2008-05-10 Ulrich Drepper + + * 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 + + [BZ #6505] + * sysdeps/unix/sysv/linux/sys/user.h: Replace with #error stub. + +2008-05-08 David S. Miller + + * 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 + + * 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 + + * 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 + + 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 + + * 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 + + * 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 + + * stdlib/tst-setcontext.c: Include unistd.h. + 2008-04-25 David S. Miller * 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 + + * resolv/res_mkquery.c (__res_nopt): Use NS_PUT16 instead of ns_put16. + 2008-04-15 Ulrich Drepper + [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 + + * sysdeps/unix/sysv/linux/dl-osinfo.h: Include fcntl.h. + 2008-04-11 Ulrich Drepper * 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 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 directly; include 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 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 , 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 #include 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 + + 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 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 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 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 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 , 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 @@ -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 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 , 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 + +/* 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 + + 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 + + [BZ #6438] + * locales/iso14651_t1_common: Add sorting data for Telugu. + + [BZ #6447] + * locales/be_BY: Fix yesexpr. + Patch by Alexander Mikhailian . + +2008-04-15 Ulrich Drepper + + * charmaps/UTF-8: Update for Unicode v5.1. + * locales/i18n: Update for Unicode 5. + +2008-04-09 Ulrich Drepper + + * tst-langinfo.sh: Adjust for latest fr_FR locale changes. + 2008-04-07 Ulrich Drepper [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 /xcd/xbc GREEK SMALL DOTTED LUNATE SIGMA SYMBOL /xcd/xbd GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL /xcd/xbe GREEK QUESTION MARK - /xcd/xbf GREEK CAPITAL KAI SYMBOL /xce/x84 GREEK TONOS /xce/x85 GREEK DIALYTIKA TONOS /xce/x86 GREEK CAPITAL LETTER ALPHA WITH TONOS @@ -972,6 +971,7 @@ CHARMAP /xcf/x8c GREEK SMALL LETTER OMICRON WITH TONOS /xcf/x8d GREEK SMALL LETTER UPSILON WITH TONOS /xcf/x8e GREEK SMALL LETTER OMEGA WITH TONOS + /xcf/x8f GREEK CAPITAL KAI SYMBOL /xcf/x90 GREEK BETA SYMBOL /xcf/x91 GREEK THETA SYMBOL /xcf/x92 GREEK UPSILON WITH HOOK SYMBOL @@ -9443,71 +9443,71 @@ CHARMAP /xe2/xb4/xa3 GEORGIAN SMALL LETTER WE /xe2/xb4/xa4 GEORGIAN SMALL LETTER HAR /xe2/xb4/xa5 GEORGIAN SMALL LETTER HOE - /xe2/xb4/xb0 TIFINAGH YA - /xe2/xb4/xb1 LETTRE TIFINAGHE YAB - /xe2/xb4/xb2 LETTRE TIFINAGHE YAB SPIRANT - /xe2/xb4/xb3 LETTRE TIFINAGHE YAG - /xe2/xb4/xb4 LETTRE TIFINAGHE YAG SPIRANT - /xe2/xb4/xb5 LETTRE TIFINAGHE YADJ KABYLE - /xe2/xb4/xb6 LETTRE TIFINAGHE YADJ - /xe2/xb4/xb7 LETTRE TIFINAGHE YAD - /xe2/xb4/xb8 LETTRE TIFINAGHE YAD SPIRANT (yadh) - /xe2/xb4/xb9 LETTRE TIFINAGHE YADD - /xe2/xb4/xba LETTRE TIFINAGHE YADD SPIRANT - /xe2/xb4/xbb LETTRE TIFINAGHE YEY - /xe2/xb4/xbc LETTRE TIFINAGHE YAF - /xe2/xb4/xbd LETTRE TIFINAGHE YAK - /xe2/xb4/xbe LETTRE TIFINAGHE YAK TOUAREG - /xe2/xb4/xbf LETTRE TIFINAGHE YAK SPIRANT - /xe2/xb5/x80 LETTRE TIFINAGHE YAH (yab touareg) - /xe2/xb5/x81 LETTRE TIFINAGHE YAH KABYLE - /xe2/xb5/x82 LETTRE TIFINAGHE YAH TOUAREG - /xe2/xb5/x83 LETTRE TIFINAGHE YAHH - /xe2/xb5/x84 LETTRE TIFINAGHE YA’ - /xe2/xb5/x85 LETTRE TIFINAGHE YAKH - /xe2/xb5/x86 LETTRE TIFINAGHE YAKH TOUAREG (quatre-points en carré touareg) - /xe2/xb5/x87 LETTRE TIFINAGHE YAQ - /xe2/xb5/x88 LETTRE TIFINAGHE YAQ TOUAREG - /xe2/xb5/x89 LETTRE TIFINAGHE YI - /xe2/xb5/x8a LETTRE TIFINAGHE YAJ - /xe2/xb5/x8b LETTRE TIFINAGHE YAJ DE L’AHAGGAR - /xe2/xb5/x8c LETTRE TIFINAGHE YAJ TOUAREG - /xe2/xb5/x8d LETTRE TIFINAGHE YAL - /xe2/xb5/x8e LETTRE TIFINAGHE YAM - /xe2/xb5/x8f LETTRE TIFINAGHE YAN - /xe2/xb5/x90 LETTRE TIFINAGHE YAGN TOUAREG - /xe2/xb5/x91 LETTRE TIFINAGHE YANG TOUAREG - /xe2/xb5/x92 LETTRE TIFINAGHE YAP - /xe2/xb5/x93 LETTRE TIFINAGHE YOU (yaw touareg) - /xe2/xb5/x94 LETTRE TIFINAGHE YAR - /xe2/xb5/x95 LETTRE TIFINAGHE YARR - /xe2/xb5/x96 LETTRE TIFINAGHE YAGH - /xe2/xb5/x97 LETTRE TIFINAGHE YAGH TOUAREG - /xe2/xb5/x98 LETTRE TIFINAGHE YAGH DE L’AÏR (yadj de l’Adrar, cinq-points en quinconce touareg) - /xe2/xb5/x99 LETTRE TIFINAGHE YAS - /xe2/xb5/x9a LETTRE TIFINAGHE YASS - /xe2/xb5/x9b LETTRE TIFINAGHE YACH - /xe2/xb5/x9c LETTRE TIFINAGHE YAT - /xe2/xb5/x9d LETTRE TIFINAGHE YAT SPIRANT (yath) - /xe2/xb5/x9e LETTRE TIFINAGHE YATCH - /xe2/xb5/x9f LETTRE TIFINAGHE YATT - /xe2/xb5/xa0 LETTRE TIFINAGHE YAV - /xe2/xb5/xa1 LETTRE TIFINAGHE YAW - /xe2/xb5/xa2 LETTRE TIFINAGHE YAY - /xe2/xb5/xa3 LETTRE TIFINAGHE YAZ - /xe2/xb5/xa4 LETTRE TIFINAGHE YAZ TAWELLEMET (yaz harpon) - /xe2/xb5/xa5 LETTRE TIFINAGHE YAZZ - /xe2/xb5/xaf LETTRE MODIFICATIVE TIFINAGHE DE LABIO-VÉLARISATION (tamatart) - /xe2/xb6/x80 ETHIOPIC SYLLALE LOA - /xe2/xb6/x81 ETHIOPIC SYLLALE MOA - /xe2/xb6/x82 ETHIOPIC SYLLALE ROA - /xe2/xb6/x83 ETHIOPIC SYLLALE SOA - /xe2/xb6/x84 ETHIOPIC SYLLALE SHOA - /xe2/xb6/x85 ETHIOPIC SYLLALE BOA - /xe2/xb6/x86 ETHIOPIC SYLLALE TOA - /xe2/xb6/x87 ETHIOPIC SYLLALE COA - /xe2/xb6/x88 ETHIOPIC SYLLALE NOA - /xe2/xb6/x89 ETHIOPIC SYLLALE NYOA + /xe2/xb4/xb0 TIFINAGH LETTER YA + /xe2/xb4/xb1 TIFINAGH LETTER YAB + /xe2/xb4/xb2 TIFINAGH LETTER YABH + /xe2/xb4/xb3 TIFINAGH LETTER YAG + /xe2/xb4/xb4 TIFINAGH LETTER YAGHH + /xe2/xb4/xb5 TIFINAGH LETTER BERBER ACADEMY YAJ + /xe2/xb4/xb6 TIFINAGH LETTER YAJ + /xe2/xb4/xb7 TIFINAGH LETTER YAD + /xe2/xb4/xb8 TIFINAGH LETTER YADH + /xe2/xb4/xb9 TIFINAGH LETTER YADD + /xe2/xb4/xba TIFINAGH LETTER YADDH + /xe2/xb4/xbb TIFINAGH LETTER YEY + /xe2/xb4/xbc TIFINAGH LETTER YAF + /xe2/xb4/xbd TIFINAGH LETTER YAK + /xe2/xb4/xbe TIFINAGH LETTER TUAREG YAK + /xe2/xb4/xbf TIFINAGH LETTER YAKHH + /xe2/xb5/x80 TIFINAGH LETTER YAH + /xe2/xb5/x81 TIFINAGH LETTER BERBER ACADEMY YAH + /xe2/xb5/x82 TIFINAGH LETTER TUAREG YAH + /xe2/xb5/x83 TIFINAGH LETTER YAHH + /xe2/xb5/x84 TIFINAGH LETTER YAA + /xe2/xb5/x85 TIFINAGH LETTER YAKH + /xe2/xb5/x86 TIFINAGH LETTER TUAREG YAKH + /xe2/xb5/x87 TIFINAGH LETTER YAQ + /xe2/xb5/x88 TIFINAGH LETTER TUAREG YAQ + /xe2/xb5/x89 TIFINAGH LETTER YI + /xe2/xb5/x8a TIFINAGH LETTER YAZH + /xe2/xb5/x8b TIFINAGH LETTER AHAGGAR YAZH + /xe2/xb5/x8c TIFINAGH LETTER TUAREG YAZH + /xe2/xb5/x8d TIFINAGH LETTER YAL + /xe2/xb5/x8e TIFINAGH LETTER YAM + /xe2/xb5/x8f TIFINAGH LETTER YAN + /xe2/xb5/x90 TIFINAGH LETTER TUAREG YAGN + /xe2/xb5/x91 TIFINAGH LETTER TUAREG YANG + /xe2/xb5/x92 TIFINAGH LETTER YAP + /xe2/xb5/x93 TIFINAGH LETTER YU + /xe2/xb5/x94 TIFINAGH LETTER YAR + /xe2/xb5/x95 TIFINAGH LETTER YARR + /xe2/xb5/x96 TIFINAGH LETTER YAGH + /xe2/xb5/x97 TIFINAGH LETTER TUAREG YAGH + /xe2/xb5/x98 TIFINAGH LETTER AYER YAGH + /xe2/xb5/x99 TIFINAGH LETTER YAS + /xe2/xb5/x9a TIFINAGH LETTER YASS + /xe2/xb5/x9b TIFINAGH LETTER YASH + /xe2/xb5/x9c TIFINAGH LETTER YAT + /xe2/xb5/x9d TIFINAGH LETTER YATH + /xe2/xb5/x9e TIFINAGH LETTER YACH + /xe2/xb5/x9f TIFINAGH LETTER YATT + /xe2/xb5/xa0 TIFINAGH LETTER YAV + /xe2/xb5/xa1 TIFINAGH LETTER YAW + /xe2/xb5/xa2 TIFINAGH LETTER YAY + /xe2/xb5/xa3 TIFINAGH LETTER YAZ + /xe2/xb5/xa4 TIFINAGH LETTER TAWELLEMET YAZ + /xe2/xb5/xa5 TIFINAGH LETTER YAZZ + /xe2/xb5/xaf TIFINAGH MODIFIER LETTER LABIALIZATION MARK + /xe2/xb6/x80 ETHIOPIC SYLLABLE LOA + /xe2/xb6/x81 ETHIOPIC SYLLABLE MOA + /xe2/xb6/x82 ETHIOPIC SYLLABLE ROA + /xe2/xb6/x83 ETHIOPIC SYLLABLE SOA + /xe2/xb6/x84 ETHIOPIC SYLLABLE SHOA + /xe2/xb6/x85 ETHIOPIC SYLLABLE BOA + /xe2/xb6/x86 ETHIOPIC SYLLABLE TOA + /xe2/xb6/x87 ETHIOPIC SYLLABLE COA + /xe2/xb6/x88 ETHIOPIC SYLLABLE NOA + /xe2/xb6/x89 ETHIOPIC SYLLABLE NYOA /xe2/xb6/x8a ETHIOPIC SYLLABLE GLOTTAL OA /xe2/xb6/x8b ETHIOPIC SYLLABLE ZOA /xe2/xb6/x8c ETHIOPIC SYLLABLE DOA @@ -26425,7 +26425,6 @@ CHARMAP /xef/xbf/xbc OBJECT REPLACEMENT CHARACTER /xef/xbf/xbd REPLACEMENT CHARACTER /xf0/x90/x80/x80 LINEAR B SYLLABLE B008 A - /xf0/x90/x80/x80 LINEAR B SYLLABLE B008 A /xf0/x90/x80/x81 LINEAR B SYLLABLE B038 E /xf0/x90/x80/x82 LINEAR B SYLLABLE B028 I /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 "" +yesexpr "" noexpr "" 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 / ;;;;/ ;..;;;;;/ % BASIC GREEK/ + ;;;/ ;..;;;;..;/ ..;..(2)..;/ % GREEK SYMBOLS AND COPTIC/ @@ -73,7 +71,7 @@ upper / ;..(2)..;;..(2)..;/ ..(2)..;/ % CYRILLIC SUPPLEMENT/ - ..(2)..;/ + ..(2)..;/ % ARMENIAN/ ..;/ % GEORGIAN/ @@ -83,8 +81,8 @@ upper / ..;/ % LATIN EXTENDED ADDITIONAL/ ..(2)..;/ - ..(2)..;/ - ..(2)..;/ + ..(2)..;;/ + ..(2)..;/ % GREEK EXTENDED/ ..;..;..;..;/ ..;..(2)..;..;/ @@ -101,9 +99,15 @@ upper / % GLAGOLITIC/ ..;/ % LATIN EXTENDED-C/ - ;..;..(2)..;;/ + ;..;..(2)..;..;/ + ;;;/ % COPTIC/ ..(2)..;/ +% CYRILLIC SUPPLEMENT 2/ + ..(2)..;..(2)..;..(2)..;/ +% LATIN EXTENDED-D/ + ..(2)..;..(2)..;..(2)..;/ + ..(2)..;/ % HALFWIDTH AND FULLWIDTH FORMS/ ..;/ % DESERET/ @@ -133,6 +137,7 @@ lower / % COMBINING DIACRITICAL MARKS/ ;/ % BASIC GREEK/ + ;;;/ ..;/ ..;..;/ % GREEK SYMBOLS AND COPTIC/ @@ -142,13 +147,13 @@ lower / ..;..(2)..;/ ;..(2)..;..(2)..;/ ;/ - ..(2)..;/ + ..(2)..;/ % ARMENIAN/ ..;/ % PHONETIC EXTENSIONS/ ;/ % LATIN EXTENDED ADDITIONAL/ - ..(2)..;;..(2)..;/ + ..(2)..;..;;..(2)..;/ % GREEK EXTENDED/ ..;..;..;..;/ ..;..(2)..;..;..;/ @@ -158,19 +163,25 @@ lower / % LETTERLIKE SYMBOLS/ ;/ % NUMBER FORMS/ - ..;;/ + ..;;/ % ENCLOSED ALPHANUMERICS/ ..;/ % GLAGOLITIC/ ..;/ % LATIN EXTENDED-C/ - ;;..(2)..;;/ + ;;..(2)..;;;;/ + ..;/ % COPTIC/ ..(2)..;/ % 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/ ..;/ +% CYRILLIC SUPPLEMENT 2/ + ..(2)..;..(2)..;..(2)..;/ +% LATIN EXTENDED-D/ + ..(2)..;;..(2)..;..;/ + ..(2)..;..(2)..;;/ % HALFWIDTH AND FULLWIDTH FORMS/ ..;/ % DESERET/ @@ -196,7 +207,7 @@ alpha / % COMBINING DIACRITICAL MARKS/ ;/ % BASIC GREEK/ - ..;;/ + ..;..;..;;/ ..;;..;/ ..;/ % GREEK SYMBOLS AND COPTIC/ @@ -204,18 +215,18 @@ alpha / % CYRILLIC/ ..;..;/ % CYRILLIC SUPPLEMENT/ - ..;/ + ..;/ % ARMENIAN/ ..;;..;/ % HEBREW/ ..;..;/ % ARABIC/ - ..;..;..;..;/ + ..;..;..;/ ;..;..;..;;/ % SYRIAC/ ;..;..;/ % ARABIC SUPPLEMENT/ - ..;/ + ..;/ % THAANA/ ..;;/ % NKO/ @@ -238,20 +249,20 @@ alpha / % ORIYA/ ..;;;..;..;/ ;;..;;;;/ - ..;;/ + ..;;/ % TAMIL/ ;..;..;..;;/ ;;;;;;..;/ ..;/ % TELUGU/ ..;..;..;..;/ - ..;..;/ + ..;;..;..;/ % KANNADA/ ..;..;..;..;/ ..;;..;/ % MALAYALAM/ ..;..;..;..;/ - ..;/ + ;..;/ % SINHALA/ ..;..;..;;/ ..;/ @@ -263,9 +274,10 @@ alpha / ..;..;..;;/ ..;;..;/ % TIBETAN/ - ;..;..;..;/ + ;..;..;..;/ % MYANMAR/ - ..;..;;;..;/ + ..;..;..;;;/ + ;..;..;;/ % GEORGIAN/ ..;..;;/ % HANGUL JAMO/ @@ -298,7 +310,7 @@ alpha / % KHMER/ ..;;;/ % MONGOLIAN/ - ..;..;/ + ..;..;;/ % LIMBU/ ..;..;/ % TAI LE/ @@ -309,10 +321,16 @@ alpha / ..;/ % BALINESE/ ..;..;..;/ +% SUNDANESE/ + ..;..;/ +% LEPCHA/ + ..;..;/ +% OL CHIKI/ + ..;/ % PHONETIC EXTENSIONS/ ..;/ % LATIN EXTENDED ADDITIONAL/ - ..;..;/ + ..;..;/ % GREEK EXTENDED/ ..;..;..;..;/ ..;;;;..;/ @@ -326,13 +344,13 @@ alpha / ;..;..;/ ..;..;;/ % NUMBER FORMS/ - ..;/ + ..;/ % ENCLOSED ALPHANUMERICS/ ..;/ % GLAGOLITIC/ ..;..;/ % LATIN EXTENDED-C/ - ..;..;/ + ..;..;/ % COPTIC/ ..;/ % GEORGIAN SUPPLEMENT/ @@ -350,7 +368,7 @@ alpha / % KATAKANA/ ..;..;/ % BOPOMOFO/ - ..;/ + ..;/ % HANGUL COMPATIBILITY JAMO/ ..;/ % BOPOMOFO EXTENDED/ @@ -363,12 +381,24 @@ alpha / ..;/ % YI SYLLABLES/ ..;/ +% VAI SYLLABLES/ + ..;..;..;/ +% CYRILLIC SUPPLEMENT 2/ + ..;..;..;/ % LATIN EXTENDED-D/ - ..;/ + ..;..;..;/ % SYLOTI NEGRI/ ;;..;..;..;/ % PHAGS PA/ ..;/ +% SAURASHTRA/ + ..;/ +% KAYAH LI/ + ..;/ +% REJANG/ + ..;/ +% CHAM/ + ..;..;..;/ % HANGUL SYLLABLES/ ..;/ % CJK COMPATIBILITY IDEOGRAPHS/ @@ -394,6 +424,10 @@ alpha / ..;/ % ANCIENT GREEK NUMBERS/ ..;/ +% LYCIAN/ + ..;/ +% CARIAN/ + ..;/ % OLD ITALIC/ ..;/ % GOTHIC/ @@ -458,11 +492,11 @@ alpha / % TAMIL/ ..;/ % TELUGU/ - ..;/ + ..;..;/ % KANNADA/ ..;/ % MALAYALAM/ - ..;/ + ..;..;/ % THAI/ ..;/ % LAO/ @@ -475,6 +509,20 @@ alpha / ..;/ % MONGOLIAN/ ..;/ +% SUNDANESE/ + ..;/ +% LEPCHA/ + ..;/ +% OL CHIKI/ + ..;/ +% VAI/ + ..;/ +% SAURASHTRA/ + ..;/ +% KAYAH LI/ + ..;/ +% CHAM/ + ..;/ % HALFWIDTH AND FULLWIDTH FORMS/ .. @@ -514,57 +562,67 @@ punct / ..;..;..;;/ ..;;;..;..;/ ..;..;..;..;/ - ..;..;;..;/ + ..;..;..;/ ..;..;;;..;/ ..;..;..;;;/ ..;..;..;..;/ ..;;..;..;/ - ..;;..;;..;/ + ..;;..;;..;/ ..;..;;..;/ ..;..;;..;/ - ..;..;..;..;/ + ..;..;;..;/ + ;..;/ ;..;..;..;/ - ..;;..;;..;/ + ..;;..;;..;/ ..;..;..;;;/ - ..;..;..;;/ + ..;..;..;;;/ ..;..;..;..;/ ..;..;..;;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;;..;;/ ..;;..;..;;/ ;;;..;;..;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;;/ + ;..;..;/ ..;..;..;..;/ ..;..;..;..;/ ..;;..;..;;/ ..;..;;..;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;;..;/ + ..;..;..;..;/ + ..;/ + ..;..;;..;/ ..;..;..;..;/ - ;..;..;..;/ + ;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ;..;..;;;;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;;..;;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;;..;..;/ + ..;..;/ + ..;..;..;/ ..;..;..;..;/ ..;..;..;..;/ ..;..;;;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ ..;;;;..;/ - ..;..;;;..;/ - ..;..;..;..;/ + ..;;;..;..;/ + ..;..;;..;;/ + ..;..;/ + ..;;;..;/ + ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ ..;..;..;/ @@ -575,7 +633,7 @@ punct / ..;..;/ ..;..;/ ..;..;/ - ..;..;/ + ..;..;/ ..;..;/ ..;;;;;/ ;;;;;;/ @@ -583,52 +641,55 @@ punct / ..;.. graph / - ..;..;..;..;/ - ..;;..;..;/ - ..;..;..;..;/ + ..;..;..;/ + ..;;..;..;/ + ..;..;..;/ ..;..;..;..;/ - ..;..;..;;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;;/ ..;..;..;..;/ ..;..;..;..;/ ..;..;..;;/ - ..;..;..;..;/ - ;..;..;..;/ + ..;..;..;;/ + ..;/ + ;..;..;..;/ ..;..;..;..;/ ..;..;..;..;/ ;..;..;;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ - ..;..;;..;/ + ..;..;;;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;/ ..;..;..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;/ ..;;..;;..;/ ;..;..;..;/ ..;..;;..;;/ ;..;..;..;;/ ;..;..;..;/ ..;;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;;;/ + ..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ @@ -638,37 +699,43 @@ graph / ..;..;..;..;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;/ + ..;..;..;..;/ ..;..;..;..;/ ;;;..;..;/ ..;..;..;..;/ ..;..;;..;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ ..;..;;..;;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;;..;..;/ + ..;/ + ..;..;..;..;/ ..;..;..;;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ..;;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ;..;..;..;/ ..;..;..;..;/ @@ -677,6 +744,8 @@ graph / ..;..;/ ..;..;/ ..;..;/ + ..;..;/ + ..;..;/ ..;..;/ ..;..;/ ..;..;/ @@ -690,7 +759,7 @@ graph / ..;..;/ ..;..;/ ..;..;/ - ..;..;/ + ..;..;/ ..;..;/ ..;..;/ ..;;..;/ @@ -701,57 +770,61 @@ graph / ..;..;;/ ..;..;/ ..;..;/ + ..;..;/ ..;..;;/ ..;..;/ ..;.. print / - ..;..;..;..;/ - ..;;..;..;/ - ..;..;..;..;/ + ..;..;..;/ + ..;;..;..;/ + ..;..;..;/ ..;..;..;..;/ - ..;..;..;;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;;/ ..;..;..;..;/ ..;..;..;..;/ ..;..;..;;/ - ..;..;..;..;/ - ;..;..;..;/ + ..;..;..;;/ + ..;/ + ;..;..;..;/ ..;..;..;..;/ ..;..;..;..;/ ;..;..;;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ - ..;..;;..;/ + ..;..;;;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;/ ..;..;..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;/ ..;;..;;..;/ ;..;..;..;/ ..;..;;..;;/ ;..;..;..;;/ ;..;..;..;/ ..;;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;;;/ + ..;..;/ ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ @@ -761,37 +834,45 @@ print / ..;..;..;..;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;/ + ..;..;..;..;/ ..;..;..;..;/ ;;;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ ;..;;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;;/ + ..;/ + ..;..;..;..;/ + ..;..;..;..;/ ..;;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ;..;..;..;/ + ..;/ ..;..;..;..;/ ..;..;..;;/ ..;..;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ ..;..;;..;/ ..;..;..;..;/ ..;..;..;/ @@ -800,6 +881,8 @@ print / ..;..;/ ..;..;/ ..;..;/ + ..;..;/ + ..;..;/ ..;..;/ ..;..;/ ..;..;/ @@ -813,7 +896,7 @@ print / ..;..;/ ..;..;/ ..;..;/ - ..;..;/ + ..;..;/ ..;..;/ ..;..;/ ..;;..;/ @@ -824,6 +907,7 @@ print / ..;..;;/ ..;..;/ ..;..;/ + ..;..;/ ..;..;;/ ..;..;/ ..;.. @@ -844,7 +928,8 @@ toupper / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -889,13 +974,16 @@ toupper / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -943,7 +1031,9 @@ toupper / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -983,7 +1073,8 @@ toupper / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1032,6 +1123,7 @@ toupper / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ + (,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1139,7 +1231,8 @@ tolower / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1186,6 +1279,8 @@ tolower / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1223,7 +1318,8 @@ tolower / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1235,6 +1331,7 @@ tolower / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ + (,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1284,7 +1381,8 @@ tolower / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1431,7 +1529,9 @@ map "totitle"; / (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ - (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ (,);(,);(,);(,);/ @@ -1574,35 +1674,40 @@ map "totitle"; / % That is, all combining characters (level 2+3). class "combining"; / ..;..;..;..;/ - ;..;..;;..;/ + ;..;..;;..;/ ..;;..;..;/ ..;..;;..;/ ..;..;..;;/ ..;..;..;..;/ ;..;..;..;;/ ..;..;;..;/ - ..;..;..;..;/ + ..;..;;..;/ + ;..;/ ;..;..;..;/ - ..;..;;..;/ + ..;..;;..;/ ..;..;..;;/ - ..;..;..;;/ + ..;..;..;;;/ ..;..;..;..;/ - ..;..;;..;/ + ..;..;..;;/ + ..;/ ..;..;..;..;/ - ..;..;..;..;/ - ;..;;..;;/ - ..;..;;..;/ + ..;..;..;..;/ + ;..;..;;..;/ + ;..;..;;..;/ ..;;..;..;/ ..;..;;;;/ ..;..;..;..;/ - ..;;..;..;/ - ..;;..;..;/ + ..;;..;/ + ..;..;..;..;/ + ..;..;;/ + ;..;..;/ ..;..;..;;/ ..;;..;..;/ ..;..;..;..;/ - ..;..;..;..;/ - ..;..;..;;;/ - ;..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;;;;;/ + ;..;;..;..;/ ..;..;/ ..;..;;/ ..;..;/ @@ -1619,20 +1724,25 @@ class "combining_level3"; / ..;..;;..;/ ..;..;;..;/ ..;;..;..;/ - ..;..;..;;/ + ..;;..;;..;/ + ;/ ..;..;..;..;/ - ..;;..;..;/ + ..;;..;..;/ ..;..;;..;/ - ..;..;;..;/ + ..;..;;;..;/ ..;..;..;..;/ + ..;/ ..;;..;..;/ ..;..;..;..;/ - ..;..;..;;/ + ..;..;..;;/ + ..;/ ..;;..;;..;/ ..;;..;..;;/ ..;..;..;..;/ ..;;..;..;/ - ..;..;..;..;/ + ..;..;..;..;/ + ..;/ + ..;..;;..;/ ..;..;..;..;/ ..;..;..;..;/ ..;..;..;..;/ 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 script script script +script # Déclaration des symboles internes / Declaration of internal symbols # @@ -652,6 +653,95 @@ collating-symbol collating-symbol collating-symbol +# +# +# tvd - denotes Telugu vowel modifier +# tm - denotes Telugu matras +# tvw - denotes Telugu vowels + +# defining symbols +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + # Ordre des symboles internes / Order of internal symbols # # SYMB. N° @@ -1236,6 +1326,92 @@ collating-symbol +# +# +# +# collation weights in order + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + order_start ;forward;backward;forward;forward,position # @@ -3201,6 +3377,103 @@ order_start ;forward;forward;forward;forward,position ;;;IGNORE IGNORE;;;IGNORE +order_start ;forward;forward;forward;forward,position + <0>;"";"";IGNORE + <0>;"";"";IGNORE + <1>;"";"";IGNORE + <1>;"";"";IGNORE + <1>;"";"";IGNORE + <2>;"";"";IGNORE + <2>;"";"";IGNORE + <2>;"";"";IGNORE + <3>;"";"";IGNORE + <3>;"";"";IGNORE + <3>;"";"";IGNORE + <4>;"";"";IGNORE + <5>;"";"";IGNORE + <6>;"";"";IGNORE + <7>;"";"";IGNORE + <8>;"";"";IGNORE + <9>;"";"";IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;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 , 1996. @@ -17,6 +18,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include #include /* 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 , 1997. @@ -17,6 +17,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include #include #include @@ -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 + + * 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 . + 2008-04-14 David S. Miller * 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 , 2004. @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -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 , 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 , 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 , 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 , 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 , 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 , 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 , 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 +#include __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 , 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 \n" +"Language-Team: Lithuanian \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" +".\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" +".\\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" +"." +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" +".\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: must be greater than \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 " character not in class `%s'" +msgstr "" + +#: locale/programs/ld-ctype.c:584 locale/programs/ld-ctype.c:621 +#, c-format +msgid " character must not be in class `%s'" +msgstr "" + +#: locale/programs/ld-ctype.c:599 +#, c-format +msgid "character 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 of range is smaller than from-value " +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" +".\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 or 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" +"." +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 %" +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 "" + +#: 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 "" + +#: 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 cache hits on positive entries\n" +"%15 cache hits on negative entries\n" +"%15 cache misses on positive entries\n" +"%15 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 number of delays on rdlock\n" +"%15 number of delays on wrlock\n" +"%15 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" +".\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 "" +#~ 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 , 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 #include #include #include @@ -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 , 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 #include #include +#include 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 + +#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 +/* This particular implementation was written by Eric Blake, 2008. */ + +#ifndef _LIBC +# include +#endif + +/* Specification of memmem. */ #include #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 , 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 (and + 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 +#include + +/* 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 #endif +/* Specification. */ +#include + #include +#include +#include -#if defined _LIBC || defined HAVE_STRING_H -# include -#endif +#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) -#ifdef _LIBC -# include -# 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 #endif -#if defined _LIBC || defined HAVE_STRING_H -# include +/* Specification of strstr. */ +#include + +#include + +#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 +#include +#include +#include + + +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 directly; include 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 + +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 #include #include +#include /* 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 +#include +#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 +#include +#include +#include +#include +#include + +/* 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 +#include +#include +#include +#include + +-- + +-- 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 directly; include 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 (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 #include #include +#include #include #include #include @@ -60,6 +61,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #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 directly; include 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 #include #include +#include #include #include #include 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 , 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 + +#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 , 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 +#include +#include +#include + +/* 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 , 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 +#include + +#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 , 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 +#include + +#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 +#include +#include + +-- + +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 +#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 +#include +#include + + +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 directly; include 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 + +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 #include #include +#include /* 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 +#include +#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 +#include +#include +#include +#include +#include + +/* 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 +#include +#include +#include +#include + +-- + +-- 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" -- cgit v1.2.3