From 32c075e1f01849e161724bbd400ba77244e482cc Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 31 Jul 2007 13:33:18 +0000 Subject: [PATCH] . --- ChangeLog | 1627 ++++++----- Makeconfig | 2 + Makerules | 3 + NEWS | 14 +- README | 4 +- Versions.def | 2 - argp/Makefile | 4 +- argp/argp-help.c | 9 +- argp/tst-argp2.c | 101 + catgets/gencat.c | 4 +- config.h.in | 23 + config.make.in | 5 + configure | 81 +- configure.in | 44 +- csu/Versions | 4 +- csu/libc-start.c | 17 +- csu/libc-tls.c | 58 +- csu/tst-atomic.c | 113 +- csu/version.c | 7 +- debug/catchsegv.sh | 5 +- debug/xtrace.sh | 20 +- dlfcn/Makefile | 5 +- dlfcn/dlinfo.c | 15 +- elf/Makefile | 14 +- elf/cache.c | 2 +- elf/dl-addr.c | 330 +-- elf/dl-cache.c | 6 +- elf/dl-close.c | 158 +- elf/dl-deps.c | 2 +- elf/dl-dst.h | 9 +- elf/dl-fptr.c | 4 +- elf/dl-iteratephdr.c | 10 +- elf/dl-libc.c | 2 +- elf/dl-load.c | 18 +- elf/dl-lookup.c | 22 +- elf/dl-minimal.c | 24 +- elf/dl-object.c | 9 +- elf/dl-open.c | 139 +- elf/dl-profile.c | 14 +- elf/dl-reloc.c | 24 +- elf/dl-runtime.c | 42 +- elf/dl-support.c | 9 +- elf/dl-sym.c | 23 +- elf/dl-sysdep.c | 50 +- elf/dl-tls.c | 79 +- elf/do-lookup.h | 9 +- elf/elf.h | 5 +- elf/ldconfig.c | 22 +- elf/ldd.bash.in | 4 +- elf/rtld.c | 71 +- elf/sprof.c | 4 +- elf/tst-thrlock.c | 8 +- elf/tst-tls-dlinfo.c | 4 + elf/tst-tls1.c | 8 +- elf/tst-tls10.h | 3 +- elf/tst-tls14.c | 8 +- elf/tst-tls2.c | 8 +- elf/tst-tls3.c | 8 +- elf/tst-tls4.c | 4 + elf/tst-tls5.c | 4 + elf/tst-tls6.c | 4 + elf/tst-tls7.c | 4 + elf/tst-tls8.c | 4 + elf/tst-tls9.c | 4 + elf/tst-tlsmod1.c | 4 + elf/tst-tlsmod13.c | 3 +- elf/tst-tlsmod13a.c | 3 +- elf/tst-tlsmod14a.c | 10 +- elf/tst-tlsmod2.c | 2 + elf/tst-tlsmod3.c | 4 +- elf/tst-tlsmod4.c | 4 +- elf/tst-tlsmod5.c | 2 + elf/tst-tlsmod6.c | 2 + gmon/mcount.c | 4 +- iconv/gconv_charset.h | 4 +- iconv/iconv_open.c | 4 +- iconv/iconv_prog.c | 4 +- iconv/iconvconfig.c | 4 +- iconvdata/gconv-modules | 4 +- iconvdata/johab.c | 6 +- iconvdata/ksc5601.c | 6 +- iconvdata/ksc5601.h | 4 +- iconvdata/uhc.c | 16 +- include/atomic.h | 847 +++--- include/dlfcn.h | 3 - include/errno.h | 2 +- include/libc-symbols.h | 75 +- include/link.h | 18 +- include/rpcsvc/nislib.h | 2 + include/shlib-compat.h | 16 +- include/stdio.h | 1 + include/sys/cdefs.h | 6 + include/sys/mman.h | 3 + include/tls.h | 3 +- inet/Makefile | 4 +- inet/inet6_opt.c | 36 +- inet/test-inet6_opt.c | 207 ++ io/Makefile | 17 +- io/bug-ftw5.c | 25 + io/fstat.c | 12 +- io/fstat64.c | 9 +- io/fstatat.c | 9 +- io/fstatat64.c | 9 +- io/ftw.c | 28 +- io/lstat.c | 12 +- io/lstat64.c | 9 +- io/mknod.c | 12 +- io/mknodat.c | 10 +- io/stat.c | 12 +- io/stat64.c | 9 +- libio/Banner | 1 + libio/bits/stdio.h | 12 +- libio/fileops.c | 11 +- libio/libio.h | 32 +- libio/libioP.h | 235 +- libio/oldfileops.c | 5 +- libio/stdio.c | 10 +- libio/stdio.h | 41 +- libio/vswprintf.c | 2 +- locale/C-translit.h | 759 +++--- locale/C-translit.h.in | 3 +- locale/global-locale.c | 4 +- locale/iso-3166.def | 1 + locale/iso-4217.def | 1 + locale/localeinfo.h | 4 +- locale/programs/charmap.c | 6 +- locale/programs/ld-collate.c | 4 +- locale/programs/ld-ctype.c | 11 +- locale/programs/ld-monetary.c | 2 +- locale/programs/ld-numeric.c | 2 +- locale/programs/ld-time.c | 4 +- locale/programs/locale.c | 4 +- locale/programs/localedef.c | 4 +- locale/programs/repertoire.c | 4 +- localedata/ChangeLog | 58 +- localedata/SUPPORTED | 2 + localedata/charmaps/EUC-KR | 1 + localedata/charmaps/JOHAB | 3 + localedata/locales/as_IN | 34 +- localedata/locales/bn_BD | 8 +- localedata/locales/cs_CZ | 4 +- localedata/locales/en_ZA | 15 +- localedata/locales/ru_RU | 2 + localedata/locales/sl_SI | 12 +- localedata/locales/sr_ME | 81 +- localedata/locales/sr_RS | 360 +++ localedata/locales/sr_RS@latin | 174 ++ localedata/locales/translit_neutral | 2 + login/utmp_file.c | 8 +- malloc/arena.c | 45 +- malloc/hooks.c | 4 +- malloc/malloc.c | 48 +- malloc/memusage.c | 152 +- malloc/memusage.sh | 24 +- malloc/memusagestat.c | 8 +- malloc/mtrace.pl | 4 +- manual/argp.texi | 2 +- manual/charset.texi | 6 +- manual/conf.texi | 5 + manual/errno.texi | 4 +- manual/filesys.texi | 10 +- manual/lang.texi | 2 +- manual/maint.texi | 2 +- manual/memory.texi | 8 +- manual/message.texi | 4 +- manual/resource.texi | 10 +- manual/search.texi | 18 +- manual/signal.texi | 2 +- manual/startup.texi | 2 +- manual/stdio.texi | 4 +- manual/string.texi | 9 +- manual/sysinfo.texi | 2 +- manual/syslog.texi | 2 +- manual/time.texi | 8 +- math/atest-exp.c | 8 +- math/atest-exp2.c | 7 +- math/atest-sincos.c | 10 +- math/basic-test.c | 36 +- math/bug-nextafter.c | 255 ++ math/bug-nexttoward.c | 255 ++ math/libm-test.inc | 16 + math/math_private.h | 6 + math/s_nextafter.c | 20 +- math/s_nexttowardf.c | 21 +- math/test-misc.c | 74 +- misc/madvise.c | 3 +- nis/Banner | 1 + nis/nis_call.c | 400 ++- nis/nis_domain_of.c | 16 +- nis/nis_lookup.c | 21 +- nis/nis_print_group_entry.c | 2 +- nis/nis_table.c | 15 +- nis/nss-default.c | 5 +- nis/nss_nis/nis-hosts.c | 20 +- nis/nss_nis/nis-service.c | 2 +- nis/nss_nisplus/nisplus-ethers.c | 9 +- nis/nss_nisplus/nisplus-network.c | 11 +- nis/nss_nisplus/nisplus-publickey.c | 2 +- nis/nss_nisplus/nisplus-pwd.c | 6 +- nis/nss_nisplus/nisplus-rpc.c | 11 +- nis/nss_nisplus/nisplus-service.c | 11 +- nis/nss_nisplus/nisplus-spwd.c | 5 +- nis/rpcsvc/nislib.h | 9 +- nptl/ChangeLog | 253 +- nptl/Makefile | 10 +- nptl/allocatestack.c | 59 +- nptl/descr.h | 3 +- nptl/init.c | 6 +- nptl/pthreadP.h | 4 +- nptl/pthread_attr_setstack.c | 15 +- nptl/pthread_attr_setstacksize.c | 14 +- nptl/pthread_getattr_np.c | 10 +- nptl/pthread_mutex_lock.c | 4 +- nptl/pthread_mutex_timedlock.c | 8 +- nptl/pthread_mutex_trylock.c | 8 +- nptl/sysdeps/alpha/tls.h | 28 +- nptl/sysdeps/i386/tls.h | 26 +- nptl/sysdeps/ia64/pthread_spin_unlock.c | 4 +- nptl/sysdeps/ia64/tls.h | 28 +- nptl/sysdeps/powerpc/tls.h | 28 +- nptl/{ => sysdeps/pthread}/pthread_barrier_wait.c | 0 .../{ => sysdeps/pthread}/pthread_cond_broadcast.c | 0 nptl/{ => sysdeps/pthread}/pthread_cond_signal.c | 0 .../{ => sysdeps/pthread}/pthread_cond_timedwait.c | 0 nptl/{ => sysdeps/pthread}/pthread_cond_wait.c | 0 nptl/{ => sysdeps/pthread}/pthread_getcpuclockid.c | 0 nptl/{ => sysdeps/pthread}/pthread_once.c | 0 nptl/{ => sysdeps/pthread}/pthread_rwlock_rdlock.c | 0 .../pthread}/pthread_rwlock_timedrdlock.c | 0 .../pthread}/pthread_rwlock_timedwrlock.c | 0 nptl/{ => sysdeps/pthread}/pthread_rwlock_unlock.c | 0 nptl/{ => sysdeps/pthread}/pthread_rwlock_wrlock.c | 0 nptl/{ => sysdeps/pthread}/pthread_spin_destroy.c | 0 nptl/{ => sysdeps/pthread}/pthread_spin_init.c | 0 nptl/{ => sysdeps/pthread}/pthread_spin_unlock.c | 0 nptl/sysdeps/s390/tls.h | 29 +- nptl/sysdeps/sh/tls.h | 28 +- nptl/sysdeps/sparc/tls.h | 34 +- .../sysdeps/unix/sysv/linux/alpha/bits/local_lim.h | 3 - .../sysdeps/unix/sysv/linux/alpha/bits/semaphore.h | 3 + nptl/sysdeps/unix/sysv/linux/bits/local_lim.h | 3 - nptl/sysdeps/unix/sysv/linux/fork.c | 9 +- nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h | 3 + .../unix/sysv/linux/i386/i486/sem_timedwait.S | 11 +- nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | 10 - nptl/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h | 3 - nptl/sysdeps/unix/sysv/linux/ia64/bits/semaphore.h | 3 + nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c | 22 +- nptl/sysdeps/unix/sysv/linux/powerpc/Versions | 4 - .../unix/sysv/linux/powerpc/bits/local_lim.h | 93 - .../unix/sysv/linux/powerpc/bits/semaphore.h | 3 + .../sysv/linux/powerpc/pthread_attr_setstack.c | 2 - .../sysv/linux/powerpc/pthread_attr_setstacksize.c | 8 - nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h | 2 +- nptl/sysdeps/unix/sysv/linux/s390/bits/semaphore.h | 3 + .../unix/sysv/linux/s390/s390-32/sysdep-cancel.h | 21 +- .../unix/sysv/linux/s390/s390-64/sysdep-cancel.h | 21 +- nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h | 3 + .../sysdeps/unix/sysv/linux/sparc/bits/local_lim.h | 3 - .../sysdeps/unix/sysv/linux/sparc/bits/semaphore.h | 3 + .../sparc/sparc32/sparcv9/pthread_barrier_wait.c | 2 +- .../unix/sysv/linux/x86_64/bits/semaphore.h | 3 + nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S | 4 +- nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h | 28 +- .../sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S | 10 +- nptl/sysdeps/x86_64/tls.h | 26 +- nptl/tst-cancel-wrappers.sh | 3 +- nptl/tst-cancel4.c | 44 +- nptl/tst-robust9.c | 94 + nptl/tst-robustpi9.c | 2 + nptl/tst-sem10.c | 88 + nptl/tst-tls5.h | 2 +- nptl_db/ChangeLog | 4 - nptl_db/structs.def | 6 +- nscd/Makefile | 2 + nscd/cache.c | 2 +- nscd/gai.c | 5 +- nscd/grpcache.c | 3 +- nscd/nscd-client.h | 10 +- nscd/nscd.c | 4 +- nscd/nscd.init | 9 +- nscd/nscd_getai.c | 71 +- nscd/nscd_getgr_r.c | 108 +- nscd/nscd_gethst_r.c | 147 +- nscd/nscd_getpw_r.c | 70 +- nscd/nscd_helper.c | 43 +- nscd/nscd_initgroups.c | 62 +- nscd/pwdcache.c | 3 +- nscd/selinux.c | 18 +- nscd/selinux.h | 4 +- nss/getent.c | 4 +- nss/nss_files/files-hosts.c | 42 +- po/{sv.po => ru.po} | 2859 ++++++++++---------- po/sv.po | 74 +- posix/Makefile | 3 +- posix/bug-regex27.c | 64 + posix/bug-regex28.c | 75 + posix/getconf.c | 4 +- posix/regcomp.c | 8 +- posix/unistd.h | 10 +- posix/wordexp.c | 4 +- resolv/Makefile | 4 +- resolv/Versions | 6 +- resolv/arpa/nameser.h | 2 +- resolv/inet_ntop.c | 2 +- resolv/mapv4v6addr.h | 10 +- resolv/nss_dns/dns-host.c | 15 +- resolv/nss_dns/dns-network.c | 43 +- resolv/res_libc.c | 2 +- resolv/tst-inet_ntop.c | 111 + scripts/check-local-headers.sh | 3 +- soft-fp/op-4.h | 6 +- soft-fp/op-common.h | 9 +- stdio-common/Makefile | 4 +- stdio-common/_itoa.c | 5 +- stdio-common/bug17.c | 31 + stdio-common/printf_fp.c | 99 +- stdio-common/test-vfprintf.c | 8 +- stdio-common/tfformat.c | 33 +- stdio-common/tst-sprintf.c | 21 + stdio-common/tst-sprintf2.c | 82 + stdio-common/tstscanf.c | 4 +- stdio-common/vfprintf.c | 43 +- stdio-common/vfscanf.c | 8 +- stdlib/Makefile | 4 + stdlib/atexit.c | 11 +- stdlib/cxa_finalize.c | 4 +- stdlib/stdlib.h | 16 +- sunrpc/auth_unix.c | 2 +- sunrpc/clnt_raw.c | 2 +- sunrpc/pm_getmaps.c | 2 +- sunrpc/rpc_main.c | 2 +- sunrpc/svc_run.c | 38 +- sysdeps/alpha/dl-machine.h | 28 +- sysdeps/alpha/libc-tls.c | 6 +- sysdeps/generic/ldsodefs.h | 72 +- sysdeps/generic/tls.h | 7 +- sysdeps/gnu/errlist-compat.awk | 12 +- sysdeps/gnu/netinet/tcp.h | 1 - sysdeps/gnu/siglist.c | 27 +- sysdeps/i386/bits/byteswap.h | 6 +- sysdeps/i386/dl-machine.h | 12 +- sysdeps/i386/fpu/e_log.S | 11 +- sysdeps/i386/fpu/e_logf.S | 11 +- sysdeps/i386/fpu/e_logl.S | 11 +- sysdeps/i386/fpu/e_pow.S | 18 +- sysdeps/i386/fpu/e_powf.S | 18 +- sysdeps/i386/fpu/e_powl.S | 18 +- sysdeps/i386/fpu/math_private.h | 18 + sysdeps/i386/fpu/s_nextafterl.c | 18 +- sysdeps/i386/fpu/s_nexttoward.c | 25 +- sysdeps/i386/fpu/s_nexttowardf.c | 25 +- sysdeps/i386/i486/bits/atomic.h | 370 +-- sysdeps/i386/i686/memcmp.S | 70 +- sysdeps/i386/ldbl2mpn.c | 13 +- sysdeps/i386/soft-fp/sfp-machine.h | 89 + sysdeps/i386/sysdep.h | 14 +- sysdeps/ia64/dl-machine.h | 6 +- sysdeps/ia64/fpu/fesetround.c | 6 +- sysdeps/ia64/ldbl2mpn.c | 1 + sysdeps/ia64/libc-tls.c | 6 +- sysdeps/ieee754/dbl-64/e_pow.c | 22 +- sysdeps/ieee754/flt-32/s_nextafterf.c | 20 +- sysdeps/ieee754/ldbl-128/s_nextafterl.c | 18 +- sysdeps/ieee754/ldbl-128/s_nexttoward.c | 23 +- sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c | 75 +- sysdeps/ieee754/ldbl-128ibm/printf_fphex.c | 35 +- sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c | 37 +- sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c | 107 +- sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c | 23 +- sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c | 26 +- sysdeps/ieee754/ldbl-96/s_nextafterl.c | 20 +- sysdeps/ieee754/ldbl-96/s_nexttoward.c | 23 +- sysdeps/ieee754/ldbl-96/s_nexttowardf.c | 28 +- sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c | 28 +- sysdeps/mach/hurd/fork.c | 4 +- sysdeps/mach/hurd/futimes.c | 18 +- sysdeps/mach/hurd/i386/tls.h | 5 +- sysdeps/mach/hurd/lutimes.c | 17 +- sysdeps/mach/hurd/utimes.c | 19 +- sysdeps/posix/euidaccess.c | 10 +- sysdeps/posix/getaddrinfo.c | 14 +- sysdeps/powerpc/fpu/bits/mathinline.h | 58 + sysdeps/powerpc/fpu/math_private.h | 83 - sysdeps/powerpc/powerpc32/dl-machine.c | 6 +- sysdeps/powerpc/powerpc32/dl-machine.h | 8 +- sysdeps/powerpc/powerpc32/sysdep.h | 2 +- sysdeps/powerpc/powerpc64/dl-machine.h | 11 +- sysdeps/s390/libc-tls.c | 8 +- sysdeps/s390/s390-32/dl-machine.h | 12 +- sysdeps/s390/s390-64/dl-machine.h | 12 +- sysdeps/sh/dl-machine.h | 6 +- sysdeps/sparc/sparc32/dl-machine.h | 4 +- sysdeps/sparc/sparc64/dl-machine.h | 4 +- sysdeps/unix/sysv/linux/Versions | 3 - sysdeps/unix/sysv/linux/bits/statvfs.h | 6 +- sysdeps/unix/sysv/linux/check_pf.c | 42 +- sysdeps/unix/sysv/linux/i386/clone.S | 4 - sysdeps/unix/sysv/linux/i386/getgroups.c | 5 +- sysdeps/unix/sysv/linux/i386/sigaction.c | 14 +- sysdeps/unix/sysv/linux/ifaddrs.c | 75 +- sysdeps/unix/sysv/linux/internal_statvfs.c | 4 +- .../unix/sysv/linux/posix_madvise.c | 25 +- sysdeps/unix/sysv/linux/sh/bits/shm.h | 101 - sysdeps/unix/sysv/linux/sh/sys/io.h | 48 + sysdeps/unix/sysv/linux/sys/epoll.h | 20 +- sysdeps/unix/sysv/linux/syscalls.list | 4 +- sysdeps/unix/sysv/linux/x86_64/Makefile | 2 +- sysdeps/unix/sysv/linux/x86_64/clone.S | 4 - sysdeps/unix/sysv/linux/x86_64/sigaction.c | 104 +- sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym | 3 - sysdeps/x86_64/bits/atomic.h | 334 +-- sysdeps/x86_64/bits/byteswap.h | 7 +- sysdeps/x86_64/dl-machine.h | 8 +- sysdeps/x86_64/fpu/e_log10l.S | 5 +- sysdeps/x86_64/fpu/e_log2l.S | 5 +- sysdeps/x86_64/fpu/e_logl.S | 12 +- sysdeps/x86_64/fpu/e_powl.S | 19 +- sysdeps/x86_64/fpu/math_private.h | 21 + sysdeps/x86_64/fpu/s_copysign.S | 5 +- sysdeps/x86_64/fpu/s_copysignf.S | 3 +- sysdeps/x86_64/fpu/s_log1pl.S | 5 +- sysdeps/x86_64/ldbl2mpn.c | 1 + sysdeps/x86_64/soft-fp/sfp-machine.h | 51 + time/Makefile | 5 +- time/strptime_l.c | 11 +- time/tst-strptime3.c | 55 + time/tzfile.c | 114 +- timezone/africa | 73 +- timezone/antarctica | 32 +- timezone/asia | 315 +-- timezone/australasia | 52 +- timezone/backward | 3 +- timezone/checktab.awk | 2 +- timezone/europe | 254 +- timezone/ialloc.c | 7 +- timezone/iso3166.tab | 12 +- timezone/northamerica | 614 ++--- timezone/private.h | 83 +- timezone/scheck.c | 7 +- timezone/southamerica | 193 +- timezone/tzfile.h | 23 +- timezone/tzselect.ksh | 2 +- timezone/zdump.c | 37 +- timezone/zic.c | 709 ++--- timezone/zone.tab | 43 +- tls.make.c | 6 + version.h | 4 +- 448 files changed, 10747 insertions(+), 8442 deletions(-) create mode 100644 argp/tst-argp2.c rewrite elf/dl-addr.c (68%) rewrite include/atomic.h (61%) create mode 100644 inet/test-inet6_opt.c create mode 100644 io/bug-ftw5.c create mode 100644 libio/Banner create mode 100644 localedata/locales/sr_RS create mode 100644 localedata/locales/sr_RS@latin create mode 100644 nis/Banner rename nptl/{ => sysdeps/pthread}/pthread_barrier_wait.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_cond_broadcast.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_cond_signal.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_cond_timedwait.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_cond_wait.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_getcpuclockid.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_once.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_rwlock_rdlock.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_rwlock_timedrdlock.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_rwlock_timedwrlock.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_rwlock_unlock.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_rwlock_wrlock.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_spin_destroy.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_spin_init.c (100%) rename nptl/{ => sysdeps/pthread}/pthread_spin_unlock.c (100%) delete mode 100644 nptl/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h delete mode 100644 nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstack.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c create mode 100644 nptl/tst-robust9.c create mode 100644 nptl/tst-robustpi9.c create mode 100644 nptl/tst-sem10.c copy po/{sv.po => ru.po} (67%) create mode 100644 posix/bug-regex27.c create mode 100644 posix/bug-regex28.c create mode 100644 resolv/tst-inet_ntop.c create mode 100644 stdio-common/bug17.c create mode 100644 stdio-common/tst-sprintf2.c create mode 100644 sysdeps/i386/fpu/math_private.h create mode 100644 sysdeps/i386/soft-fp/sfp-machine.h create mode 100644 sysdeps/ia64/ldbl2mpn.c delete mode 100644 sysdeps/powerpc/fpu/math_private.h copy misc/madvise.c => sysdeps/unix/sysv/linux/posix_madvise.c (53%) delete mode 100644 sysdeps/unix/sysv/linux/sh/bits/shm.h create mode 100644 sysdeps/unix/sysv/linux/sh/sys/io.h create mode 100644 sysdeps/x86_64/fpu/math_private.h create mode 100644 sysdeps/x86_64/ldbl2mpn.c create mode 100644 sysdeps/x86_64/soft-fp/sfp-machine.h create mode 100644 time/tst-strptime3.c diff --git a/ChangeLog b/ChangeLog index 88065954f4..3ad38a2b31 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,15 +1,864 @@ -2007-01-11 Jakub Jelinek +2007-07-31 Jakub Jelinek + + * NEWS, version.h (VERSION): 2.5.1. + + * stdio-common/tfformat.c (sprint_doubles): Add 12 new tests. + +2007-07-28 Ulrich Drepper + + [BZ #4858] + * stdio-common/printf_fp.c (___printf_fp): Fix special case of + #.0g and value rounded to 1.0. + * stdio-common/tfformat.c (sprint_doubles): Add two new tests. + +2007-07-03 Jakub Jelinek + + [BZ #4702] + * nis/nss-default.c: Include errno.h. + (init): Preserve errno. + +2007-07-01 Jakub Jelinek + + * elf/dl-sysdep.c (_dl_important_hwcaps): Add integer overflow check. + * elf/dl-minimal.c (__libc_memalign): Likewise. Handle malloc (0). + Return NULL if mmap failed instead of asserting it does not. + (calloc): Check for integer overflow. + + * elf/dl-minimal.c (__strtoul_internal): Fix parsing of numbers bigger + than LONG_MAX / 10. + +2007-06-19 Ulrich Drepper + + * sysdeps/generic/ldsodefs.h (rtld_global): Reorder some elements + to fill in holes + (rtld_global_ro): Likewise. + +2007-06-18 Jakub Jelinek + + * elf/dl-addr.c (_dl_addr): Skip PT_LOAD checking if l_contiguous. + Move PT_LOAD checking to... + (_dl_addr_inside_object): ... here, new function. + * elf/dl-sym.c (do_sym): If not l_contiguous, + call _dl_addr_inside_object. + * elf/dl-iteratephdr.c (__dl_iterate_phdr): Likewise. + * dlfcn/dlinfo.c (dlinfo_doit): Likewise. + * elf/dl-open.c (dl_open_worker): Likewise. + (_dl_addr_inside_object): New function if IS_IN_rtld. + * elf/dl-load.c (_dl_map_object_from_fd): Set l_contiguous if no + holes are present or are PROT_NONE protected. + * include/link.h (struct link_map): Add l_contiguous field. + * sysdeps/generic/ldsodefs.h (_dl_addr_inside_object): New prototype. + +2007-06-18 Jakub Jelinek + + * elf/rtld.c (dl_main): Don't call init_tls more than once. + +2007-06-19 Ulrich Drepper + + * elf/dl-close.c (free_mem): Free _dl_scope_free_list. + +2007-06-13 Jakub Jelinek + + * include/link.h: Don't include rtld-lowlevel.h. + (struct link_map): Remove l_scope_lock. + * sysdeps/generic/ldsodefs.h: Don't include rtld-lowlevel.h. + (_dl_scope_free_list): New field (variable) in _rtld_global. + (DL_LOOKUP_SCOPE_LOCK): Remove. + (_dl_scope_free): New prototype. + * elf/dl-runtime.c (_dl_fixup): Don't use __rtld_mrlock_*lock. + Don't pass DL_LOOKUP_SCOPE_LOCK to _dl_lookup_symbol_x. + (_dl_profile_fixup): Likewise. + * elf/dl-sym.c (do_sym): Likewise. Use wrapped _dl_lookup_symbol_x + whenever !RTLD_SINGLE_THREAD_P, use THREAD_GSCOPE_SET_FLAG and + THREAD_GSCOPE_RESET_FLAG around it. + * elf/dl-close.c (_dl_close_worker): Don't use + __rtld_mrlock_{change,done}. Call _dl_scope_free on the old + scope. Make sure THREAD_GSCOPE_WAIT () happens if any old + scopes were queued or if l_scope_mem has been abandoned. + * elf/dl-open.c (_dl_scope_free): New function. + (dl_open_worker): Use it. Don't use __rtld_mrlock_{change,done}. + * elf/dl-support.c (_dl_scope_free_list): New variable. + * elf/dl-lookup.c (add_dependency): Remove flags argument. + Remove DL_LOOKUP_SCOPE_LOCK handling. + (_dl_lookup_symbol_x): Adjust caller. Remove DL_LOOKUP_SCOPE_LOCK + handling. + * elf/dl-object.c (_dl_new_object): Don't use + __rtld_mrlock_initialize. - [BZ #3855] - * stdlib/strtod_l.c (____STRTOF_INTERNAL): 0x. not followed by - hexadecimal digit should accept just the initial 0. - * stdlib/tst-strtod2.c (tests): New variable. - (do_test): Run several tests rather than just one. +2007-06-09 Ulrich Drepper -2007-01-11 Jakub Jelinek + * elf/do-lookup.h (do_lookup_x): Read r_nlist before r_list and + make sure gcc doesn't mess around with this. + +2007-06-08 Ulrich Drepper + + * elf/dl-lookup.c (_dl_lookup_symbol_x): Remove use of r_nlist. + +2007-06-08 Jakub Jelinek + + * elf/dl-close.c (_dl_close_worker): Remove all to be removed + libraries from the global scope at once and call THREAD_GSCOPE_WAIT + at most once per _dl_close_worker. + +2007-05-18 Ulrich Drepper + + * elf/dl-close.c (_dl_close_worker): When removing object from + global scope, wait for all lookups to finish afterwards. + * elf/dl-open.c (add_to_global): When global scope array must + grow, allocate a new one and free old array only after all + lookups finish. + * elf/dl-runtime.c (_dl_fixup): Protect using global scope. + (_dl_lookup_symbol_x): Likewise. + * elf/dl-support.c: Define _dl_wait_lookup_done. + * sysdeps/generic/ldsodefs.h (struct rtld_global): Add + _dl_wait_lookup_done. + +2007-05-11 Ulrich Drepper + + * elf/dl-close.c (_dl_close_worker): Help gcc to optimize by + adding new variables. + + * elf/dl-open.c (add_to_global): Introduce variable ns to help gcc + optimize. Completely extend global scope array before making the + new entries visible. + +2007-01-15 Ulrich Drepper + + * sysdeps/generic/ldsodefs.h: Define DL_LOOKUP_SCOPE_LOCK. + * elf/dl-lookup.c (add_dependency): If scope map is locked, unlock + it before getting dl_load_lock and then relock. + (_dl_lookup_symbol_x): Pass flags to add_dependency. + When rerunning _dl_lookup_symbol_x, compute symbol_scope again in + case we unlocked the scope. + * elf/dl-runtime.c (_dl_fixup): Pass DL_LOOKUP_SCOPE_LOCK to + _dl_lookup_symbol_x in case we locked the scope. + (_dl_profile_fixup): Likewise. + * elf/dl-sym.c (do_sym): In flags passed to call_dl_lookup, also + set DL_LOOKUP_SCOPE_LOCK. + +2006-10-29 Jakub Jelinek + + * elf/dl-sym.c (do_sym): Use RTLD_SINGLE_THREAD_P. + * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Likewise. + * elf/dl-close.c (_dl_close_worker): Likewise. + * elf/dl-open.c (_dl_open_worker): Likewise. + * sysdeps/generic/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): Define. + +2006-10-27 Jakub Jelinek + + * elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope + argument. + (_dl_lookup_symbol_x): Adjust caller. + + * sysdeps/generic/ldsodefs.h (struct link_namespaces): Remove + _ns_global_scope. + * elf/rtld.c (dl_main): Don't initialize _ns_global_scope. + + * elf/dl-libc.c: Revert l_scope name changes. + * elf/dl-load.c: Likewise. + * elf/dl-object.c: Likewise. + * elf/rtld.c: Likewise. + * elf/dl-close.c (_dl_close): Likewise. + * elf/dl-open.c (dl_open_worker): Likewise. If not SINGLE_THREAD_P, + always use __rtld_mrlock_{change,done}. Always free old scope list + here if not l_scope_mem. + * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Revert l_scope name + change. Never free scope list here. Just __rtld_mrlock_lock before + the lookup and __rtld_mrlock_unlock it after the lookup. + * elf/dl-sym.c: Likewise. + * include/link.h (struct r_scoperec): Remove. + (struct link_map): Replace l_scoperec with l_scope, l_scoperec_mem + with l_scope_mem and l_scoperec_lock with l_scope_lock. + +2006-10-18 Ulrich Drepper + + * elf/dl-lookup.c (_dl_lookup_symbol_x): Add warning to + _dl_lookup_symbol_x code. + +2006-10-17 Jakub Jelinek + + * elf/dl-runtime.c: Include sysdep-cancel.h. + (_dl_fixup, _dl_profile_fixup): Use __rtld_mrlock_* and + scoperec->nusers only if !SINGLE_THREAD_P. + * elf/dl-sym.c: Include sysdep-cancel.h. + (do_sym): Use __rtld_mrlock_* and scoperec->nusers only + if !SINGLE_THREAD_P. + * elf/dl-close.c: Include sysdep-cancel.h. + (_dl_close): Use __rtld_mrlock_* and scoperec->nusers only + if !SINGLE_THREAD_P. + * elf/dl-open.c: Include sysdep-cancel.h. + (dl_open_worker): Use __rtld_mrlock_* and scoperec->nusers only + if !SINGLE_THREAD_P. + +2006-10-09 Ulrich Drepper + Jakub Jelinek + + Implement reference counting of scope records. + * elf/dl-close.c (_dl_close): Remove all scopes from removed objects + from the list in objects which remain. Always allocate new scope + record. + * elf/dl-open.c (dl_open_worker): When growing array for scopes, + don't resize, allocate a new one. + * elf/dl-runtime.c: Update reference counters before using a scope + array. + * elf/dl-sym.c: Likewise. + * elf/dl-libc.c: Adjust for l_scope name change. + * elf/dl-load.c: Likewise. + * elf/dl-object.c: Likewise. + * elf/rtld.c: Likewise. + * include/link.h: Include . Define struct + r_scoperec. Replace r_scope with pointer to r_scoperec structure. + Add l_scoperec_lock. + * sysdeps/generic/ldsodefs.h: Include . + * sysdeps/generic/rtld-lowlevel.h: New file. + +2007-06-06 Jakub Jelinek + + [BZ #4586] + * sysdeps/i386/ldbl2mpn.c (__mpn_extract_long_double): Treat + pseudo-zeros as zero. + * sysdeps/x86_64/ldbl2mpn.c: New file. + * sysdeps/ia64/ldbl2mpn.c: New file. + +2007-06-05 Jakub Jelinek + + * sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c + (__mpn_construct_long_double): Fix conversion where result ought + to be smaller than __LDBL_MIN__, or the low double should be + denormal. Fix decision where to negate low double - honor round + to even rules. + * stdio-common/tst-sprintf2.c: Include string.h. + (COMPARE_LDBL): Define. + (TEST): Also test whether a string hexadecimal float representation + can be parsed back to the number. + (main): Add a couple of further tests. + +2007-06-04 Jakub Jelinek + + * sysdeps/ieee754/ldbl-128ibm/printf_fphex.c + (PRINT_FPHEX_LONG_DOUBLE): Fix printing numbers where lower double + is non-zero, but smaller than 2 * __DBL_MIN__. + * stdio-common/tst-sprintf2.c: New test. + * stdio-common/Makefile (tests): Add tst-sprintf2. + +2007-06-04 Jakub Jelinek + + * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Remove + unused ily variable. Fix nextafterl on +-__LDBL_MAX__ and +-Inf. + Remove unreachable code at the end. + +2007-06-01 Steven Munroe + + * sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c: Correct description of + ldbl-128ibm in comment. + (fpclassifyl): Correct classification of denormals. + * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Correct + return value for MIN denormal. Rewrite using long double math too + correctly handle denormals and canonicalize the results. + +2007-05-29 Ulrich Drepper + + * nscd/nscd_helper.c (get_mapping): Handle short replies instead + of crashing. When this is the case or if the reply is malformed, + don't try to close the new file descriptor since it does not + exist. + Patch in part by Guillaume Chazarain . + +2007-05-21 Jakub Jelinek + + [BZ #4514] + * stdio-common/vfprintf.c (vfprintf): Don't shadow workstart variable, + reinitialize workend at the start of each do_positional format spec + loop, free workstart before do_positional loops. + (printf_unknown): Fix size of work_buffer. + * stdio-common/tst-sprintf.c (main): Add 3 new testcases. + +2007-05-10 Ulrich Drepper + + * include/sys/cdefs.h: Redefine __nonnull so that test for + incorrect parameters in the libc code itself are not omitted. + +2007-05-07 Ulrich Drepper + Jakub Jelinek + + * malloc/arena.c (heap_info): Add mprotect_size field, adjust pad. + (new_heap): Initialize mprotect_size. + (grow_heap): When growing, only mprotect from mprotect_size till + new_size if mprotect_size is smaller. When shrinking, use PROT_NONE + MMAP for __libc_enable_secure only, otherwise use MADV_DONTNEED. + +2007-05-06 Ulrich Drepper + + * stdio-common/vfprintf.c (process_string_arg): Optimize + ridiculous precision in wide char code printing multi-byte string. + Reported by Jim Meyering . + +2007-05-06 Ulrich Drepper + + [BZ #4465] + * posix/unistd.h: Remove __THROW from fdatasync. + +2007-05-06 Mike Frysinger + + [BZ #4465] + * sysdeps/unix/sysv/linux/syscalls.list (fdatasync): Add "C" to args. + +2007-05-06 Ulrich Drepper + + [BZ #4131] + * elf/dl-addr.c (_dl_addr): Compare address with actual segment + boundaries to work around systems with overlapping binary loading. + Based on a patch by Suzuki . + +2007-05-04 Ulrich Drepper + + * stdio-common/vfprintf.c (process_string_arg): Adjust call to + __mbsnrtowcs after last change. + +2007-05-02 Jakub Jelinek + + * stdio-common/vfprintf.c (process_string_arg): Use a VLA rather than + fixed length array for ignore. + +2007-04-30 Ulrich Drepper + + [BZ #4438] + * stdio-common/vfprintf.c (process_string_arg): Don't overflow the + stack for large precisions. + * stdio-common/test-vfprintf.c (main): Add test for large + precision. + +2007-04-30 Jakub Jelinek + + * stdio-common/printf_fp.c (___printf_fp): Don't print negative sign + for exponent 0. + * stdio-common/tfformat.c (sprint_doubles): Add a new test. + +2007-04-30 Jakub Jelinek + + [BZ #4439] + * resolv/inet_ntop.c (inet_ntop4): Take terminating '\0' into + account in the size check. + * resolv/tst-inet_ntop.c: New test. + * resolv/Makefile (tests): Add tst-inet_ntop. + +2007-04-28 Ulrich Drepper + + [BZ #4102] + * sysdeps/posix/getaddrinfo.c (default_labels): Assign separate + label to Teredo tunnel addresses 2001://32. + +2007-04-27 Ulrich Drepper + + [BZ #4342] + * stdio-common/vfscanf.c (_IO_vfscanf_internal): Allow + hexa-decimal floats without exponent. + * stdio-common/tstscanf.c (main): Adjust Test 8 test for success. + +2007-04-27 Ulrich Drepper + + [BZ #3213] + * locale/C-translit.h.in: Add entry for U2044. + +2007-04-25 Jakub Jelinek + + * sysdeps/unix/sysv/linux/check_pf.c (make_request): Return -1 instead + of 0 after the out_fail label. + +2007-03-18 Jakub Jelinek + + * nscd/gai.c: Include alloca.h. + (__libc_use_alloca): Define. + +2007-03-15 Jakub Jelinek + + * sysdeps/unix/sysv/linux/ifaddrs.c (__netlink_request): Never + reallocate the buffer, instead fail for MSG_TRUNC or for EBUSY + NLMSG_ERR. Instead use a page sized buffer. + * sysdeps/unix/sysv/linux/check_pf.c (make_request): Use page sized + buffer. + +2007-03-02 Jakub Jelinek + + * sysdeps/unix/sysv/linux/ifaddrs.c (__netlink_request): Retry with + a new netlink socket if NLMSG_ERR -EBUSY is seen after some MSG_TRUNC + message. + +2007-02-27 Jakub Jelinek + + * sysdeps/unix/sysv/linux/ifaddrs.c (__netlink_request): Fix + memory reallocation. + +2007-04-25 Jakub Jelinek + + * libio/bits/stdio.h (fgetc_unlocked): Add extern inline optimized + version. + +2007-04-25 Ulrich Drepper + + [BZ #4406] + * iconv/gconv_charset.h (strip): Allow ':' + * iconv/iconv_open.c (iconv_open): Adjust comment. + +2007-04-23 Jakub Jelinek + + [BZ #4405] + * iconvdata/gconv-modules (E13B): Add a missing slash to the alias + name. Patch by Aurelien Jarno . + +2007-04-23 Jakub Jelinek + + [BZ #4381] + * nss/nss_files/files-hosts.c (HOST_DB_LOOKUP): Ensure sufficient + alignment of buffer and tmp_buffer. + * nis/nss_nis/nis-hosts.c (internal_nis_gethostent_r, + internal_gethostbyname2_r, _nss_nis_gethostbyaddr_r): Ensure sufficient + alignment of buffer. + * resolv/nss_dns/dns-hosts.c (getanswer_r): Likewise. Handle buflen + bigger than INT_MAX. + * resolv/nss_dns/dns-network.c (getanswer_r): Likewise. Add errnop and + h_errnop arguments. Fail if buflen is too small. + (_nss_dns_getnetbyname_r, _nss_dns_getnetbyaddr_r): Adjust callers. + +2007-04-19 Ulrich Drepper + + * include/sys/mman.h: Mark madvise hidden. + * misc/madvise.c: Add libc_hidden_def. + +2007-04-17 Ulrich Drepper + + [BZ #4368] + * stdlib/stdlib.h: Remove obsolete part of comment for realpath. + +2007-04-16 Ulrich Drepper + + [BZ #4364] + * posix/unistd.h (_XOPEN_VERSION): Define appropriately for SUSv3. + +2007-04-13 Jakub Jelinek + + [BZ #4344] + * elf/ldconfig.c (search_dir): Fix 2 off-by-2 errors. + Reported by David Anderson . + +2007-04-13 Jakub Jelinek + + * stdio-common/printf_fp.c (___printf_fp): Fix exponent -4 + special case handling when wcp == wstartp + 1. Fix a comment typo. + * stdio-common/tfformat.c (sprint_doubles): Add a new testcase. + +2007-02-21 Ulrich Drepper + + [BZ #4070] + * stdio-common/printf_fp.c (___printf_fp): Handle a few more + special cases. + * stdio-common/tfformat.c (sprint_doubles): Some more tests. + +2007-02-19 Ulrich Drepper + + * stdio-common/printf_fp.c (___printf_fp): Cleanups and minor + optimization. + +2007-04-06 Jakub Jelinek + + * nis/nis_domain_of.c (__nis_domain_of): New function. + * include/rpcsvc/nislib.h (__nis_domain_of): New prototype. + * nis/nis_lookup.c (nis_lookup): Use __nis_domain_of. + * nis/nis_call.c (rec_dirsearch): Likewise. + (first_shoot): Likewise. Remove search_parent_first argument. + (struct nis_server_cache): Rename search_parent_first field + to search_parent. + (nis_server_cache_search, nis_server_cache_add): Rename + search_parent_first argument to search_parent. + (__nisfind_server): Likewise. If search_parent, call + __nis_domain_of. + +2007-04-05 Jakub Jelinek + + * nis/nis_call.c (__nisfind_server): Replace (*dir)->do_servers + with obj->do_servers after first_shoot. + +2007-03-21 Jakub Jelinek + + * nis/nis_call.c: Include bits/libc-lock.h, sys/stat.h, unistd.h. + (nis_server_cache, nis_server_cache_lock, nis_cold_start_mtime): New + variables. + (nis_server_cache_search, nis_server_cache_add): New functions. + (__nisfind_server): Use them. Add dbp and flags argument, if + call __nisbind_create. + (__nisbind_create): Add server_used and current_ep arguments, + only call __nis_findfastest if server_used is ~0. + (__do_niscall2, __prepare_niscall): Adjust callers. + (ckey_cache, ckey_cache_size, ckey_cache_allocated, ckey_cache_pid, + ckey_cache_euid, ckey_cache_lock): New variables. + (get_ckey): New function. + (__nisbind_connect): If not dbp->use_udp, pass IPPROTO_TCP to + __pmap_getnisport. Save __pmap_getnisport result in + dbp->addr.sin_port if non-zero. Use get_ckey to create conversation + key. + * nis/nis_lookup.c (nis_lookup): Likewise. + * nis/nis_table.c (nis_list): Likewise. + * nis/rpcsvc/nislib.h (__nisbind_create, __nisfind_server): Adjust + prototypes. + + * nis/nss_nisplus/nisplus-pwd.c (_nss_nisplus_getpwnam_r, + _nss_nisplus_getpwuid_r): Pass USE_DGRAM flag to nis_list. + * nis/nss_nisplus/nisplus-service.c (_nss_nisplus_getservbyname_r, + _nss_nisplus_getservbyport_r): Likewise. + * nis/nss_nisplus/nisplus-network.c (_nss_nisplus_getnetbyname_r, + _nss_nisplus_getnetbyaddr_r): Likewise. + * nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_getspnam_r): Likewise. + * nis/nss_nisplus/nisplus-ethers.c (_nss_nisplus_gethostton_r, + _nss_nisplus_getntohost_r): Likewise. + * nis/nss_nisplus/nisplus-rpc.c (_nss_nisplus_getrpcbyname_r, + _nss_nisplus_getrpcbynumber_r): Likewise. + +2007-04-01 Jakub Jelinek + + * sysdeps/ia64/fpu/fesetround.c (fesetround): Return 0 on success + and 1 on failure. + +2007-04-01 Jakub Jelinek + + * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (__nextafterl): Use + math_opt_barrier and math_force_eval macros. + +2007-03-27 Jakub Jelinek + + [BZ #3306] + * math/math_private.h (math_opt_barrier, math_force_eval): Define. + * sysdeps/i386/fpu/math_private.h: New file. + * sysdeps/x86_64/fpu/math_private.h: New file. + * math/s_nexttowardf.c (__nexttowardf): Use math_opt_barrier and + math_force_eval macros. Use "+m" constraint on asm rather than + "=m" and "m". + * math/s_nextafter.c (__nextafter): Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c (__nexttoward): + Likewise. + * sysdeps/ieee754/flt-32/s_nextafterf.c (__nextafterf): Likewise. + * sysdeps/ieee754/ldbl-128/s_nexttoward.c (__nexttoward): Likewise. + * sysdeps/ieee754/ldbl-96/s_nexttoward.c (__nexttoward): Likewise. + * sysdeps/i386/fpu/s_nextafterl.c (__nextafterl): Use + math_opt_barrier and math_force_eval macros. + * sysdeps/ieee754/ldbl-128/s_nextafterl.c (__nextafterl): Likewise. + * sysdeps/ieee754/ldbl-96/s_nextafterl.c (__nextafterl): Likewise. + * sysdeps/i386/fpu/s_nexttoward.c: Include float.h. + (__nexttoward): Use math_opt_barrier and + math_force_eval macros. Use "+m" constraint on asm rather than + "=m" and "m". Only use asm to force double result if + FLT_EVAL_METHOD is 2. + * sysdeps/i386/fpu/s_nexttowardf.c: Include float.h. + (__nexttowardf): Use math_opt_barrier and + math_force_eval macros. Use "+m" constraint on asm rather than + "=m" and "m". Only use asm to force double result if + FLT_EVAL_METHOD is not 0. + * sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c: Include float.h. + (__nexttowardf): Use math_opt_barrier and + math_force_eval macros. If FLT_EVAL_METHOD is not 0, force + x to float using asm. + * sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c: Include float.h. + (__nldbl_nexttowardf): Use math_opt_barrier and + math_force_eval macros. If FLT_EVAL_METHOD is not 0, force + x to float using asm. + * sysdeps/ieee754/ldbl-96/s_nexttowardf.c: Include float.h. + (__nexttowardf): Use math_opt_barrier and math_force_eval + macros. If FLT_EVAL_METHOD is not 0, force x to float using asm. + * math/bug-nextafter.c (zero, inf): New variables. + (main): Add new tests. + * math/bug-nexttoward.c (zero, inf): New variables. + (main): Add new tests. + +2007-03-30 Jakub Jelinek + + * libio/libio.h (__underflow, __uflow, __overflow, __wunderflow, + __wuflow, __woverflow, _IO_getc, _IO_putc, _IO_peekc_locked, _IO_padn, + _IO_sgetn, _IO_seekoff, _IO_seekpos, _IO_getwc, _IO_putwc, _IO_wpadn): + Remove __THROW. + * libio/fileops.c (new_do_write, _IO_file_xsgetn_mmap, + _IO_file_xsgetn_maybe_mmap): Likewise. + * libio/oldfileops.c (old_do_write): Likewise. + * libio/libioP.h (_IO_switch_to_get_mode, _IO_switch_to_wget_mode, + _IO_init_marker, _IO_init_wmarker, _IO_default_uflow, + _IO_wdefault_uflow, _IO_default_setbuf, _IO_default_seekpos, + _IO_do_write, _IO_new_do_write, _IO_old_do_write, _IO_wdo_write, + _IO_flush_all_lockp, _IO_flush_all, _IO_cleanup, + _IO_flush_all_linebuffered, _IO_new_fgetpos, _IO_old_fgetpos, + _IO_new_fsetpos, _IO_old_fsetpos, _IO_new_fgetpos64, + _IO_old_fgetpos64, _IO_new_fsetpos64, _IO_old_fsetpos64, + _IO_file_setbuf, _IO_file_seekoff, _IO_file_xsputn, _IO_file_xsgetn, + _IO_file_underflow, _IO_file_underflow_mmap, + _IO_file_underflow_maybe_mmap, _IO_file_overflow, _IO_file_attach, + _IO_file_open, _IO_file_fopen, _IO_file_write, _IO_file_read, + _IO_file_sync, _IO_file_close_it, _IO_file_finish, + _IO_new_file_attach, _IO_new_file_close_it, _IO_new_file_finish, + _IO_new_file_fopen, _IO_new_file_setbuf, _IO_file_setbuf_mmap, + _IO_new_file_sync, _IO_new_file_underflow, _IO_new_file_overflow, + _IO_new_file_seekoff, _IO_new_file_write, _IO_new_file_xsputn, + _IO_old_file_setbuf, _IO_old_file_seekoff, _IO_old_file_xsputn, + _IO_old_file_underflow, _IO_old_file_overflow, _IO_old_file_attach, + _IO_old_file_fopen, _IO_old_file_write, _IO_old_file_sync, + _IO_old_file_close_it, _IO_old_file_finish, _IO_wfile_xsputn, + _IO_wfile_setbuf, _IO_wfile_sync, _IO_wfile_underflow, + _IO_wfile_overflow, _IO_wfile_seekoff, _IO_old_proc_open, + _IO_old_proc_close, _IO_getdelim, _IO_flush_all_internal, + _IO_adjust_column_internal, _IO_default_uflow_internal, + _IO_default_xsgetn_internal, _IO_wdefault_xsputn_internal, + _IO_wdefault_xsgetn_internal, _IO_wdefault_uflow_internal, + _IO_file_setbuf_internal, _IO_file_seekoff_internal, + _IO_file_xsputn_internal, _IO_file_xsgetn_internal, + _IO_file_close_it_internal, _IO_file_underflow_internal, + _IO_file_overflow_internal, _IO_file_attach_internal, + _IO_file_fopen_internal, _IO_file_sync_internal, + _IO_file_finish_internal, _IO_wfile_xsputn_internal, + _IO_wfile_seekoff_internal, _IO_wfile_sync_internal, + _IO_switch_to_wget_mode_internal, _IO_padn_internal, + _IO_switch_to_get_mode_internal, _IO_seekoff_unlocked, + _IO_seekpos_unlocked): Likewise. + (_IO_strtod, _IO_dtoa, _IO_outfloat, _IO_read, _IO_write, + _IO_lseek, _IO_close, _IO_fstat): Remove unused prototypes. + +2007-03-23 Jakub Jelinek + + * scripts/check-local-headers.sh: Filter out sys/capability.h. + +2007-03-22 Jakub Jelinek + + * config.h.in (HAVE_LIBCAP): Add. + * nscd/selinux.h: Include sys/capability.h rather than non-existent + sys/capabilities.h. + * nscd/selinux.c (preserve_capabilities): Use cap_free instead of + free_caps. Cast away const from 4th cap_set_flag argument. + +2007-03-16 Jakub Jelinek + + * elf/dl-open.c (dl_open_worker): Declare l in 2 different + smaller scopes. + * elf/dl-dst.h (DL_DST_REQ_STATIC): Add l as macro argument. + (DL_DST_REQUIRED): Adjust user. + +2007-03-15 Jakub Jelinek + + * locale/programs/ld-ctype.c (find_translit): Return NULL if ctype is + NULL. + +2007-03-15 Jakub Jelinek + + [BZ #4181] + * inet/inet6_opt.c (add_padding): Only insert padding if npad > 0. + (inet6_opt_append): Don't check extlen is big enough if extbuf + is NULL. + (inet6_opt_finish): Likewise. + * inet/Makefile (tests): Add test-inet6_opt. + * inet/test-inet6_opt.c: New test. + +2007-03-15 Jakub Jelinek + + [BZ #4130] + * login/utmp_file.c (setutent_file): Use O_LARGEFILE for + open_not_cancel_2. + (updwtmp_file): Likewise. + +2007-03-15 Jakub Jelinek + + [BZ #4101] + * argp/argp-help.c (hol_cluster_cmp): Fix comparisons used to find + ancestors with the same depths. + Patch by Niels Moeller . + (filter_doc): Don't crash if argp is NULL. + * argp/Makefile (tests): Add tst-argp2. + * argp/tst-argp2.c: New test. + +2007-03-15 Jakub Jelinek + + [BZ #3919] + * math/libm-test.inc (log_test): Test -Inf and NaN. + (log10_test, log1p_test, log2_test): Test -Inf. + * sysdeps/i386/fpu/e_log.S (__ieee754_log): Don't raise + FE_INVALID when argument is qNaN. + * sysdeps/i386/fpu/e_logl.S (__ieee754_logl): Likewise. + * sysdeps/i386/fpu/e_logf.S (__ieee754_logf): Likewise. + * sysdeps/x86_64/fpu/e_logl.S (__ieee754_logl): Likewise. + * sysdeps/x86_64/fpu/e_log10l.S (__ieee754_log10l): Replace + andb $1, %ah with testb $1, %ah, don't test for parity, instead + testb $4, %ah and jump if non-zero. + * sysdeps/x86_64/fpu/e_log2l.S (__ieee754_log2l): Likewise. + * sysdeps/x86_64/fpu/s_log1pl.S (__log1pl): Likewise. + +2007-03-06 Ulrich Drepper + + * sysdeps/posix/getaddrinfo.c (get_scope): Correct test for + 172.16/12 address range. + +2007-03-01 Jakub Jelinek - * sysdeps/i386/soft-fp/sfp-machine.h: Remove. - * sysdeps/x86_64/soft-fp/sfp-machine.h: Likewise. + [BZ #4069] + * sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Check for NaN + earlier. + * math/libm-test.inc (pow_test): Add more tests involving NaNs. + + * sysdeps/i386/fpu/e_powf.S (__ieee754_powf): Avoid invalid exception + for x qNaN and y either +-inf or non-integer value. + * sysdeps/i386/fpu/e_pow.S (__ieee754_pow): Likewise. + * sysdeps/i386/fpu/e_powl.S (__ieee754_powl): Likewise. + * sysdeps/x86_64/fpu/e_powl.S (__ieee754_powl): Likewise. + +2007-02-21 Ulrich Drepper + + [BZ #4076] + * io/ftw.c (ftw_startup): Handle special case of FTW_CHDIR in /. + (open_dir_stream): Likewise. + * io/Makefile (tests): Add bug-ftw5. + * io/bug-ftw5.c: New file. + +2007-02-21 Ulrich Drepper + + * nscd/grpcache.c (cache_addgr): In case a record changed on + refresh, adjust key_copy. + + [BZ #4074] + * nscd/pwdcache.c (cache_addpw): In case a record changed on + refresh, adjust key_copy. + +2007-02-21 Ulrich Drepper + + [BZ #3458] + * sysdeps/unix/sysv/linux/posix_madvise.c: New file. + * sysdeps/unix/sysv/linux/syscalls.list: Remove posix_madvise entry. + +2007-02-17 Ulrich Drepper + + [BZ #3842] + * sysdeps/posix/euidaccess.c [_LIBC] (euidaccess): Remove shortcut + using __libc_enable_secure. + +2007-02-17 Ulrich Drepper + + [BZ #3348] + * malloc/memusage.sh: Cleanups. + * debug/xtrace.sh: Quoting and trap changes. + +2007-02-16 Ulrich Drepper + + * locale/iso-3166.def: Add entry for Serbia. + * locale/iso-4217.def: Define RSD. + +2007-02-15 Ulrich Drepper + + * nscd/nscd_helper.c (open_socket): Don't send padding bytes from + reqdata. + +2007-02-13 Ulrich Drepper + + * po/ru.po: Update from translation team. + +2007-02-03 Ulrich Drepper + + * po/sv.po: Update from translation team. + +2007-02-12 Jakub Jelinek + + * sysdeps/i386/bits/byteswap.h (__bswap_32): Add __amdfam10__ + to the list of i486+ CPUs. + * sysdeps/x86_64/bits/byteswap.h (__bswap_32): Likewise. + +2007-01-24 Jakub Jelinek + + * sysdeps/i386/bits/byteswap.h (__bswap_32): Add __nocona__, __core2__ + and __geode__ to the list of i486+ CPUs. + * sysdeps/x86_64/bits/byteswap.h (__bswap_32): Likewise. + +2007-02-08 Jakub Jelinek + + [BZ #3944] + * time/strptime_l.c (__strptime_internal): Set have_mon for + %b/%B/%h. Set have_mon and have_mday if tm_mon and tm_mday + have been computed from tm_yday and tm_year. Don't crash + in day_of_the_week or day_of_the_year if not have_mon + and tm_mon contains bogus value. + * time/Makefile (tests): Add tst-strptime3. + * time/tst-strptime3.c: New test. + +2007-02-05 Jakub Jelinek + + [BZ #3957] + * posix/regcomp.c (parse_bracket_exp): Set '\n' bit rather than '\0' + bit for RE_HAT_LISTS_NOT_NEWLINE. + (build_charclass_op): Remove bogus comment. + * posix/Makefile (tests): Add bug-regex27 and bug-regex28. + * posix/bug-regex27.c: New test. + * posix/bug-regex28.c: New test. + +2007-02-02 Bruno Haible + + [BZ #3954] + * iconvdata/ksc5601.c (__ksc5601_sym_to_ucs, __ksc5601_sym_from_ucs): + Add mapping for U+327E. + * iconvdata/ksc5601.h (KSC5601_SYMBOL): Increment. + * iconvdata/johab.c (BODY for FROM_LOOP, BODY for TO_LOOP): Enable + mapping of 0xD9 0xE8. + * iconvdata/uhc.c (BODY for FROM_LOOP, BODY for TO_LOOP): Disable + mapping of U+327E. + Reported by Jungshik Shin . + + [BZ #3955] + * iconvdata/johab.c (BODY for FROM_LOOP, BODY for TO_LOOP): Enable + mapping of 0xD9 0xE6 and of 0xD9 0xE7. + Reported by Jungshik Shin . + +2007-01-31 Jakub Jelinek + + * nscd/nscd-client.h (__nscd_cache_search): Remove const qualifier + from return value. + * nscd/nscd_helper.c: Include string.h. + (__nscd_cache_search): Remove const qualifier from return value. + On strict alignment architectures check hash entry and data head + alignment. + * nscd/nscd_getpw_r.c (nscd_getpw_r): Don't crash or fail because + mmapped data during GC cycle contains garbage. If + __nscd_drop_map_ref fails, decrement mapped->counter when returning + error or if retrying with NO_MAPPING, only __nscd_unmap if counter + dropped to 0. + * nscd/nscd_getgr_r.c (nscd_getgr_r): Likewise. + * nscd/nscd_initgroups.c (__nscd_getgrouplist): Likewise. + * nscd/nscd_gethst_r.c (nscd_gethst_r): Likewise. + * nscd/nscd_getai.c (__nscd_getai): Likewise. + +2007-01-22 Ulrich Drepper + + [BZ #3902] + * stdio-common/_itoa.c (_itoa): Make sure at least a zero is emitted. + * stdio-common/Makefile (tests): Add bug17. + * stdio-common/bug17.c: New file. + +2007-01-15 Jakub Jelinek + + * soft-fp/op-common.h (FP_TRUNC): When truncating a NaN, clear + workbits in semi-raw fraction. + + * math/test-misc.c: Add new tests. + +2007-01-14 Steven Munroe + + * math/basic-test.c: Include test-skeleton.c. + (TEST_TRUNC): Define. + (truncdfsf_test, trunctfsf_test, trunctfdf_test): New. + (main): Rename to ... + (do_test): ...this. Run new tests. + (TEST_FUNCTION): Define. + +2006-10-05 Steven Munroe + Joe Kerian + + [BZ #2749] + * soft-fp/op-4.h (__FP_FRAC_SUB_3, __FP_FRAC_SUB_4): Correct borrow + handling for high words. + * soft-fp/op-common.h (_FP_OVERFLOW_SEMIRAW): Always set inexact + and overflow for infinity. + +2007-01-13 Ulrich Drepper + + * nis/nss_nis/nis-service.c (_nss_nis_getservbyname_r): Correct + computation of keylen. 2007-01-10 Ulrich Drepper @@ -17,11 +866,6 @@ fts_read. Patch by Miloslav Trmac . -2006-10-27 Richard Sandiford - - * elf/elf.h (R_MIPS_GLOB_DAT): Define. - (R_MIPS_NUM): Bump by 1. - 2007-01-03 Jakub Jelinek * posix/execvp.c: Include alloca.h. @@ -32,38 +876,77 @@ * posix/Makefile: Add rules to build and run tst-vfork3 test. * posix/tst-vfork3.c: New test. +2007-01-05 Steven Munroe + + * stdlib/tst-makecontext.c: Include errno.h. Change main() + to do_test(). Define TEST_FUNCTION. Include test-skeleton.c. + (do_test): Check errno and exit(0) if ENOSYS. + +2007-01-11 Jakub Jelinek + + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix handling of multi-byte + thousands separators. + * stdlib/Makefile: Add rules to build and run tst-strtod4. + * stdlib/tst-strtod4.c: New test. + + [BZ #3855] + * stdlib/strtod_l.c (____STRTOF_INTERNAL): 0x. not followed by + hexadecimal digit should accept just the initial 0. + * stdlib/tst-strtod2.c (tests): New variable. + (do_test): Run several tests rather than just one. + 2007-01-03 Ulrich Drepper - * string/Makefile (tst-strxfrm2-ENV): Define. * stdlib/Makefile (tst-strtod3-ENV): Define. -2007-01-02 Ulrich Drepper +2006-12-11 Ulrich Drepper + + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand + separators also if no non-zero digits found. + * stdlib/Makefile (tests): Add tst-strtod3. + +2006-12-09 Ulrich Drepper + + [BZ #3664] + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix test to recognize + empty parsed strings. + * stdlib/Makefile (tests): Add tst-strtod2. + * stdlib/tst-strtod2.c: New file. + + [BZ #3673] + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix exp_limit + computation. + * stdlib/Makefile (tests): Add tst-atof2. + * stdlib/tst-atof2.c: New file. + + [BZ #3674] + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Adjust exponent value + correctly if removing trailing zero of hex-float. + * stdlib/Makefile (tests): Add tst-atof1. + * stdlib/tst-atof1.c: New file. + +2007-01-03 Ulrich Drepper + + * string/Makefile (tst-strxfrm2-ENV): Define. + +2006-11-10 Jakub Jelinek - * posix/getconf.c: Update copyright year. - * nss/getent.c: Likewise. - * iconv/iconvconfig.c: Likewise. - * iconv/iconv_prog.c: Likewise. - * elf/ldconfig.c: Likewise. - * catgets/gencat.c: Likewise. - * csu/version.c: Likewise. - * elf/ldd.bash.in: Likewise. - * elf/sprof.c (print_version): Likewise. - * locale/programs/locale.c: Likewise. - * locale/programs/localedef.c: Likewise. - * nscd/nscd.c (print_version): Likewise. - * debug/xtrace.sh: Likewise. - * malloc/memusage.sh: Likewise. - * malloc/mtrace.pl: Likewise. - * debug/catchsegv.sh: Likewise. + * string/strxfrm_l.c (STRXFRM): Fix trailing \1 optimization + if N is one bigger than return value. + * string/tst-strxfrm2.c (do_test): Also test strxfrm with l1 + 1 + and l1 last arguments, if buf is defined, verify the return value + equals to strlen (buf) and verify no byte beyond passed length + is modified. -2006-12-24 Ulrich Drepper +2006-11-09 Ulrich Drepper - * malloc/malloc.c (sYSMALLOc): Remove some unnecessary alignment - attempts. + * string/Makefile (tests): Add tst-strxfrm2. + * string/tst-strxfrm2.c: New file. -2006-12-23 Ulrich Drepper +2006-11-08 Jakub Jelinek - * posix/wordexp.c: Remove some unnecessary tests. + * string/strxfrm_l.c (STRXFRM): Do the trailing \1 removal + optimization even if needed > n. 2006-12-22 Gavin Romig-Koch @@ -74,52 +957,30 @@ * include/atomic.h (atomic_forced_read): New macro. -2006-12-20 SUGIOKA Toshinobu - - * sysdeps/unix/sysv/linux/sh/bits/shm.h: New file. - 2006-12-19 Jakub Jelinek - * nss/getXXbyYY_r.c: Include atomic.h. - (INTERNAL (REENTRANT_NAME)): Write startp after start_fct, - add atomic_write_barrier () in between. - * stdlib/Makefile (tests): Add tst-makecontext. * stdlib/tst-makecontext.c: New test. * sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S (__makecontext): Don't realign uc_mcontext.uc_regs. -2006-11-28 Jakub Jelinek +2006-12-13 Jakub Jelinek - * elf/dl-support.c: Include dl-procinfo.h. - * sysdeps/powerpc/dl-procinfo.h (PPC_PLATFORM_POWER4, - PPC_PLATFORM_PPC970, PPC_PLATFORM_POWER5, PPC_PLATFORM_POWER5_PLUS, - PPC_PLATFORM_POWER6, PPC_PLATFORM_CELL_BE, PPC_PLATFORM_POWER6X): - Define. - (_dl_string_platform): Use PPC_PLATFORM_* macros instead of - hardcoded constants. - * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platform): Use - PPC_PLATFORM_* macros for array designators. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S: Include + kernel-features.h. -2006-11-11 Steven Munroe +2006-12-19 Jakub Jelinek - * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Add 3 new cap - names to the beginning. - (_dl_powerpc_platforms): Add "power6x". - * sysdeps/powerpc/dl-procinfo.h (_DL_HWCAP_FIRST): Decrease. - (HWCAP_IMPORTANT): Add PPC_FEATURE_HAS_DFP. - (_DL_PLATFORMS_COUNT): Increase. - (_dl_string_platform): Handle power6x case. - * sysdeps/powerpc/sysdep.h (PPC_FEATURE_PA6T, PPC_FEATURE_HAS_DFP, - PPC_FEATURE_POWER6_EXT): Define. - (PPC_FEATURE_POWER5, PPC_FEATURE_POWER5_PLUS): Correct Comment. + * nss/getXXbyYY_r.c: Include atomic.h. + (INTERNAL (REENTRANT_NAME)): Write startp after start_fct, + add atomic_write_barrier () in between. 2006-12-18 Jakub Jelinek [BZ #3747] * stdlib/jrand48_r.c (__jrand48_r): Make sure result is in the - [-2^31 .. 2^31) range. + [-231 .. 231) range. * stdlib/tst-rand48.c (main): Fix expected values for 64-bit targets. * stdlib/tst-rand48-2.c: New test. @@ -136,10 +997,6 @@ 2006-12-13 Ulrich Drepper - * sysdeps/unix/sysv/linux/bits/statvfs.h: Define ST_RELATIME. - * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags): - Handle relatime mount option. - [BZ #2337] * libio/Makefile (tests): Add tst-setvbuf1. * libio/tst-setvbuf1.c: New file. @@ -165,16 +1022,12 @@ * libio/fileops.c (_IO_new_file_close_it): Call _IO_set[bgp] even for wide streams. -2006-12-13 Jakub Jelinek - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S: Include - kernel-features.h. - -2006-12-11 Ulrich Drepper +2006-12-09 Jakub Jelinek - * stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand - separators also if no non-zero digits found. - * stdlib/Makefile (tests): Add tst-strtod3. + * misc/mntent_r.c (__hasmntopt): Check p[optlen] even when p == rest. + Start searching for next comma at p rather than rest. + * misc/Makefile (tests): Add tst-mntent2. + * misc/tst-mntent2.c: New test. 2006-12-09 Ulrich Drepper @@ -182,49 +1035,24 @@ * include/features.h: Fix comment about default value for _POSIX_C_SOURCE. - [BZ #3664] - * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix test to recognize - empty parsed strings. - * stdlib/Makefile (tests): Add tst-strtod2. - * stdlib/tst-strtod2.c: New file. - - [BZ #3673] - * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix exp_limit - computation. - * stdlib/Makefile (tests): Add tst-atof2. - * stdlib/tst-atof2.c: New file. - - [BZ #3674] - * stdlib/strtod_l.c (____STRTOF_INTERNAL): Adjust exponent value - correctly if removing trailing zero of hex-float. - * stdlib/Makefile (tests): Add tst-atof1. - * stdlib/tst-atof1.c: New file. - 2006-12-09 Jakub Jelinek - * misc/mntent_r.c (__hasmntopt): Check p[optlen] even when p == rest. - Start searching for next comma at p rather than rest. - * misc/Makefile (tests): Add tst-mntent2. - * misc/tst-mntent2.c: New test. - * misc/getusershell.c (initshells): Check for integer overflows. Make strings buffer one bigger as fgets always succeeds when second argument is 1. Don't use calloc for shells array. Disallow - / as shell. - -2006-12-08 Ulrich Drepper - - * malloc/memusage.c: Handle realloc with new size of zero and - non-NULL pointer correctly. - (me): Really write first record twice. - (struct entry): Make format bi-arch safe. - (dest): Write out more realloc statistics. - * malloc/memusagestat.c (struct entry): Make format bi-arch safe. + / as shell. 2006-12-05 Jakub Jelinek * nis/nis_subr.c (nis_getnames): Revert last change. +2006-10-11 Jakub Jelinek + + * nis/nis_defaults.c (__nis_default_access): Don't call getenv twice. + + * nis/nis_subr.c (nis_getnames): Use __secure_getenv instead of getenv. + * sysdeps/generic/unsecvars.h: Add NIS_PATH. + 2006-12-04 Jakub Jelinek * sysdeps/unix/sysv/linux/ttyname.c: Include termios.h. @@ -235,189 +1063,77 @@ * io/Makefile: Add rules to build and run tst-ttyname_r test. * io/tst-ttyname_r.c: New test. -2006-12-03 Kaz Kojima - - * sysdeps/unix/sysv/linux/sh/sys/io.h: Removed. - -2006-11-30 H.J. Lu - - * sysdeps/i386/i686/memcmp.S: Use jump table as the base of - jump table entries. - -2006-11-30 Jan Kratochvil - - * sysdeps/unix/sysv/linux/i386/clone.S: Provide CFI for the outermost - `clone' function to ensure proper unwinding stop of gdb. - * sysdeps/unix/sysv/linux/x86_64/clone.S: Likewise. - -2006-12-01 Ulrich Drepper - - * nscd/nscd.init: Remove obsolete and commented-out -S option - handling. - -2006-11-23 Jakub Jelinek - - [BZ #3514] - * manual/string.texi (strncmp): Fix pastos from wcscmp description. - - [BZ #3515] - * manual/string.texi (strtok): Remove duplicate paragraph. - -2006-12-01 Jan Kratochvil - - * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Fix compatibility with - libgcc not supporting `rflags' unwinding (register # >= 17). - -2006-11-30 Jakub Jelinek +2006-11-28 Jakub Jelinek - * sunrpc/svc_run.c (svc_run): Set my_pollfd to new_pollfd if realloc - succeeded. + * elf/dl-support.c: Include dl-procinfo.h. + * sysdeps/powerpc/dl-procinfo.h (PPC_PLATFORM_POWER4, + PPC_PLATFORM_PPC970, PPC_PLATFORM_POWER5, PPC_PLATFORM_POWER5_PLUS, + PPC_PLATFORM_POWER6, PPC_PLATFORM_CELL_BE, PPC_PLATFORM_POWER6X): + Define. + (_dl_string_platform): Use PPC_PLATFORM_* macros instead of + hardcoded constants. + * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platform): Use + PPC_PLATFORM_* macros for array designators. -2006-11-29 Daniel Jacobowitz - Jakub Jelinek - Jan Kratochvil +2006-11-11 Steven Munroe - * sysdeps/unix/sysv/linux/x86_64/sigaction.c (restore_rt): Add correct - unwind information. - * sysdeps/unix/sysv/linux/x86_64/Makefile: Provide symbols for - 'restore_rt' even in the 'signal' directory. - * sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym: Extend the regs list. + * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Add 3 new cap + names to the beginning. + (_dl_powerpc_platforms): Add "power6x". + * sysdeps/powerpc/dl-procinfo.h (_DL_HWCAP_FIRST): Decrease. + (HWCAP_IMPORTANT): Add PPC_FEATURE_HAS_DFP. + (_DL_PLATFORMS_COUNT): Increase. + (_dl_string_platform): Handle power6x case. + * sysdeps/powerpc/sysdep.h (PPC_FEATURE_PA6T, PPC_FEATURE_HAS_DFP, + PPC_FEATURE_POWER6_EXT): Define. + (PPC_FEATURE_POWER5, PPC_FEATURE_POWER5_PLUS): Correct Comment. 2006-11-27 Jakub Jelinek [BZ #3559] * sunrpc/svc_run.c (svc_run): Fail instead of segfaulting if - malloc crashed. Don't allocate memory unnecessarily in each - loop. + malloc crashed. -2006-10-21 Jakub Jelinek +2006-11-14 Jakub Jelinek - * resolv/mapv4v6addr.h (map_v4v6_address): Fix last change. + * nss/nss_files/files-alias.c (get_next_alias): Set line back + to first_unused after parsing :include: file. -2006-11-20 Ulrich Drepper +2006-11-14 Ulrich Drepper - * resolv/mapv4v6addr.h (map_v4v6_address): Optimize a bit. + * po/nl.po: Update from translation team. -2006-11-18 Bruno Haible +2006-11-10 Ulrich Drepper - * sysdeps/unix/sysv/linux/i386/getgroups.c (__getgroups): Invoke - __sysconf only after having tried to call getgroups32. + * po/sv.po: Update from translation team. -2006-11-19 Ulrich Drepper +2006-11-01 Ulrich Drepper - * nss/nss_files/files-hosts.c (LINE_PARSER): Support IPv6-style - addresses for IPv4 queries if they can be mapped. + * po/sv.po: Update from translation team. -2006-11-16 Jakub Jelinek +2006-10-29 Ulrich Drepper - * sysdeps/x86_64/fpu/s_copysignf.S (__copysignf): Switch to .text. - * sysdeps/x86_64/fpu/s_copysign.S (__copysign): Likewise. - (signmask): Add .size directive. - (othermask): Add .type directive. + * po/sv.po: Update from translation team. -2006-11-14 Ulrich Drepper +2006-10-09 Ulrich Drepper - * po/nl.po: Update from translation team. + * po/sv.po: Update from translation team. - * timezone/zdump.c: Redo fix for BZ #3137. +2006-10-07 Ulrich Drepper -2006-11-14 Jakub Jelinek + * po/tr.po: Update from translation team. - * nss/nss_files/files-alias.c (get_next_alias): Set line back - to first_unused after parsing :include: file. +2006-10-06 Ulrich Drepper -2006-11-10 Ulrich Drepper + * po/pl.po: Update from translation team. - * timezone/africa: Update from tzdata2006o. - * timezone/antarctica: Likewise. - * timezone/asia: Likewise. - * timezone/australasia: Likewise. - * timezone/backward: Likewise. - * timezone/europe: Likewise. - * timezone/iso3166.tab: Likewise. - * timezone/northamerica: Likewise. - * timezone/southamerica: Likewise. - * timezone/zone.tab: Likewise. - - * time/tzfile.c (__tzfile_read): Extend to handle new file format - on machines with 64-bit time_t. - - * timezone/checktab.awk: Update from tzcode2006o. - * timezone/ialloc.c: Likewise. - * timezone/private.h: Likewise. - * timezone/scheck.c: Likewise. - * timezone/tzfile.h: Likewise. - * timezone/tzselect.ksh: Likewise. - * timezone/zdump.c: Likewise. - * timezone/zic.c: Likewise. - - [BZ #3483] - * elf/ldconfig.c (main): Call setlocale and textdomain. - Patch mostly by Benno Schulenberg . - - [BZ #3480] - * manual/argp.texi: Fix typos. - * manual/charset.texi: Likewise. - * manual/errno.texi: Likewise. - * manual/filesys.texi: Likewise. - * manual/lang.texi: Likewise. - * manual/maint.texi: Likewise. - * manual/memory.texi: Likewise. - * manual/message.texi: Likewise. - * manual/resource.texi: Likewise. - * manual/search.texi: Likewise. - * manual/signal.texi: Likewise. - * manual/startup.texi: Likewise. - * manual/stdio.texi: Likewise. - * manual/sysinfo.texi: Likewise. - * manual/syslog.texi: Likewise. - * manual/time.texi: Likewise. - Patch by Ralf Wildenhues . - - [BZ #3465] - * sunrpc/clnt_raw.c: Minimal message improvements. - * sunrpc/pm_getmaps.c: Likewise. - * nis/nss_nisplus/nisplus-publickey.c: Likewise. - * nis/nis_print_group_entry.c: Likewise. - * locale/programs/repertoire.c: Likewise. - * locale/programs/charmap.c: Likewise. - * malloc/memusage.sh: Likewise. - * elf/dl-deps.c: Likewise. - * locale/programs/ld-collate.c: Likewise. - * libio/vswprintf.c: Likewise. - * malloc/memusagestat.c: Likewise. - * sunrpc/auth_unix.c: Likewise. - * sunrpc/rpc_main.c: Likewise. - * nscd/cache.c: Likewise. - * locale/programs/repertoire.c: Unify output messages. - * locale/programs/charmap.c: Likewise. - * locale/programs/ld-ctype.c: Likewise. - * locale/programs/ld-monetary.c: Likewise. - * locale/programs/ld-numeric.c: Likewise. - * locale/programs/ld-time.c: Likewise. - * elf/ldconfig.c: Likewise. - * nscd/selinux.c: Likewise. - * elf/cache.c: Likewise. - Patch mostly by Benno Schulenberg . +2006-11-10 Ulrich Drepper [BZ #3451] * sysdeps/i386/fpu/bits/mathinline.h (floor): Make rounding mode change atomic. (ceil): Likewise. -2006-11-10 Jakub Jelinek - - * string/strxfrm_l.c (STRXFRM): Fix trailing \1 optimization - if N is one bigger than return value. - * string/tst-strxfrm2.c (do_test): Also test strxfrm with l1 + 1 - and l1 last arguments, if buf is defined, verify the return value - equals to strlen (buf) and verify no byte beyond passed length - is modified. - -2006-11-10 Ulrich Drepper - - * po/sv.po: Update from translation team. - 2006-11-09 Ulrich Drepper * sysdeps/unix/sysv/linux/x86_64/sysconf.c (intel_check_word): Add @@ -428,204 +1144,27 @@ * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word): Add noinline attribute. - * sysdeps/gnu/siglist.c (__old_sys_siglist, __old_sys_sigabbrev): - Use __new_sys_siglist instead of _sys_siglist_internal as - second macro argument. - (_old_sys_siglist): Use declare_symbol_alias macro instead of - strong_alias. - -2006-11-09 Ulrich Drepper - - [BZ #3493] - * posix/unistd.h (sysconf): Remove const attribute. - - * sysdeps/posix/getaddrinfo.c (getaddrinfo): Fix test for - temporary or deprecated addresses. - Patch by Sridhar Samudrala . - - * string/Makefile (tests): Add tst-strxfrm2. - * string/tst-strxfrm2.c: New file. - -2006-10-09 Jakub Jelinek +2006-11-05 Ulrich Drepper - * elf/dl-debug.c (_dl_debug_initialize): Check r->r_map for 0 - rather than r->r_brk. + * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word): + Update handling of cache descriptor 0x49 for new models. + * sysdeps/unix/sysv/linux/x86_64/sysconf.c (intel_check_word): + Likewise. 2006-11-08 Jakub Jelinek - * string/strxfrm_l.c (STRXFRM): Do the trailing \1 removal - optimization even if needed > n. - * elf/dl-load.c (decompose_rpath): Return bool rather than void. If l->l_name is on inhibit_rpath list, set sps->dirs to -1 and return false, otherwise return true. (cache_rpath): Return decompose_rpath return value. -2006-11-07 Jakub Jelinek - - * include/libc-symbols.h (declare_symbol): Rename to... - (declare_symbol_alias): ... this. Add ORIGINAL argument, imply - strong_alias (ORIGINAL, SYMBOL) in asm to make sure it preceedes - .size directive. - * sysdeps/gnu/errlist-compat.awk: Adjust for declare_symbol_alias - changes. - * sysdeps/gnu/siglist.c: Likewise. - -2006-11-03 Steven Munroe - - * sysdeps/powerpc/fpu/bits/mathinline.h - [__LIBC_INTERNAL_MATH_INLINES]: Moved to ... - * sysdeps/powerpc/fpu/math_private.h: ...here. New file. - -2006-11-05 Ulrich Drepper - - * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word): - Update handling of cache descriptor 0x49 for new models. - * sysdeps/unix/sysv/linux/x86_64/sysconf.c (intel_check_word): - Likewise. - 2006-11-02 Jakub Jelinek * malloc/memusage.c (dest): Reset not_me back to false after printing statistics. -2006-11-02 Ulrich Drepper - - * configure.in: Work around ld --help change and avoid -z relro - test completely if the architecture doesn't care about security. - -2006-11-01 Ulrich Drepper - - * po/sv.po: Update from translation team. - -2006-10-31 Ulrich Drepper - - * stdlib/atexit.c (atexit): Don't mark as hidden when used to - generate compatibility version. - -2006-10-29 Ulrich Drepper - - * configure.in: Relax -z relro requirement a bit. - - * po/sv.po: Update from translation team. - -2006-10-29 Jakub Jelinek - - * elf/dl-sym.c (do_sym): Use RTLD_SINGLE_THREAD_P. - * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Likewise. - * elf/dl-close.c (_dl_close_worker): Likewise. - * elf/dl-open.c (_dl_open_worker): Likewise. - * sysdeps/generic/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): Define. - 2006-10-27 Ulrich Drepper - * configure.in: Require assembler support for visibility, compiler - support for visibility and aliases, linker support for various -z - options. - * Makeconfig: Remove conditional code which now is unnecessary. - * config.h.in: Likewise. - * config.make.in: Likewise. - * dlfcn/Makefile: Likewise. - * elf/Makefile: Likewise. - * elf/dl-load.c: Likewise. - * elf/rtld.c: Likewise. - * include/libc-symbols.h: Likewise. - * include/stdio.h: Likewise. - * io/Makefile: Likewise. - * io/fstat.c: Likewise. - * io/fstat64.c: Likewise. - * io/fstatat.c: Likewise. - * io/fstatat64.c: Likewise. - * io/lstat.c: Likewise. - * io/lstat64.c: Likewise. - * io/mknod.c: Likewise. - * io/mknodat.c: Likewise. - * io/stat.c: Likewise. - * io/stat64.c: Likewise. - * libio/stdio.c: Likewise. - * nscd/Makefile: Likewise. - * stdlib/Makefile: Likewise. - * stdlib/atexit.c: Likewise. - * sysdeps/generic/ldsodefs.h: Likewise. - * sysdeps/i386/dl-machine.h: Likewise. - * sysdeps/i386/sysdep.h: Likewise. - * sysdeps/i386/i686/memcmp.S: Likewise. - * sysdeps/powerpc/powerpc32/sysdep.h: Likewise. - * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise. - - * Makerules: USE_TLS support is now default. - * tls.make.c: Likewise. - * csu/Versions: Likewise. - * csu/libc-start.c: Likewise. - * csu/libc-tls.c: Likewise. - * csu/version.c: Likewise. - * dlfcn/dlinfo.c: Likewise. - * elf/dl-addr.c: Likewise. - * elf/dl-cache.c: Likewise. - * elf/dl-close.c: Likewise. - * elf/dl-iteratephdr.c: Likewise. - * elf/dl-load.c: Likewise. - * elf/dl-lookup.c: Likewise. - * elf/dl-object.c: Likewise. - * elf/dl-open.c: Likewise. - * elf/dl-reloc.c: Likewise. - * elf/dl-support.c: Likewise. - * elf/dl-sym.c: Likewise. - * elf/dl-sysdep.c: Likewise. - * elf/dl-tls.c: Likewise. - * elf/ldconfig.c: Likewise. - * elf/rtld.c: Likewise. - * elf/tst-tls-dlinfo.c: Likewise. - * elf/tst-tls1.c: Likewise. - * elf/tst-tls10.h: Likewise. - * elf/tst-tls14.c: Likewise. - * elf/tst-tls2.c: Likewise. - * elf/tst-tls3.c: Likewise. - * elf/tst-tls4.c: Likewise. - * elf/tst-tls5.c: Likewise. - * elf/tst-tls6.c: Likewise. - * elf/tst-tls7.c: Likewise. - * elf/tst-tls8.c: Likewise. - * elf/tst-tls9.c: Likewise. - * elf/tst-tlsmod1.c: Likewise. - * elf/tst-tlsmod13.c: Likewise. - * elf/tst-tlsmod13a.c: Likewise. - * elf/tst-tlsmod14a.c: Likewise. - * elf/tst-tlsmod2.c: Likewise. - * elf/tst-tlsmod3.c: Likewise. - * elf/tst-tlsmod4.c: Likewise. - * elf/tst-tlsmod5.c: Likewise. - * elf/tst-tlsmod6.c: Likewise. - * include/errno.h: Likewise. - * include/link.h: Likewise. - * include/tls.h: Likewise. - * locale/global-locale.c: Likewise. - * locale/localeinfo.h: Likewise. - * malloc/arena.c: Likewise. - * malloc/hooks.c: Likewise. - * malloc/malloc.c: Likewise. - * resolv/Versions: Likewise. - * sysdeps/alpha/dl-machine.h: Likewise. - * sysdeps/alpha/libc-tls.c: Likewise. - * sysdeps/generic/ldsodefs.h: Likewise. - * sysdeps/generic/tls.h: Likewise. - * sysdeps/i386/dl-machine.h: Likewise. - * sysdeps/ia64/dl-machine.h: Likewise. - * sysdeps/ia64/libc-tls.c: Likewise. - * sysdeps/mach/hurd/fork.c: Likewise. - * sysdeps/mach/hurd/i386/tls.h: Likewise. - * sysdeps/powerpc/powerpc32/dl-machine.c: Likwise. - * sysdeps/powerpc/powerpc32/dl-machine.h: Likewise. - * sysdeps/powerpc/powerpc64/dl-machine.h: Likewise. - * sysdeps/s390/libc-tls.c: Likewise. - * sysdeps/s390/s390-32/dl-machine.h: Likewise. - * sysdeps/s390/s390-64/dl-machine.h: Likewise. - * sysdeps/sh/dl-machine.h: Likewise. - * sysdeps/sparc/sparc32/dl-machine.h: Likewise. - * sysdeps/sparc/sparc64/dl-machine.h: Likewise. - * sysdeps/x86_64/dl-machine.h: Likewise. - * elf/dl-close.c (_dl_close_worker): Renamed from _dl_close and split out locking and parameter checking. (_dl_close): Call _dl_close_worker after locking and checking. @@ -634,50 +1173,12 @@ * elf/Makefile: Add rules to build and run tst-thrlock. * elf/tst-thrlock.c: New file. - [BZ #3426] - * stdlib/stdlib.h: Adjust comment for canonicalize_file_name to - reality. - [BZ #3429] * elf/dl-open.c (dl_open_worker): Keep holding dl_load_lock until we are sure we do not need it anymore for _dl_close. Also move the asserts inside the lock region. Patch mostly by Suzuki . -2006-10-27 Jakub Jelinek - - * elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope - argument. - (_dl_lookup_symbol_x): Adjust caller. - - * sysdeps/generic/ldsodefs.h (struct link_namespaces): Remove - _ns_global_scope. - * elf/rtld.c (dl_main): Don't initialize _ns_global_scope. - - * elf/dl-libc.c: Revert l_scope name changes. - * elf/dl-load.c: Likewise. - * elf/dl-object.c: Likewise. - * elf/rtld.c: Likewise. - * elf/dl-close.c (_dl_close): Likewise. - * elf/dl-open.c (dl_open_worker): Likewise. If not SINGLE_THREAD_P, - always use __rtld_mrlock_{change,done}. Always free old scope list - here if not l_scope_mem. - * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Revert l_scope name - change. Never free scope list here. Just __rtld_mrlock_lock before - the lookup and __rtld_mrlock_unlock it after the lookup. - * elf/dl-sym.c: Likewise. - * include/link.h (struct r_scoperec): Remove. - (struct link_map): Replace l_scoperec with l_scope, l_scoperec_mem - with l_scope_mem and l_scoperec_lock with l_scope_lock. - -2006-10-25 Ulrich Drepper - - * sysdeps/gnu/netinet/tcp.h: Define TCP_CONGESTION. - -2006-10-18 Ulrich Drepper - - * configure.in: Disable building profile libraries by default. - 2006-10-17 Jakub Jelinek * sunrpc/xdr_mem.c (xdrmem_setpos): Don't compare addresses @@ -685,68 +1186,14 @@ * sunrpc/Makefile (tests): Add tst-xdrmem2. * sunrpc/tst-xdrmem2.c: New test. -2006-10-18 Ulrich Drepper - - * elf/dl-lookup.c (_dl_lookup_symbol_x): Add warning to - _dl_lookup_symbol_x code. - -2006-10-17 Jakub Jelinek - - * elf/dl-runtime.c: Include sysdep-cancel.h. - (_dl_fixup, _dl_profile_fixup): Use __rtld_mrlock_* and - scoperec->nusers only if !SINGLE_THREAD_P. Use atomic_* - instead of catomic_* macros. - * elf/dl-sym.c: Include sysdep-cancel.h. - (do_sym): Use __rtld_mrlock_* and scoperec->nusers only - if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros. - * elf/dl-close.c: Include sysdep-cancel.h. - (_dl_close): Use __rtld_mrlock_* and scoperec->nusers only - if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros. - * elf/dl-open.c: Include sysdep-cancel.h. - (dl_open_worker): Use __rtld_mrlock_* and scoperec->nusers only - if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros. - -2006-10-17 Jakub Jelinek - - [BZ #3313] - * malloc/malloc.c (malloc_consolidate): Set maxfb to address of last - fastbin rather than end of fastbin array. - -2006-10-18 Ulrich Drepper - - * sysdeps/i386/i486/bits/atomic.h (catomic_decrement): Use correct - body macro. - * sysdeps/x86_64/bits/atomic.h - (__arch_c_compare_and_exchange_val_64_acq): Add missing casts. - (catomic_decrement): Use correct body macro. - -2006-10-17 Jakub Jelinek - - * include/atomic.h: Add a unique prefix to all local variables - in macros. - * csu/tst-atomic.c (do_test): Test also catomic_* macros. - 2006-10-16 Ulrich Drepper [BZ #3369] * sysdeps/posix/getaddrinfo.c (rfc3484_sort): Fix typos in rules 4 and 7. -2006-10-14 Ulrich Drepper - - * resolv/arpa/nameser.h: Document that ns_t_a6 is deprecated. - 2006-10-13 Ulrich Drepper - [BZ #3313] - * malloc/malloc.c (malloc_consolidate): Don't use get_fast_max to - determine highest fast bin to consolidate, always look into all of - them. - (do_check_malloc_state): Only require for empty bins for large - sizes in main arena. - - * libio/stdio.h: Add more __wur attributes. - * elf/dl-minimal.c (realloc): Optimize last patch. 2006-10-12 Richard Sandiford @@ -755,56 +1202,10 @@ * elf/dl-minimal.c (realloc): Let malloc() return a new pointer, and use memcpy() if it does. -2006-11-12 Andreas Jaeger - - [BZ #2510] - * manual/search.texi (Hash Search Function): Clarify. - (Array Search Function): Clarify. - -2006-11-12 Joseph Myers - - [BZ #2830] - * math/atest-exp.c (main): Cast hex value to mp_limb_t before - shifting. - * math/atest-exp2.c (read_mpn_hex): Likewise. - * math/atest-sincos.c (main): Likewise. - 2006-10-11 Ulrich Drepper - * sysdeps/unix/sysv/linux/syscalls.list: Add epoll_pwait. - * sysdeps/unix/sysv/linux/sys/epoll.h: Declare epoll_pwait. - * sysdeps/unix/sysv/linux/Versions (libc): Add epoll_pwait for - version GLIBC_2.6. - * Versions.def: Add GLIBC_2.6 for libc. - * sysdeps/unix/sysv/linux/i386/sysdep.h (DOARGS_6): Fix offset. - * sysdeps/i386/i486/bits/atomic.h: Add catomic_* support. - -2006-10-11 Jakub Jelinek - - * malloc/malloc.c (_int_malloc): Remove unused any_larger variable. - - * nis/nis_defaults.c (__nis_default_access): Don't call getenv twice. - - * nis/nis_subr.c (nis_getnames): Use __secure_getenv instead of getenv. - * sysdeps/generic/unsecvars.h: Add NIS_PATH. - -2006-10-11 Ulrich Drepper - - * include/atomic.c: Define catomic_* operations. - * sysdeps/x86_64/bits/atomic.h: Likewise. Fix a few minor problems. - * stdlib/cxa_finalize.c: Use catomic_* operations instead of atomic_*. - * malloc/memusage.c: Likewise. - * gmon/mcount.c: Likewise. - * elf/dl-close.c: Likewise. - * elf/dl-open.c: Likewise. - * elf/dl-profile.c: Likewise. - * elf/dl-sym.c: Likewise. - * elf/dl-runtime.c: Likewise. - * elf/dl-fptr.c: Likewise. - * resolv/res_libc.c: Likewise. - 2006-10-10 Ulrich Drepper * nis/nis_subr.c (nis_getnames): Add trailing dot to NIS_PATH @@ -814,59 +1215,13 @@ at least one entry consisting of the parameter concatenated with the domain. -2006-10-10 Roland McGrath - - * sysdeps/mach/hurd/utimes.c: Use a union to avoid an improper cast. - * sysdeps/mach/hurd/futimes.c: Likewise. - * sysdeps/mach/hurd/lutimes.c: Likewise. - -2006-10-09 Ulrich Drepper - Jakub Jelinek - - Implement reference counting of scope records. - * elf/dl-close.c (_dl_close): Remove all scopes from removed objects - from the list in objects which remain. Always allocate new scope - record. - * elf/dl-open.c (dl_open_worker): When growing array for scopes, - don't resize, allocate a new one. - * elf/dl-runtime.c: Update reference counters before using a scope - array. - * elf/dl-sym.c: Likewise. - * elf/dl-libc.c: Adjust for l_scope name change. - * elf/dl-load.c: Likewise. - * elf/dl-object.c: Likewise. - * elf/rtld.c: Likewise. - * include/link.h: Include . Define struct - r_scoperec. Replace r_scope with pointer to r_scoperec structure. - Add l_scoperec_lock. - * sysdeps/generic/ldsodefs.h: Include . - * sysdeps/generic/rtld-lowlevel.h: New file. - - * include/atomic.h: Rename atomic_and to atomic_and_val and - atomic_or to atomic_or_val. Define new macros atomic_and and - atomic_or which do not return values. - * sysdeps/x86_64/bits/atomic.h: Define atomic_and and atomic_or. - Various cleanups. - * sysdeps/i386/i486/bits/atomic.h: Likewise. - - * po/sv.po: Update from translation team. - -2006-10-07 Ulrich Drepper - - * Versions.def: Add GLIBC_2.6 to libpthread. - - * include/shlib-compat.h (SHLIB_COMPAT): Expand parameters before use. - (versioned_symbol): Likewise. - (compat_symbol): Likewise. +2006-10-09 Jakub Jelinek - * po/tr.po: Update from translation team. + * elf/dl-debug.c (_dl_debug_initialize): Check r->r_map for 0 + rather than r->r_brk. 2006-10-06 Ulrich Drepper - * nis/Banner: Removed. It's been integral part forever and the - author info is incomplete anyway. - * libio/Banner: Likewise. - * nis/nis_table.c (nis_list): If __follow_path fails in the new code, make sure the nis_freeresult call doesn't crash and that the result is reported correctly. @@ -888,10 +1243,6 @@ Don't use locking around _nss_grp_create_tablename call. * nis/nss_nisplus/nisplus-initgroups.c: New file. -2006-10-06 Ulrich Drepper - - * version.h (VERSION): Bump to 2.5.90 for new development tree. - 2006-10-06 Andreas Jaeger * include/features.h (__GLIBC_MINOR__): It's glibc 2.5 now. diff --git a/Makeconfig b/Makeconfig index 349f94d9ac..5a1aebccff 100644 --- a/Makeconfig +++ b/Makeconfig @@ -407,9 +407,11 @@ LDFLAGS.so += $(combreloc-LDFLAGS) LDFLAGS-rtld += $(combreloc-LDFLAGS) endif +ifeq (yes,$(have-z-relro)) relro-LDFLAGS = -Wl,-z,relro LDFLAGS.so += $(relro-LDFLAGS) LDFLAGS-rtld += $(relro-LDFLAGS) +endif ifeq (yes,$(have-hash-style)) # For the time being we unconditionally use 'both'. At some time we diff --git a/Makerules b/Makerules index 200f8d7eea..b0be86b368 100644 --- a/Makerules +++ b/Makerules @@ -1233,7 +1233,10 @@ endif ifeq ($(firstword $(sysd-sorted-done) f)$(firstword $(generating) f),tf) -include $(common-objpfx)tls.make +config-tls := notls +ifeq ($(use-tls),yes) config-tls := tls +endif ifeq ($(use-thread),yes) config-tls := thread endif diff --git a/NEWS b/NEWS index f078f3cc63..f18b2d73f0 100644 --- a/NEWS +++ b/NEWS @@ -1,13 +1,21 @@ -GNU C Library NEWS -- history of user-visible changes. 2006-10-11 +GNU C Library NEWS -- history of user-visible changes. 2006-09-29 Copyright (C) 1992-2002,2003,2004,2005,2006 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.6 +Version 2.5.1 -* New Linux interfaces: epoll_pwait. +* The following bugs are resolved with this release: + + 2337, 2749, 3213, 3291, 3306, 3320, 3322, 3334, 3348, 3352, 3369, 3429, + 3451, 3458, 3559, 3632, 3664, 3673, 3674, 3747, 3842, 3851, 3855, 3884, + 3902, 3919, 3944, 3954, 3955, 3957, 3995, 4069, 4070, 4074, 4076, 4101, + 4102, 4130, 4131, 4181, 4342, 4344, 4364, 4368, 4381, 4405, 4406, 4411, + 4438, 4439, 4465, 4512, 4514, 4586, 4702, 4858 + + Visit for the details of each bug. Version 2.5 diff --git a/README b/README index 97b3a61e06..2980b10a01 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -This directory contains the version 2.5 release of the GNU C Library. +This directory contains the version 2.5.1 release of the GNU C Library. The GNU C Library is the standard system C library for all GNU systems, and is an important part of what makes up a GNU system. It provides the @@ -52,7 +52,7 @@ The GNU C Library supports these configurations for using Linux kernels: The code for other CPU configurations supported by volunteers outside of the core glibc maintenance effort is contained in the separate `ports' -add-on. You can find glibc-ports-2.5 distributed separately in the +add-on. You can find glibc-ports-2.5.1 distributed separately in the same place where you got the main glibc distribution files. Currently these configurations are known to work using the `ports' add-on: diff --git a/Versions.def b/Versions.def index 254208469f..b492caaf0b 100644 --- a/Versions.def +++ b/Versions.def @@ -22,7 +22,6 @@ libc { GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 - GLIBC_2.6 %ifdef USE_IN_LIBIO HURD_CTHREADS_0.3 %endif @@ -83,7 +82,6 @@ libpthread { GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 - GLIBC_2.6 GLIBC_PRIVATE } libresolv { diff --git a/argp/Makefile b/argp/Makefile index 5ade517476..b8c9fca0fb 100644 --- a/argp/Makefile +++ b/argp/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1997, 2002, 2003, 2006 Free Software Foundation, Inc. +# Copyright (C) 1997, 2002, 2003, 2006, 2007 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 @@ -26,7 +26,7 @@ distribute = argp-fmtstream.h argp-namefrob.h routines = $(addprefix argp-, ba fmtstream fs-xinl help parse pv \ pvh xinl eexst) -tests = argp-test tst-argp1 bug-argp1 +tests = argp-test tst-argp1 bug-argp1 tst-argp2 CFLAGS-argp-help.c = $(uses-callbacks) -fexceptions CFLAGS-argp-parse.c = $(uses-callbacks) diff --git a/argp/argp-help.c b/argp/argp-help.c index 13c0820710..c12b10e235 100644 --- a/argp/argp-help.c +++ b/argp/argp-help.c @@ -1,5 +1,6 @@ /* Hierarchial argument parsing help output - Copyright (C) 1995-2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Miles Bader . @@ -672,9 +673,9 @@ hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2) { /* If one cluster is deeper than the other, use its ancestor at the same level, so that finding the common ancestor is straightforward. */ - while (cl1->depth < cl2->depth) + while (cl1->depth > cl2->depth) cl1 = cl1->parent; - while (cl2->depth < cl1->depth) + while (cl2->depth > cl1->depth) cl2 = cl2->parent; /* Now reduce both clusters to their ancestors at the point where both have @@ -987,7 +988,7 @@ static const char * filter_doc (const char *doc, int key, const struct argp *argp, const struct argp_state *state) { - if (argp->help_filter) + if (argp && argp->help_filter) /* We must apply a user filter to this output. */ { void *input = __argp_input (argp, state); diff --git a/argp/tst-argp2.c b/argp/tst-argp2.c new file mode 100644 index 0000000000..926614fbc8 --- /dev/null +++ b/argp/tst-argp2.c @@ -0,0 +1,101 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2007. + + 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 + +static const struct argp_option opt1[] = + { + { "opt1", '1', "NUMBER", 0, "Option 1" }, + { NULL, 0, NULL, 0, NULL } + }; + +static const struct argp_option opt2[] = + { + { "opt2", '2', "NUMBER", 0, "Option 2" }, + { NULL, 0, NULL, 0, NULL } + }; + +static const struct argp_option opt3[] = + { + { "opt3", '3', "NUMBER", 0, "Option 3" }, + { NULL, 0, NULL, 0, NULL } + }; + +static const struct argp_option opt4[] = + { + { "opt4", '4', "NUMBER", 0, "Option 4" }, + { NULL, 0, NULL, 0, NULL } + }; + +static const struct argp_option opt5[] = + { + { "opt5", '5', "NUMBER", 0, "Option 5" }, + { NULL, 0, NULL, 0, NULL } + }; + +static struct argp argp5 = + { + opt5, NULL, "args doc5", "doc5", NULL, NULL, NULL + }; + +static struct argp argp4 = + { + opt4, NULL, "args doc4", "doc4", NULL, NULL, NULL + }; + +static struct argp argp3 = + { + opt3, NULL, "args doc3", "doc3", NULL, NULL, NULL + }; + +static struct argp_child children2[] = + { + { &argp4, 0, "child3", 3 }, + { &argp5, 0, "child4", 4 }, + { NULL, 0, NULL, 0 } + }; + +static struct argp argp2 = + { + opt2, NULL, "args doc2", "doc2", children2, NULL, NULL + }; + +static struct argp_child children1[] = + { + { &argp2, 0, "child1", 1 }, + { &argp3, 0, "child2", 2 }, + { NULL, 0, NULL, 0 } + }; + +static struct argp argp1 = + { + opt1, NULL, "args doc1", "doc1", children1, NULL, NULL + }; + + +static int +do_test (void) +{ + argp_help (&argp1, stdout, ARGP_HELP_LONG, (char *) "tst-argp2"); + return 0; +} + + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/catgets/gencat.c b/catgets/gencat.c index f5cbb8e1b3..e72754d526 100644 --- a/catgets/gencat.c +++ b/catgets/gencat.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -246,7 +246,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } diff --git a/config.h.in b/config.h.in index a46e405269..ba4dec8aff 100644 --- a/config.h.in +++ b/config.h.in @@ -19,6 +19,9 @@ /* Defined if building with SELinux support & audit libs are detected. */ #undef HAVE_LIBAUDIT +/* Defined if building with SELinux support & libcap libs are detected. */ +#undef HAVE_LIBCAP + /* Define if using XCOFF. Set by --with-xcoff. */ #undef HAVE_XCOFF @@ -120,6 +123,23 @@ /* Define if the linker supports the -z combreloc option. */ #undef HAVE_Z_COMBRELOC +/* Define if the assembler supported .protected. */ +#undef HAVE_PROTECTED + +/* Define if the assembler supported .hidden. */ +#undef HAVE_HIDDEN + +/* Define if the compiler supports __attribute__ ((visibility (...))). */ +#undef HAVE_VISIBILITY_ATTRIBUTE + +/* Define if the compiler doesn't support __attribute__ ((visibility (...))) + together with __asm__ redirection properly. */ +#undef HAVE_BROKEN_VISIBILITY_ATTRIBUTE + +/* Define if the compiler doesn't support __attribute__ ((alias (...))) + together with __asm__ redirection properly. */ +#undef HAVE_BROKEN_ALIAS_ATTRIBUTE + /* Define if _rtld_local structure should be forced into .sdata section. */ #undef HAVE_SDATA_SECTION @@ -171,6 +191,9 @@ /* Defined if forced unwind support is available. */ #undef HAVE_FORCED_UNWIND +/* Defined if the linker supports the -z relro option. */ +#undef HAVE_Z_RELRO + /* Defined of libidn is available. */ #undef HAVE_LIBIDN diff --git a/config.make.in b/config.make.in index 7aa9c1c12d..677da3a891 100644 --- a/config.make.in +++ b/config.make.in @@ -38,9 +38,14 @@ c++-sysincludes = @CXX_SYSINCLUDES@ all-warnings = @all_warnings@ elf = @elf@ +have-protected = @libc_cv_asm_protected_directive@ +have-z-nodelete = @libc_cv_z_nodelete@ +have-z-nodlopen = @libc_cv_z_nodlopen@ +have-z-initfirst = @libc_cv_z_initfirst@ have-z-combreloc = @libc_cv_z_combreloc@ have-z-execstack = @libc_cv_z_execstack@ have-initfini = @libc_cv_have_initfini@ +have-z-relro = @libc_cv_z_relro@ have-Bgroup = @libc_cv_Bgroup@ have-as-needed = @libc_cv_as_needed@ libgcc_s_suffix = @libc_cv_libgcc_s_suffix@ diff --git a/configure b/configure index 0f00394f03..d14f89a8a9 100755 --- a/configure +++ b/configure @@ -313,7 +313,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons add_on_subdirs base_machine submachine sysnames sysdeps_add_ons INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES CXX_SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_cc_with_libunwind libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie libc_cv_hashstyle fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_libcap have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons add_on_subdirs base_machine submachine sysnames sysdeps_add_ons INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES CXX_SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie libc_cv_hashstyle fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_libcap have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -864,7 +864,7 @@ Optional Features: [default=no] --enable-shared build shared library [default=yes if GNU ld & ELF] - --enable-profile build profiled library [default=no] + --enable-profile build profiled library [default=yes] --enable-omitfp build undebuggable optimized library [default=no] --enable-bounded build with runtime bounds checking @@ -1543,7 +1543,7 @@ if test "${enable_profile+set}" = set; then enableval="$enable_profile" profile=$enableval else - profile=no + profile=yes fi; # Check whether --enable-omitfp or --disable-omitfp was given. if test "${enable_omitfp+set}" = set; then @@ -5339,15 +5339,22 @@ EOF (exit $ac_status); }; }; then libc_cv_asm_protected_directive=yes else - { { echo "$as_me:$LINENO: error: assembler support for symbol visibility is required" >&5 -echo "$as_me: error: assembler support for symbol visibility is required" >&2;} - { (exit 1); exit 1; }; } + libc_cv_asm_protected_directive=no fi rm -f conftest* fi echo "$as_me:$LINENO: result: $libc_cv_asm_protected_directive" >&5 echo "${ECHO_T}$libc_cv_asm_protected_directive" >&6 + cat >>confdefs.h <<\_ACEOF +#define HAVE_PROTECTED 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define HAVE_HIDDEN 1 +_ACEOF + + if test $libc_cv_asm_protected_directive = yes; then echo "$as_me:$LINENO: checking whether __attribute__((visibility())) is supported" >&5 echo $ECHO_N "checking whether __attribute__((visibility())) is supported... $ECHO_C" >&6 @@ -5376,10 +5383,11 @@ EOF fi echo "$as_me:$LINENO: result: $libc_cv_visibility_attribute" >&5 echo "${ECHO_T}$libc_cv_visibility_attribute" >&6 - if test $libc_cv_visibility_attribute != yes; then - { { echo "$as_me:$LINENO: error: compiler support for visibility attribute is required" >&5 -echo "$as_me: error: compiler support for visibility attribute is required" >&2;} - { (exit 1); exit 1; }; } + if test $libc_cv_visibility_attribute = yes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_VISIBILITY_ATTRIBUTE 1 +_ACEOF + fi fi @@ -5411,9 +5419,10 @@ fi echo "$as_me:$LINENO: result: $libc_cv_broken_visibility_attribute" >&5 echo "${ECHO_T}$libc_cv_broken_visibility_attribute" >&6 if test $libc_cv_broken_visibility_attribute = yes; then - { { echo "$as_me:$LINENO: error: working compiler support for visibility attribute is required" >&5 -echo "$as_me: error: working compiler support for visibility attribute is required" >&2;} - { (exit 1); exit 1; }; } + cat >>confdefs.h <<\_ACEOF +#define HAVE_BROKEN_VISIBILITY_ATTRIBUTE 1 +_ACEOF + fi fi @@ -5448,9 +5457,10 @@ fi echo "$as_me:$LINENO: result: $libc_cv_broken_alias_attribute" >&5 echo "${ECHO_T}$libc_cv_broken_alias_attribute" >&6 if test $libc_cv_broken_alias_attribute = yes; then - { { echo "$as_me:$LINENO: error: working alias attribute support required" >&5 -echo "$as_me: error: working alias attribute support required" >&2;} - { (exit 1); exit 1; }; } + cat >>confdefs.h <<\_ACEOF +#define HAVE_BROKEN_ALIAS_ATTRIBUTE 1 +_ACEOF + fi if test $libc_cv_visibility_attribute = yes; then @@ -5562,15 +5572,14 @@ EOF then libc_cv_z_nodelete=yes else - { { echo "$as_me:$LINENO: error: linker with -z nodelete support required" >&5 -echo "$as_me: error: linker with -z nodelete support required" >&2;} - { (exit 1); exit 1; }; } + libc_cv_z_nodelete=no fi rm -f conftest* fi echo "$as_me:$LINENO: result: $libc_cv_z_nodelete" >&5 echo "${ECHO_T}$libc_cv_z_nodelete" >&6 + echo "$as_me:$LINENO: checking for -z nodlopen option" >&5 echo $ECHO_N "checking for -z nodlopen option... $ECHO_C" >&6 if test "${libc_cv_z_nodlopen+set}" = set; then @@ -5591,15 +5600,14 @@ EOF then libc_cv_z_nodlopen=yes else - { { echo "$as_me:$LINENO: error: linker with -z nodlopen support required" >&5 -echo "$as_me: error: linker with -z nodlopen support required" >&2;} - { (exit 1); exit 1; }; } + libc_cv_z_nodlopen=no fi rm -f conftest* fi echo "$as_me:$LINENO: result: $libc_cv_z_nodlopen" >&5 echo "${ECHO_T}$libc_cv_z_nodlopen" >&6 + echo "$as_me:$LINENO: checking for -z initfirst option" >&5 echo $ECHO_N "checking for -z initfirst option... $ECHO_C" >&6 if test "${libc_cv_z_initfirst+set}" = set; then @@ -5620,18 +5628,15 @@ EOF then libc_cv_z_initfirst=yes else - { { echo "$as_me:$LINENO: error: linker with -z initfirst support required" >&5 -echo "$as_me: error: linker with -z initfirst support required" >&2;} - { (exit 1); exit 1; }; } + libc_cv_z_initfirst=no fi rm -f conftest* fi echo "$as_me:$LINENO: result: $libc_cv_z_initfirst" >&5 echo "${ECHO_T}$libc_cv_z_initfirst" >&6 - case "$base_machine" in - i[34567]86 | x86_64 | powerpc* | s390* | sparc* | alpha*) - echo "$as_me:$LINENO: checking for -z relro option" >&5 + + echo "$as_me:$LINENO: checking for -z relro option" >&5 echo $ECHO_N "checking for -z relro option... $ECHO_C" >&6 if test "${libc_cv_z_relro+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -5657,14 +5662,13 @@ else fi echo "$as_me:$LINENO: result: $libc_cv_z_relro" >&5 echo "${ECHO_T}$libc_cv_z_relro" >&6 - if test "$libc_cv_z_relro" = no; then - { { echo "$as_me:$LINENO: error: linker with -z relro support required" >&5 -echo "$as_me: error: linker with -z relro support required" >&2;} - { (exit 1); exit 1; }; } - fi - ;; - *) ;; - esac + + if test $libc_cv_z_relro = yes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_Z_RELRO 1 +_ACEOF + + fi echo "$as_me:$LINENO: checking for -Bgroup option" >&5 echo $ECHO_N "checking for -Bgroup option... $ECHO_C" >&6 @@ -8506,7 +8510,12 @@ s,@PERL@,$PERL,;t t s,@INSTALL_INFO@,$INSTALL_INFO,;t t s,@BISON@,$BISON,;t t s,@VERSIONING@,$VERSIONING,;t t +s,@libc_cv_asm_protected_directive@,$libc_cv_asm_protected_directive,;t t s,@libc_cv_cc_with_libunwind@,$libc_cv_cc_with_libunwind,;t t +s,@libc_cv_z_nodelete@,$libc_cv_z_nodelete,;t t +s,@libc_cv_z_nodlopen@,$libc_cv_z_nodlopen,;t t +s,@libc_cv_z_initfirst@,$libc_cv_z_initfirst,;t t +s,@libc_cv_z_relro@,$libc_cv_z_relro,;t t s,@libc_cv_Bgroup@,$libc_cv_Bgroup,;t t s,@libc_cv_libgcc_s_suffix@,$libc_cv_libgcc_s_suffix,;t t s,@libc_cv_as_needed@,$libc_cv_as_needed,;t t diff --git a/configure.in b/configure.in index 71ceb04b33..924b0406cb 100644 --- a/configure.in +++ b/configure.in @@ -131,9 +131,9 @@ AC_ARG_ENABLE([shared], [shared=default]) AC_ARG_ENABLE([profile], AC_HELP_STRING([--enable-profile], - [build profiled library @<:@default=no@:>@]), + [build profiled library @<:@default=yes@:>@]), [profile=$enableval], - [profile=no]) + [profile=yes]) AC_ARG_ENABLE([omitfp], AC_HELP_STRING([--enable-omitfp], [build undebuggable optimized library @<:@default=no@:>@]), @@ -1259,9 +1259,12 @@ EOF if AC_TRY_COMMAND(${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then libc_cv_asm_protected_directive=yes else - AC_MSG_ERROR(assembler support for symbol visibility is required) + libc_cv_asm_protected_directive=no fi rm -f conftest*]) + AC_SUBST(libc_cv_asm_protected_directive) + AC_DEFINE(HAVE_PROTECTED) + AC_DEFINE(HAVE_HIDDEN) if test $libc_cv_asm_protected_directive = yes; then AC_CACHE_CHECK(whether __attribute__((visibility())) is supported, @@ -1280,8 +1283,8 @@ EOF fi rm -f conftest.[cs] ]) - if test $libc_cv_visibility_attribute != yes; then - AC_MSG_ERROR(compiler support for visibility attribute is required) + if test $libc_cv_visibility_attribute = yes; then + AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE) fi fi @@ -1304,7 +1307,7 @@ changequote([,])dnl rm -f conftest.c conftest.s ]) if test $libc_cv_broken_visibility_attribute = yes; then - AC_MSG_ERROR(working compiler support for visibility attribute is required) + AC_DEFINE(HAVE_BROKEN_VISIBILITY_ATTRIBUTE) fi fi @@ -1328,7 +1331,7 @@ EOF rm -f conftest.c conftest.s ]) if test $libc_cv_broken_alias_attribute = yes; then - AC_MSG_ERROR(working alias attribute support required) + AC_DEFINE(HAVE_BROKEN_ALIAS_ATTRIBUTE) fi if test $libc_cv_visibility_attribute = yes; then @@ -1400,9 +1403,10 @@ EOF then libc_cv_z_nodelete=yes else - AC_MSG_ERROR(linker with -z nodelete support required) + libc_cv_z_nodelete=no fi rm -f conftest*]) + AC_SUBST(libc_cv_z_nodelete) AC_CACHE_CHECK(for -z nodlopen option, libc_cv_z_nodlopen, [dnl @@ -1416,9 +1420,10 @@ EOF then libc_cv_z_nodlopen=yes else - AC_MSG_ERROR(linker with -z nodlopen support required) + libc_cv_z_nodlopen=no fi rm -f conftest*]) + AC_SUBST(libc_cv_z_nodlopen) AC_CACHE_CHECK(for -z initfirst option, libc_cv_z_initfirst, [dnl @@ -1432,16 +1437,13 @@ EOF then libc_cv_z_initfirst=yes else - AC_MSG_ERROR(linker with -z initfirst support required) + libc_cv_z_initfirst=no fi rm -f conftest*]) + AC_SUBST(libc_cv_z_initfirst) - case "$base_machine" in -changequote(,)dnl - i[34567]86 | x86_64 | powerpc* | s390* | sparc* | alpha*) -changequote([,])dnl - AC_CACHE_CHECK(for -z relro option, - libc_cv_z_relro, [dnl + AC_CACHE_CHECK(for -z relro option, + libc_cv_z_relro, [dnl libc_cv_z_relro=no if AC_TRY_COMMAND([${CC-cc} -v --help 2>&1|grep "z relro" 1>&AS_MESSAGE_LOG_FD]) then @@ -1450,12 +1452,10 @@ changequote([,])dnl libc_cv_z_relro=yes fi fi]) - if test "$libc_cv_z_relro" = no; then - AC_MSG_ERROR(linker with -z relro support required) - fi - ;; - *) ;; - esac + AC_SUBST(libc_cv_z_relro) + if test $libc_cv_z_relro = yes; then + AC_DEFINE(HAVE_Z_RELRO) + fi AC_CACHE_CHECK(for -Bgroup option, libc_cv_Bgroup, [dnl diff --git a/csu/Versions b/csu/Versions index f0b4f00549..a1321a9df8 100644 --- a/csu/Versions +++ b/csu/Versions @@ -5,7 +5,7 @@ libc { # helper functions __libc_init_first; __libc_start_main; -%if !HAVE___THREAD +%if !(USE_TLS && HAVE___THREAD) # global variables _errno; @@ -18,7 +18,7 @@ libc { gnu_get_libc_release; gnu_get_libc_version; } GLIBC_PRIVATE { -%if HAVE___THREAD +%if USE_TLS && HAVE___THREAD # This version is for the TLS symbol, GLIBC_2.0 is the old object symbol. errno; %endif diff --git a/csu/libc-start.c b/csu/libc-start.c index 634844759d..194db6b1ec 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1998-2003, 2004, 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 @@ -30,7 +30,11 @@ extern int __libc_multiple_libcs; #include #ifndef SHARED # include -extern void __pthread_initialize_minimal (void); +extern void __pthread_initialize_minimal (void) +# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP + __attribute__ ((weak)) +# endif + ; # ifndef THREAD_SET_STACK_GUARD /* Only exported for architectures that don't store the stack guard canary in thread local area. */ @@ -136,8 +140,13 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), /* Initialize the thread library at least a bit since the libgcc functions are using thread functions if these are available and - we need to setup errno. */ - __pthread_initialize_minimal (); + we need to setup errno. If there is no thread library and we + handle TLS the function is defined in the libc to initialized the + TLS handling. */ +# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP + if (__pthread_initialize_minimal) +# endif + __pthread_initialize_minimal (); #endif # ifndef SHARED diff --git a/csu/libc-tls.c b/csu/libc-tls.c index 0d240ccef9..3544e396da 100644 --- a/csu/libc-tls.c +++ b/csu/libc-tls.c @@ -1,5 +1,5 @@ /* Initialization code for TLS in statically linked application. - Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 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 @@ -29,6 +29,7 @@ #error makefile bug, this file is for static only #endif +#ifdef USE_TLS extern ElfW(Phdr) *_dl_phdr; extern size_t _dl_phnum; @@ -142,19 +143,19 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) The initialized value of _dl_tls_static_size is provided by dl-open.c to request some surplus that permits dynamic loading of modules with IE-model TLS. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign); tlsblock = __sbrk (tcb_offset + tcbsize + max_align); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP tcb_offset = roundup (tcbsize, align ?: 1); tlsblock = __sbrk (tcb_offset + memsz + max_align + TLS_PRE_TCB_SIZE + GL(dl_tls_static_size)); tlsblock += TLS_PRE_TCB_SIZE; -#else +# else /* In case a model with a different layout for the TCB and DTV is defined add another #elif here and in the following #ifs. */ -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif /* Align the TLS block. */ tlsblock = (void *) (((uintptr_t) tlsblock + max_align - 1) @@ -165,16 +166,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) // static_dtv[1].counter = 0; would be needed if not already done /* Initialize the TLS block. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset - roundup (memsz, align ?: 1)); static_map.l_tls_offset = roundup (memsz, align ?: 1); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP static_dtv[2].pointer.val = (char *) tlsblock + tcb_offset; static_map.l_tls_offset = tcb_offset; -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif static_dtv[2].pointer.is_static = true; /* sbrk gives us zero'd memory, so we don't need to clear the remainder. */ memcpy (static_dtv[2].pointer.val, initimage, filesz); @@ -182,16 +183,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) /* Install the pointer to the dtv. */ /* Initialize the thread pointer. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP INSTALL_DTV ((char *) tlsblock + tcb_offset, static_dtv); const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset, 0); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP INSTALL_DTV (tlsblock, static_dtv); const char *lossage = TLS_INIT_TP (tlsblock, 0); -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif if (__builtin_expect (lossage != NULL, 0)) __libc_fatal (lossage); @@ -211,11 +212,11 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) memsz = roundup (memsz, align ?: 1); -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP memsz += tcbsize; -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP memsz += tcb_offset; -#endif +# endif init_static_tls (memsz, MAX (TLS_TCB_ALIGN, max_align)); } @@ -229,11 +230,11 @@ _dl_tls_setup (void) { init_slotinfo (); init_static_tls ( -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP TLS_TCB_SIZE, -#else +# else 0, -#endif +# endif TLS_TCB_ALIGN); return 0; } @@ -247,3 +248,16 @@ __pthread_initialize_minimal (void) { __libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN); } + +#elif defined NONTLS_INIT_TP + +/* This is the minimal initialization function used when libpthread is + not used. */ +void +__attribute__ ((weak)) +__pthread_initialize_minimal (void) +{ + NONTLS_INIT_TP; +} + +#endif diff --git a/csu/tst-atomic.c b/csu/tst-atomic.c index 7c0b022b78..7a2e3d0865 100644 --- a/csu/tst-atomic.c +++ b/csu/tst-atomic.c @@ -1,5 +1,5 @@ /* Tests for atomic.h macros. - Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2003. @@ -379,117 +379,6 @@ do_test (void) } #endif -#ifdef catomic_compare_and_exchange_val_acq - mem = 24; - if (catomic_compare_and_exchange_val_acq (&mem, 35, 24) != 24 - || mem != 35) - { - puts ("catomic_compare_and_exchange_val_acq test 1 failed"); - ret = 1; - } - - mem = 12; - if (catomic_compare_and_exchange_val_acq (&mem, 10, 15) != 12 - || mem != 12) - { - puts ("catomic_compare_and_exchange_val_acq test 2 failed"); - ret = 1; - } - - mem = -15; - if (catomic_compare_and_exchange_val_acq (&mem, -56, -15) != -15 - || mem != -56) - { - puts ("catomic_compare_and_exchange_val_acq test 3 failed"); - ret = 1; - } - - mem = -1; - if (catomic_compare_and_exchange_val_acq (&mem, 17, 0) != -1 - || mem != -1) - { - puts ("catomic_compare_and_exchange_val_acq test 4 failed"); - ret = 1; - } -#endif - - mem = 24; - if (catomic_compare_and_exchange_bool_acq (&mem, 35, 24) - || mem != 35) - { - puts ("catomic_compare_and_exchange_bool_acq test 1 failed"); - ret = 1; - } - - mem = 12; - if (! catomic_compare_and_exchange_bool_acq (&mem, 10, 15) - || mem != 12) - { - puts ("catomic_compare_and_exchange_bool_acq test 2 failed"); - ret = 1; - } - - mem = -15; - if (catomic_compare_and_exchange_bool_acq (&mem, -56, -15) - || mem != -56) - { - puts ("catomic_compare_and_exchange_bool_acq test 3 failed"); - ret = 1; - } - - mem = -1; - if (! catomic_compare_and_exchange_bool_acq (&mem, 17, 0) - || mem != -1) - { - puts ("catomic_compare_and_exchange_bool_acq test 4 failed"); - ret = 1; - } - - mem = 2; - if (catomic_exchange_and_add (&mem, 11) != 2 - || mem != 13) - { - puts ("catomic_exchange_and_add test failed"); - ret = 1; - } - - mem = -21; - catomic_add (&mem, 22); - if (mem != 1) - { - puts ("catomic_add test failed"); - ret = 1; - } - - mem = -1; - catomic_increment (&mem); - if (mem != 0) - { - puts ("catomic_increment test failed"); - ret = 1; - } - - mem = 2; - if (catomic_increment_val (&mem) != 3) - { - puts ("catomic_increment_val test failed"); - ret = 1; - } - - mem = 17; - catomic_decrement (&mem); - if (mem != 16) - { - puts ("catomic_decrement test failed"); - ret = 1; - } - - if (catomic_decrement_val (&mem) != 15) - { - puts ("catomic_decrement_val test failed"); - ret = 1; - } - return ret; } diff --git a/csu/version.c b/csu/version.c index f7a8fb35e9..2196d20432 100644 --- a/csu/version.c +++ b/csu/version.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992-2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1992-2002, 2003, 2004, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -25,7 +25,7 @@ static const char __libc_version[] = VERSION; static const char banner[] = "GNU C Library "RELEASE" release version "VERSION", by Roland McGrath et al.\n\ -Copyright (C) 2007 Free Software Foundation, Inc.\n\ +Copyright (C) 2006 Free Software Foundation, Inc.\n\ This is free software; see the source for copying conditions.\n\ There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE.\n\ @@ -34,6 +34,9 @@ Compiled by GNU CC version "__VERSION__".\n" #ifdef GLIBC_OLDEST_ABI "The oldest ABI supported: " GLIBC_OLDEST_ABI ".\n" #endif +#ifdef USE_TLS +"Thread-local storage support included.\n" +#endif "For bug reporting instructions, please see:\n\ .\n"; diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh index 6f47fab42a..f4d971e34b 100755 --- a/debug/catchsegv.sh +++ b/debug/catchsegv.sh @@ -1,6 +1,5 @@ #! /bin/sh -# Copyright (C) 1998,1999,2001,2003,2004,2006,2007 -# Free Software Foundation, Inc. +# Copyright (C) 1998,1999,2001,2003,2004,2006 Free Software Foundation, Inc. # This file is part of the GNU C Library. # Contributed by Ulrich Drepper , 1998. @@ -40,7 +39,7 @@ if test $# -eq 0; then ;; --v | --ve | --ver | --vers | --versi | --versio | --version) echo 'catchsegv (GNU libc) @VERSION@' - echo 'Copyright (C) 2007 Free Software Foundation, Inc. + echo 'Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Ulrich Drepper.' diff --git a/debug/xtrace.sh b/debug/xtrace.sh index e8ffe2f420..c913c76d21 100755 --- a/debug/xtrace.sh +++ b/debug/xtrace.sh @@ -64,7 +64,7 @@ do_version() { printf $"Copyright (C) %s Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -" "2007" +" "2006" printf $"Written by %s. " "Ulrich Drepper" exit 0 @@ -161,32 +161,32 @@ if test -n "$data"; then while read fct; do read file if test "$fct" != '??' -a "$file" != '??:0'; then - format_line $fct $file + format_line "$fct" "$file" fi done else - fifo=$(mktemp -u ${TMPDIR:-/tmp}/xtrace.XXXXXX) + fifo=$(mktemp -ut xtrace.XXXXXX) || exit + trap 'rm -f "$fifo"; exit 1' HUP INT QUIT TERM PIPE mkfifo -m 0600 $fifo || exit 1 - trap 'rm $fifo; exit 1' SIGINT SIGTERM SIGPIPE # Now start the program and let it write to the FIFO. $TERMINAL_PROG -T "xtrace - $program $*" -e /bin/sh -c "LD_PRELOAD=$pcprofileso PCPROFILE_OUTPUT=$fifo $program $*; read < $fifo" & termpid=$! - $pcprofiledump -u $fifo | + $pcprofiledump -u "$fifo" | while read line; do - echo $line | + echo "$line" | sed 's/this = \([^,]*\).*/\1/' | - addr2line -fC -e $program + addr2line -fC -e "$program" done | while read fct; do read file if test "$fct" != '??' -a "$file" != '??:0'; then - format_line $fct $file + format_line "$fct" "$file" fi done read -p "Press return here to close $TERMINAL_PROG($program)." - echo > $fifo - rm $fifo + echo > "$fifo" + rm "$fifo" fi exit 0 diff --git a/dlfcn/Makefile b/dlfcn/Makefile index e8fbab2958..63e7b31b2a 100644 --- a/dlfcn/Makefile +++ b/dlfcn/Makefile @@ -41,7 +41,10 @@ endif ifeq (yes,$(build-shared)) tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \ bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2 \ - bug-atexit3 tstatexit + bug-atexit3 +ifeq (yes,$(have-protected)) +tests += tstatexit +endif endif modules-names = glreflib1 glreflib2 failtestmod defaultmod1 defaultmod2 \ errmsg1mod modatexit modcxaatexit \ diff --git a/dlfcn/dlinfo.c b/dlfcn/dlinfo.c index 923127cbf3..20aa9504fb 100644 --- a/dlfcn/dlinfo.c +++ b/dlfcn/dlinfo.c @@ -1,5 +1,5 @@ /* dlinfo -- Get information from the dynamic linker. - Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2006, 2007 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 @@ -32,7 +32,9 @@ dlinfo (void *handle, int request, void *arg) #else -# include +# ifdef USE_TLS +# include +# endif struct dlinfo_args { @@ -56,9 +58,8 @@ dlinfo_doit (void *argsblock) /* Find the highest-addressed object that CALLER is not below. */ for (nsid = 0; nsid < DL_NNS; ++nsid) for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next) - if (caller >= l->l_map_start && caller < l->l_map_end) - /* There must be exactly one DSO for the range of the virtual - memory. Otherwise something is really broken. */ + if (caller >= l->l_map_start && caller < l->l_map_end + && (l->l_contiguous || _dl_addr_inside_object (l, caller))) break; if (l == NULL) @@ -95,14 +96,18 @@ RTLD_SELF used in code not dynamically loaded")); case RTLD_DI_TLS_MODID: *(size_t *) args->arg = 0; +#ifdef USE_TLS *(size_t *) args->arg = l->l_tls_modid; +#endif break; case RTLD_DI_TLS_DATA: { void *data = NULL; +#ifdef USE_TLS if (l->l_tls_modid != 0) data = _dl_tls_get_addr_soft (l); +#endif *(void **) args->arg = data; break; } diff --git a/elf/Makefile b/elf/Makefile index afebaec1ec..06e376d803 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -159,8 +159,8 @@ endif ifeq (yes,$(build-shared)) tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ constload1 order $(tests-vis-$(have-protected)) noload filter unload \ - reldep reldep2 reldep3 reldep4 nodelete nodelete2 \ - nodlopen nodlopen2 neededtest neededtest2 \ + reldep reldep2 reldep3 reldep4 $(tests-nodelete-$(have-z-nodelete)) \ + $(tests-nodlopen-$(have-z-nodlopen)) neededtest neededtest2 \ neededtest3 neededtest4 unload2 lateglobal initfirst global \ restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \ circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \ @@ -175,6 +175,8 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ # reldep9 test-srcs = tst-pathopt tests-vis-yes = vismain +tests-nodelete-yes = nodelete nodelete2 +tests-nodlopen-yes = nodlopen nodlopen2 tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog endif ifeq (yesyes,$(have-fpie)$(build-shared)) @@ -184,9 +186,8 @@ tests: $(objpfx)tst-leaks1-mem modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ testobj1_1 failobj constload2 constload3 unloadmod \ dep1 dep2 dep3 dep4 $(modules-vis-$(have-protected)) \ - nodelmod1 nodelmod2 nodelmod3 nodelmod4 \ - nodel2mod1 nodel2mod2 nodel2mod3 \ - nodlopenmod nodlopenmod2 filtmod1 filtmod2 \ + $(modules-nodelete-$(have-z-nodelete)) \ + $(modules-nodlopen-$(have-z-nodlopen)) filtmod1 filtmod2 \ reldepmod1 reldepmod2 reldepmod3 reldepmod4 nextmod1 nextmod2 \ reldep4mod1 reldep4mod2 reldep4mod3 reldep4mod4 \ neededobj1 neededobj2 neededobj3 neededobj4 \ @@ -220,6 +221,9 @@ ifeq (yesyes,$(have-fpie)$(build-shared)) modules-names += tst-piemod1 endif modules-vis-yes = vismod1 vismod2 vismod3 +modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4 \ + nodel2mod1 nodel2mod2 nodel2mod3 +modules-nodlopen-yes = nodlopenmod nodlopenmod2 modules-execstack-yes = tst-execstack-mod extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) # We need this variable to be sure the test modules get the right CPPFLAGS. diff --git a/elf/cache.c b/elf/cache.c index e18446644e..6730fb36eb 100644 --- a/elf/cache.c +++ b/elf/cache.c @@ -439,7 +439,7 @@ save_cache (const char *cache_name) } if (write (fd, strings, total_strlen) != (ssize_t) total_strlen) - error (EXIT_FAILURE, errno, _("Writing of cache data failed")); + error (EXIT_FAILURE, errno, _("Writing of cache data failed.")); close (fd); diff --git a/elf/dl-addr.c b/elf/dl-addr.c dissimilarity index 68% index e55dc4b46f..7dbf716cfa 100644 --- a/elf/dl-addr.c +++ b/elf/dl-addr.c @@ -1,160 +1,170 @@ -/* Locate the shared object symbol nearest a given address. - Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - 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 - - -int -internal_function -_dl_addr (const void *address, Dl_info *info, - struct link_map **mapp, const ElfW(Sym) **symbolp) -{ - const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address); - - /* Protect against concurrent loads and unloads. */ - __rtld_lock_lock_recursive (GL(dl_load_lock)); - - /* Find the highest-addressed object that ADDRESS is not below. */ - struct link_map *match = NULL; - for (Lmid_t ns = 0; ns < DL_NNS; ++ns) - for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l; l = l->l_next) - if (addr >= l->l_map_start && addr < l->l_map_end) - { - /* We know ADDRESS lies within L if in any shared object. - Make sure it isn't past the end of L's segments. */ - size_t n = l->l_phnum; - if (n > 0) - { - do - --n; - while (l->l_phdr[n].p_type != PT_LOAD); - if (addr >= (l->l_addr + - l->l_phdr[n].p_vaddr + l->l_phdr[n].p_memsz)) - /* Off the end of the highest-addressed shared object. */ - continue; - } - - match = l; - break; - } - - int result = 0; - if (match != NULL) - { - /* Now we know what object the address lies in. */ - info->dli_fname = match->l_name; - info->dli_fbase = (void *) match->l_map_start; - - /* If this is the main program the information is incomplete. */ - if (__builtin_expect (match->l_name[0], 'a') == '\0' - && match->l_type == lt_executable) - info->dli_fname = _dl_argv[0]; - - const ElfW(Sym) *symtab - = (const ElfW(Sym) *) D_PTR (match, l_info[DT_SYMTAB]); - const char *strtab = (const char *) D_PTR (match, l_info[DT_STRTAB]); - - ElfW(Word) strtabsize = match->l_info[DT_STRSZ]->d_un.d_val; - - const ElfW(Sym) *matchsym = NULL; - if (match->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM + DT_THISPROCNUM - + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] != NULL) - { - /* We look at all symbol table entries referenced by the - hash table. */ - for (Elf_Symndx bucket = 0; bucket < match->l_nbuckets; ++bucket) - { - Elf32_Word symndx = match->l_gnu_buckets[bucket]; - if (symndx != 0) - { - const Elf32_Word *hasharr = &match->l_gnu_chain_zero[symndx]; - - do - { - /* The hash table never references local symbols - so we can omit that test here. */ - if ((symtab[symndx].st_shndx != SHN_UNDEF - || symtab[symndx].st_value != 0) - && ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS - && DL_ADDR_SYM_MATCH (match, &symtab[symndx], - matchsym, addr) - && symtab[symndx].st_name < strtabsize) - matchsym = (ElfW(Sym) *) &symtab[symndx]; - - ++symndx; - } - while ((*hasharr++ & 1u) == 0); - } - } - } - else - { - const ElfW(Sym) *symtabend; - if (match->l_info[DT_HASH] != NULL) - symtabend = (symtab - + ((Elf_Symndx *) D_PTR (match, l_info[DT_HASH]))[1]); - else - /* There is no direct way to determine the number of symbols in the - dynamic symbol table and no hash table is present. The ELF - binary is ill-formed but what shall we do? Use the beginning of - the string table which generally follows the symbol table. */ - symtabend = (const ElfW(Sym) *) strtab; - - for (; (void *) symtab < (void *) symtabend; ++symtab) - if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL - || ELFW(ST_BIND) (symtab->st_info) == STB_WEAK) - && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS - && (symtab->st_shndx != SHN_UNDEF - || symtab->st_value != 0) - && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr) - && symtab->st_name < strtabsize) - matchsym = (ElfW(Sym) *) symtab; - } - - if (mapp) - *mapp = match; - if (symbolp) - *symbolp = matchsym; - - if (matchsym) - { - /* We found a symbol close by. Fill in its name and exact - address. */ - lookup_t matchl = LOOKUP_VALUE (match); - - info->dli_sname = strtab + matchsym->st_name; - info->dli_saddr = DL_SYMBOL_ADDRESS (matchl, matchsym); - } - else - { - /* No symbol matches. We return only the containing object. */ - info->dli_sname = NULL; - info->dli_saddr = NULL; - } - - result = 1; - } - - __rtld_lock_unlock_recursive (GL(dl_load_lock)); - - return result; -} -libc_hidden_def (_dl_addr) +/* Locate the shared object symbol nearest a given address. + Copyright (C) 1996-2004, 2005, 2006, 2007 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 + + +static void +__attribute ((always_inline)) +determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info, + struct link_map **mapp, const ElfW(Sym) **symbolp) +{ + /* Now we know what object the address lies in. */ + info->dli_fname = match->l_name; + info->dli_fbase = (void *) match->l_map_start; + + /* If this is the main program the information is incomplete. */ + if (__builtin_expect (match->l_name[0], 'a') == '\0' + && match->l_type == lt_executable) + info->dli_fname = _dl_argv[0]; + + const ElfW(Sym) *symtab + = (const ElfW(Sym) *) D_PTR (match, l_info[DT_SYMTAB]); + const char *strtab = (const char *) D_PTR (match, l_info[DT_STRTAB]); + + ElfW(Word) strtabsize = match->l_info[DT_STRSZ]->d_un.d_val; + + const ElfW(Sym) *matchsym = NULL; + if (match->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM + DT_THISPROCNUM + + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] != NULL) + { + /* We look at all symbol table entries referenced by the hash + table. */ + for (Elf_Symndx bucket = 0; bucket < match->l_nbuckets; ++bucket) + { + Elf32_Word symndx = match->l_gnu_buckets[bucket]; + if (symndx != 0) + { + const Elf32_Word *hasharr = &match->l_gnu_chain_zero[symndx]; + + do + { + /* The hash table never references local symbols so + we can omit that test here. */ + if ((symtab[symndx].st_shndx != SHN_UNDEF + || symtab[symndx].st_value != 0) +#ifdef USE_TLS + && ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS +#endif + && DL_ADDR_SYM_MATCH (match, &symtab[symndx], + matchsym, addr) + && symtab[symndx].st_name < strtabsize) + matchsym = (ElfW(Sym) *) &symtab[symndx]; + + ++symndx; + } + while ((*hasharr++ & 1u) == 0); + } + } + } + else + { + const ElfW(Sym) *symtabend; + if (match->l_info[DT_HASH] != NULL) + symtabend = (symtab + + ((Elf_Symndx *) D_PTR (match, l_info[DT_HASH]))[1]); + else + /* There is no direct way to determine the number of symbols in the + dynamic symbol table and no hash table is present. The ELF + binary is ill-formed but what shall we do? Use the beginning of + the string table which generally follows the symbol table. */ + symtabend = (const ElfW(Sym) *) strtab; + + for (; (void *) symtab < (void *) symtabend; ++symtab) + if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL + || ELFW(ST_BIND) (symtab->st_info) == STB_WEAK) +#ifdef USE_TLS + && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS +#endif + && (symtab->st_shndx != SHN_UNDEF + || symtab->st_value != 0) + && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr) + && symtab->st_name < strtabsize) + matchsym = (ElfW(Sym) *) symtab; + } + + if (mapp) + *mapp = match; + if (symbolp) + *symbolp = matchsym; + + if (matchsym) + { + /* We found a symbol close by. Fill in its name and exact + address. */ + lookup_t matchl = LOOKUP_VALUE (match); + + info->dli_sname = strtab + matchsym->st_name; + info->dli_saddr = DL_SYMBOL_ADDRESS (matchl, matchsym); + } + else + { + /* No symbol matches. We return only the containing object. */ + info->dli_sname = NULL; + info->dli_saddr = NULL; + } +} + + +int +internal_function +_dl_addr (const void *address, Dl_info *info, + struct link_map **mapp, const ElfW(Sym) **symbolp) +{ + const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address); + int result = 0; + + /* Protect against concurrent loads and unloads. */ + __rtld_lock_lock_recursive (GL(dl_load_lock)); + + /* Find the highest-addressed object that ADDRESS is not below. */ + for (Lmid_t ns = 0; ns < DL_NNS; ++ns) + for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l; l = l->l_next) + if (addr >= l->l_map_start && addr < l->l_map_end + && (l->l_contiguous || _dl_addr_inside_object (l, addr))) + { + determine_info (addr, l, info, mapp, symbolp); + result = 1; + goto out; + } + + out: + __rtld_lock_unlock_recursive (GL(dl_load_lock)); + + return result; +} +libc_hidden_def (_dl_addr) + +/* Return non-zero if ADDR lies within one of L's segments. */ +int +internal_function +_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr) +{ + int n = l->l_phnum; + const ElfW(Addr) reladdr = addr - l->l_addr; + + while (--n >= 0) + if (l->l_phdr[n].p_type == PT_LOAD + && reladdr - l->l_phdr[n].p_vaddr >= 0 + && reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz) + return 1; + return 0; +} diff --git a/elf/dl-cache.c b/elf/dl-cache.c index bbeba77e4a..fc7d9916c6 100644 --- a/elf/dl-cache.c +++ b/elf/dl-cache.c @@ -256,7 +256,11 @@ _dl_load_cache_lookup (const char *name) platform = 1ULL << platform; /* Only accept hwcap if it's for the right platform. */ -#define _DL_HWCAP_TLS_MASK (1LL << 63) +#ifdef USE_TLS +# define _DL_HWCAP_TLS_MASK (1LL << 63) +#else +# define _DL_HWCAP_TLS_MASK 0 +#endif #define HWCAP_CHECK \ if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \ continue; \ diff --git a/elf/dl-close.c b/elf/dl-close.c index df968fe649..5cd8b9be2d 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -1,5 +1,5 @@ /* Close a shared object opened by `_dl_open'. - Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2005, 2006, 2007 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 @@ -31,6 +31,7 @@ #include #include #include +#include /* Type of the constructor functions. */ @@ -41,6 +42,7 @@ typedef void (*fini_t) (void); #define IDX_STILL_USED -1 +#ifdef USE_TLS /* Returns true we an non-empty was found. */ static bool remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp, @@ -102,13 +104,12 @@ remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp, /* No non-entry in this list element. */ return false; } +#endif void _dl_close_worker (struct link_map *map) { - Lmid_t ns = map->l_ns; - /* One less direct use. */ --map->l_direct_opencount; @@ -131,11 +132,16 @@ _dl_close_worker (struct link_map *map) return; } + Lmid_t nsid = map->l_ns; + struct link_namespaces *ns = &GL(dl_ns)[nsid]; + retry: dl_close_state = pending; +#ifdef USE_TLS bool any_tls = false; - const unsigned int nloaded = GL(dl_ns)[ns]._ns_nloaded; +#endif + const unsigned int nloaded = ns->_ns_nloaded; char used[nloaded]; char done[nloaded]; struct link_map *maps[nloaded]; @@ -143,7 +149,7 @@ _dl_close_worker (struct link_map *map) /* Run over the list and assign indexes to the link maps and enter them into the MAPS array. */ int idx = 0; - for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next) + for (struct link_map *l = ns->_ns_loaded; l != NULL; l = l->l_next) { l->l_idx = idx; maps[idx] = l; @@ -220,20 +226,22 @@ _dl_close_worker (struct link_map *map) } /* Sort the entries. */ - _dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nloaded, used, ns); + _dl_sort_fini (ns->_ns_loaded, maps, nloaded, used, nsid); /* Call all termination functions at once. */ #ifdef SHARED - bool do_audit = GLRO(dl_naudit) > 0 && !GL(dl_ns)[ns]._ns_loaded->l_auditing; + bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing; #endif bool unload_any = false; + bool scope_mem_left = false; + unsigned int unload_global = 0; unsigned int first_loaded = ~0; for (unsigned int i = 0; i < nloaded; ++i) { struct link_map *imap = maps[i]; /* All elements must be in the same namespace. */ - assert (imap->l_ns == ns); + assert (imap->l_ns == nsid); if (!used[i]) { @@ -248,7 +256,7 @@ _dl_close_worker (struct link_map *map) if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) _dl_debug_printf ("\ncalling fini: %s [%lu]\n\n", - imap->l_name, ns); + imap->l_name, nsid); if (imap->l_info[DT_FINI_ARRAY] != NULL) { @@ -291,6 +299,9 @@ _dl_close_worker (struct link_map *map) /* We indeed have an object to remove. */ unload_any = true; + if (imap->l_global) + ++unload_global; + /* Remember where the first dynamically loaded object is. */ if (i < first_loaded) first_loaded = i; @@ -334,7 +345,7 @@ _dl_close_worker (struct link_map *map) struct link_map *tmap = (struct link_map *) ((char *) imap->l_scope[cnt] - offsetof (struct link_map, l_searchlist)); - assert (tmap->l_ns == ns); + assert (tmap->l_ns == nsid); if (tmap->l_idx == IDX_STILL_USED) ++remain; else @@ -399,18 +410,18 @@ _dl_close_worker (struct link_map *map) struct r_scope_elem **old = imap->l_scope; - if (RTLD_SINGLE_THREAD_P) - imap->l_scope = newp; - else - { - __rtld_mrlock_change (imap->l_scope_lock); - imap->l_scope = newp; - __rtld_mrlock_done (imap->l_scope_lock); - } + imap->l_scope = newp; /* No user anymore, we can free it now. */ if (old != imap->l_scope_mem) - free (old); + { + if (_dl_scope_free (old)) + /* If _dl_scope_free used THREAD_GSCOPE_WAIT (), + no need to repeat it. */ + scope_mem_left = false; + } + else + scope_mem_left = true; imap->l_scope_max = new_size; } @@ -435,7 +446,7 @@ _dl_close_worker (struct link_map *map) /* Auditing checkpoint: we will start deleting objects. */ if (__builtin_expect (do_audit, 0)) { - struct link_map *head = GL(dl_ns)[ns]._ns_loaded; + struct link_map *head = ns->_ns_loaded; struct audit_ifaces *afct = GLRO(dl_audit); /* Do not call the functions for any auditing object. */ if (head->l_auditing == 0) @@ -452,13 +463,55 @@ _dl_close_worker (struct link_map *map) #endif /* Notify the debugger we are about to remove some loaded objects. */ - struct r_debug *r = _dl_debug_initialize (0, ns); + struct r_debug *r = _dl_debug_initialize (0, nsid); r->r_state = RT_DELETE; _dl_debug_state (); + if (unload_global) + { + /* Some objects are in the global scope list. Remove them. */ + struct r_scope_elem *ns_msl = ns->_ns_main_searchlist; + unsigned int i; + unsigned int j = 0; + unsigned int cnt = ns_msl->r_nlist; + + while (cnt > 0 && ns_msl->r_list[cnt - 1]->l_removed) + --cnt; + + if (cnt + unload_global == ns_msl->r_nlist) + /* Speed up removing most recently added objects. */ + j = cnt; + else + for (i = 0; i < cnt; i++) + if (ns_msl->r_list[i]->l_removed == 0) + { + if (i != j) + ns_msl->r_list[j] = ns_msl->r_list[i]; + j++; + } + ns_msl->r_nlist = j; + } + + if (!RTLD_SINGLE_THREAD_P + && (unload_global + || scope_mem_left + || (GL(dl_scope_free_list) != NULL + && GL(dl_scope_free_list)->count))) + { + struct dl_scope_free_list *fsl; + + THREAD_GSCOPE_WAIT (); + /* Now we can free any queued old scopes. */ + if ((fsl = GL(dl_scope_free_list)) != NULL) + while (fsl->count > 0) + free (fsl->list[--fsl->count]); + } + +#ifdef USE_TLS size_t tls_free_start; size_t tls_free_end; tls_free_start = tls_free_end = NO_TLS_OFFSET; +#endif /* Check each element of the search list to see if all references to it are gone. */ @@ -471,24 +524,8 @@ _dl_close_worker (struct link_map *map) /* That was the last reference, and this was a dlopen-loaded object. We can unmap it. */ - if (__builtin_expect (imap->l_global, 0)) - { - /* This object is in the global scope list. Remove it. */ - unsigned int cnt = GL(dl_ns)[ns]._ns_main_searchlist->r_nlist; - - do - --cnt; - while (GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt] != imap); - - /* The object was already correctly registered. */ - while (++cnt - < GL(dl_ns)[ns]._ns_main_searchlist->r_nlist) - GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt - 1] - = GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt]; - - --GL(dl_ns)[ns]._ns_main_searchlist->r_nlist; - } +#ifdef USE_TLS /* Remove the object from the dtv slotinfo array if it uses TLS. */ if (__builtin_expect (imap->l_tls_blocksize > 0, 0)) { @@ -507,7 +544,7 @@ _dl_close_worker (struct link_map *map) this search list, going in either direction. When the whole chunk is at the end of the used area then we can reclaim it. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP if (tls_free_start == NO_TLS_OFFSET || (size_t) imap->l_tls_offset == tls_free_start) { @@ -547,7 +584,7 @@ _dl_close_worker (struct link_map *map) = tls_free_end - imap->l_tls_blocksize; } } -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP if ((size_t) imap->l_tls_offset == tls_free_end) /* Extend the contiguous chunk being reclaimed. */ tls_free_end -= imap->l_tls_blocksize; @@ -564,11 +601,12 @@ _dl_close_worker (struct link_map *map) tls_free_start = imap->l_tls_offset; tls_free_end = tls_free_start + imap->l_tls_blocksize; } -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif } } +#endif /* We can unmap all the maps at once. We determined the start address and length when we loaded the object and @@ -581,12 +619,12 @@ _dl_close_worker (struct link_map *map) else { #ifdef SHARED - assert (ns != LM_ID_BASE); + assert (nsid != LM_ID_BASE); #endif - GL(dl_ns)[ns]._ns_loaded = imap->l_next; + ns->_ns_loaded = imap->l_next; } - --GL(dl_ns)[ns]._ns_nloaded; + --ns->_ns_nloaded; if (imap->l_next != NULL) imap->l_next->l_prev = imap->l_prev; @@ -634,6 +672,7 @@ _dl_close_worker (struct link_map *map) } } +#ifdef USE_TLS /* If we removed any object which uses TLS bump the generation counter. */ if (any_tls) { @@ -643,12 +682,13 @@ _dl_close_worker (struct link_map *map) if (tls_free_end == GL(dl_tls_static_used)) GL(dl_tls_static_used) = tls_free_start; } +#endif #ifdef SHARED /* Auditing checkpoint: we have deleted all objects. */ if (__builtin_expect (do_audit, 0)) { - struct link_map *head = GL(dl_ns)[ns]._ns_loaded; + struct link_map *head = ns->_ns_loaded; /* Do not call the functions for any auditing object. */ if (head->l_auditing == 0) { @@ -702,6 +742,7 @@ _dl_close (void *_map) } +#ifdef USE_TLS static bool __libc_freeres_fn_section free_slotinfo (struct dtv_slotinfo_list **elemp) { @@ -728,45 +769,52 @@ free_slotinfo (struct dtv_slotinfo_list **elemp) return true; } +#endif libc_freeres_fn (free_mem) { - for (Lmid_t ns = 0; ns < DL_NNS; ++ns) - if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0 - && (GL(dl_ns)[ns]._ns_main_searchlist->r_nlist + for (Lmid_t nsid = 0; nsid < DL_NNS; ++nsid) + if (__builtin_expect (GL(dl_ns)[nsid]._ns_global_scope_alloc, 0) != 0 + && (GL(dl_ns)[nsid]._ns_main_searchlist->r_nlist // XXX Check whether we need NS-specific initial_searchlist == GLRO(dl_initial_searchlist).r_nlist)) { /* All object dynamically loaded by the program are unloaded. Free the memory allocated for the global scope variable. */ - struct link_map **old = GL(dl_ns)[ns]._ns_main_searchlist->r_list; + struct link_map **old = GL(dl_ns)[nsid]._ns_main_searchlist->r_list; /* Put the old map in. */ - GL(dl_ns)[ns]._ns_main_searchlist->r_list + GL(dl_ns)[nsid]._ns_main_searchlist->r_list // XXX Check whether we need NS-specific initial_searchlist = GLRO(dl_initial_searchlist).r_list; /* Signal that the original map is used. */ - GL(dl_ns)[ns]._ns_global_scope_alloc = 0; + GL(dl_ns)[nsid]._ns_global_scope_alloc = 0; /* Now free the old map. */ free (old); } +#ifdef USE_TLS if (USE___THREAD || GL(dl_tls_dtv_slotinfo_list) != NULL) { /* Free the memory allocated for the dtv slotinfo array. We can do this only if all modules which used this memory are unloaded. */ -#ifdef SHARED +# ifdef SHARED if (GL(dl_initial_dtv) == NULL) /* There was no initial TLS setup, it was set up later when it used the normal malloc. */ free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)); else -#endif +# endif /* The first element of the list does not have to be deallocated. It was allocated in the dynamic linker (i.e., with a different malloc), and in the static library it's in .bss space. */ free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next); } +#endif + + void *scope_free_list = GL(dl_scope_free_list); + GL(dl_scope_free_list) = NULL; + free (scope_free_list); } diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 4ec984e15b..c35cc977fa 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -123,7 +123,7 @@ DST not allowed in SUID/SGID programs")); \ processed. */ \ if (fatal) \ _dl_signal_error (0, __str, NULL, N_("\ -empty dynamic string token substitution")); \ +empty dynamics string token substitution")); \ else \ { \ /* This is for DT_AUXILIARY. */ \ diff --git a/elf/dl-dst.h b/elf/dl-dst.h index 83d16bdb0e..175b7cd195 100644 --- a/elf/dl-dst.h +++ b/elf/dl-dst.h @@ -1,5 +1,6 @@ /* Handling of dynamic sring tokens. - Copyright (C) 1999,2001,2002,2003,2004,2006 Free Software Foundation, Inc. + Copyright (C) 1999,2001,2002,2003,2004,2006,2007 + 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 @@ -50,7 +51,7 @@ \ First get the origin string if it is not available yet. \ This can only happen for the map of the executable. */ \ - DL_DST_REQ_STATIC \ + DL_DST_REQ_STATIC (l) \ if ((l)->l_origin == NULL) \ { \ assert ((l)->l_name[0] == '\0'); \ @@ -68,9 +69,9 @@ __len; }) #ifdef SHARED -# define DL_DST_REQ_STATIC /* nothing */ +# define DL_DST_REQ_STATIC(l) /* nothing */ #else -# define DL_DST_REQ_STATIC \ +# define DL_DST_REQ_STATIC(l) \ if ((l) == NULL) \ { \ const char *origin = _dl_get_origin (); \ diff --git a/elf/dl-fptr.c b/elf/dl-fptr.c index e068124d6f..78beecfdcb 100644 --- a/elf/dl-fptr.c +++ b/elf/dl-fptr.c @@ -1,5 +1,5 @@ /* Manage function descriptors. Generic version. - Copyright (C) 1999-2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1999,2000,2001,2002,2003,2004 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 @@ -40,7 +40,7 @@ #ifndef COMPARE_AND_SWAP # define COMPARE_AND_SWAP(ptr, old, new) \ - (catomic_compare_and_exchange_bool_acq (ptr, new, old) == 0) + (atomic_compare_and_exchange_bool_acq (ptr, new, old) == 0) #endif ElfW(Addr) _dl_boot_fptr_table [ELF_MACHINE_BOOT_FPTR_TABLE_LEN]; diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c index d03d8b6daf..b29534d5c9 100644 --- a/elf/dl-iteratephdr.c +++ b/elf/dl-iteratephdr.c @@ -1,5 +1,5 @@ /* Get loaded objects program headers. - Copyright (C) 2001,2002,2003,2004,2006 Free Software Foundation, Inc. + Copyright (C) 2001,2002,2003,2004,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2001. @@ -54,9 +54,9 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, nloaded += GL(dl_ns)[cnt]._ns_nloaded; if (caller >= (const void *) l->l_map_start - && caller < (const void *) l->l_map_end) - /* There must be exactly one DSO for the range of the virtual - memory. Otherwise something is really broken. */ + && caller < (const void *) l->l_map_end + && (l->l_contiguous + || _dl_addr_inside_object (l, (ElfW(Addr)) caller))) ns = cnt; } @@ -70,9 +70,11 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, info.dlpi_subs = GL(dl_load_adds) - nloaded; info.dlpi_tls_modid = 0; info.dlpi_tls_data = NULL; +#ifdef USE_TLS info.dlpi_tls_modid = l->l_tls_modid; if (info.dlpi_tls_modid != 0) info.dlpi_tls_data = _dl_tls_get_addr_soft (l); +#endif ret = callback (&info, sizeof (struct dl_phdr_info), data); if (ret) break; diff --git a/elf/dl-libc.c b/elf/dl-libc.c index a6d0d1fcef..1b995eda92 100644 --- a/elf/dl-libc.c +++ b/elf/dl-libc.c @@ -1,5 +1,5 @@ /* Handle loading and unloading shared objects for internal libc purposes. - Copyright (C) 1999-2002,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 1999,2000,2001,2002,2004,2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Zack Weinberg , 1999. diff --git a/elf/dl-load.c b/elf/dl-load.c index 1650ef953a..9625030e88 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1,5 +1,5 @@ /* Map in a shared object's segments from the file. - Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2005, 2006, 2007 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 @@ -1078,6 +1078,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, break; case PT_TLS: +#ifdef USE_TLS if (ph->p_memsz == 0) /* Nothing to do for an empty segment. */ break; @@ -1105,7 +1106,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, break; } -#ifdef SHARED +# ifdef SHARED if (l->l_prev == NULL || (mode & __RTLD_AUDIT) != 0) /* We are loading the executable itself when the dynamic linker was executed directly. The setup will happen later. */ @@ -1114,7 +1115,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, /* In a static binary there is no way to tell if we dynamically loaded libpthread. */ if (GL(dl_error_catch_tsd) == &_dl_initial_error_catch_tsd) -#endif +# endif { /* We have not yet loaded libpthread. We can do the TLS setup right now! */ @@ -1147,6 +1148,7 @@ cannot allocate TLS data structures for initial thread"); _dl_deallocate_tls (tcb, 1); goto call_lose; } +#endif /* Uh-oh, the binary expects TLS support but we cannot provide it. */ @@ -1223,6 +1225,8 @@ cannot allocate TLS data structures for initial thread"); loadcmds[nloadcmds - 1].mapstart - c->mapend, PROT_NONE); + l->l_contiguous = 1; + goto postmap; } @@ -1242,6 +1246,7 @@ cannot allocate TLS data structures for initial thread"); /* Remember which part of the address space this object uses. */ l->l_map_start = c->mapstart + l->l_addr; l->l_map_end = l->l_map_start + maplength; + l->l_contiguous = !has_holes; while (c < &loadcmds[nloadcmds]) { @@ -1385,7 +1390,7 @@ cannot allocate TLS data structures for initial thread"); requires that it be executable. We must change the protection of the variable which contains the flags used in the mprotect calls. */ -#ifdef SHARED +#if defined HAVE_Z_RELRO && defined SHARED if ((mode & (__RTLD_DLOPEN | __RTLD_AUDIT)) == __RTLD_DLOPEN) { const uintptr_t p = (uintptr_t) &__stack_prot & -GLRO(dl_pagesize); @@ -1422,9 +1427,11 @@ cannot enable executable stack as shared object requires"); } } +#ifdef USE_TLS /* Adjust the address of the TLS initialization image. */ if (l->l_tls_initimage != NULL) l->l_tls_initimage = (char *) l->l_tls_initimage + l->l_addr; +#endif /* We are done mapping in the file. We no longer need the descriptor. */ if (__builtin_expect (__close (fd) != 0, 0)) @@ -1928,10 +1935,11 @@ open_path (const char *name, size_t namelen, int preloaded, must not be freed using the general free() in libc. */ if (sps->malloced) free (sps->dirs); - +#ifdef HAVE_Z_RELRO /* rtld_search_dirs is attribute_relro, therefore avoid writing into it. */ if (sps != &rtld_search_dirs) +#endif sps->dirs = (void *) -1; } diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 019278c9b0..e971929d0e 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -1,5 +1,5 @@ /* Look up a symbol in the loaded objects. - Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2005, 2006, 2007 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 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -228,17 +229,13 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map, /* No other flag than DL_LOOKUP_ADD_DEPENDENCY is allowed if we look up a versioned symbol. */ - assert (version == NULL || flags == 0 || flags == DL_LOOKUP_ADD_DEPENDENCY); + assert (version == NULL || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY)) == 0); size_t i = 0; if (__builtin_expect (skip_map != NULL, 0)) - { - /* Search the relevant loaded objects for a definition. */ - while ((*scope)->r_list[i] != skip_map) - ++i; - - assert (i < (*scope)->r_nlist); - } + /* Search the relevant loaded objects for a definition. */ + while ((*scope)->r_list[i] != skip_map) + ++i; /* Search the relevant loaded objects for a definition. */ for (size_t start = i; *scope != NULL; start = 0, ++scope) @@ -341,9 +338,8 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map, && add_dependency (undef_map, current_value.m) < 0) /* Something went wrong. Perhaps the object we tried to reference was just removed. Try finding another definition. */ - return _dl_lookup_symbol_x (undef_name, undef_map, ref, - symbol_scope, version, type_class, - flags, skip_map); + return _dl_lookup_symbol_x (undef_name, undef_map, ref, symbol_scope, + version, type_class, flags, skip_map); /* The object is used. */ current_value.m->l_used = 1; @@ -449,10 +445,12 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, conflict = 1; } +# ifdef USE_TLS if (value->s && (__builtin_expect (ELFW(ST_TYPE) (value->s->st_info) == STT_TLS, 0))) type_class = 4; +# endif if (conflict || GLRO(dl_trace_prelink_map) == undef_map diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c index 8e78709b5a..eeea790e40 100644 --- a/elf/dl-minimal.c +++ b/elf/dl-minimal.c @@ -1,5 +1,5 @@ /* Minimal replacements for basic facilities used in the dynamic linker. - Copyright (C) 1995-1998,2000-2002,2004,2005,2006 + Copyright (C) 1995-1998,2000-2002,2004-2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -75,14 +75,21 @@ __libc_memalign (size_t align, size_t n) alloc_ptr = (void *) 0 + (((alloc_ptr - (void *) 0) + align - 1) & ~(align - 1)); - if (alloc_ptr + n >= alloc_end) + if (alloc_ptr + n >= alloc_end || n >= -(uintptr_t) alloc_ptr) { /* Insufficient space left; allocate another page. */ caddr_t page; size_t nup = (n + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); + if (__builtin_expect (nup == 0, 0)) + { + if (n) + return NULL; + nup = GLRO(dl_pagesize); + } page = __mmap (0, nup, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, _dl_zerofd, 0); - assert (page != MAP_FAILED); + if (page == MAP_FAILED) + return NULL; if (page != alloc_end) alloc_ptr = page; alloc_end = page + nup; @@ -108,7 +115,14 @@ calloc (size_t nmemb, size_t size) /* New memory from the trivial malloc above is always already cleared. (We make sure that's true in the rare occasion it might not be, by clearing memory in free, below.) */ - return malloc (nmemb * size); + size_t bytes = nmemb * size; + +#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t) / 2)) + if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0) + && size != 0 && bytes / size != nmemb) + return NULL; + + return malloc (bytes); } /* This will rarely be called. */ @@ -264,7 +278,7 @@ __strtoul_internal (const char *nptr, char **endptr, int base, int group) while (*nptr >= '0' && *nptr <= '9') { unsigned long int digval = *nptr - '0'; - if (result > LONG_MAX / 10 + if (result > ULONG_MAX / 10 || (result == ULONG_MAX / 10 && digval > ULONG_MAX % 10)) { errno = ERANGE; diff --git a/elf/dl-object.c b/elf/dl-object.c index 33ee860e59..86f7a8e4d9 100644 --- a/elf/dl-object.c +++ b/elf/dl-object.c @@ -1,5 +1,5 @@ /* Storage management for the chain of loaded shared objects. - Copyright (C) 1995-2002, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2002, 2004 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 @@ -64,7 +64,7 @@ _dl_new_object (char *realname, const char *libname, int type, new->l_name = realname; new->l_type = type; new->l_loader = loader; -#if NO_TLS_OFFSET != 0 +#if defined USE_TLS && NO_TLS_OFFSET != 0 new->l_tls_offset = NO_TLS_OFFSET; #endif new->l_ns = nsid; @@ -85,11 +85,6 @@ _dl_new_object (char *realname, const char *libname, int type, new->l_scope = new->l_scope_mem; new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]); - /* No need to initialize the scope lock if the initializer is zero. */ -#if _RTLD_MRLOCK_INITIALIZER != 0 - __rtld_mrlock_initialize (new->l_scope_lock); -#endif - /* Counter for the scopes we have to handle. */ idx = 0; diff --git a/elf/dl-open.c b/elf/dl-open.c index c997521126..32e7caac7f 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -1,5 +1,5 @@ /* Load a shared object at runtime, relocate it, and run its initializer. - Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2004, 2005, 2006, 2007 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 @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -97,17 +98,17 @@ add_to_global (struct link_map *new) in an realloc() call. Therefore we allocate a completely new array the first time we have to add something to the locale scope. */ - if (GL(dl_ns)[new->l_ns]._ns_global_scope_alloc == 0) + struct link_namespaces *ns = &GL(dl_ns)[new->l_ns]; + if (ns->_ns_global_scope_alloc == 0) { /* This is the first dynamic object given global scope. */ - GL(dl_ns)[new->l_ns]._ns_global_scope_alloc - = GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist + to_add + 8; + ns->_ns_global_scope_alloc + = ns->_ns_main_searchlist->r_nlist + to_add + 8; new_global = (struct link_map **) - malloc (GL(dl_ns)[new->l_ns]._ns_global_scope_alloc - * sizeof (struct link_map *)); + malloc (ns->_ns_global_scope_alloc * sizeof (struct link_map *)); if (new_global == NULL) { - GL(dl_ns)[new->l_ns]._ns_global_scope_alloc = 0; + ns->_ns_global_scope_alloc = 0; nomem: _dl_signal_error (ENOMEM, new->l_libname->name, NULL, N_("cannot extend global scope")); @@ -115,29 +116,39 @@ add_to_global (struct link_map *new) } /* Copy over the old entries. */ - GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list - = memcpy (new_global, - GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list, - (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist + ns->_ns_main_searchlist->r_list + = memcpy (new_global, ns->_ns_main_searchlist->r_list, + (ns->_ns_main_searchlist->r_nlist * sizeof (struct link_map *))); } - else if (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist + to_add - > GL(dl_ns)[new->l_ns]._ns_global_scope_alloc) + else if (ns->_ns_main_searchlist->r_nlist + to_add + > ns->_ns_global_scope_alloc) { /* We have to extend the existing array of link maps in the main map. */ + struct link_map **old_global + = GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list; + size_t new_nalloc = ((ns->_ns_global_scope_alloc + to_add) * 2); + new_global = (struct link_map **) - realloc (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list, - ((GL(dl_ns)[new->l_ns]._ns_global_scope_alloc + to_add + 8) - * sizeof (struct link_map *))); + malloc (new_nalloc * sizeof (struct link_map *)); if (new_global == NULL) goto nomem; - GL(dl_ns)[new->l_ns]._ns_global_scope_alloc += to_add + 8; - GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list = new_global; + memcpy (new_global, old_global, + ns->_ns_global_scope_alloc * sizeof (struct link_map *)); + + ns->_ns_global_scope_alloc = new_nalloc; + ns->_ns_main_searchlist->r_list = new_global; + + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_WAIT (); + + free (old_global); } /* Now add the new entries. */ + unsigned int new_nlist = ns->_ns_main_searchlist->r_nlist; for (cnt = 0; cnt < new->l_searchlist.r_nlist; ++cnt) { struct link_map *map = new->l_searchlist.r_list[cnt]; @@ -145,15 +156,49 @@ add_to_global (struct link_map *new) if (map->l_global == 0) { map->l_global = 1; - GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list[GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist] - = map; - ++GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist; + ns->_ns_main_searchlist->r_list[new_nlist++] = map; } } + atomic_write_barrier (); + ns->_ns_main_searchlist->r_nlist = new_nlist; return 0; } +int +_dl_scope_free (struct r_scope_elem **old) +{ + struct dl_scope_free_list *fsl; +#define DL_SCOPE_FREE_LIST_SIZE (sizeof (fsl->list) / sizeof (fsl->list[0])) + + if (RTLD_SINGLE_THREAD_P) + free (old); + else if ((fsl = GL(dl_scope_free_list)) == NULL) + { + GL(dl_scope_free_list) = fsl = malloc (sizeof (*fsl)); + if (fsl == NULL) + { + THREAD_GSCOPE_WAIT (); + free (old); + return 1; + } + else + { + fsl->list[0] = old; + fsl->count = 1; + } + } + else if (fsl->count < DL_SCOPE_FREE_LIST_SIZE) + fsl->list[fsl->count++] = old; + else + { + THREAD_GSCOPE_WAIT (); + while (fsl->count > 0) + free (fsl->list[--fsl->count]); + return 1; + } + return 0; +} static void dl_open_worker (void *a) @@ -161,10 +206,12 @@ dl_open_worker (void *a) struct dl_open_args *args = a; const char *file = args->file; int mode = args->mode; - struct link_map *new, *l; + struct link_map *new; int lazy; unsigned int i; +#ifdef USE_TLS bool any_tls = false; +#endif struct link_map *call_map = NULL; /* Check whether _dl_open() has been called from a valid DSO. */ @@ -186,13 +233,14 @@ dl_open_worker (void *a) By default we assume this is the main application. */ call_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded; + struct link_map *l; for (Lmid_t ns = 0; ns < DL_NNS; ++ns) for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next) if (caller_dlopen >= (const void *) l->l_map_start - && caller_dlopen < (const void *) l->l_map_end) + && caller_dlopen < (const void *) l->l_map_end + && (l->l_contiguous + || _dl_addr_inside_object (l, (ElfW(Addr)) caller_dlopen))) { - /* There must be exactly one DSO for the range of the virtual - memory. Otherwise something is really broken. */ assert (ns == l->l_ns); call_map = l; goto found_caller; @@ -325,7 +373,7 @@ dl_open_worker (void *a) /* Relocate the objects loaded. We do this in reverse order so that copy relocs of earlier objects overwrite the data written by later objects. */ - l = new; + struct link_map *l = new; while (l->l_next) l = l->l_next; while (1) @@ -417,17 +465,10 @@ dl_open_worker (void *a) memcpy (newp, imap->l_scope, cnt * sizeof (imap->l_scope[0])); struct r_scope_elem **old = imap->l_scope; - if (RTLD_SINGLE_THREAD_P) - imap->l_scope = newp; - else - { - __rtld_mrlock_change (imap->l_scope_lock); - imap->l_scope = newp; - __rtld_mrlock_done (imap->l_scope_lock); - } + imap->l_scope = newp; if (old != imap->l_scope_mem) - free (old); + _dl_scope_free (old); imap->l_scope_max = new_size; } @@ -439,6 +480,7 @@ dl_open_worker (void *a) atomic_write_barrier (); imap->l_scope[cnt] = &new->l_searchlist; } +#if USE_TLS /* Only add TLS memory if this object is loaded now and therefore is not yet initialized. */ else if (! imap->l_init_called @@ -453,11 +495,11 @@ dl_open_worker (void *a) if (imap->l_need_tls_init) { imap->l_need_tls_init = 0; -#ifdef SHARED +# ifdef SHARED /* Update the slot information data for at least the generation of the DSO we are allocating data for. */ _dl_update_slotinfo (imap->l_tls_modid); -#endif +# endif GL(dl_init_static_tls) (imap); assert (imap->l_need_tls_init == 0); @@ -466,12 +508,15 @@ dl_open_worker (void *a) /* We have to bump the generation counter. */ any_tls = true; } +#endif } +#if USE_TLS /* Bump the generation number if necessary. */ if (any_tls && __builtin_expect (++GL(dl_tls_generation) == 0, 0)) _dl_fatal_printf (N_("\ TLS generation counter wrapped! Please report this.")); +#endif /* Run the initializer functions of new objects. */ _dl_init (new, args->argc, args->argv, args->env); @@ -568,6 +613,7 @@ no more namespaces available for dlmopen()")); state if relocation failed, for example. */ if (args.map) { +#ifdef USE_TLS /* Maybe some of the modules which were loaded use TLS. Since it will be removed in the following _dl_close call we have to mark the dtv array as having gaps to fill the @@ -577,6 +623,7 @@ no more namespaces available for dlmopen()")); up. */ if ((mode & __RTLD_AUDIT) == 0) GL(dl_tls_dtv_gaps) = true; +#endif _dl_close_worker (args.map); } @@ -650,3 +697,21 @@ show_scope (struct link_map *new) } } #endif + +#ifdef IS_IN_rtld +/* Return non-zero if ADDR lies within one of L's segments. */ +int +internal_function +_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr) +{ + int n = l->l_phnum; + const ElfW(Addr) reladdr = addr - l->l_addr; + + while (--n >= 0) + if (l->l_phdr[n].p_type == PT_LOAD + && reladdr - l->l_phdr[n].p_vaddr >= 0 + && reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz) + return 1; + return 0; +} +#endif diff --git a/elf/dl-profile.c b/elf/dl-profile.c index 47033f32ef..41214c1b08 100644 --- a/elf/dl-profile.c +++ b/elf/dl-profile.c @@ -1,5 +1,5 @@ /* Profiling of shared libraries. - Copyright (C) 1997-2002, 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. Based on the BSD mcount implementation. @@ -509,24 +509,24 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc) size_t newfromidx; to_index = (data[narcs].self_pc / (HASHFRACTION * sizeof (*tos))); - newfromidx = catomic_exchange_and_add (&fromidx, 1) + 1; + newfromidx = atomic_exchange_and_add (&fromidx, 1) + 1; froms[newfromidx].here = &data[narcs]; froms[newfromidx].link = tos[to_index]; tos[to_index] = newfromidx; - catomic_increment (&narcs); + atomic_increment (&narcs); } /* If we still have no entry stop searching and insert. */ if (*topcindex == 0) { - uint_fast32_t newarc = catomic_exchange_and_add (narcsp, 1); + uint_fast32_t newarc = atomic_exchange_and_add (narcsp, 1); /* In rare cases it could happen that all entries in FROMS are occupied. So we cannot count this anymore. */ if (newarc >= fromlimit) goto done; - *topcindex = catomic_exchange_and_add (&fromidx, 1) + 1; + *topcindex = atomic_exchange_and_add (&fromidx, 1) + 1; fromp = &froms[*topcindex]; fromp->here = &data[newarc]; @@ -534,7 +534,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc) data[newarc].self_pc = selfpc; data[newarc].count = 0; fromp->link = 0; - catomic_increment (&narcs); + atomic_increment (&narcs); break; } @@ -547,7 +547,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc) } /* Increment the counter. */ - catomic_increment (&fromp->here->count); + atomic_increment (&fromp->here->count); done: ; diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c index c315b5d972..117410e924 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 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 @@ -35,6 +35,7 @@ #endif +#ifdef USE_TLS /* We are trying to perform a static TLS relocation in MAP, but it was dynamically loaded. This can only work if there is enough surplus in the static TLS area already allocated for each running thread. If this @@ -55,7 +56,7 @@ _dl_allocate_static_tls (struct link_map *map) cannot allocate memory in static TLS block")); } -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP size_t freebytes; size_t n; size_t blsize; @@ -72,7 +73,7 @@ cannot allocate memory in static TLS block")); - map->l_tls_firstbyte_offset); map->l_tls_offset = GL(dl_tls_static_used) = offset; -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP size_t used; size_t check; @@ -86,9 +87,9 @@ cannot allocate memory in static TLS block")); map->l_tls_offset = offset; GL(dl_tls_static_used) = used; -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif /* If the object is not yet relocated we cannot initialize the static TLS region. Delay it. */ @@ -114,13 +115,13 @@ cannot allocate memory in static TLS block")); void _dl_nothread_init_static_tls (struct link_map *map) { -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP void *dest = (char *) THREAD_SELF - map->l_tls_offset; -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP void *dest = (char *) THREAD_SELF + map->l_tls_offset + TLS_PRE_TCB_SIZE; -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif /* Fill in the DTV slot so that a later LD/GD access will find it. */ dtv_t *dtv = THREAD_DTV (); @@ -132,6 +133,7 @@ _dl_nothread_init_static_tls (struct link_map *map) memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size), '\0', map->l_tls_blocksize - map->l_tls_initimage_size); } +#endif void diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index afc99f6150..ee2b8b5f6c 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -1,5 +1,5 @@ /* On-demand PLT fixup for shared objects. - Copyright (C) 1995-2002,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 1995-2006, 2007 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 @@ -26,6 +26,8 @@ #include #include #include "dynamic-link.h" +#include + #if (!defined ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \ || ELF_MACHINE_NO_REL @@ -93,15 +95,19 @@ _dl_fixup ( version = NULL; } - if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P) - __rtld_mrlock_lock (l->l_scope_lock); + /* We need to keep the scope around so do some locking. This is + not necessary for objects which cannot be unloaded or when + we are not using any threads (yet). */ + int flags = DL_LOOKUP_ADD_DEPENDENCY; + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_SET_FLAG (); - result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, - l->l_scope, version, ELF_RTYPE_CLASS_PLT, - DL_LOOKUP_ADD_DEPENDENCY, NULL); + result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope, + version, ELF_RTYPE_CLASS_PLT, flags, NULL); - if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P) - __rtld_mrlock_unlock (l->l_scope_lock); + /* We are done with the global scope. */ + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_RESET_FLAG (); /* Currently result contains the base load address (or link map) of the object that defines sym. Now add in the symbol @@ -181,16 +187,20 @@ _dl_profile_fixup ( version = NULL; } - if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P) - __rtld_mrlock_lock (l->l_scope_lock); + /* We need to keep the scope around so do some locking. This is + not necessary for objects which cannot be unloaded or when + we are not using any threads (yet). */ + int flags = DL_LOOKUP_ADD_DEPENDENCY; + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_SET_FLAG (); - result = _dl_lookup_symbol_x (strtab + refsym->st_name, l, &defsym, - l->l_scope, version, - ELF_RTYPE_CLASS_PLT, - DL_LOOKUP_ADD_DEPENDENCY, NULL); + result = _dl_lookup_symbol_x (strtab + refsym->st_name, l, + &defsym, l->l_scope, version, + ELF_RTYPE_CLASS_PLT, flags, NULL); - if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P) - __rtld_mrlock_unlock (l->l_scope_lock); + /* We are done with the global scope. */ + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_RESET_FLAG (); /* Currently result contains the base load address (or link map) of the object that defines sym. Now add in the symbol diff --git a/elf/dl-support.c b/elf/dl-support.c index c1cfc0df41..4b7be6bc27 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -1,5 +1,5 @@ /* Support for dynamic linking code in static libc. - Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2005, 2006, 2007 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 @@ -98,7 +98,9 @@ int _dl_starting_up = 1; hp_timing_t _dl_cpuclock_offset; #endif +#ifdef USE_TLS void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls; +#endif size_t _dl_pagesize; @@ -132,6 +134,11 @@ int (*_dl_make_stack_executable_hook) (void **) internal_function = _dl_make_stack_executable; +/* Function in libpthread to wait for termination of lookups. */ +void (*_dl_wait_lookup_done) (void); + +struct dl_scope_free_list *_dl_scope_free_list; + #ifdef NEED_DL_SYSINFO /* Needed for improved syscall handling on at least x86/Linux. */ uintptr_t _dl_sysinfo = DL_SYSINFO_DEFAULT; diff --git a/elf/dl-sym.c b/elf/dl-sym.c index 88a5adb0d5..fa0e3a67fc 100644 --- a/elf/dl-sym.c +++ b/elf/dl-sym.c @@ -1,5 +1,5 @@ /* Look up a symbol in a shared object loaded by `dlopen'. - Copyright (C) 1999,2000,2001,2002,2004,2006 Free Software Foundation, Inc. + Copyright (C) 1999-2002,2004,2006,2007 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 @@ -26,10 +26,12 @@ #include #include #include -#include +#ifdef USE_TLS +# include +#endif -#ifdef SHARED +#if defined USE_TLS && defined SHARED /* Systems which do not have tls_index also probably have to define DONT_USE_TLS_INDEX. */ @@ -98,10 +100,9 @@ do_sym (void *handle, const char *name, void *who, for (Lmid_t ns = 0; ns < DL_NNS; ++ns) for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next) - if (caller >= l->l_map_start && caller < l->l_map_end) + if (caller >= l->l_map_start && caller < l->l_map_end + && (l->l_contiguous || _dl_addr_inside_object (l, caller))) { - /* There must be exactly one DSO for the range of the virtual - memory. Otherwise something is really broken. */ match = l; break; } @@ -113,15 +114,13 @@ do_sym (void *handle, const char *name, void *who, the initial binary. And then the more complex part where the object is dynamically loaded and the scope array can change. */ - if (match->l_type != lt_loaded || RTLD_SINGLE_THREAD_P) + if (RTLD_SINGLE_THREAD_P) result = GLRO(dl_lookup_symbol_x) (name, match, &ref, match->l_scope, vers, 0, flags | DL_LOOKUP_ADD_DEPENDENCY, NULL); else { - __rtld_mrlock_lock (match->l_scope_lock); - struct call_dl_lookup_args args; args.name = name; args.map = match; @@ -129,13 +128,15 @@ do_sym (void *handle, const char *name, void *who, args.flags = flags | DL_LOOKUP_ADD_DEPENDENCY; args.refp = &ref; + THREAD_GSCOPE_SET_FLAG (); + const char *objname; const char *errstring = NULL; bool malloced; int err = GLRO(dl_catch_error) (&objname, &errstring, &malloced, call_dl_lookup, &args); - __rtld_mrlock_unlock (match->l_scope_lock); + THREAD_GSCOPE_RESET_FLAG (); if (__builtin_expect (errstring != NULL, 0)) { @@ -182,7 +183,7 @@ RTLD_NEXT used in code not dynamically loaded")); { void *value; -#ifdef SHARED +#if defined USE_TLS && defined SHARED if (ELFW(ST_TYPE) (ref->st_info) == STT_TLS) /* The found symbol is a thread-local storage variable. Return the address for to the current thread. */ diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c index d06ce1754e..68e08f480a 100644 --- a/elf/dl-sysdep.c +++ b/elf/dl-sysdep.c @@ -1,5 +1,5 @@ /* Operating system support for run-time dynamic linker. Generic Unix version. - Copyright (C) 1995-1998, 2000-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-1998, 2000-2005, 2007 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 @@ -405,8 +405,25 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, } #endif +#ifdef USE_TLS /* For TLS enabled builds always add 'tls'. */ ++cnt; +#else + if (cnt == 0) + { + /* If we no have platform name and no important capability we only + have the base directory to search. */ + result = (struct r_strlenpair *) malloc (sizeof (*result)); + if (result == NULL) + goto no_memory; + + result[0].str = (char *) result; /* Does not really matter. */ + result[0].len = 0; + + *sz = 1; + return result; + } +#endif /* Create temporary data structure to generate result table. */ temp = (struct r_strlenpair *) alloca (cnt * sizeof (*temp)); @@ -448,11 +465,11 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, temp[m].len = platform_len; ++m; } - +#ifdef USE_TLS temp[m].str = "tls"; temp[m].len = 3; ++m; - +#endif assert (m == cnt); /* Determine the total size of all strings together. */ @@ -460,9 +477,21 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, total = temp[0].len + 1; else { - total = (1UL << (cnt - 2)) * (temp[0].len + temp[cnt - 1].len + 2); - for (n = 1; n + 1 < cnt; ++n) - total += (1UL << (cnt - 3)) * (temp[n].len + 1); + total = temp[0].len + temp[cnt - 1].len + 2; + if (cnt > 2) + { + total <<= 1; + for (n = 1; n + 1 < cnt; ++n) + total += temp[n].len + 1; + if (cnt > 3 + && (cnt >= sizeof (size_t) * 8 + || total + (sizeof (*result) << 3) + >= (1UL << (sizeof (size_t) * 8 - cnt + 3)))) + _dl_signal_error (ENOMEM, NULL, NULL, + N_("cannot create capability list")); + + total <<= cnt - 3; + } } /* The result structure: we use a very compressed way to store the @@ -470,8 +499,13 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, *sz = 1 << cnt; result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total); if (result == NULL) - _dl_signal_error (ENOMEM, NULL, NULL, - N_("cannot create capability list")); + { +#ifndef USE_TLS + no_memory: +#endif + _dl_signal_error (ENOMEM, NULL, NULL, + N_("cannot create capability list")); + } if (cnt == 1) { diff --git a/elf/dl-tls.c b/elf/dl-tls.c index d5865ab409..a0f4f77ffa 100644 --- a/elf/dl-tls.c +++ b/elf/dl-tls.c @@ -26,26 +26,30 @@ #include #include -#include -#include + +/* We don't need any of this if TLS is not supported. */ +#ifdef USE_TLS + +# include +# include /* Amount of excess space to allocate in the static TLS area to allow dynamic loading of modules defining IE-model TLS data. */ -#define TLS_STATIC_SURPLUS 64 + DL_NNS * 100 +# define TLS_STATIC_SURPLUS 64 + DL_NNS * 100 /* Value used for dtv entries for which the allocation is delayed. */ -#define TLS_DTV_UNALLOCATED ((void *) -1l) +# define TLS_DTV_UNALLOCATED ((void *) -1l) /* Out-of-memory handler. */ -#ifdef SHARED +# ifdef SHARED static void __attribute__ ((__noreturn__)) oom (void) { _dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n"); } -#endif +# endif size_t @@ -109,7 +113,7 @@ _dl_next_tls_modid (void) } -#ifdef SHARED +# ifdef SHARED void internal_function _dl_determine_tlsoffset (void) @@ -154,7 +158,7 @@ _dl_determine_tlsoffset (void) memory requirement for the next TLS block is smaller than the gap. */ -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP /* We simply start with zero. */ size_t offset = 0; @@ -201,7 +205,7 @@ _dl_determine_tlsoffset (void) GL(dl_tls_static_used) = offset; GL(dl_tls_static_size) = (roundup (offset + TLS_STATIC_SURPLUS, max_align) + TLS_TCB_SIZE); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP /* The TLS blocks start right after the TCB. */ size_t offset = TLS_TCB_SIZE; @@ -245,9 +249,9 @@ _dl_determine_tlsoffset (void) GL(dl_tls_static_used) = offset; GL(dl_tls_static_size) = roundup (offset + TLS_STATIC_SURPLUS, TLS_TCB_ALIGN); -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif /* The alignment requirement for the static TLS block. */ GL(dl_tls_static_align) = max_align; @@ -284,7 +288,7 @@ _dl_tls_setup (void) return 0; } rtld_hidden_def (_dl_tls_setup) -#endif +# endif static void * internal_function @@ -333,13 +337,13 @@ _dl_allocate_tls_storage (void) void *result; size_t size = GL(dl_tls_static_size); -#if TLS_DTV_AT_TP +# if TLS_DTV_AT_TP /* Memory layout is: [ TLS_PRE_TCB_SIZE ] [ TLS_TCB_SIZE ] [ TLS blocks ] ^ This should be returned. */ size += (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1) & ~(GL(dl_tls_static_align) - 1); -#endif +# endif /* Allocate a correctly aligned chunk of memory. */ result = __libc_memalign (GL(dl_tls_static_align), size); @@ -348,14 +352,14 @@ _dl_allocate_tls_storage (void) /* Allocate the DTV. */ void *allocated = result; -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP /* The TCB follows the TLS blocks. */ result = (char *) result + size - TLS_TCB_SIZE; /* Clear the TCB data structure. We can't ask the caller (i.e. libpthread) to do it, because we will initialize the DTV et al. */ memset (result, '\0', TLS_TCB_SIZE); -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP result = (char *) result + size - GL(dl_tls_static_size); /* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before it. @@ -363,7 +367,7 @@ _dl_allocate_tls_storage (void) initialize the DTV et al. */ memset ((char *) result - TLS_PRE_TCB_SIZE, '\0', TLS_PRE_TCB_SIZE + TLS_TCB_SIZE); -#endif +# endif result = allocate_dtv (result); if (result == NULL) @@ -424,14 +428,14 @@ _dl_allocate_tls_init (void *result) assert (map->l_tls_modid == cnt); assert (map->l_tls_blocksize >= map->l_tls_initimage_size); -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize); dest = (char *) result - map->l_tls_offset; -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP dest = (char *) result + map->l_tls_offset; -#else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -#endif +# else +# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" +# endif /* Copy the initialization image and clear the BSS part. */ dtv[map->l_tls_modid].pointer.val = dest; @@ -487,21 +491,21 @@ _dl_deallocate_tls (void *tcb, bool dealloc_tcb) if (dealloc_tcb) { -#if TLS_TCB_AT_TP +# if TLS_TCB_AT_TP /* The TCB follows the TLS blocks. Back up to free the whole block. */ tcb -= GL(dl_tls_static_size) - TLS_TCB_SIZE; -#elif TLS_DTV_AT_TP +# elif TLS_DTV_AT_TP /* Back up the TLS_PRE_TCB_SIZE bytes. */ tcb -= (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1) & ~(GL(dl_tls_static_align) - 1); -#endif +# endif free (tcb); } } rtld_hidden_def (_dl_deallocate_tls) -#ifdef SHARED +# ifdef SHARED /* The __tls_get_addr function has two basic forms which differ in the arguments. The IA-64 form takes two parameters, the module ID and offset. The form used, among others, on IA-32 takes a reference to @@ -509,15 +513,15 @@ rtld_hidden_def (_dl_deallocate_tls) form seems to be more often used (in the moment) so we default to it. Users of the IA-64 form have to provide adequate definitions of the following macros. */ -# ifndef GET_ADDR_ARGS -# define GET_ADDR_ARGS tls_index *ti -# endif -# ifndef GET_ADDR_MODULE -# define GET_ADDR_MODULE ti->ti_module -# endif -# ifndef GET_ADDR_OFFSET -# define GET_ADDR_OFFSET ti->ti_offset -# endif +# ifndef GET_ADDR_ARGS +# define GET_ADDR_ARGS tls_index *ti +# endif +# ifndef GET_ADDR_MODULE +# define GET_ADDR_MODULE ti->ti_module +# endif +# ifndef GET_ADDR_OFFSET +# define GET_ADDR_OFFSET ti->ti_offset +# endif static void * @@ -728,7 +732,7 @@ __tls_get_addr (GET_ADDR_ARGS) return (char *) p + GET_ADDR_OFFSET; } -#endif +# endif /* Look up the module's TLS block as for __tls_get_addr, @@ -836,3 +840,4 @@ cannot create TLS data structures")); listp->slotinfo[idx].map = l; listp->slotinfo[idx].gen = GL(dl_tls_generation) + 1; } +#endif /* use TLS */ diff --git a/elf/do-lookup.h b/elf/do-lookup.h index 2585d83005..ab9a510ba1 100644 --- a/elf/do-lookup.h +++ b/elf/do-lookup.h @@ -1,5 +1,5 @@ /* Look up a symbol in the loaded objects. - Copyright (C) 1995-2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2004, 2005, 2006, 2007 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 @@ -29,8 +29,13 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, const struct r_found_version *const version, int flags, struct link_map *skip, int type_class) { - struct link_map **list = scope->r_list; size_t n = scope->r_nlist; + /* Make sure we read the value before proceeding. Otherwise we + might use r_list pointing to the initial scope and r_nlist being + the value after a resize. That is the only path in dl-open.c not + protected by GSCOPE. A read barrier here might be to expensive. */ + __asm volatile ("" : "+r" (n), "+m" (scope->r_list)); + struct link_map **list = scope->r_list; do { diff --git a/elf/elf.h b/elf/elf.h index d27e5f085d..dae359778b 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -1,5 +1,5 @@ /* This file defines standard ELF types, structures, and macros. - Copyright (C) 1995-2003,2004,2005,2006,2007 Free Software Foundation, Inc. + Copyright (C) 1995-2003,2004,2005,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -1511,9 +1511,8 @@ typedef struct #define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */ #define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */ #define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */ -#define R_MIPS_GLOB_DAT 51 /* Keep this the last entry. */ -#define R_MIPS_NUM 52 +#define R_MIPS_NUM 51 /* Legal values for p_type field of Elf32_Phdr. */ diff --git a/elf/ldconfig.c b/elf/ldconfig.c index ec81cbb817..4a088af1ed 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -287,7 +286,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Andreas Jaeger"); } @@ -559,7 +558,7 @@ manual_link (char *library) /* Do some sanity checks first. */ if (lstat64 (real_library, &stat_buf)) { - error (0, errno, _("Cannot lstat %s"), library); + error (0, errno, _("Can't lstat %s"), library); free (path); return; } @@ -707,10 +706,10 @@ search_dir (const struct dir_entry *entry) + 1, ".#prelink#.", sizeof (".#prelink#.") - 1) == 0) continue; } - len += strlen (entry->path); + len += strlen (entry->path) + 2; if (len > file_name_len) { - file_name_len = len + 1; + file_name_len = len; file_name = alloca (file_name_len); if (!opt_chroot) real_file_name = file_name; @@ -718,10 +717,10 @@ search_dir (const struct dir_entry *entry) sprintf (file_name, "%s/%s", entry->path, direntry->d_name); if (opt_chroot) { - len = strlen (dir_name) + strlen (direntry->d_name); + len = strlen (dir_name) + strlen (direntry->d_name) + 2; if (len > real_file_name_len) { - real_file_name_len = len + 1; + real_file_name_len = len; real_file_name = alloca (real_file_name_len); } sprintf (real_file_name, "%s/%s", dir_name, direntry->d_name); @@ -1167,14 +1166,9 @@ set_hwcap (void) int main (int argc, char **argv) { - /* Set locale via LC_ALL. */ - setlocale (LC_ALL, ""); - - /* Set the text message domain. */ - textdomain (_libc_intl_domainname); + int remaining; /* Parse and process arguments. */ - int remaining; argp_parse (&argp, argc, argv, 0, &remaining, NULL); /* Remaining arguments are additional directories if opt_manual_link @@ -1191,7 +1185,9 @@ main (int argc, char **argv) add_dir (argv[i]); } +#ifdef USE_TLS hwcap_extra[63 - _DL_FIRST_EXTRA] = "tls"; +#endif set_hwcap (); diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in index 05282fe99b..d1591a5785 100644 --- a/elf/ldd.bash.in +++ b/elf/ldd.bash.in @@ -1,5 +1,5 @@ #! @BASH@ -# Copyright (C) 1996-2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -39,7 +39,7 @@ while test $# -gt 0; do printf $"Copyright (C) %s Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -" "2007" +" "2006" printf $"Written by %s and %s. " "Roland McGrath" "Ulrich Drepper" exit 0 diff --git a/elf/rtld.c b/elf/rtld.c index 5e6ee51603..a357a46987 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1,5 +1,5 @@ /* Run time dynamic linker. - Copyright (C) 1995-2002,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 1995-2006, 2007 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 @@ -207,7 +207,8 @@ DL_SYSINFO_IMPLEMENTATION is fine, too. The latter is important here. We can avoid setting up a temporary link map for ld.so if we can mark _rtld_global as hidden. */ -#ifdef PI_STATIC_AND_HIDDEN +#if defined PI_STATIC_AND_HIDDEN && defined HAVE_HIDDEN \ + && defined HAVE_VISIBILITY_ATTRIBUTE # define DONT_USE_BOOTSTRAP_MAP 1 #endif @@ -291,7 +292,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end; GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext; /* Copy the TLS related data if necessary. */ -#ifndef DONT_USE_BOOTSTRAP_MAP +#if USE_TLS && !defined DONT_USE_BOOTSTRAP_MAP # if USE___THREAD assert (info->l.l_tls_modid != 0); GL(dl_rtld_map).l_tls_blocksize = info->l.l_tls_blocksize; @@ -399,7 +400,7 @@ _dl_start (void *arg) bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic (); elf_get_dynamic_info (&bootstrap_map, NULL); -#if NO_TLS_OFFSET != 0 +#if defined USE_TLS && NO_TLS_OFFSET != 0 bootstrap_map.l_tls_offset = NO_TLS_OFFSET; #endif @@ -700,6 +701,7 @@ match_version (const char *string, struct link_map *map) return 0; } +#ifdef USE_TLS static bool tls_init_tp_called; static void * @@ -771,6 +773,7 @@ cannot allocate TLS data structures for initial thread"); return tcbp; } +#endif #ifdef _LIBC_REENTRANT /* _dl_error_catch_tsd points to this for the single-threaded case. @@ -858,14 +861,18 @@ dl_main (const ElfW(Phdr) *phdr, hp_timing_t stop; hp_timing_t diff; #endif +#ifdef USE_TLS void *tcbp = NULL; +#endif #ifdef _LIBC_REENTRANT /* Explicit initialization since the reloc would just be more work. */ GL(dl_error_catch_tsd) = &_dl_initial_error_catch_tsd; #endif +#ifdef USE_TLS GL(dl_init_static_tls) = &_dl_nothread_init_static_tls; +#endif #if defined SHARED && defined _LIBC_REENTRANT \ && defined __rtld_lock_default_lock_recursive @@ -1150,6 +1157,7 @@ of this helper program; chances are you did not intend to run this program.\n\ break; case PT_TLS: +#ifdef USE_TLS if (ph->p_memsz > 0) { /* Note that in the case the dynamic linker we duplicate work @@ -1169,6 +1177,10 @@ of this helper program; chances are you did not intend to run this program.\n\ /* This image gets the ID one. */ GL(dl_tls_max_dtv_idx) = main_map->l_tls_modid = 1; } +#else + _dl_fatal_printf ("\ +ld.so does not support TLS, but program uses it!\n"); +#endif break; case PT_GNU_STACK: @@ -1180,12 +1192,13 @@ of this helper program; chances are you did not intend to run this program.\n\ main_map->l_relro_size = ph->p_memsz; break; } - - /* Adjust the address of the TLS initialization image in case - the executable is actually an ET_DYN object. */ - if (main_map->l_tls_initimage != NULL) - main_map->l_tls_initimage - = (char *) main_map->l_tls_initimage + main_map->l_addr; +#ifdef USE_TLS + /* Adjust the address of the TLS initialization image in case + the executable is actually an ET_DYN object. */ + if (main_map->l_tls_initimage != NULL) + main_map->l_tls_initimage + = (char *) main_map->l_tls_initimage + main_map->l_addr; +#endif if (! main_map->l_map_end) main_map->l_map_end = ~0; if (! main_map->l_text_end) @@ -1388,10 +1401,12 @@ of this helper program; chances are you did not intend to run this program.\n\ break; } +#ifdef USE_TLS /* Add the dynamic linker to the TLS list if it also uses TLS. */ if (GL(dl_rtld_map).l_tls_blocksize != 0) /* Assign a module ID. Do this before loading any audit modules. */ GL(dl_rtld_map).l_tls_modid = _dl_next_tls_modid (); +#endif /* If we have auditing DSOs to load, do it now. */ if (__builtin_expect (audit_list != NULL, 0)) @@ -1399,8 +1414,15 @@ of this helper program; chances are you did not intend to run this program.\n\ /* Iterate over all entries in the list. The order is important. */ struct audit_ifaces *last_audit = NULL; struct audit_list *al = audit_list->next; + +#ifdef USE_TLS + /* Since we start using the auditing DSOs right away we need to + initialize the data structures now. */ + tcbp = init_tls (); +#endif do { +#ifdef USE_TLS int tls_idx = GL(dl_tls_max_dtv_idx); /* Now it is time to determine the layout of the static TLS @@ -1408,11 +1430,7 @@ of this helper program; chances are you did not intend to run this program.\n\ always allocate the static block, we never defer it even if no DF_STATIC_TLS bit is set. The reason is that we know glibc will use the static model. */ - - /* Since we start using the auditing DSOs right away we need to - initialize the data structures now. */ - tcbp = init_tls (); - +#endif struct dlmopen_args dlmargs; dlmargs.fname = al->name; dlmargs.map = NULL; @@ -1527,7 +1545,9 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", assert (GL(dl_ns)[ns]._ns_loaded == NULL); assert (GL(dl_ns)[ns]._ns_nloaded == 0); +#ifdef USE_TLS GL(dl_tls_max_dtv_idx) = tls_idx; +#endif goto not_loaded; } } @@ -1803,6 +1823,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", _dl_receive_error (print_missing_version, version_check_doit, &args); } +#ifdef USE_TLS /* We do not initialize any of the TLS functionality unless any of the initial modules uses TLS. This makes dynamic loading of modules with TLS impossible, but to support it requires either eagerly doing setup @@ -1813,6 +1834,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", bool was_tls_init_tp_called = tls_init_tp_called; if (tcbp == NULL) tcbp = init_tls (); +#endif /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); @@ -1869,12 +1891,13 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", (size_t) l->l_map_start, (int) sizeof l->l_addr * 2, (size_t) l->l_addr); - +#ifdef USE_TLS if (l->l_tls_modid) _dl_printf (" TLS(0x%Zx, 0x%0*Zx)\n", l->l_tls_modid, (int) sizeof l->l_tls_offset * 2, (size_t) l->l_tls_offset); else +#endif _dl_printf ("\n"); } } @@ -1942,8 +1965,8 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", lookup_t result; result = _dl_lookup_symbol_x (INTUSE(_dl_argv)[i], main_map, - &ref, main_map->l_scope, - NULL, ELF_RTYPE_CLASS_PLT, + &ref, main_map->l_scope, NULL, + ELF_RTYPE_CLASS_PLT, DL_LOOKUP_ADD_DEPENDENCY, NULL); loadbase = LOOKUP_VALUE_ADDRESS (result); @@ -1985,8 +2008,8 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", { /* Mark the link map as not yet relocated again. */ GL(dl_rtld_map).l_relocated = 0; - _dl_relocate_object (&GL(dl_rtld_map), - main_map->l_scope, 0, 0); + _dl_relocate_object (&GL(dl_rtld_map), main_map->l_scope, + 0, 0); } } #define VERNEEDTAG (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)) @@ -2157,9 +2180,11 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", if (l->l_relro_size) _dl_protect_relro (l); +#ifdef USE_TLS /* Add object to slot information data if necessasy. */ if (l->l_tls_blocksize != 0 && tls_init_tp_called) _dl_add_to_slotinfo (l); +#endif } _dl_sysdep_start_cleanup (); @@ -2206,9 +2231,11 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", _dl_relocate_object (l, l->l_scope, GLRO(dl_lazy), consider_profiling); +#ifdef USE_TLS /* Add object to slot information data if necessasy. */ if (l->l_tls_blocksize != 0 && tls_init_tp_called) _dl_add_to_slotinfo (l); +#endif l = l->l_prev; } @@ -2237,6 +2264,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", # define NONTLS_INIT_TP do { } while (0) #endif +#ifdef USE_TLS if (!was_tls_init_tp_called && GL(dl_tls_max_dtv_idx) > 0) ++GL(dl_tls_generation); @@ -2254,6 +2282,9 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); } +#else + NONTLS_INIT_TP; +#endif if (! prelinked && rtld_multiple_ref) { diff --git a/elf/sprof.c b/elf/sprof.c index 01d27e1eff..e53a7ba7a3 100644 --- a/elf/sprof.c +++ b/elf/sprof.c @@ -1,5 +1,5 @@ /* Read and display shared object profiling data. - Copyright (C) 1997-2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1997-2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -357,7 +357,7 @@ 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\ "), - "2007"); + "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } diff --git a/elf/tst-thrlock.c b/elf/tst-thrlock.c index fe72eba141..71f1fbb35d 100644 --- a/elf/tst-thrlock.c +++ b/elf/tst-thrlock.c @@ -27,9 +27,8 @@ tf (void *arg) return NULL; } - -static int -do_test (void) +int +main (void) { #define N 10 pthread_t th[N]; @@ -54,6 +53,3 @@ do_test (void) } return 0; } - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/elf/tst-tls-dlinfo.c b/elf/tst-tls-dlinfo.c index 26c2811178..e97b5081fd 100644 --- a/elf/tst-tls-dlinfo.c +++ b/elf/tst-tls-dlinfo.c @@ -9,6 +9,7 @@ static int do_test (void) { +#ifdef USE_TLS static const char modname[] = "tst-tlsmod2.so"; int result = 0; int *foop; @@ -82,6 +83,9 @@ do_test (void) dlclose (h); return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c index 3b9b10f9aa..478f5bbdcd 100644 --- a/elf/tst-tls1.c +++ b/elf/tst-tls1.c @@ -3,18 +3,21 @@ #include -#include "tls-macros.h" +#ifdef USE_TLS +# include "tls-macros.h" /* Two common 'int' variables in TLS. */ COMMON_INT_DEF(foo); COMMON_INT_DEF(bar); +#endif #define TEST_FUNCTION do_test () static int do_test (void) { +#ifdef USE_TLS int result = 0; int *ap, *bp; @@ -79,6 +82,9 @@ do_test (void) } return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls10.h b/elf/tst-tls10.h index bffc332a0a..1be6adc293 100644 --- a/elf/tst-tls10.h +++ b/elf/tst-tls10.h @@ -1,7 +1,8 @@ #include #include -#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE +#if defined USE_TLS && defined HAVE___THREAD \ + && defined HAVE_TLS_MODEL_ATTRIBUTE # define USE_TLS__THREAD struct A diff --git a/elf/tst-tls14.c b/elf/tst-tls14.c index c1e6ba7e2c..428fd5293e 100644 --- a/elf/tst-tls14.c +++ b/elf/tst-tls14.c @@ -6,9 +6,9 @@ #include -#if HAVE___THREAD +#if USE_TLS && HAVE___THREAD -# define AL 4096 +#define AL 4096 struct foo { int i; @@ -55,11 +55,11 @@ do_test (void) return result; } -# define TEST_FUNCTION do_test () +#define TEST_FUNCTION do_test () #else -# define TEST_FUNCTION 0 +#define TEST_FUNCTION 0 #endif diff --git a/elf/tst-tls2.c b/elf/tst-tls2.c index 3d13272c08..417489968e 100644 --- a/elf/tst-tls2.c +++ b/elf/tst-tls2.c @@ -3,18 +3,21 @@ #include -#include "tls-macros.h" +#ifdef USE_TLS +# include "tls-macros.h" /* Two 'int' variables in TLS. */ VAR_INT_DEF(foo); VAR_INT_DEF(bar); +#endif #define TEST_FUNCTION do_test () static int do_test (void) { +#ifdef USE_TLS int result = 0; int *ap, *bp; @@ -79,6 +82,9 @@ do_test (void) } return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls3.c b/elf/tst-tls3.c index c5e501eb4e..84be43575b 100644 --- a/elf/tst-tls3.c +++ b/elf/tst-tls3.c @@ -3,13 +3,15 @@ #include -#include "tls-macros.h" +#ifdef USE_TLS +# include "tls-macros.h" /* One define int variable, two externs. */ COMMON_INT_DECL(foo); VAR_INT_DECL(bar); VAR_INT_DEF(baz); +#endif extern int in_dso (void); @@ -19,6 +21,7 @@ extern int in_dso (void); static int do_test (void) { +#ifdef USE_TLS int result = 0; int *ap, *bp, *cp; @@ -64,6 +67,9 @@ do_test (void) result |= in_dso (); return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls4.c b/elf/tst-tls4.c index 4ae33db24d..f92ee53ce5 100644 --- a/elf/tst-tls4.c +++ b/elf/tst-tls4.c @@ -9,6 +9,7 @@ static int do_test (void) { +#ifdef USE_TLS static const char modname[] = "tst-tlsmod2.so"; int result = 0; int *foop; @@ -46,6 +47,9 @@ do_test (void) dlclose (h); return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls5.c b/elf/tst-tls5.c index 27b18294fb..a571d2cd3f 100644 --- a/elf/tst-tls5.c +++ b/elf/tst-tls5.c @@ -9,6 +9,7 @@ static int do_test (void) { +#ifdef USE_TLS static const char modname[] = "tst-tlsmod2.so"; int result = 0; int *foop; @@ -62,6 +63,9 @@ do_test (void) dlclose (h); return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls6.c b/elf/tst-tls6.c index 021622d9c7..68d706538f 100644 --- a/elf/tst-tls6.c +++ b/elf/tst-tls6.c @@ -10,6 +10,7 @@ static int do_test (void) { +#ifdef USE_TLS static const char modname[] = "tst-tlsmod2.so"; int result = 0; int *foop; @@ -80,6 +81,9 @@ do_test (void) } return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls7.c b/elf/tst-tls7.c index 1edc2b6356..37f1a63e16 100644 --- a/elf/tst-tls7.c +++ b/elf/tst-tls7.c @@ -10,6 +10,7 @@ static int do_test (void) { +#ifdef USE_TLS static const char modname[] = "tst-tlsmod3.so"; int result = 0; int (*fp) (void); @@ -51,6 +52,9 @@ do_test (void) } return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls8.c b/elf/tst-tls8.c index 36b1baca63..ccc4e9f6fa 100644 --- a/elf/tst-tls8.c +++ b/elf/tst-tls8.c @@ -10,6 +10,7 @@ static int do_test (void) { +#ifdef USE_TLS static const char modname1[] = "$ORIGIN/tst-tlsmod3.so"; static const char modname2[] = "$ORIGIN/tst-tlsmod4.so"; int result = 0; @@ -164,6 +165,9 @@ do_test (void) } return result; +#else + return 0; +#endif } diff --git a/elf/tst-tls9.c b/elf/tst-tls9.c index 12078518fa..e317696dfc 100644 --- a/elf/tst-tls9.c +++ b/elf/tst-tls9.c @@ -9,6 +9,7 @@ static int do_test (void) { +#ifdef USE_TLS static const char modname1[] = "tst-tlsmod5.so"; static const char modname2[] = "tst-tlsmod6.so"; int result = 0; @@ -32,6 +33,9 @@ do_test (void) dlclose (h2); return result; +#else + return 0; +#endif } diff --git a/elf/tst-tlsmod1.c b/elf/tst-tlsmod1.c index 4d966c9472..c74a617b77 100644 --- a/elf/tst-tlsmod1.c +++ b/elf/tst-tlsmod1.c @@ -2,6 +2,7 @@ #include +#ifdef USE_TLS #include "tls-macros.h" @@ -9,6 +10,7 @@ COMMON_INT_DEF(foo); VAR_INT_DEF(bar); VAR_INT_DECL(baz); +#endif extern int in_dso (void); @@ -16,6 +18,7 @@ int in_dso (void) { int result = 0; +#ifdef USE_TLS int *ap, *bp, *cp; /* Get variables using initial exec model. */ @@ -59,6 +62,7 @@ in_dso (void) printf ("baz = %d\n", *cp); result = 1; } +#endif return result; } diff --git a/elf/tst-tlsmod13.c b/elf/tst-tlsmod13.c index e4e23af2d8..beca89f6fe 100644 --- a/elf/tst-tlsmod13.c +++ b/elf/tst-tlsmod13.c @@ -1,6 +1,7 @@ #include -#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE +#if defined USE_TLS && defined HAVE___THREAD \ + && defined HAVE_TLS_MODEL_ATTRIBUTE __thread int a[2] __attribute__ ((tls_model ("initial-exec"))); #else int a[2]; diff --git a/elf/tst-tlsmod13a.c b/elf/tst-tlsmod13a.c index 70a02131ee..14b12b032b 100644 --- a/elf/tst-tlsmod13a.c +++ b/elf/tst-tlsmod13a.c @@ -1,6 +1,7 @@ #include -#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE +#if defined USE_TLS && defined HAVE___THREAD \ + && defined HAVE_TLS_MODEL_ATTRIBUTE __thread int b[2] __attribute__ ((tls_model ("initial-exec"))); #else int b[2]; diff --git a/elf/tst-tlsmod14a.c b/elf/tst-tlsmod14a.c index ad1d179aac..0bb393d9c5 100644 --- a/elf/tst-tlsmod14a.c +++ b/elf/tst-tlsmod14a.c @@ -3,9 +3,9 @@ #include -#if HAVE___THREAD +#if USE_TLS && HAVE___THREAD -# define AL 4096 +#define AL 4096 struct foo { int i; @@ -15,9 +15,9 @@ static __thread struct foo f; static struct foo g; -# ifndef FCT -# define FCT in_dso1 -# endif +#ifndef FCT +# define FCT in_dso1 +#endif int diff --git a/elf/tst-tlsmod2.c b/elf/tst-tlsmod2.c index 981923313c..98d9d3e518 100644 --- a/elf/tst-tlsmod2.c +++ b/elf/tst-tlsmod2.c @@ -2,6 +2,7 @@ #include +#ifdef USE_TLS #include "tls-macros.h" @@ -34,3 +35,4 @@ in_dso (int n, int *caller_foop) return result; } +#endif diff --git a/elf/tst-tlsmod3.c b/elf/tst-tlsmod3.c index 5c456ee2da..4a8aad659f 100644 --- a/elf/tst-tlsmod3.c +++ b/elf/tst-tlsmod3.c @@ -2,7 +2,8 @@ #include -#include "tls-macros.h" +#ifdef USE_TLS +# include "tls-macros.h" extern int in_dso (int n, int *caller_foop); @@ -37,3 +38,4 @@ in_dso2 (void) return result; } +#endif diff --git a/elf/tst-tlsmod4.c b/elf/tst-tlsmod4.c index dd95486618..5285e821b0 100644 --- a/elf/tst-tlsmod4.c +++ b/elf/tst-tlsmod4.c @@ -2,7 +2,8 @@ #include -#include "tls-macros.h" +#ifdef USE_TLS +# include "tls-macros.h" COMMON_INT_DEF(baz); @@ -34,3 +35,4 @@ in_dso (int n, int *caller_bazp) return result; } +#endif diff --git a/elf/tst-tlsmod5.c b/elf/tst-tlsmod5.c index 00d3a9d920..2ec69e13b3 100644 --- a/elf/tst-tlsmod5.c +++ b/elf/tst-tlsmod5.c @@ -1,5 +1,7 @@ #include +#ifdef USE_TLS #include "tls-macros.h" COMMON_INT_DEF(foo); +#endif diff --git a/elf/tst-tlsmod6.c b/elf/tst-tlsmod6.c index 244d9ae485..0fda51b226 100644 --- a/elf/tst-tlsmod6.c +++ b/elf/tst-tlsmod6.c @@ -1,5 +1,7 @@ #include +#ifdef USE_TLS #include "tls-macros.h" COMMON_INT_DEF(bar); +#endif diff --git a/gmon/mcount.c b/gmon/mcount.c index 5a4a2499d4..32a5f1ea0f 100644 --- a/gmon/mcount.c +++ b/gmon/mcount.c @@ -69,8 +69,8 @@ _MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */ * check that we are profiling * and that we aren't recursively invoked. */ - if (catomic_compare_and_exchange_bool_acq (&p->state, GMON_PROF_BUSY, - GMON_PROF_ON)) + if (atomic_compare_and_exchange_bool_acq (&p->state, GMON_PROF_BUSY, + GMON_PROF_ON)) return; /* diff --git a/iconv/gconv_charset.h b/iconv/gconv_charset.h index c18abec578..8882f4319f 100644 --- a/iconv/gconv_charset.h +++ b/iconv/gconv_charset.h @@ -1,5 +1,5 @@ /* Charset name normalization. - Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2001,2002,2003,2004,2005,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2001. @@ -30,7 +30,7 @@ strip (char *wp, const char *s) while (*s != '\0') { if (__isalnum_l (*s, _nl_C_locobj_ptr) - || *s == '_' || *s == '-' || *s == '.' || *s == ',') + || *s == '_' || *s == '-' || *s == '.' || *s == ',' || *s == ':') *wp++ = __toupper_l (*s, _nl_C_locobj_ptr); else if (*s == '/') { diff --git a/iconv/iconv_open.c b/iconv/iconv_open.c index e0f6135575..fc94fa5fe0 100644 --- a/iconv/iconv_open.c +++ b/iconv/iconv_open.c @@ -1,5 +1,5 @@ /* Get descriptor for character set conversion. - Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1997,1998,1999,2000,2001,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -38,7 +38,7 @@ iconv_open (const char *tocode, const char *fromcode) int res; /* Normalize the name. We remove all characters beside alpha-numeric, - '_', '-', '/', and '.'. */ + '_', '-', '/', '.', and ':'. */ tocode_len = strlen (tocode); tocode_conv = (char *) alloca (tocode_len + 3); strip (tocode_conv, tocode); diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c index 84493af68f..77829971ad 100644 --- a/iconv/iconv_prog.c +++ b/iconv/iconv_prog.c @@ -1,5 +1,5 @@ /* Convert text in given files from the specified from-set to the to-set. - Copyright (C) 1998-2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1998-2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -426,7 +426,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c index 405ee98a91..dc3f008457 100644 --- a/iconv/iconvconfig.c +++ b/iconv/iconvconfig.c @@ -1,5 +1,5 @@ /* Generate fastloading iconv module configuration files. - Copyright (C) 2000-2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2000-2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2000. @@ -395,7 +395,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } diff --git a/iconvdata/gconv-modules b/iconvdata/gconv-modules index 852c7b94a6..a33645d41f 100644 --- a/iconvdata/gconv-modules +++ b/iconvdata/gconv-modules @@ -1,5 +1,5 @@ # GNU libc iconv configuration. -# Copyright (C) 1997-2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 1997-2004, 2005, 2007 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 @@ -1376,7 +1376,7 @@ module INTERNAL INIS-CYRILLIC// INIS-CYRILLIC 1 # from to module cost alias ISO-IR-98// ISO_2033// alias ISO_2033-1983// ISO_2033// -alias E13B/ ISO_2033// +alias E13B// ISO_2033// alias CSISO2033// ISO_2033// module ISO_2033// INTERNAL ISO_2033 1 module INTERNAL ISO_2033// ISO_2033 1 diff --git a/iconvdata/johab.c b/iconvdata/johab.c index 6d6f92235c..58cb5bcc0d 100644 --- a/iconvdata/johab.c +++ b/iconvdata/johab.c @@ -1,5 +1,5 @@ /* Mapping tables for JOHAB handling. - Copyright (C) 1998, 1999, 2000-2002 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000-2002, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jungshik Shin and Ulrich Drepper , 1998. @@ -239,7 +239,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2) if (__builtin_expect (ch2 < 0x31, 0) \ || (__builtin_expect (ch2 > 0x7e, 0) && ch2 < 0x91) \ || __builtin_expect (ch2, 0) == 0xff \ - || (__builtin_expect (ch, 0) == 0xd9 && ch2 > 0xe5) \ + || (__builtin_expect (ch, 0) == 0xd9 && ch2 > 0xe8) \ || (__builtin_expect (ch, 0) == 0xda \ && ch2 > 0xa0 && ch2 < 0xd4) \ || (__builtin_expect (ch, 0) == 0xde && ch2 > 0xf1)) \ @@ -386,7 +386,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2) break; \ } \ if (__builtin_expect (written == __UNKNOWN_10646_CHAR, 0) \ - || (outptr[0] == 0x22 && outptr[1] > 0x65)) \ + || (outptr[0] == 0x22 && outptr[1] > 0x68)) \ { \ UNICODE_TAG_HANDLER (ch, 4); \ STANDARD_TO_LOOP_ERR_HANDLER (4); \ diff --git a/iconvdata/ksc5601.c b/iconvdata/ksc5601.c index bf8ce35cc6..30e468150d 100644 --- a/iconvdata/ksc5601.c +++ b/iconvdata/ksc5601.c @@ -1,5 +1,5 @@ /* Conversion tables for KS C 5601-1992 based encoding conversion. - Copyright (C) 1998, 2000 Free Software Foundation, Inc. + Copyright (C) 1998, 2000, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jungshik Shin , 1998. @@ -412,7 +412,8 @@ const uint16_t __ksc5601_sym_to_ucs[] = [0x0098] = 0x2669, [0x0099] = 0x266a, [0x009a] = 0x266c, [0x009b] = 0x327f, [0x009c] = 0x321c, [0x009d] = 0x2116, [0x009e] = 0x33c7, [0x009f] = 0x2122, [0x00a0] = 0x33c2, [0x00a1] = 0x33d8, [0x00a2] = 0x2121, [0x00a3] = 0x20ac, - [0x00a4] = 0x00ae, [0x00bc] = 0xff01, [0x00bd] = 0xff02, [0x00be] = 0xff03, + [0x00a4] = 0x00ae, [0x00a5] = 0x327e, + [0x00bc] = 0xff01, [0x00bd] = 0xff02, [0x00be] = 0xff03, [0x00bf] = 0xff04, [0x00c0] = 0xff05, [0x00c1] = 0xff06, [0x00c2] = 0xff07, [0x00c3] = 0xff08, [0x00c4] = 0xff09, [0x00c5] = 0xff0a, [0x00c6] = 0xff0b, [0x00c7] = 0xff0c, [0x00c8] = 0xff0d, [0x00c9] = 0xff0e, [0x00ca] = 0xff0f, @@ -917,6 +918,7 @@ const struct map __ksc5601_sym_from_ucs[KSC5601_SYMBOL] = {0x3273, "\x28\x44"}, {0x3274, "\x28\x45"}, {0x3275, "\x28\x46"}, {0x3276, "\x28\x47"}, {0x3277, "\x28\x48"}, {0x3278, "\x28\x49"}, {0x3279, "\x28\x4a"}, {0x327a, "\x28\x4b"}, {0x327b, "\x28\x4c"}, + {0x327e, "\x22\x68"}, {0x327f, "\x22\x5e"}, {0x3380, "\x27\x49"}, {0x3381, "\x27\x4a"}, {0x3382, "\x27\x4b"}, {0x3383, "\x27\x4c"}, {0x3384, "\x27\x4d"}, {0x3388, "\x27\x3a"}, {0x3389, "\x27\x3b"}, {0x338a, "\x27\x5c"}, diff --git a/iconvdata/ksc5601.h b/iconvdata/ksc5601.h index 603a337f89..77f47ca834 100644 --- a/iconvdata/ksc5601.h +++ b/iconvdata/ksc5601.h @@ -1,5 +1,5 @@ /* Access functions for KS C 5601-1992 based encoding conversion. - Copyright (C) 1998, 1999, 2000, 2003 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2003, 2007 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 @@ -22,7 +22,7 @@ #define KSC5601_HANGUL 2350 #define KSC5601_HANJA 4888 -#define KSC5601_SYMBOL 988 +#define KSC5601_SYMBOL 989 #include #include diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c index 5d25b863ee..1234346c8d 100644 --- a/iconvdata/uhc.c +++ b/iconvdata/uhc.c @@ -1,5 +1,5 @@ /* Mapping tables for UHC handling. - Copyright (C) 1998, 1999, 2000-2002 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000-2002, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jungshik Shin , 1998. @@ -3135,7 +3135,8 @@ static const char uhc_hangul_from_ucs[11172][2] = else \ { \ ch = ksc5601_to_ucs4 (&inptr, 2, 0x80); \ - if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0)) \ + if (__builtin_expect (ch == __UNKNOWN_10646_CHAR, 0) \ + || __builtin_expect (ch == 0x327e, 0)) \ { \ /* Illegal. */ \ STANDARD_FROM_LOOP_ERR_HANDLER (2); \ @@ -3207,16 +3208,17 @@ static const char uhc_hangul_from_ucs[11172][2] = { \ size_t written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr); \ \ + if (__builtin_expect (ch == 0x327e, 0) \ + || __builtin_expect (written == __UNKNOWN_10646_CHAR, 0)) \ + { \ + UNICODE_TAG_HANDLER (ch, 4); \ + STANDARD_TO_LOOP_ERR_HANDLER (4); \ + } \ if (__builtin_expect (written == 0, 0)) \ { \ result = __GCONV_FULL_OUTPUT; \ break; \ } \ - if (__builtin_expect (written == __UNKNOWN_10646_CHAR, 0)) \ - { \ - UNICODE_TAG_HANDLER (ch, 4); \ - STANDARD_TO_LOOP_ERR_HANDLER (4); \ - } \ \ *outptr++ |= 0x80; \ *outptr++ |= 0x80; \ diff --git a/include/atomic.h b/include/atomic.h dissimilarity index 61% index 2ad8b5fcb7..d44728b215 100644 --- a/include/atomic.h +++ b/include/atomic.h @@ -1,510 +1,337 @@ -/* Internal macros for atomic operations for GNU C Library. - Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2002. - - 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 _ATOMIC_H -#define _ATOMIC_H 1 - -/* This header defines three types of macros: - - - atomic arithmetic and logic operation on memory. They all - have the prefix "atomic_". - - - conditionally atomic operations of the same kinds. These - always behave identical but can be faster when atomicity - is not really needed since only one thread has access to - the memory location. In that case the code is slower in - the multi-thread case. The interfaces have the prefix - "catomic_". - - - support functions like barriers. They also have the preifx - "atomic_". - - Architectures must provide a few lowlevel macros (the compare - and exchange definitions). All others are optional. They - should only be provided if the architecture has specific - support for the operation. - - As macros are usually heavily nested and often use local - variables to make sure side-effects are evaluated properly, use for - macro local variables a per-macro unique prefix. This file uses - __atgN_ prefix where N is different in each macro. */ - -#include - -#include - -/* Wrapper macros to call pre_NN_post (mem, ...) where NN is the - bit width of *MEM. The calling macro puts parens around MEM - and following args. */ -#define __atomic_val_bysize(pre, post, mem, ...) \ - ({ \ - __typeof (*mem) __atg1_result; \ - if (sizeof (*mem) == 1) \ - __atg1_result = pre##_8_##post (mem, __VA_ARGS__); \ - else if (sizeof (*mem) == 2) \ - __atg1_result = pre##_16_##post (mem, __VA_ARGS__); \ - else if (sizeof (*mem) == 4) \ - __atg1_result = pre##_32_##post (mem, __VA_ARGS__); \ - else if (sizeof (*mem) == 8) \ - __atg1_result = pre##_64_##post (mem, __VA_ARGS__); \ - else \ - abort (); \ - __atg1_result; \ - }) -#define __atomic_bool_bysize(pre, post, mem, ...) \ - ({ \ - int __atg2_result; \ - if (sizeof (*mem) == 1) \ - __atg2_result = pre##_8_##post (mem, __VA_ARGS__); \ - else if (sizeof (*mem) == 2) \ - __atg2_result = pre##_16_##post (mem, __VA_ARGS__); \ - else if (sizeof (*mem) == 4) \ - __atg2_result = pre##_32_##post (mem, __VA_ARGS__); \ - else if (sizeof (*mem) == 8) \ - __atg2_result = pre##_64_##post (mem, __VA_ARGS__); \ - else \ - abort (); \ - __atg2_result; \ - }) - - -/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL. - Return the old *MEM value. */ -#if !defined atomic_compare_and_exchange_val_acq \ - && defined __arch_compare_and_exchange_val_32_acq -# define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ - __atomic_val_bysize (__arch_compare_and_exchange_val,acq, \ - mem, newval, oldval) -#endif - - -#if !defined catomic_compare_and_exchange_val_acq \ - && defined __arch_c_compare_and_exchange_val_32_acq -# define catomic_compare_and_exchange_val_acq(mem, newval, oldval) \ - __atomic_val_bysize (__arch_c_compare_and_exchange_val,acq, \ - mem, newval, oldval) -#else -# define catomic_compare_and_exchange_val_acq(mem, newval, oldval) \ - atomic_compare_and_exchange_val_acq (mem, newval, oldval) -#endif - - -#ifndef atomic_compare_and_exchange_val_rel -# define atomic_compare_and_exchange_val_rel(mem, newval, oldval) \ - atomic_compare_and_exchange_val_acq (mem, newval, oldval) -#endif - - -#ifndef catomic_compare_and_exchange_val_rel -# define catomic_compare_and_exchange_val_rel(mem, newval, oldval) \ - atomic_compare_and_exchange_val_acq (mem, newval, oldval) -#endif - - -/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL. - Return zero if *MEM was changed or non-zero if no exchange happened. */ -#ifndef atomic_compare_and_exchange_bool_acq -# ifdef __arch_compare_and_exchange_bool_32_acq -# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ - __atomic_bool_bysize (__arch_compare_and_exchange_bool,acq, \ - mem, newval, oldval) -# else -# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ - ({ /* Cannot use __oldval here, because macros later in this file might \ - call this macro with __oldval argument. */ \ - __typeof (oldval) __atg3_old = (oldval); \ - atomic_compare_and_exchange_val_acq (mem, newval, __atg3_old) \ - != __atg3_old; \ - }) -# endif -#endif - - -#ifndef catomic_compare_and_exchange_bool_acq -# ifdef __arch_c_compare_and_exchange_bool_32_acq -# define catomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ - __atomic_bool_bysize (__arch_c_compare_and_exchange_bool,acq, \ - mem, newval, oldval) -# else -# define catomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ - ({ /* Cannot use __oldval here, because macros later in this file might \ - call this macro with __oldval argument. */ \ - __typeof (oldval) __atg4_old = (oldval); \ - catomic_compare_and_exchange_val_acq (mem, newval, __atg4_old) \ - != __atg4_old; \ - }) -# endif -#endif - - -#ifndef atomic_compare_and_exchange_bool_rel -# define atomic_compare_and_exchange_bool_rel(mem, newval, oldval) \ - atomic_compare_and_exchange_bool_acq (mem, newval, oldval) -#endif - - -#ifndef catomic_compare_and_exchange_bool_rel -# define catomic_compare_and_exchange_bool_rel(mem, newval, oldval) \ - catomic_compare_and_exchange_bool_acq (mem, newval, oldval) -#endif - - -/* Store NEWVALUE in *MEM and return the old value. */ -#ifndef atomic_exchange_acq -# define atomic_exchange_acq(mem, newvalue) \ - ({ __typeof (*(mem)) __atg5_oldval; \ - __typeof (mem) __atg5_memp = (mem); \ - __typeof (*(mem)) __atg5_value = (newvalue); \ - \ - do \ - __atg5_oldval = *__atg5_memp; \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg5_memp, __atg5_value, \ - __atg5_oldval), 0)); \ - \ - __atg5_oldval; }) -#endif - -#ifndef atomic_exchange_rel -# define atomic_exchange_rel(mem, newvalue) atomic_exchange_acq (mem, newvalue) -#endif - - -/* Add VALUE to *MEM and return the old value of *MEM. */ -#ifndef atomic_exchange_and_add -# define atomic_exchange_and_add(mem, value) \ - ({ __typeof (*(mem)) __atg6_oldval; \ - __typeof (mem) __atg6_memp = (mem); \ - __typeof (*(mem)) __atg6_value = (value); \ - \ - do \ - __atg6_oldval = *__atg6_memp; \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg6_memp, \ - __atg6_oldval \ - + __atg6_value, \ - __atg6_oldval), 0)); \ - \ - __atg6_oldval; }) -#endif - - -#ifndef catomic_exchange_and_add -# define catomic_exchange_and_add(mem, value) \ - ({ __typeof (*(mem)) __atg7_oldv; \ - __typeof (mem) __atg7_memp = (mem); \ - __typeof (*(mem)) __atg7_value = (value); \ - \ - do \ - __atg7_oldv = *__atg7_memp; \ - while (__builtin_expect \ - (catomic_compare_and_exchange_bool_acq (__atg7_memp, \ - __atg7_oldv \ - + __atg7_value, \ - __atg7_oldv), 0)); \ - \ - __atg7_oldv; }) -#endif - - -#ifndef atomic_max -# define atomic_max(mem, value) \ - do { \ - __typeof (*(mem)) __atg8_oldval; \ - __typeof (mem) __atg8_memp = (mem); \ - __typeof (*(mem)) __atg8_value = (value); \ - do { \ - __atg8_oldval = *__atg8_memp; \ - if (__atg8_oldval >= __atg8_value) \ - break; \ - } while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg8_memp, __atg8_value,\ - __atg8_oldval), 0)); \ - } while (0) -#endif - - -#ifndef catomic_max -# define catomic_max(mem, value) \ - do { \ - __typeof (*(mem)) __atg9_oldv; \ - __typeof (mem) __atg9_memp = (mem); \ - __typeof (*(mem)) __atg9_value = (value); \ - do { \ - __atg9_oldv = *__atg9_memp; \ - if (__atg9_oldv >= __atg9_value) \ - break; \ - } while (__builtin_expect \ - (catomic_compare_and_exchange_bool_acq (__atg9_memp, \ - __atg9_value, \ - __atg9_oldv), 0)); \ - } while (0) -#endif - - -#ifndef atomic_min -# define atomic_min(mem, value) \ - do { \ - __typeof (*(mem)) __atg10_oldval; \ - __typeof (mem) __atg10_memp = (mem); \ - __typeof (*(mem)) __atg10_value = (value); \ - do { \ - __atg10_oldval = *__atg10_memp; \ - if (__atg10_oldval <= __atg10_value) \ - break; \ - } while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg10_memp, \ - __atg10_value, \ - __atg10_oldval), 0)); \ - } while (0) -#endif - - -#ifndef atomic_add -# define atomic_add(mem, value) (void) atomic_exchange_and_add ((mem), (value)) -#endif - - -#ifndef catomic_add -# define catomic_add(mem, value) \ - (void) catomic_exchange_and_add ((mem), (value)) -#endif - - -#ifndef atomic_increment -# define atomic_increment(mem) atomic_add ((mem), 1) -#endif - - -#ifndef catomic_increment -# define catomic_increment(mem) catomic_add ((mem), 1) -#endif - - -#ifndef atomic_increment_val -# define atomic_increment_val(mem) (atomic_exchange_and_add ((mem), 1) + 1) -#endif - - -#ifndef catomic_increment_val -# define catomic_increment_val(mem) (catomic_exchange_and_add ((mem), 1) + 1) -#endif - - -/* Add one to *MEM and return true iff it's now zero. */ -#ifndef atomic_increment_and_test -# define atomic_increment_and_test(mem) \ - (atomic_exchange_and_add ((mem), 1) + 1 == 0) -#endif - - -#ifndef atomic_decrement -# define atomic_decrement(mem) atomic_add ((mem), -1) -#endif - - -#ifndef catomic_decrement -# define catomic_decrement(mem) catomic_add ((mem), -1) -#endif - - -#ifndef atomic_decrement_val -# define atomic_decrement_val(mem) (atomic_exchange_and_add ((mem), -1) - 1) -#endif - - -#ifndef catomic_decrement_val -# define catomic_decrement_val(mem) (catomic_exchange_and_add ((mem), -1) - 1) -#endif - - -/* Subtract 1 from *MEM and return true iff it's now zero. */ -#ifndef atomic_decrement_and_test -# define atomic_decrement_and_test(mem) \ - (atomic_exchange_and_add ((mem), -1) == 1) -#endif - - -/* Decrement *MEM if it is > 0, and return the old value. */ -#ifndef atomic_decrement_if_positive -# define atomic_decrement_if_positive(mem) \ - ({ __typeof (*(mem)) __atg11_oldval; \ - __typeof (mem) __atg11_memp = (mem); \ - \ - do \ - { \ - __atg11_oldval = *__atg11_memp; \ - if (__builtin_expect (__atg11_oldval <= 0, 0)) \ - break; \ - } \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg11_memp, \ - __atg11_oldval - 1, \ - __atg11_oldval), 0)); \ - __atg11_oldval; }) -#endif - - -#ifndef atomic_add_negative -# define atomic_add_negative(mem, value) \ - ({ __typeof (value) __atg12_value = (value); \ - atomic_exchange_and_add (mem, __atg12_value) < -__atg12_value; }) -#endif - - -#ifndef atomic_add_zero -# define atomic_add_zero(mem, value) \ - ({ __typeof (value) __atg13_value = (value); \ - atomic_exchange_and_add (mem, __atg13_value) == -__atg13_value; }) -#endif - - -#ifndef atomic_bit_set -# define atomic_bit_set(mem, bit) \ - (void) atomic_bit_test_set(mem, bit) -#endif - - -#ifndef atomic_bit_test_set -# define atomic_bit_test_set(mem, bit) \ - ({ __typeof (*(mem)) __atg14_old; \ - __typeof (mem) __atg14_memp = (mem); \ - __typeof (*(mem)) __atg14_mask = ((__typeof (*(mem))) 1 << (bit)); \ - \ - do \ - __atg14_old = (*__atg14_memp); \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg14_memp, \ - __atg14_old | __atg14_mask,\ - __atg14_old), 0)); \ - \ - __atg14_old & __atg14_mask; }) -#endif - -/* Atomically *mem &= mask. */ -#ifndef atomic_and -# define atomic_and(mem, mask) \ - do { \ - __typeof (*(mem)) __atg15_old; \ - __typeof (mem) __atg15_memp = (mem); \ - __typeof (*(mem)) __atg15_mask = (mask); \ - \ - do \ - __atg15_old = (*__atg15_memp); \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg15_memp, \ - __atg15_old & __atg15_mask, \ - __atg15_old), 0)); \ - } while (0) -#endif - -/* Atomically *mem &= mask and return the old value of *mem. */ -#ifndef atomic_and_val -# define atomic_and_val(mem, mask) \ - ({ __typeof (*(mem)) __atg16_old; \ - __typeof (mem) __atg16_memp = (mem); \ - __typeof (*(mem)) __atg16_mask = (mask); \ - \ - do \ - __atg16_old = (*__atg16_memp); \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg16_memp, \ - __atg16_old & __atg16_mask,\ - __atg16_old), 0)); \ - \ - __atg16_old; }) -#endif - -/* Atomically *mem |= mask and return the old value of *mem. */ -#ifndef atomic_or -# define atomic_or(mem, mask) \ - do { \ - __typeof (*(mem)) __atg17_old; \ - __typeof (mem) __atg17_memp = (mem); \ - __typeof (*(mem)) __atg17_mask = (mask); \ - \ - do \ - __atg17_old = (*__atg17_memp); \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg17_memp, \ - __atg17_old | __atg17_mask, \ - __atg17_old), 0)); \ - } while (0) -#endif - -#ifndef catomic_or -# define catomic_or(mem, mask) \ - do { \ - __typeof (*(mem)) __atg18_old; \ - __typeof (mem) __atg18_memp = (mem); \ - __typeof (*(mem)) __atg18_mask = (mask); \ - \ - do \ - __atg18_old = (*__atg18_memp); \ - while (__builtin_expect \ - (catomic_compare_and_exchange_bool_acq (__atg18_memp, \ - __atg18_old | __atg18_mask,\ - __atg18_old), 0)); \ - } while (0) -#endif - -/* Atomically *mem |= mask and return the old value of *mem. */ -#ifndef atomic_or_val -# define atomic_or_val(mem, mask) \ - ({ __typeof (*(mem)) __atg19_old; \ - __typeof (mem) __atg19_memp = (mem); \ - __typeof (*(mem)) __atg19_mask = (mask); \ - \ - do \ - __atg19_old = (*__atg19_memp); \ - while (__builtin_expect \ - (atomic_compare_and_exchange_bool_acq (__atg19_memp, \ - __atg19_old | __atg19_mask,\ - __atg19_old), 0)); \ - \ - __atg19_old; }) -#endif - -#ifndef atomic_full_barrier -# define atomic_full_barrier() __asm ("" ::: "memory") -#endif - - -#ifndef atomic_read_barrier -# define atomic_read_barrier() atomic_full_barrier () -#endif - - -#ifndef atomic_write_barrier -# define atomic_write_barrier() atomic_full_barrier () -#endif - - -#ifndef atomic_forced_read -# define atomic_forced_read(x) \ - ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; }) -#endif - - -#ifndef atomic_delay -# define atomic_delay() do { /* nothing */ } while (0) -#endif - -#endif /* atomic.h */ +/* Internal macros for atomic operations for GNU C Library. + Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2002. + + 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 _ATOMIC_H +#define _ATOMIC_H 1 + +#include + +#include + +/* Wrapper macros to call pre_NN_post (mem, ...) where NN is the + bit width of *MEM. The calling macro puts parens around MEM + and following args. */ +#define __atomic_val_bysize(pre, post, mem, ...) \ + ({ \ + __typeof (*mem) __result; \ + if (sizeof (*mem) == 1) \ + __result = pre##_8_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 2) \ + __result = pre##_16_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 4) \ + __result = pre##_32_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 8) \ + __result = pre##_64_##post (mem, __VA_ARGS__); \ + else \ + abort (); \ + __result; \ + }) +#define __atomic_bool_bysize(pre, post, mem, ...) \ + ({ \ + int __result; \ + if (sizeof (*mem) == 1) \ + __result = pre##_8_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 2) \ + __result = pre##_16_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 4) \ + __result = pre##_32_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 8) \ + __result = pre##_64_##post (mem, __VA_ARGS__); \ + else \ + abort (); \ + __result; \ + }) + + +/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL. + Return the old *MEM value. */ +#if !defined atomic_compare_and_exchange_val_acq \ + && defined __arch_compare_and_exchange_val_32_acq +# define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \ + __atomic_val_bysize (__arch_compare_and_exchange_val,acq, \ + mem, newval, oldval) +#endif + + +#ifndef atomic_compare_and_exchange_val_rel +# define atomic_compare_and_exchange_val_rel(mem, newval, oldval) \ + atomic_compare_and_exchange_val_acq (mem, newval, oldval) +#endif + + +/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL. + Return zero if *MEM was changed or non-zero if no exchange happened. */ +#ifndef atomic_compare_and_exchange_bool_acq +# ifdef __arch_compare_and_exchange_bool_32_acq +# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ + __atomic_bool_bysize (__arch_compare_and_exchange_bool,acq, \ + mem, newval, oldval) +# else +# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ + ({ /* Cannot use __oldval here, because macros later in this file might \ + call this macro with __oldval argument. */ \ + __typeof (oldval) __old = (oldval); \ + atomic_compare_and_exchange_val_acq (mem, newval, __old) != __old; \ + }) +# endif +#endif + + +#ifndef atomic_compare_and_exchange_bool_rel +# define atomic_compare_and_exchange_bool_rel(mem, newval, oldval) \ + atomic_compare_and_exchange_bool_acq (mem, newval, oldval) +#endif + + +/* Store NEWVALUE in *MEM and return the old value. */ +#ifndef atomic_exchange_acq +# define atomic_exchange_acq(mem, newvalue) \ + ({ __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*(mem)) __value = (newvalue); \ + \ + do \ + __oldval = *__memp; \ + while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __value, \ + __oldval),\ + 0)); \ + \ + __oldval; }) +#endif + +#ifndef atomic_exchange_rel +# define atomic_exchange_rel(mem, newvalue) atomic_exchange_acq (mem, newvalue) +#endif + + +/* Add VALUE to *MEM and return the old value of *MEM. */ +#ifndef atomic_exchange_and_add +# define atomic_exchange_and_add(mem, value) \ + ({ __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*(mem)) __value = (value); \ + \ + do \ + __oldval = *__memp; \ + while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __oldval \ + + __value,\ + __oldval),\ + 0)); \ + \ + __oldval; }) +#endif + + + +#ifndef atomic_max +# define atomic_max(mem, value) \ + do { \ + __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*(mem)) __value = (value); \ + do { \ + __oldval = *__memp; \ + if (__oldval >= __value) \ + break; \ + } while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __value, \ + __oldval),\ + 0)); \ + } while (0) +#endif + +#ifndef atomic_min +# define atomic_min(mem, value) \ + do { \ + __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*(mem)) __value = (value); \ + do { \ + __oldval = *__memp; \ + if (__oldval <= __value) \ + break; \ + } while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __value, \ + __oldval),\ + 0)); \ + } while (0) +#endif + +#ifndef atomic_add +# define atomic_add(mem, value) (void) atomic_exchange_and_add ((mem), (value)) +#endif + + +#ifndef atomic_increment +# define atomic_increment(mem) atomic_add ((mem), 1) +#endif + + +#ifndef atomic_increment_val +# define atomic_increment_val(mem) (atomic_exchange_and_add ((mem), 1) + 1) +#endif + + +/* Add one to *MEM and return true iff it's now zero. */ +#ifndef atomic_increment_and_test +# define atomic_increment_and_test(mem) \ + (atomic_exchange_and_add ((mem), 1) + 1 == 0) +#endif + + +#ifndef atomic_decrement +# define atomic_decrement(mem) atomic_add ((mem), -1) +#endif + + +#ifndef atomic_decrement_val +# define atomic_decrement_val(mem) (atomic_exchange_and_add ((mem), -1) - 1) +#endif + + +/* Subtract 1 from *MEM and return true iff it's now zero. */ +#ifndef atomic_decrement_and_test +# define atomic_decrement_and_test(mem) \ + (atomic_exchange_and_add ((mem), -1) == 1) +#endif + + +/* Decrement *MEM if it is > 0, and return the old value. */ +#ifndef atomic_decrement_if_positive +# define atomic_decrement_if_positive(mem) \ + ({ __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + \ + do \ + { \ + __oldval = *__memp; \ + if (__builtin_expect (__oldval <= 0, 0)) \ + break; \ + } \ + while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __oldval \ + - 1, \ + __oldval),\ + 0));\ + __oldval; }) +#endif + + +#ifndef atomic_add_negative +# define atomic_add_negative(mem, value) \ + ({ __typeof (value) __aan_value = (value); \ + atomic_exchange_and_add (mem, __aan_value) < -__aan_value; }) +#endif + + +#ifndef atomic_add_zero +# define atomic_add_zero(mem, value) \ + ({ __typeof (value) __aaz_value = (value); \ + atomic_exchange_and_add (mem, __aaz_value) == -__aaz_value; }) +#endif + + +#ifndef atomic_bit_set +# define atomic_bit_set(mem, bit) \ + (void) atomic_bit_test_set(mem, bit) +#endif + + +#ifndef atomic_bit_test_set +# define atomic_bit_test_set(mem, bit) \ + ({ __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*(mem)) __mask = ((__typeof (*(mem))) 1 << (bit)); \ + \ + do \ + __oldval = (*__memp); \ + while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __oldval \ + | __mask, \ + __oldval),\ + 0)); \ + \ + __oldval & __mask; }) +#endif + +/* Atomically *mem &= mask and return the old value of *mem. */ +#ifndef atomic_and +# define atomic_and(mem, mask) \ + ({ __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*(mem)) __mask = (mask); \ + \ + do \ + __oldval = (*__memp); \ + while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __oldval \ + & __mask, \ + __oldval),\ + 0)); \ + \ + __oldval; }) +#endif + +/* Atomically *mem |= mask and return the old value of *mem. */ +#ifndef atomic_or +# define atomic_or(mem, mask) \ + ({ __typeof (*(mem)) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*(mem)) __mask = (mask); \ + \ + do \ + __oldval = (*__memp); \ + while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \ + __oldval \ + | __mask, \ + __oldval),\ + 0)); \ + \ + __oldval; }) +#endif + +#ifndef atomic_full_barrier +# define atomic_full_barrier() __asm ("" ::: "memory") +#endif + + +#ifndef atomic_read_barrier +# define atomic_read_barrier() atomic_full_barrier () +#endif + + +#ifndef atomic_write_barrier +# define atomic_write_barrier() atomic_full_barrier () +#endif + + +#ifndef atomic_forced_read +# define atomic_forced_read(x) \ + ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; }) +#endif + + +#ifndef atomic_delay +# define atomic_delay() do { /* nothing */ } while (0) +#endif + +#endif /* atomic.h */ diff --git a/include/dlfcn.h b/include/dlfcn.h index 79c8f7d31b..9144dd2f3f 100644 --- a/include/dlfcn.h +++ b/include/dlfcn.h @@ -47,9 +47,6 @@ libc_hidden_proto (_dl_addr) /* Close an object previously opened by _dl_open. */ extern void _dl_close (void *map) attribute_hidden; -/* Same as above, but without locking and safety checks for user - provided map arguments. */ -extern void _dl_close_worker (struct link_map *map) attribute_hidden; /* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns diff --git a/include/errno.h b/include/errno.h index 80c7b6ec13..fe8bca44c5 100644 --- a/include/errno.h +++ b/include/errno.h @@ -19,7 +19,7 @@ extern int rtld_errno attribute_hidden; # else -# include +# include /* Defines USE_TLS. */ # if USE___THREAD # undef errno diff --git a/include/libc-symbols.h b/include/libc-symbols.h index a2faeafb32..da46f5e804 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -114,13 +114,6 @@ # define _weak_alias(name, aliasname) \ extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))); -/* Same as WEAK_ALIAS, but mark symbol as hidden. */ -# define weak_hidden_alias(name, aliasname) \ - _weak_hidden_alias (name, aliasname) -# define _weak_hidden_alias(name, aliasname) \ - extern __typeof (name) aliasname \ - __attribute__ ((weak, alias (#name), __visibility__ ("hidden"))); - /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */ # define weak_extern(symbol) _weak_extern (weak symbol) # define _weak_extern(expr) _Pragma (#expr) @@ -128,7 +121,6 @@ # else # define weak_alias(name, aliasname) strong_alias(name, aliasname) -# define weak_hidden_alias(name, aliasname) strong_alias(name, aliasname) # define weak_extern(symbol) /* Nothing. */ # endif @@ -294,42 +286,27 @@ requires at runtime the shared libraries from the glibc version used \ for linking") #endif -/* Declare SYMBOL to be TYPE (`function' or `object') of SIZE bytes - alias to ORIGINAL, when the assembler supports such declarations - (such as in ELF). +/* Declare SYMBOL to be TYPE (`function' or `object') and of SIZE bytes, + when the assembler supports such declarations (such as in ELF). This is only necessary when defining something in assembly, or playing funny alias games where the size should be other than what the compiler thinks it is. */ -#define declare_symbol_alias(symbol, original, type, size) \ - declare_symbol_alias_1 (symbol, original, type, size) +#define declare_symbol(symbol, type, size) \ + declare_symbol_1 (symbol, type, size) #ifdef ASM_TYPE_DIRECTIVE_PREFIX # ifdef __ASSEMBLER__ -# define declare_symbol_alias_1(symbol, original, type, size) \ - strong_alias (original, symbol); \ +# define declare_symbol_1(symbol, type, size) \ .type C_SYMBOL_NAME (symbol), \ - declare_symbol_alias_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type); \ - .size C_SYMBOL_NAME (symbol), size -# define declare_symbol_alias_1_paste(a, b) \ - declare_symbol_alias_1_paste_1 (a,b) -# define declare_symbol_alias_1_paste_1(a,b) a##b + declare_symbol_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type), size +# define declare_symbol_1_paste(a, b) declare_symbol_1_paste_1 (a,b) +# define declare_symbol_1_paste_1(a,b) a##b # else /* Not __ASSEMBLER__. */ -# define declare_symbol_alias_1(symbol, original, type, size) \ - asm (declare_symbol_alias_1_stringify (ASM_GLOBAL_DIRECTIVE) \ - " " __SYMBOL_PREFIX #symbol \ - "\n\t" declare_symbol_alias_1_alias (symbol, original) \ - "\n\t.type " __SYMBOL_PREFIX #symbol ", " \ - declare_symbol_alias_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \ +# define declare_symbol_1(symbol, type, size) \ + asm (".type " __SYMBOL_PREFIX #symbol ", " \ + declare_symbol_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \ "\n\t.size " __SYMBOL_PREFIX #symbol ", " #size); -# define declare_symbol_alias_1_stringify(x) \ - declare_symbol_alias_1_stringify_1 (x) -# define declare_symbol_alias_1_stringify_1(x) #x -# ifdef HAVE_ASM_SET_DIRECTIVE -# define declare_symbol_alias_1_alias(symbol, original) \ - ".set " __SYMBOL_PREFIX #symbol ", " __SYMBOL_PREFIX #original -# else -# define declare_symbol_alias_1_alias(symbol, original) \ - __SYMBOL_PREFIX #symbol " = " __SYMBOL_PREFIX #original -# endif /* HAVE_ASM_SET_DIRECTIVE */ +# define declare_symbol_1_stringify(x) declare_symbol_1_stringify_1 (x) +# define declare_symbol_1_stringify_1(x) #x # endif /* __ASSEMBLER__ */ #else # define declare_symbol_1(symbol, type, size) /* Nothing. */ @@ -454,7 +431,8 @@ for linking") strong_alias(real, name) #endif -#if defined SHARED || defined LIBC_NONSHARED +#if defined HAVE_VISIBILITY_ATTRIBUTE \ + && (defined SHARED || defined LIBC_NONSHARED) # define attribute_hidden __attribute__ ((visibility ("hidden"))) #else # define attribute_hidden @@ -466,7 +444,11 @@ for linking") # define attribute_tls_model_ie #endif -#define attribute_relro __attribute__ ((section (".data.rel.ro"))) +#ifdef HAVE_Z_RELRO +# define attribute_relro __attribute__ ((section (".data.rel.ro"))) +#else +# define attribute_relro +#endif /* Handling on non-exported internal names. We have to do this only for shared code. */ @@ -475,9 +457,14 @@ for linking") # define INTDEF(name) strong_alias (name, name##_internal) # define INTVARDEF(name) \ _INTVARDEF (name, name##_internal) -# define _INTVARDEF(name, aliasname) \ +# if defined HAVE_VISIBILITY_ATTRIBUTE +# define _INTVARDEF(name, aliasname) \ extern __typeof (name) aliasname __attribute__ ((alias (#name), \ visibility ("hidden"))); +# else +# define _INTVARDEF(name, aliasname) \ + extern __typeof (name) aliasname __attribute__ ((alias (#name))); +# endif # define INTDEF2(name, newname) strong_alias (name, newname##_internal) # define INTVARDEF2(name, newname) _INTVARDEF (name, newname##_internal) #else @@ -562,10 +549,16 @@ for linking") versioned_symbol (libc, __real_foo, foo, GLIBC_2_1); libc_hidden_ver (__real_foo, foo) */ -#if defined SHARED && defined DO_VERSIONING && !defined NO_HIDDEN +#if defined SHARED && defined DO_VERSIONING \ + && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN # ifndef __ASSEMBLER__ -# define __hidden_proto_hiddenattr(attrs...) \ +# if !defined HAVE_VISIBILITY_ATTRIBUTE \ + || defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE +# define __hidden_proto_hiddenattr(attrs...) +# else +# define __hidden_proto_hiddenattr(attrs...) \ __attribute__ ((visibility ("hidden"), ##attrs)) +# endif # define hidden_proto(name, attrs...) \ __hidden_proto (name, __GI_##name, ##attrs) # define __hidden_proto(name, internal, attrs...) \ diff --git a/include/link.h b/include/link.h index b45deabf7f..9311256aff 100644 --- a/include/link.h +++ b/include/link.h @@ -1,6 +1,6 @@ /* Data structure for communication from the run-time dynamic linker for loaded ELF shared objects. - Copyright (C) 1995-2002,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 1995-2006, 2007 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 @@ -44,7 +44,6 @@ extern unsigned int la_objopen (struct link_map *__map, Lmid_t __lmid, #include #include #include -#include /* Some internal data structures of the dynamic linker used in the @@ -122,7 +121,7 @@ struct link_map are indexed by DT_ADDRTAGIDX(tagvalue), see . */ ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM - + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM]; + + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM]; const ElfW(Phdr) *l_phdr; /* Pointer to program header table in core. */ ElfW(Addr) l_entry; /* Entry point location. */ ElfW(Half) l_phnum; /* Number of program header entries. */ @@ -183,6 +182,9 @@ struct link_map is interested in the PLT interception.*/ unsigned int l_removed:1; /* Nozero if the object cannot be used anymore since it is removed. */ + unsigned int l_contiguous:1; /* Nonzero if inter-segment holes are + mprotected or if no holes are present at + all. */ /* Array with version names. */ unsigned int l_nversions; @@ -220,8 +222,6 @@ struct link_map /* This is an array defining the lookup scope for this link map. There are initially at most three different scope lists. */ struct r_scope_elem **l_scope; - /* We need to protect using the SCOPEREC. */ - __rtld_mrlock_define (, l_scope_lock) /* A similar array, this time only with the local scope. This is used occasionally. */ @@ -261,6 +261,7 @@ struct link_map const ElfW(Sym) *ret; } l_lookup_cache; +#ifdef USE_TLS /* Thread-local storage related info. */ /* Start of the initialization image. */ @@ -273,13 +274,14 @@ struct link_map size_t l_tls_align; /* Offset of first byte module alignment. */ size_t l_tls_firstbyte_offset; -#ifndef NO_TLS_OFFSET -# define NO_TLS_OFFSET 0 -#endif +# ifndef NO_TLS_OFFSET +# define NO_TLS_OFFSET 0 +# endif /* For objects present at startup time: offset in the static TLS block. */ ptrdiff_t l_tls_offset; /* Index of the module in the dtv array. */ size_t l_tls_modid; +#endif /* Information used to change permission after the relocations are done. */ diff --git a/include/rpcsvc/nislib.h b/include/rpcsvc/nislib.h index 9c2be0e811..635c513e4d 100644 --- a/include/rpcsvc/nislib.h +++ b/include/rpcsvc/nislib.h @@ -42,4 +42,6 @@ libnsl_hidden_proto (__nis_default_group) libnsl_hidden_proto (__nis_default_access) libnsl_hidden_proto (nis_clone_object) +extern const_nis_name __nis_domain_of (const_nis_name) __THROW; + #endif diff --git a/include/shlib-compat.h b/include/shlib-compat.h index 79246dff25..1e6d1782d9 100644 --- a/include/shlib-compat.h +++ b/include/shlib-compat.h @@ -1,5 +1,5 @@ /* Macros for managing ABI-compatibility definitions using ELF symbol versions. - Copyright (C) 2000, 2002, 2006 Free Software Foundation, Inc. + Copyright (C) 2000, 2002 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 @@ -44,8 +44,6 @@ in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version. */ # define SHLIB_COMPAT(lib, introduced, obsoleted) \ - _SHLIB_COMPAT (lib, introduced, obsoleted) -# define _SHLIB_COMPAT(lib, introduced, obsoleted) \ ((IS_IN_##lib - 0) \ && (!(ABI_##lib##_##obsoleted - 0) \ || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0)))) @@ -64,17 +62,13 @@ shlib-versions if that is newer. */ # define versioned_symbol(lib, local, symbol, version) \ - versioned_symbol_1 (lib, local, symbol, version) -# define versioned_symbol_1(lib, local, symbol, version) \ - versioned_symbol_2 (local, symbol, VERSION_##lib##_##version) -# define versioned_symbol_2(local, symbol, name) \ + versioned_symbol_1 (local, symbol, VERSION_##lib##_##version) +# define versioned_symbol_1(local, symbol, name) \ default_symbol_version (local, symbol, name) # define compat_symbol(lib, local, symbol, version) \ - compat_symbol_1 (lib, local, symbol, version) -# define compat_symbol_1(lib, local, symbol, version) \ - compat_symbol_2 (local, symbol, VERSION_##lib##_##version) -# define compat_symbol_2(local, symbol, name) \ + compat_symbol_1 (local, symbol, VERSION_##lib##_##version) +# define compat_symbol_1(local, symbol, name) \ symbol_version (local, symbol, name) #else diff --git a/include/stdio.h b/include/stdio.h index b293b8f1c7..e040380d79 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -131,6 +131,7 @@ libc_hidden_proto (__vsnprintf_chk) libc_hidden_proto (__vfprintf_chk) # if !defined NOT_IN_libc && defined SHARED && defined DO_VERSIONING \ + && defined HAVE_VISIBILITY_ATTRIBUTE && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE\ && !defined NO_HIDDEN /* Special gcc builtins. */ extern size_t __builtin_fwrite (const void *, size_t, size_t, void *) diff --git a/include/sys/cdefs.h b/include/sys/cdefs.h index 8ba980477d..cd0750b452 100644 --- a/include/sys/cdefs.h +++ b/include/sys/cdefs.h @@ -2,6 +2,12 @@ #include +/* The compiler will optimize based on the knowledge the parameter is + not NULL. This will omit tests. A robust implementation cannot allow + this so when compiling glibc itself we ignore this attribute. */ +#undef __nonnull +#define __nonnull(params) + extern void __chk_fail (void) __attribute__ ((__noreturn__)); libc_hidden_proto (__chk_fail) rtld_hidden_proto (__chk_fail) diff --git a/include/sys/mman.h b/include/sys/mman.h index 8c07a4e2c6..a4687b30f7 100644 --- a/include/sys/mman.h +++ b/include/sys/mman.h @@ -12,4 +12,7 @@ extern int __mprotect (void *__addr, size_t __len, int __prot); /* This one is Linux specific. */ extern void *__mremap (void *__addr, size_t __old_len, size_t __new_len, int __flags, ...); + +libc_hidden_proto (madvise); + #endif diff --git a/include/tls.h b/include/tls.h index 1642456a73..ffd3e4e70c 100644 --- a/include/tls.h +++ b/include/tls.h @@ -5,7 +5,8 @@ #include_next -#if HAVE___THREAD && (!defined NOT_IN_libc || defined IS_IN_libpthread) +#if USE_TLS && HAVE___THREAD \ + && (!defined NOT_IN_libc || defined IS_IN_libpthread) # define USE___THREAD 1 diff --git a/inet/Makefile b/inet/Makefile index 075716fbeb..3f796e4487 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2002, 2003, 2004, 2006 Free Software Foundation, Inc. +# Copyright (C) 1991-2006, 2007 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 @@ -52,7 +52,7 @@ routines := htonl htons \ aux := check_pf ifreq tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \ - tst-gethnm test-ifaddrs bug-if1 + tst-gethnm test-ifaddrs bug-if1 test-inet6_opt include ../Rules diff --git a/inet/inet6_opt.c b/inet/inet6_opt.c index bddb85182b..17d3fee213 100644 --- a/inet/inet6_opt.c +++ b/inet/inet6_opt.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 Free Software Foundation, Inc. +/* Copyright (C) 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2006. @@ -51,7 +51,7 @@ add_padding (uint8_t *extbuf, int offset, int npad) { if (npad == 1) extbuf[offset] = IP6OPT_PAD1; - else + else if (npad > 0) { struct ip6_opt *pad_opt = (struct ip6_opt *) (extbuf + offset); @@ -102,21 +102,17 @@ inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type, int data_offset = offset + sizeof (struct ip6_opt); int npad = (align - data_offset % align) & (align - 1); - /* Now we can check whether the buffer is large enough. */ - if (data_offset + npad + len > extlen) - return -1; - - if (npad != 0) + if (extbuf != NULL) { - if (extbuf != NULL) - add_padding (extbuf, offset, npad); + /* Now we can check whether the buffer is large enough. */ + if (data_offset + npad + len > extlen) + return -1; + + add_padding (extbuf, offset, npad); offset += npad; - } - /* Now prepare the option itself. */ - if (extbuf != NULL) - { + /* Now prepare the option itself. */ struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset); opt->ip6o_type = type; @@ -124,6 +120,8 @@ inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type, *databufp = opt + 1; } + else + offset += npad; return offset + sizeof (struct ip6_opt) + len; } @@ -145,12 +143,14 @@ inet6_opt_finish (void *extbuf, socklen_t extlen, int offset) /* Required padding at the end. */ int npad = (8 - (offset & 7)) & 7; - /* Make sure the buffer is large enough. */ - if (offset + npad > extlen) - return -1; - if (extbuf != NULL) - add_padding (extbuf, offset, npad); + { + /* Make sure the buffer is large enough. */ + if (offset + npad > extlen) + return -1; + + add_padding (extbuf, offset, npad); + } return offset + npad; } diff --git a/inet/test-inet6_opt.c b/inet/test-inet6_opt.c new file mode 100644 index 0000000000..4db9b59389 --- /dev/null +++ b/inet/test-inet6_opt.c @@ -0,0 +1,207 @@ +#include +#include +#include +#include + +#define OPT_X 42 +#define OPT_Y 43 +#define OPT_Z 44 + +static void * +encode_inet6_opt (socklen_t *elp) +{ + void *eb = NULL; + socklen_t el; + int cl; + void *db; + int offset; + uint8_t val1; + uint16_t val2; + uint32_t val4; + uint64_t val8; + + *elp = 0; +#define CHECK() \ + if (cl == -1) \ + { \ + printf ("cl == -1 on line %d\n", __LINE__); \ + free (eb); \ + return NULL; \ + } + + /* Estimate the length */ + cl = inet6_opt_init (NULL, 0); + CHECK (); + cl = inet6_opt_append (NULL, 0, cl, OPT_X, 12, 8, NULL); + CHECK (); + cl = inet6_opt_append (NULL, 0, cl, OPT_Y, 7, 4, NULL); + CHECK (); + cl = inet6_opt_append (NULL, 0, cl, OPT_Z, 7, 1, NULL); + CHECK (); + cl = inet6_opt_finish (NULL, 0, cl); + CHECK (); + el = cl; + + eb = malloc (el + 8); + if (eb == NULL) + { + puts ("malloc failed"); + return NULL; + } + /* Canary. */ + memcpy (eb + el, "deadbeef", 8); + + cl = inet6_opt_init (eb, el); + CHECK (); + + cl = inet6_opt_append (eb, el, cl, OPT_X, 12, 8, &db); + CHECK (); + val4 = 0x12345678; + offset = inet6_opt_set_val (db, 0, &val4, sizeof (val4)); + val8 = 0x0102030405060708LL; + inet6_opt_set_val (db, offset, &val8, sizeof (val8)); + + cl = inet6_opt_append (eb, el, cl, OPT_Y, 7, 4, &db); + CHECK (); + val1 = 0x01; + offset = inet6_opt_set_val (db, 0, &val1, sizeof (val1)); + val2 = 0x1331; + offset = inet6_opt_set_val (db, offset, &val2, sizeof (val2)); + val4 = 0x01020304; + inet6_opt_set_val (db, offset, &val4, sizeof (val4)); + + cl = inet6_opt_append (eb, el, cl, OPT_Z, 7, 1, &db); + CHECK (); + inet6_opt_set_val (db, 0, (void *) "abcdefg", 7); + + cl = inet6_opt_finish (eb, el, cl); + CHECK (); + + if (memcmp (eb + el, "deadbeef", 8) != 0) + { + puts ("Canary corrupted"); + free (eb); + return NULL; + } + *elp = el; + return eb; +} + +int +decode_inet6_opt (void *eb, socklen_t el) +{ + int ret = 0; + int seq = 0; + int cl = 0; + int offset; + uint8_t type; + socklen_t len; + uint8_t val1; + uint16_t val2; + uint32_t val4; + uint64_t val8; + void *db; + char buf[8]; + + while ((cl = inet6_opt_next (eb, el, cl, &type, &len, &db)) != -1) + switch (type) + { + case OPT_X: + if (seq++ != 0) + { + puts ("OPT_X is not first"); + ret = 1; + } + if (len != 12) + { + printf ("OPT_X's length %d != 12\n", len); + ret = 1; + } + offset = inet6_opt_get_val (db, 0, &val4, sizeof (val4)); + if (val4 != 0x12345678) + { + printf ("OPT_X's val4 %x != 0x12345678\n", val4); + ret = 1; + } + offset = inet6_opt_get_val (db, offset, &val8, sizeof (val8)); + if (offset != len || val8 != 0x0102030405060708LL) + { + printf ("OPT_X's val8 %llx != 0x0102030405060708\n", + (long long) val8); + ret = 1; + } + break; + case OPT_Y: + if (seq++ != 1) + { + puts ("OPT_Y is not second"); + ret = 1; + } + if (len != 7) + { + printf ("OPT_Y's length %d != 7\n", len); + ret = 1; + } + offset = inet6_opt_get_val (db, 0, &val1, sizeof (val1)); + if (val1 != 0x01) + { + printf ("OPT_Y's val1 %x != 0x01\n", val1); + ret = 1; + } + offset = inet6_opt_get_val (db, offset, &val2, sizeof (val2)); + if (val2 != 0x1331) + { + printf ("OPT_Y's val2 %x != 0x1331\n", val2); + ret = 1; + } + offset = inet6_opt_get_val (db, offset, &val4, sizeof (val4)); + if (offset != len || val4 != 0x01020304) + { + printf ("OPT_Y's val4 %x != 0x01020304\n", val4); + ret = 1; + } + break; + case OPT_Z: + if (seq++ != 2) + { + puts ("OPT_Z is not third"); + ret = 1; + } + if (len != 7) + { + printf ("OPT_Z's length %d != 7\n", len); + ret = 1; + } + offset = inet6_opt_get_val (db, 0, buf, 7); + if (offset != len || memcmp (buf, "abcdefg", 7) != 0) + { + buf[7] = '\0'; + printf ("OPT_Z's buf \"%s\" != \"abcdefg\"\n", buf); + ret = 1; + } + break; + default: + printf ("Unknown option %d\n", type); + ret = 1; + break; + } + if (seq != 3) + { + puts ("Didn't see all of OPT_X, OPT_Y and OPT_Z"); + ret = 1; + } + return ret; +} + +int +main (void) +{ + void *eb; + socklen_t el; + eb = encode_inet6_opt (&el); + if (eb == NULL) + return 1; + if (decode_inet6_opt (eb, el)) + return 1; + return 0; +} diff --git a/io/Makefile b/io/Makefile index 18287b201a..6623551769 100644 --- a/io/Makefile +++ b/io/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1992-2002,2003,2005,2006 Free Software Foundation, Inc. +# Copyright (C) 1992-2002,2003,2005,2006, 2007 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 @@ -66,7 +66,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ tst-openat tst-unlinkat tst-fstatat tst-futimesat \ tst-renameat tst-fchownat tst-fchmodat tst-faccessat \ tst-symlinkat tst-linkat tst-readlinkat tst-mkdirat \ - tst-mknodat tst-mkfifoat tst-ttyname_r + tst-mknodat tst-mkfifoat tst-ttyname_r bug-ftw5 distribute := ftwtest-sh @@ -90,6 +90,19 @@ CFLAGS-posix_fallocate64.c = -fexceptions CFLAGS-test-stat.c = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE CFLAGS-test-lfs.c = -D_LARGEFILE64_SOURCE +ifeq (yes,$(have-protected)) +CFLAGS-stat.c = -DHAVE_DOT_HIDDEN +CFLAGS-fstat.c = -DHAVE_DOT_HIDDEN +CFLAGS-lstat.c = -DHAVE_DOT_HIDDEN +CFLAGS-mknod.c = -DHAVE_DOT_HIDDEN +CFLAGS-stat64.c = -DHAVE_DOT_HIDDEN +CFLAGS-fstat64.c = -DHAVE_DOT_HIDDEN +CFLAGS-lstat64.c = -DHAVE_DOT_HIDDEN +CFLAGS-fstatat.c = -DHAVE_DOT_HIDDEN +CFLAGS-fstatat64.c = -DHAVE_DOT_HIDDEN +CFLAGS-mknodat.c = -DHAVE_DOT_HIDDEN +endif + test-stat2-ARGS = Makefile . $(objpfx)test-stat2 tst-statvfs-ARGS = $(objpfx)tst-statvfs tst-statvfs.c /tmp diff --git a/io/bug-ftw5.c b/io/bug-ftw5.c new file mode 100644 index 0000000000..c1cd81d30e --- /dev/null +++ b/io/bug-ftw5.c @@ -0,0 +1,25 @@ +#include +#include +#include + +static int +fn (const char *file, const struct stat *sb, int flag, struct FTW *s) +{ + puts (file); + return FTW_STOP; +} + +static int +do_test (void) +{ + if (nftw ("/", fn, 0, FTW_CHDIR | FTW_ACTIONRETVAL) < 0) + { + printf ("nftw / FTW_CHDIR: %m\n"); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/io/fstat.c b/io/fstat.c index e2f9abd384..0f95c1a6e2 100644 --- a/io/fstat.c +++ b/io/fstat.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -47,10 +47,16 @@ #undef fstat #undef __fstat int -attribute_hidden __fstat (int fd, struct stat *buf) { return __fxstat (_STAT_VER, fd, buf); } -weak_hidden_alias (__fstat, fstat) +weak_alias (__fstat, fstat) + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tfstat"); +asm (".hidden\t__fstat"); +#endif diff --git a/io/fstat64.c b/io/fstat64.c index fe655444b2..79bd967d8f 100644 --- a/io/fstat64.c +++ b/io/fstat64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 2001 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 @@ -46,8 +46,13 @@ #undef fstat64 int -attribute_hidden fstat64 (int fd, struct stat64 *buf) { return __fxstat64 (_STAT_VER, fd, buf); } + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tfstat64"); +#endif diff --git a/io/fstatat.c b/io/fstatat.c index abf083c72e..1ac80597a0 100644 --- a/io/fstatat.c +++ b/io/fstatat.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 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 @@ -46,8 +46,13 @@ #undef fstatat int -attribute_hidden fstatat (int fd, const char *file, struct stat *buf, int flag) { return __fxstatat (_STAT_VER, fd, file, buf, flag); } + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tfstatat"); +#endif diff --git a/io/fstatat64.c b/io/fstatat64.c index 6fdf709af5..a14b42d42e 100644 --- a/io/fstatat64.c +++ b/io/fstatat64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 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 @@ -46,8 +46,13 @@ #undef fstatat64 int -attribute_hidden fstatat64 (int fd, const char *file, struct stat64 *buf, int flag) { return __fxstatat64 (_STAT_VER, fd, file, buf, flag); } + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tfstatat64"); +#endif diff --git a/io/ftw.c b/io/ftw.c index 413871744e..5495bc7ecc 100644 --- a/io/ftw.c +++ b/io/ftw.c @@ -1,5 +1,5 @@ /* File tree walker functions. - Copyright (C) 1996-2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2003, 2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -348,8 +348,17 @@ open_dir_stream (int *dfdp, struct ftw_data *data, struct dir_data *dirp) } else { - const char *name = ((data->flags & FTW_CHDIR) - ? data->dirbuf + data->ftw.base: data->dirbuf); + const char *name; + + if (data->flags & FTW_CHDIR) + { + name = data->dirbuf + data->ftw.base; + if (name[0] == '\0') + name = "."; + } + else + name = data->dirbuf; + dirp->stream = __opendir (name); } @@ -721,9 +730,16 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, /* Get stat info for start directory. */ if (result == 0) { - const char *name = ((data.flags & FTW_CHDIR) - ? data.dirbuf + data.ftw.base - : data.dirbuf); + const char *name; + + if (data.flags & FTW_CHDIR) + { + name = data.dirbuf + data.ftw.base; + if (name[0] == '\0') + name = "."; + } + else + name = data.dirbuf; if (((flags & FTW_PHYS) ? LXSTAT (_STAT_VER, name, &st) diff --git a/io/lstat.c b/io/lstat.c index 620e47877a..c4d7abe2c2 100644 --- a/io/lstat.c +++ b/io/lstat.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -47,10 +47,16 @@ #undef lstat #undef __lstat int -attribute_hidden __lstat (const char *file, struct stat *buf) { return __lxstat (_STAT_VER, file, buf); } -weak_hidden_alias (__lstat, lstat) +weak_alias (__lstat, lstat) + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tlstat"); +asm (".hidden\t__lstat"); +#endif diff --git a/io/lstat64.c b/io/lstat64.c index 3e4ba2d972..8a994e4867 100644 --- a/io/lstat64.c +++ b/io/lstat64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 2001 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 @@ -46,8 +46,13 @@ #undef lstat64 int -attribute_hidden lstat64 (const char *file, struct stat64 *buf) { return __lxstat64 (_STAT_VER, file, buf); } + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tlstat64"); +#endif diff --git a/io/mknod.c b/io/mknod.c index cc5fd26105..7d43593a25 100644 --- a/io/mknod.c +++ b/io/mknod.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -47,10 +47,16 @@ all callers. */ int -attribute_hidden __mknod (const char *path, mode_t mode, dev_t dev) { return __xmknod (_MKNOD_VER, path, mode, &dev); } -weak_hidden_alias (__mknod, mknod) +weak_alias (__mknod, mknod) + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tmknod"); +asm (".hidden\t__mknod"); +#endif diff --git a/io/mknodat.c b/io/mknodat.c index b02ba695f9..ac515b5b48 100644 --- a/io/mknodat.c +++ b/io/mknodat.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 2001, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 2001, 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 @@ -47,8 +47,14 @@ all callers. */ int -attribute_hidden mknodat (int fd, const char *path, mode_t mode, dev_t dev) { return __xmknodat (_MKNOD_VER, fd, path, mode, &dev); } + + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tmknodat"); +#endif diff --git a/io/stat.c b/io/stat.c index 6f1c28fc56..6af604957e 100644 --- a/io/stat.c +++ b/io/stat.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 2001 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 @@ -46,10 +46,16 @@ #undef stat int -attribute_hidden __stat (const char *file, struct stat *buf) { return __xstat (_STAT_VER, file, buf); } -weak_hidden_alias (__stat, stat) +weak_alias (__stat, stat) + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tstat"); +asm (".hidden\t__stat"); +#endif diff --git a/io/stat64.c b/io/stat64.c index 14e036a700..cadf1e1f1d 100644 --- a/io/stat64.c +++ b/io/stat64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 2001 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 @@ -46,8 +46,13 @@ #undef stat64 int -attribute_hidden stat64 (const char *file, struct stat64 *buf) { return __xstat64 (_STAT_VER, file, buf); } + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tstat64"); +#endif diff --git a/libio/Banner b/libio/Banner new file mode 100644 index 0000000000..8ec3141927 --- /dev/null +++ b/libio/Banner @@ -0,0 +1 @@ +GNU libio by Per Bothner diff --git a/libio/bits/stdio.h b/libio/bits/stdio.h index 9e951ad8e4..2d44fad1f5 100644 --- a/libio/bits/stdio.h +++ b/libio/bits/stdio.h @@ -1,5 +1,5 @@ /* Optimizing macros and inline functions for stdio functions. - Copyright (C) 1998, 2000, 2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1998, 2000, 2001, 2004, 2007 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 @@ -44,6 +44,16 @@ getchar (void) } +# ifdef __USE_MISC +/* Faster version when locking is not necessary. */ +__STDIO_INLINE int +fgetc_unlocked (FILE *__fp) +{ + return _IO_getc_unlocked (__fp); +} +# endif /* misc */ + + # if defined __USE_POSIX || defined __USE_MISC /* This is defined in POSIX.1:1996. */ __STDIO_INLINE int diff --git a/libio/fileops.c b/libio/fileops.c index dbd7a7a8f2..886b3729c3 100644 --- a/libio/fileops.c +++ b/libio/fileops.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1993, 1995, 1997-2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1995, 1997-2005, 2006, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Per Bothner . @@ -472,7 +473,7 @@ _IO_file_setbuf_mmap (fp, p, len) return result; } -static _IO_size_t new_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW; +static _IO_size_t new_do_write (_IO_FILE *, const char *, _IO_size_t); /* Write TO_DO bytes from DATA to FP. Then mark FP as having empty buffers. */ @@ -1468,8 +1469,7 @@ _IO_file_xsgetn (fp, data, n) } INTDEF(_IO_file_xsgetn) -static _IO_size_t _IO_file_xsgetn_mmap (_IO_FILE *, void *, _IO_size_t) - __THROW; +static _IO_size_t _IO_file_xsgetn_mmap (_IO_FILE *, void *, _IO_size_t); static _IO_size_t _IO_file_xsgetn_mmap (fp, data, n) _IO_FILE *fp; @@ -1528,8 +1528,7 @@ _IO_file_xsgetn_mmap (fp, data, n) return s - (char *) data; } -static _IO_size_t _IO_file_xsgetn_maybe_mmap (_IO_FILE *, void *, _IO_size_t) - __THROW; +static _IO_size_t _IO_file_xsgetn_maybe_mmap (_IO_FILE *, void *, _IO_size_t); static _IO_size_t _IO_file_xsgetn_maybe_mmap (fp, data, n) _IO_FILE *fp; diff --git a/libio/libio.h b/libio/libio.h index 428e035540..9df08614ee 100644 --- a/libio/libio.h +++ b/libio/libio.h @@ -410,12 +410,12 @@ extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, extern "C" { #endif -extern int __underflow (_IO_FILE *) __THROW; -extern int __uflow (_IO_FILE *) __THROW; -extern int __overflow (_IO_FILE *, int) __THROW; -extern _IO_wint_t __wunderflow (_IO_FILE *) __THROW; -extern _IO_wint_t __wuflow (_IO_FILE *) __THROW; -extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t) __THROW; +extern int __underflow (_IO_FILE *); +extern int __uflow (_IO_FILE *); +extern int __overflow (_IO_FILE *, int); +extern _IO_wint_t __wunderflow (_IO_FILE *); +extern _IO_wint_t __wuflow (_IO_FILE *); +extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); #if __GNUC__ >= 3 # define _IO_BE(expr, res) __builtin_expect ((expr), res) @@ -448,12 +448,12 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t) __THROW; #define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0) #define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0) -extern int _IO_getc (_IO_FILE *__fp) __THROW; -extern int _IO_putc (int __c, _IO_FILE *__fp) __THROW; +extern int _IO_getc (_IO_FILE *__fp); +extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) __THROW; extern int _IO_ferror (_IO_FILE *__fp) __THROW; -extern int _IO_peekc_locked (_IO_FILE *__fp) __THROW; +extern int _IO_peekc_locked (_IO_FILE *__fp); /* This one is for Emacs. */ #define _IO_PENDING_OUTPUT_COUNT(_fp) \ @@ -482,17 +482,17 @@ extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, _IO_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, _IO_va_list); -extern _IO_ssize_t _IO_padn (_IO_FILE *, int, _IO_ssize_t) __THROW; -extern _IO_size_t _IO_sgetn (_IO_FILE *, void *, _IO_size_t) __THROW; +extern _IO_ssize_t _IO_padn (_IO_FILE *, int, _IO_ssize_t); +extern _IO_size_t _IO_sgetn (_IO_FILE *, void *, _IO_size_t); -extern _IO_off64_t _IO_seekoff (_IO_FILE *, _IO_off64_t, int, int) __THROW; -extern _IO_off64_t _IO_seekpos (_IO_FILE *, _IO_off64_t, int) __THROW; +extern _IO_off64_t _IO_seekoff (_IO_FILE *, _IO_off64_t, int, int); +extern _IO_off64_t _IO_seekpos (_IO_FILE *, _IO_off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) __THROW; #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T -extern _IO_wint_t _IO_getwc (_IO_FILE *__fp) __THROW; -extern _IO_wint_t _IO_putwc (wchar_t __wc, _IO_FILE *__fp) __THROW; +extern _IO_wint_t _IO_getwc (_IO_FILE *__fp); +extern _IO_wint_t _IO_putwc (wchar_t __wc, _IO_FILE *__fp); extern int _IO_fwide (_IO_FILE *__fp, int __mode) __THROW; # if __GNUC__ >= 2 /* While compiling glibc we have to handle compatibility with very old @@ -531,7 +531,7 @@ extern int _IO_vfwscanf (_IO_FILE * __restrict, const wchar_t * __restrict, _IO_va_list, int *__restrict); extern int _IO_vfwprintf (_IO_FILE *__restrict, const wchar_t *__restrict, _IO_va_list); -extern _IO_ssize_t _IO_wpadn (_IO_FILE *, wint_t, _IO_ssize_t) __THROW; +extern _IO_ssize_t _IO_wpadn (_IO_FILE *, wint_t, _IO_ssize_t); extern void _IO_free_wbackup_area (_IO_FILE *) __THROW; #endif diff --git a/libio/libioP.h b/libio/libioP.h index a2cd4c2202..a574b40f77 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997-2003,2004,2005,2006 +/* Copyright (C) 1993, 1997-2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -380,7 +380,7 @@ typedef struct _IO_FILE *_IO_ITER; extern void _IO_switch_to_main_get_area (_IO_FILE *) __THROW; extern void _IO_switch_to_backup_area (_IO_FILE *) __THROW; -extern int _IO_switch_to_get_mode (_IO_FILE *) __THROW; +extern int _IO_switch_to_get_mode (_IO_FILE *); extern void _IO_init (_IO_FILE *, int) __THROW; extern int _IO_sputbackc (_IO_FILE *, int) __THROW; extern int _IO_sungetc (_IO_FILE *) __THROW; @@ -394,7 +394,7 @@ extern unsigned _IO_adjust_column (unsigned, const char *, int) __THROW; extern void _IO_switch_to_main_wget_area (_IO_FILE *) __THROW; extern void _IO_switch_to_wbackup_area (_IO_FILE *) __THROW; -extern int _IO_switch_to_wget_mode (_IO_FILE *) __THROW; +extern int _IO_switch_to_wget_mode (_IO_FILE *); extern void _IO_wsetb (_IO_FILE *, wchar_t *, wchar_t *, int) __THROW; extern wint_t _IO_sputbackwc (_IO_FILE *, wint_t) __THROW; extern wint_t _IO_sungetwc (_IO_FILE *) __THROW; @@ -404,8 +404,8 @@ extern unsigned _IO_adjust_wcolumn (unsigned, const wchar_t *, int) __THROW; /* Marker-related function. */ -extern void _IO_init_marker (struct _IO_marker *, _IO_FILE *) __THROW; -extern void _IO_init_wmarker (struct _IO_marker *, _IO_FILE *) __THROW; +extern void _IO_init_marker (struct _IO_marker *, _IO_FILE *); +extern void _IO_init_wmarker (struct _IO_marker *, _IO_FILE *); extern void _IO_remove_marker (struct _IO_marker *) __THROW; extern int _IO_marker_difference (struct _IO_marker *, struct _IO_marker *) __THROW; @@ -434,22 +434,22 @@ libc_hidden_proto (_IO_list_resetlock) /* Default jumptable functions. */ extern int _IO_default_underflow (_IO_FILE *) __THROW; -extern int _IO_default_uflow (_IO_FILE *) __THROW; -extern wint_t _IO_wdefault_uflow (_IO_FILE *) __THROW; +extern int _IO_default_uflow (_IO_FILE *); +extern wint_t _IO_wdefault_uflow (_IO_FILE *); extern int _IO_default_doallocate (_IO_FILE *) __THROW; extern int _IO_wdefault_doallocate (_IO_FILE *) __THROW; extern void _IO_default_finish (_IO_FILE *, int) __THROW; extern void _IO_wdefault_finish (_IO_FILE *, int) __THROW; extern int _IO_default_pbackfail (_IO_FILE *, int) __THROW; extern wint_t _IO_wdefault_pbackfail (_IO_FILE *, wint_t) __THROW; -extern _IO_FILE* _IO_default_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW; +extern _IO_FILE* _IO_default_setbuf (_IO_FILE *, char *, _IO_ssize_t); extern _IO_size_t _IO_default_xsputn (_IO_FILE *, const void *, _IO_size_t); extern _IO_size_t _IO_wdefault_xsputn (_IO_FILE *, const void *, _IO_size_t); extern _IO_size_t _IO_default_xsgetn (_IO_FILE *, void *, _IO_size_t); extern _IO_size_t _IO_wdefault_xsgetn (_IO_FILE *, void *, _IO_size_t); extern _IO_off64_t _IO_default_seekoff (_IO_FILE *, _IO_off64_t, int, int) __THROW; -extern _IO_off64_t _IO_default_seekpos (_IO_FILE *, _IO_off64_t, int) __THROW; +extern _IO_off64_t _IO_default_seekpos (_IO_FILE *, _IO_off64_t, int); extern _IO_ssize_t _IO_default_write (_IO_FILE *, const void *, _IO_ssize_t); extern _IO_ssize_t _IO_default_read (_IO_FILE *, void *, _IO_ssize_t); extern int _IO_default_stat (_IO_FILE *, void *) __THROW; @@ -473,22 +473,22 @@ extern const struct _IO_jump_t _IO_old_proc_jumps attribute_hidden; extern const struct _IO_jump_t _IO_str_jumps attribute_hidden; extern const struct _IO_jump_t _IO_wstr_jumps attribute_hidden; extern const struct _IO_codecvt __libio_codecvt attribute_hidden; -extern int _IO_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW; -extern int _IO_new_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW; -extern int _IO_old_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW; -extern int _IO_wdo_write (_IO_FILE *, const wchar_t *, _IO_size_t) __THROW; -extern int _IO_flush_all_lockp (int) __THROW; -extern int _IO_flush_all (void) __THROW; -extern int _IO_cleanup (void) __THROW; -extern void _IO_flush_all_linebuffered (void) __THROW; -extern int _IO_new_fgetpos (_IO_FILE *, _IO_fpos_t *) __THROW; -extern int _IO_old_fgetpos (_IO_FILE *, _IO_fpos_t *) __THROW; -extern int _IO_new_fsetpos (_IO_FILE *, const _IO_fpos_t *) __THROW; -extern int _IO_old_fsetpos (_IO_FILE *, const _IO_fpos_t *) __THROW; -extern int _IO_new_fgetpos64 (_IO_FILE *, _IO_fpos64_t *) __THROW; -extern int _IO_old_fgetpos64 (_IO_FILE *, _IO_fpos64_t *) __THROW; -extern int _IO_new_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *) __THROW; -extern int _IO_old_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *) __THROW; +extern int _IO_do_write (_IO_FILE *, const char *, _IO_size_t); +extern int _IO_new_do_write (_IO_FILE *, const char *, _IO_size_t); +extern int _IO_old_do_write (_IO_FILE *, const char *, _IO_size_t); +extern int _IO_wdo_write (_IO_FILE *, const wchar_t *, _IO_size_t); +extern int _IO_flush_all_lockp (int); +extern int _IO_flush_all (void); +extern int _IO_cleanup (void); +extern void _IO_flush_all_linebuffered (void); +extern int _IO_new_fgetpos (_IO_FILE *, _IO_fpos_t *); +extern int _IO_old_fgetpos (_IO_FILE *, _IO_fpos_t *); +extern int _IO_new_fsetpos (_IO_FILE *, const _IO_fpos_t *); +extern int _IO_old_fsetpos (_IO_FILE *, const _IO_fpos_t *); +extern int _IO_new_fgetpos64 (_IO_FILE *, _IO_fpos64_t *); +extern int _IO_old_fgetpos64 (_IO_FILE *, _IO_fpos64_t *); +extern int _IO_new_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *); +extern int _IO_old_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *); extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW; @@ -534,95 +534,79 @@ extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW; /* Jumptable functions for files. */ extern int _IO_file_doallocate (_IO_FILE *) __THROW; -extern _IO_FILE* _IO_file_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW; -extern _IO_off64_t _IO_file_seekoff (_IO_FILE *, _IO_off64_t, int, int) - __THROW; +extern _IO_FILE* _IO_file_setbuf (_IO_FILE *, char *, _IO_ssize_t); +extern _IO_off64_t _IO_file_seekoff (_IO_FILE *, _IO_off64_t, int, int); extern _IO_off64_t _IO_file_seekoff_mmap (_IO_FILE *, _IO_off64_t, int, int) __THROW; -extern _IO_size_t _IO_file_xsputn (_IO_FILE *, const void *, _IO_size_t) - __THROW; -extern _IO_size_t _IO_file_xsgetn (_IO_FILE *, void *, _IO_size_t) __THROW; +extern _IO_size_t _IO_file_xsputn (_IO_FILE *, const void *, _IO_size_t); +extern _IO_size_t _IO_file_xsgetn (_IO_FILE *, void *, _IO_size_t); extern int _IO_file_stat (_IO_FILE *, void *) __THROW; extern int _IO_file_close (_IO_FILE *) __THROW; extern int _IO_file_close_mmap (_IO_FILE *) __THROW; -extern int _IO_file_underflow (_IO_FILE *) __THROW; -extern int _IO_file_underflow_mmap (_IO_FILE *) __THROW; -extern int _IO_file_underflow_maybe_mmap (_IO_FILE *) __THROW; -extern int _IO_file_overflow (_IO_FILE *, int) __THROW; +extern int _IO_file_underflow (_IO_FILE *); +extern int _IO_file_underflow_mmap (_IO_FILE *); +extern int _IO_file_underflow_maybe_mmap (_IO_FILE *); +extern int _IO_file_overflow (_IO_FILE *, int); #define _IO_file_is_open(__fp) ((__fp)->_fileno != -1) extern void _IO_file_init (struct _IO_FILE_plus *) __THROW; -extern _IO_FILE* _IO_file_attach (_IO_FILE *, int) __THROW; -extern _IO_FILE* _IO_file_open (_IO_FILE *, const char *, int, int, int, int) - __THROW; +extern _IO_FILE* _IO_file_attach (_IO_FILE *, int); +extern _IO_FILE* _IO_file_open (_IO_FILE *, const char *, int, int, int, int); libc_hidden_proto (_IO_file_open) -extern _IO_FILE* _IO_file_fopen (_IO_FILE *, const char *, const char *, int) - __THROW; -extern _IO_ssize_t _IO_file_write (_IO_FILE *, const void *, _IO_ssize_t) - __THROW; -extern _IO_ssize_t _IO_file_read (_IO_FILE *, void *, _IO_ssize_t) __THROW; -extern int _IO_file_sync (_IO_FILE *) __THROW; -extern int _IO_file_close_it (_IO_FILE *) __THROW; +extern _IO_FILE* _IO_file_fopen (_IO_FILE *, const char *, const char *, int); +extern _IO_ssize_t _IO_file_write (_IO_FILE *, const void *, _IO_ssize_t); +extern _IO_ssize_t _IO_file_read (_IO_FILE *, void *, _IO_ssize_t); +extern int _IO_file_sync (_IO_FILE *); +extern int _IO_file_close_it (_IO_FILE *); extern _IO_off64_t _IO_file_seek (_IO_FILE *, _IO_off64_t, int) __THROW; -extern void _IO_file_finish (_IO_FILE *, int) __THROW; +extern void _IO_file_finish (_IO_FILE *, int); -extern _IO_FILE* _IO_new_file_attach (_IO_FILE *, int) __THROW; -extern int _IO_new_file_close_it (_IO_FILE *) __THROW; -extern void _IO_new_file_finish (_IO_FILE *, int) __THROW; +extern _IO_FILE* _IO_new_file_attach (_IO_FILE *, int); +extern int _IO_new_file_close_it (_IO_FILE *); +extern void _IO_new_file_finish (_IO_FILE *, int); extern _IO_FILE* _IO_new_file_fopen (_IO_FILE *, const char *, const char *, - int) __THROW; + int); extern void _IO_no_init (_IO_FILE *, int, int, struct _IO_wide_data *, const struct _IO_jump_t *) __THROW; extern void _IO_new_file_init (struct _IO_FILE_plus *) __THROW; -extern _IO_FILE* _IO_new_file_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW; -extern _IO_FILE* _IO_file_setbuf_mmap (_IO_FILE *, char *, _IO_ssize_t) - __THROW; -extern int _IO_new_file_sync (_IO_FILE *) __THROW; -extern int _IO_new_file_underflow (_IO_FILE *) __THROW; -extern int _IO_new_file_overflow (_IO_FILE *, int) __THROW; -extern _IO_off64_t _IO_new_file_seekoff (_IO_FILE *, _IO_off64_t, int, int) - __THROW; -extern _IO_ssize_t _IO_new_file_write (_IO_FILE *, const void *, _IO_ssize_t) - __THROW; -extern _IO_size_t _IO_new_file_xsputn (_IO_FILE *, const void *, _IO_size_t) - __THROW; - -extern _IO_FILE* _IO_old_file_setbuf (_IO_FILE *, char *, _IO_ssize_t) __THROW; -extern _IO_off64_t _IO_old_file_seekoff (_IO_FILE *, _IO_off64_t, int, int) - __THROW; -extern _IO_size_t _IO_old_file_xsputn (_IO_FILE *, const void *, _IO_size_t) - __THROW; -extern int _IO_old_file_underflow (_IO_FILE *) __THROW; -extern int _IO_old_file_overflow (_IO_FILE *, int) __THROW; +extern _IO_FILE* _IO_new_file_setbuf (_IO_FILE *, char *, _IO_ssize_t); +extern _IO_FILE* _IO_file_setbuf_mmap (_IO_FILE *, char *, _IO_ssize_t); +extern int _IO_new_file_sync (_IO_FILE *); +extern int _IO_new_file_underflow (_IO_FILE *); +extern int _IO_new_file_overflow (_IO_FILE *, int); +extern _IO_off64_t _IO_new_file_seekoff (_IO_FILE *, _IO_off64_t, int, int); +extern _IO_ssize_t _IO_new_file_write (_IO_FILE *, const void *, _IO_ssize_t); +extern _IO_size_t _IO_new_file_xsputn (_IO_FILE *, const void *, _IO_size_t); + +extern _IO_FILE* _IO_old_file_setbuf (_IO_FILE *, char *, _IO_ssize_t); +extern _IO_off64_t _IO_old_file_seekoff (_IO_FILE *, _IO_off64_t, int, int); +extern _IO_size_t _IO_old_file_xsputn (_IO_FILE *, const void *, _IO_size_t); +extern int _IO_old_file_underflow (_IO_FILE *); +extern int _IO_old_file_overflow (_IO_FILE *, int); extern void _IO_old_file_init (struct _IO_FILE_plus *) __THROW; -extern _IO_FILE* _IO_old_file_attach (_IO_FILE *, int) __THROW; -extern _IO_FILE* _IO_old_file_fopen (_IO_FILE *, const char *, const char *) - __THROW; -extern _IO_ssize_t _IO_old_file_write (_IO_FILE *, const void *, _IO_ssize_t) - __THROW; -extern int _IO_old_file_sync (_IO_FILE *) __THROW; -extern int _IO_old_file_close_it (_IO_FILE *) __THROW; -extern void _IO_old_file_finish (_IO_FILE *, int) __THROW; +extern _IO_FILE* _IO_old_file_attach (_IO_FILE *, int); +extern _IO_FILE* _IO_old_file_fopen (_IO_FILE *, const char *, const char *); +extern _IO_ssize_t _IO_old_file_write (_IO_FILE *, const void *, _IO_ssize_t); +extern int _IO_old_file_sync (_IO_FILE *); +extern int _IO_old_file_close_it (_IO_FILE *); +extern void _IO_old_file_finish (_IO_FILE *, int); extern int _IO_wfile_doallocate (_IO_FILE *) __THROW; -extern _IO_size_t _IO_wfile_xsputn (_IO_FILE *, const void *, _IO_size_t) - __THROW; -extern _IO_FILE* _IO_wfile_setbuf (_IO_FILE *, wchar_t *, _IO_ssize_t) __THROW; -extern wint_t _IO_wfile_sync (_IO_FILE *) __THROW; -extern wint_t _IO_wfile_underflow (_IO_FILE *) __THROW; -extern wint_t _IO_wfile_overflow (_IO_FILE *, wint_t) __THROW; -extern _IO_off64_t _IO_wfile_seekoff (_IO_FILE *, _IO_off64_t, int, int) - __THROW; +extern _IO_size_t _IO_wfile_xsputn (_IO_FILE *, const void *, _IO_size_t); +extern _IO_FILE* _IO_wfile_setbuf (_IO_FILE *, wchar_t *, _IO_ssize_t); +extern wint_t _IO_wfile_sync (_IO_FILE *); +extern wint_t _IO_wfile_underflow (_IO_FILE *); +extern wint_t _IO_wfile_overflow (_IO_FILE *, wint_t); +extern _IO_off64_t _IO_wfile_seekoff (_IO_FILE *, _IO_off64_t, int, int); /* Jumptable functions for proc_files. */ extern _IO_FILE* _IO_proc_open (_IO_FILE *, const char *, const char *) __THROW; extern _IO_FILE* _IO_new_proc_open (_IO_FILE *, const char *, const char *) __THROW; -extern _IO_FILE* _IO_old_proc_open (_IO_FILE *, const char *, const char *) - __THROW; +extern _IO_FILE* _IO_old_proc_open (_IO_FILE *, const char *, const char *); extern int _IO_proc_close (_IO_FILE *) __THROW; extern int _IO_new_proc_close (_IO_FILE *) __THROW; -extern int _IO_old_proc_close (_IO_FILE *) __THROW; +extern int _IO_old_proc_close (_IO_FILE *); /* Jumptable functions for strfiles. */ extern int _IO_str_underflow (_IO_FILE *) __THROW; @@ -660,73 +644,62 @@ extern int _IO_vsnprintf (char *string, _IO_size_t maxlen, extern _IO_size_t _IO_getline (_IO_FILE *,char *, _IO_size_t, int, int); extern _IO_size_t _IO_getline_info (_IO_FILE *,char *, _IO_size_t, int, int, int *); -extern _IO_ssize_t _IO_getdelim (char **, _IO_size_t *, int, _IO_FILE *) - __THROW; +extern _IO_ssize_t _IO_getdelim (char **, _IO_size_t *, int, _IO_FILE *); extern _IO_size_t _IO_getwline (_IO_FILE *,wchar_t *, _IO_size_t, wint_t, int); extern _IO_size_t _IO_getwline_info (_IO_FILE *,wchar_t *, _IO_size_t, wint_t, int, wint_t *); -extern double _IO_strtod (const char *, char **) __THROW; -extern char *_IO_dtoa (double __d, int __mode, int __ndigits, - int *__decpt, int *__sign, char **__rve) __THROW; -extern int _IO_outfloat (double __value, _IO_FILE *__sb, int __type, - int __width, int __precision, int __flags, - int __sign_mode, int __fill) __THROW; extern struct _IO_FILE_plus *_IO_list_all; extern void (*_IO_cleanup_registration_needed) (void); /* Prototype for functions with alternative entry point. */ -extern int _IO_flush_all_internal (void) __THROW; -extern unsigned _IO_adjust_column_internal (unsigned, const char *, int) - __THROW; +extern int _IO_flush_all_internal (void); +extern unsigned _IO_adjust_column_internal (unsigned, const char *, int); -extern int _IO_default_uflow_internal (_IO_FILE *) __THROW; +extern int _IO_default_uflow_internal (_IO_FILE *); extern void _IO_default_finish_internal (_IO_FILE *, int) __THROW; extern int _IO_default_pbackfail_internal (_IO_FILE *, int) __THROW; extern _IO_size_t _IO_default_xsputn_internal (_IO_FILE *, const void *, - _IO_size_t) __THROW; -extern _IO_size_t _IO_default_xsgetn_internal (_IO_FILE *, void *, _IO_size_t) - __THROW; + _IO_size_t); +extern _IO_size_t _IO_default_xsgetn_internal (_IO_FILE *, void *, _IO_size_t); extern int _IO_default_doallocate_internal (_IO_FILE *) __THROW; extern void _IO_wdefault_finish_internal (_IO_FILE *, int) __THROW; extern wint_t _IO_wdefault_pbackfail_internal (_IO_FILE *, wint_t) __THROW; extern _IO_size_t _IO_wdefault_xsputn_internal (_IO_FILE *, const void *, - _IO_size_t) __THROW; + _IO_size_t); extern _IO_size_t _IO_wdefault_xsgetn_internal (_IO_FILE *, void *, - _IO_size_t) __THROW; + _IO_size_t); extern int _IO_wdefault_doallocate_internal (_IO_FILE *) __THROW; -extern wint_t _IO_wdefault_uflow_internal (_IO_FILE *) __THROW; +extern wint_t _IO_wdefault_uflow_internal (_IO_FILE *); extern int _IO_file_doallocate_internal (_IO_FILE *) __THROW; -extern _IO_FILE* _IO_file_setbuf_internal (_IO_FILE *, char *, _IO_ssize_t) - __THROW; +extern _IO_FILE* _IO_file_setbuf_internal (_IO_FILE *, char *, _IO_ssize_t); extern _IO_off64_t _IO_file_seekoff_internal (_IO_FILE *, _IO_off64_t, - int, int) __THROW; + int, int); extern _IO_size_t _IO_file_xsputn_internal (_IO_FILE *, const void *, - _IO_size_t) __THROW; -extern _IO_size_t _IO_file_xsgetn_internal (_IO_FILE *, void *, _IO_size_t) - __THROW; + _IO_size_t); +extern _IO_size_t _IO_file_xsgetn_internal (_IO_FILE *, void *, _IO_size_t); extern int _IO_file_stat_internal (_IO_FILE *, void *) __THROW; extern int _IO_file_close_internal (_IO_FILE *) __THROW; -extern int _IO_file_close_it_internal (_IO_FILE *) __THROW; -extern int _IO_file_underflow_internal (_IO_FILE *) __THROW; -extern int _IO_file_overflow_internal (_IO_FILE *, int) __THROW; +extern int _IO_file_close_it_internal (_IO_FILE *); +extern int _IO_file_underflow_internal (_IO_FILE *); +extern int _IO_file_overflow_internal (_IO_FILE *, int); extern void _IO_file_init_internal (struct _IO_FILE_plus *) __THROW; -extern _IO_FILE* _IO_file_attach_internal (_IO_FILE *, int) __THROW; +extern _IO_FILE* _IO_file_attach_internal (_IO_FILE *, int); extern _IO_FILE* _IO_file_fopen_internal (_IO_FILE *, const char *, - const char *, int) __THROW; + const char *, int); extern _IO_ssize_t _IO_file_read_internal (_IO_FILE *, void *, _IO_ssize_t); -extern int _IO_file_sync_internal (_IO_FILE *) __THROW; +extern int _IO_file_sync_internal (_IO_FILE *); extern _IO_off64_t _IO_file_seek_internal (_IO_FILE *, _IO_off64_t, int) __THROW; -extern void _IO_file_finish_internal (_IO_FILE *, int) __THROW; +extern void _IO_file_finish_internal (_IO_FILE *, int); extern _IO_size_t _IO_wfile_xsputn_internal (_IO_FILE *, const void *, - _IO_size_t) __THROW; + _IO_size_t); extern _IO_off64_t _IO_wfile_seekoff_internal (_IO_FILE *, _IO_off64_t, - int, int) __THROW; -extern wint_t _IO_wfile_sync_internal (_IO_FILE *) __THROW; + int, int); +extern wint_t _IO_wfile_sync_internal (_IO_FILE *); extern int _IO_str_underflow_internal (_IO_FILE *) __THROW; extern int _IO_str_overflow_internal (_IO_FILE *, int) __THROW; @@ -747,12 +720,12 @@ extern void _IO_wdoallocbuf_internal (_IO_FILE *) __THROW; extern _IO_size_t _IO_sgetn_internal (_IO_FILE *, void *, _IO_size_t); extern void _IO_flush_all_linebuffered_internal (void) __THROW; -extern int _IO_switch_to_wget_mode_internal (_IO_FILE *) __THROW; +extern int _IO_switch_to_wget_mode_internal (_IO_FILE *); extern void _IO_unsave_markers_internal (_IO_FILE *) __THROW; extern void _IO_switch_to_main_wget_area_internal (_IO_FILE *) __THROW; extern int _IO_wdo_write_internal (_IO_FILE *, const wchar_t *, _IO_size_t); extern int _IO_do_write_internal (_IO_FILE *, const char *, _IO_size_t); -extern _IO_ssize_t _IO_padn_internal (_IO_FILE *, int, _IO_ssize_t) __THROW; +extern _IO_ssize_t _IO_padn_internal (_IO_FILE *, int, _IO_ssize_t); extern _IO_size_t _IO_getline_info_internal (_IO_FILE *,char *, _IO_size_t, int, int, int *); extern _IO_size_t _IO_getline_internal (_IO_FILE *, char *, _IO_size_t, int, @@ -762,7 +735,7 @@ extern void _IO_free_backup_area_internal (_IO_FILE *) __THROW; extern void _IO_switch_to_wbackup_area_internal (_IO_FILE *) __THROW; extern void _IO_setb_internal (_IO_FILE *, char *, char *, int) __THROW; extern wint_t _IO_sputbackwc_internal (_IO_FILE *, wint_t) __THROW; -extern int _IO_switch_to_get_mode_internal (_IO_FILE *) __THROW; +extern int _IO_switch_to_get_mode_internal (_IO_FILE *); extern int _IO_vfscanf_internal (_IO_FILE * __restrict, const char * __restrict, _IO_va_list, int *__restrict); @@ -772,9 +745,9 @@ extern void _IO_doallocbuf_internal (_IO_FILE *) __THROW; extern void _IO_wsetb_internal (_IO_FILE *, wchar_t *, wchar_t *, int) __THROW; extern _IO_off64_t _IO_seekoff_unlocked (_IO_FILE *, _IO_off64_t, int, int) - attribute_hidden __THROW; + attribute_hidden; extern _IO_off64_t _IO_seekpos_unlocked (_IO_FILE *, _IO_off64_t, int) - attribute_hidden __THROW; + attribute_hidden; extern int _IO_putc_internal (int __c, _IO_FILE *__fp); extern void _IO_init_internal (_IO_FILE *, int) __THROW; extern void _IO_un_link_internal (struct _IO_FILE_plus *) __THROW; @@ -866,12 +839,6 @@ extern void _IO_un_link_internal (struct _IO_FILE_plus *) __THROW; #ifndef OS_FSTAT # define OS_FSTAT fstat #endif -struct stat; -extern _IO_ssize_t _IO_read (int, void *, _IO_size_t); -extern _IO_ssize_t _IO_write (int, const void *, _IO_size_t); -extern _IO_off64_t _IO_lseek (int, _IO_off64_t, int) __THROW; -extern int _IO_close (int); -extern int _IO_fstat (int, struct stat *) __THROW; extern int _IO_vscanf (const char *, _IO_va_list) __THROW; /* _IO_pos_BAD is an _IO_off64_t value indicating error, unknown, or EOF. */ diff --git a/libio/oldfileops.c b/libio/oldfileops.c index a69c87e8b8..3bd0aa175b 100644 --- a/libio/oldfileops.c +++ b/libio/oldfileops.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1993, 1995, 1997-2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1995, 1997-2004, 2005, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Per Bothner . @@ -271,7 +272,7 @@ _IO_old_file_setbuf (fp, p, len) return fp; } -static int old_do_write (_IO_FILE *, const char *, _IO_size_t) __THROW; +static int old_do_write (_IO_FILE *, const char *, _IO_size_t); /* Write TO_DO bytes from DATA to FP. Then mark FP as having empty buffers. */ diff --git a/libio/stdio.c b/libio/stdio.c index b2baf65be3..8dc24ed98f 100644 --- a/libio/stdio.c +++ b/libio/stdio.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1993,1994,1996,1997,2000,2002,2006 - Free Software Foundation, Inc. +/* Copyright (C) 1993,1994,1996,1997,2000,2002 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 @@ -41,9 +40,14 @@ _IO_FILE *stderr = (FILE *) &_IO_2_1_stderr_; #undef _IO_stderr #ifdef _LIBC # define AL(name) AL2 (name, _IO_##name) -# define AL2(name, al) \ +# if defined HAVE_VISIBILITY_ATTRIBUTE +# define AL2(name, al) \ extern __typeof (name) al __attribute__ ((alias (#name), \ visibility ("hidden"))) +# else +# define AL2(name, al) \ + extern __typeof (name) al __attribute__ ((alias (#name))) +# endif AL(stdin); AL(stdout); AL(stderr); diff --git a/libio/stdio.h b/libio/stdio.h index 3738e6d3b6..5e74305638 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -166,27 +166,27 @@ __BEGIN_NAMESPACE_STD This function is a possible cancellation points and therefore not marked with __THROW. */ #ifndef __USE_FILE_OFFSET64 -extern FILE *tmpfile (void) __wur; +extern FILE *tmpfile (void); #else # ifdef __REDIRECT -extern FILE *__REDIRECT (tmpfile, (void), tmpfile64) __wur; +extern FILE *__REDIRECT (tmpfile, (void), tmpfile64); # else # define tmpfile tmpfile64 # endif #endif #ifdef __USE_LARGEFILE64 -extern FILE *tmpfile64 (void) __wur; +extern FILE *tmpfile64 (void); #endif /* Generate a temporary filename. */ -extern char *tmpnam (char *__s) __THROW __wur; +extern char *tmpnam (char *__s) __THROW; __END_NAMESPACE_STD #ifdef __USE_MISC /* This is the reentrant variant of `tmpnam'. The only difference is that it does not allow S to be NULL. */ -extern char *tmpnam_r (char *__s) __THROW __wur; +extern char *tmpnam_r (char *__s) __THROW; #endif @@ -199,7 +199,7 @@ extern char *tmpnam_r (char *__s) __THROW __wur; P_tmpdir is tried and finally "/tmp". The storage for the filename is allocated by `malloc'. */ extern char *tempnam (__const char *__dir, __const char *__pfx) - __THROW __attribute_malloc__ __wur; + __THROW __attribute_malloc__; #endif @@ -244,23 +244,21 @@ __BEGIN_NAMESPACE_STD This function is a possible cancellation point and therefore not marked with __THROW. */ extern FILE *fopen (__const char *__restrict __filename, - __const char *__restrict __modes) __wur; + __const char *__restrict __modes); /* Open a file, replacing an existing stream with it. This function is a possible cancellation point and therefore not marked with __THROW. */ extern FILE *freopen (__const char *__restrict __filename, __const char *__restrict __modes, - FILE *__restrict __stream) __wur; + FILE *__restrict __stream); #else # ifdef __REDIRECT extern FILE *__REDIRECT (fopen, (__const char *__restrict __filename, - __const char *__restrict __modes), fopen64) - __wur; + __const char *__restrict __modes), fopen64); extern FILE *__REDIRECT (freopen, (__const char *__restrict __filename, __const char *__restrict __modes, - FILE *__restrict __stream), freopen64) - __wur; + FILE *__restrict __stream), freopen64); # else # define fopen fopen64 # define freopen freopen64 @@ -269,15 +267,15 @@ extern FILE *__REDIRECT (freopen, (__const char *__restrict __filename, __END_NAMESPACE_STD #ifdef __USE_LARGEFILE64 extern FILE *fopen64 (__const char *__restrict __filename, - __const char *__restrict __modes) __wur; + __const char *__restrict __modes); extern FILE *freopen64 (__const char *__restrict __filename, __const char *__restrict __modes, - FILE *__restrict __stream) __wur; + FILE *__restrict __stream); #endif #ifdef __USE_POSIX /* Create a new stream that refers to an existing system file descriptor. */ -extern FILE *fdopen (int __fd, __const char *__modes) __THROW __wur; +extern FILE *fdopen (int __fd, __const char *__modes) __THROW; #endif #ifdef __USE_GNU @@ -285,16 +283,15 @@ extern FILE *fdopen (int __fd, __const char *__modes) __THROW __wur; and uses the given functions for input and output. */ extern FILE *fopencookie (void *__restrict __magic_cookie, __const char *__restrict __modes, - _IO_cookie_io_functions_t __io_funcs) __THROW __wur; + _IO_cookie_io_functions_t __io_funcs) __THROW; /* Create a new stream that refers to a memory buffer. */ -extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes) - __THROW __wur; +extern FILE *fmemopen (void *__s, size_t __len, __const char *__modes) __THROW; /* Open a stream that writes into a malloc'd buffer that is expanded as necessary. *BUFLOC and *SIZELOC are updated with the buffer's location and the number of characters written on fflush or fclose. */ -extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __THROW __wur; +extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __THROW; #endif @@ -370,13 +367,13 @@ __END_NAMESPACE_C99 Store the address of the string in *PTR. */ extern int vasprintf (char **__restrict __ptr, __const char *__restrict __f, _G_va_list __arg) - __THROW __attribute__ ((__format__ (__printf__, 2, 0))) __wur; + __THROW __attribute__ ((__format__ (__printf__, 2, 0))); extern int __asprintf (char **__restrict __ptr, __const char *__restrict __fmt, ...) - __THROW __attribute__ ((__format__ (__printf__, 2, 3))) __wur; + __THROW __attribute__ ((__format__ (__printf__, 2, 3))); extern int asprintf (char **__restrict __ptr, __const char *__restrict __fmt, ...) - __THROW __attribute__ ((__format__ (__printf__, 2, 3))) __wur; + __THROW __attribute__ ((__format__ (__printf__, 2, 3))); /* Write formatted output to a file descriptor. diff --git a/libio/vswprintf.c b/libio/vswprintf.c index e9a316a01c..5bbd20227b 100644 --- a/libio/vswprintf.c +++ b/libio/vswprintf.c @@ -119,7 +119,7 @@ _IO_vswprintf (string, maxlen, format, args) if (sf.f._sbf._f._wide_data->_IO_buf_base == sf.overflow_buf) /* ISO C99 requires swprintf/vswprintf to return an error if the - output does not fit in the provided buffer. */ + output does not fit int he provided buffer. */ return -1; /* Terminate the string. */ diff --git a/locale/C-translit.h b/locale/C-translit.h index 568db4866f..adb009ba56 100644 --- a/locale/C-translit.h +++ b/locale/C-translit.h @@ -1,4 +1,4 @@ -#define NTRANSLIT 1352 +#define NTRANSLIT 1353 static const uint32_t translit_from_idx[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, @@ -113,7 +113,7 @@ static const uint32_t translit_from_idx[] = 2616, 2618, 2620, 2622, 2624, 2626, 2628, 2630, 2632, 2634, 2636, 2638, 2640, 2642, 2644, 2646, 2648, 2650, 2652, 2654, 2656, 2658, 2660, 2662, 2664, 2666, 2668, 2670, 2672, 2674, 2676, 2678, 2680, 2682, 2684, 2686, - 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702 + 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704 }; static const wchar_t translit_from_tbl[] = L"\x00a0" L"\0" L"\x00a9" L"\0" L"\x00ab" L"\0" L"\x00ad" L"\0" L"\x00ae" @@ -132,335 +132,336 @@ static const wchar_t translit_from_tbl[] = L"\0" L"\x201d" L"\0" L"\x201e" L"\0" L"\x201f" L"\0" L"\x2020" L"\0" L"\x2022" L"\0" L"\x2024" L"\0" L"\x2025" L"\0" L"\x2026" L"\0" L"\x202f" L"\0" L"\x2035" L"\0" L"\x2036" L"\0" L"\x2037" L"\0" L"\x2039" L"\0" - L"\x203a" L"\0" L"\x203c" L"\0" L"\x2047" L"\0" L"\x2048" L"\0" L"\x2049" - L"\0" L"\x205f" L"\0" L"\x2060" L"\0" L"\x2061" L"\0" L"\x2062" L"\0" - L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x2100" L"\0" L"\x2101" - L"\0" L"\x2102" L"\0" L"\x2105" L"\0" L"\x2106" L"\0" L"\x210a" L"\0" - L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" L"\0" L"\x210e" L"\0" L"\x2110" - L"\0" L"\x2111" L"\0" L"\x2112" L"\0" L"\x2113" L"\0" L"\x2115" L"\0" - L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" L"\0" L"\x211b" L"\0" L"\x211c" - L"\0" L"\x211d" L"\0" L"\x2121" L"\0" L"\x2122" L"\0" L"\x2124" L"\0" - L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" L"\0" L"\x212d" L"\0" L"\x212e" - L"\0" L"\x212f" L"\0" L"\x2130" L"\0" L"\x2131" L"\0" L"\x2133" L"\0" - L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" L"\0" L"\x2146" L"\0" L"\x2147" - L"\0" L"\x2148" L"\0" L"\x2149" L"\0" L"\x2153" L"\0" L"\x2154" L"\0" - L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" L"\0" L"\x2158" L"\0" L"\x2159" - L"\0" L"\x215a" L"\0" L"\x215b" L"\0" L"\x215c" L"\0" L"\x215d" L"\0" - L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" L"\0" L"\x2161" L"\0" L"\x2162" - L"\0" L"\x2163" L"\0" L"\x2164" L"\0" L"\x2165" L"\0" L"\x2166" L"\0" - L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" L"\0" L"\x216a" L"\0" L"\x216b" - L"\0" L"\x216c" L"\0" L"\x216d" L"\0" L"\x216e" L"\0" L"\x216f" L"\0" - L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" L"\0" L"\x2173" L"\0" L"\x2174" - L"\0" L"\x2175" L"\0" L"\x2176" L"\0" L"\x2177" L"\0" L"\x2178" L"\0" - L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" L"\0" L"\x217c" L"\0" L"\x217d" - L"\0" L"\x217e" L"\0" L"\x217f" L"\0" L"\x2190" L"\0" L"\x2192" L"\0" - L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" L"\0" L"\x21d4" L"\0" L"\x2212" - L"\0" L"\x2215" L"\0" L"\x2216" L"\0" L"\x2217" L"\0" L"\x2223" L"\0" - L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" L"\0" L"\x2265" L"\0" L"\x226a" - L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" L"\x22d9" L"\0" L"\x2400" L"\0" - L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" L"\0" L"\x2404" L"\0" L"\x2405" - L"\0" L"\x2406" L"\0" L"\x2407" L"\0" L"\x2408" L"\0" L"\x2409" L"\0" - L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" L"\0" L"\x240d" L"\0" L"\x240e" - L"\0" L"\x240f" L"\0" L"\x2410" L"\0" L"\x2411" L"\0" L"\x2412" L"\0" - L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" L"\0" L"\x2416" L"\0" L"\x2417" - L"\0" L"\x2418" L"\0" L"\x2419" L"\0" L"\x241a" L"\0" L"\x241b" L"\0" - L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" L"\0" L"\x241f" L"\0" L"\x2420" - L"\0" L"\x2421" L"\0" L"\x2423" L"\0" L"\x2424" L"\0" L"\x2460" L"\0" - L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" L"\0" L"\x2464" L"\0" L"\x2465" - L"\0" L"\x2466" L"\0" L"\x2467" L"\0" L"\x2468" L"\0" L"\x2469" L"\0" - L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" L"\0" L"\x246d" L"\0" L"\x246e" - L"\0" L"\x246f" L"\0" L"\x2470" L"\0" L"\x2471" L"\0" L"\x2472" L"\0" - L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" L"\0" L"\x2476" L"\0" L"\x2477" - L"\0" L"\x2478" L"\0" L"\x2479" L"\0" L"\x247a" L"\0" L"\x247b" L"\0" - L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" L"\0" L"\x247f" L"\0" L"\x2480" - L"\0" L"\x2481" L"\0" L"\x2482" L"\0" L"\x2483" L"\0" L"\x2484" L"\0" - L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" L"\0" L"\x2488" L"\0" L"\x2489" - L"\0" L"\x248a" L"\0" L"\x248b" L"\0" L"\x248c" L"\0" L"\x248d" L"\0" - L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" L"\0" L"\x2491" L"\0" L"\x2492" - L"\0" L"\x2493" L"\0" L"\x2494" L"\0" L"\x2495" L"\0" L"\x2496" L"\0" - L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" L"\0" L"\x249a" L"\0" L"\x249b" - L"\0" L"\x249c" L"\0" L"\x249d" L"\0" L"\x249e" L"\0" L"\x249f" L"\0" - L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" L"\0" L"\x24a3" L"\0" L"\x24a4" - L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" L"\x24a7" L"\0" L"\x24a8" L"\0" - L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" L"\0" L"\x24ac" L"\0" L"\x24ad" - L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" L"\x24b0" L"\0" L"\x24b1" L"\0" - L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" L"\0" L"\x24b5" L"\0" L"\x24b6" - L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" L"\x24b9" L"\0" L"\x24ba" L"\0" - L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" L"\0" L"\x24be" L"\0" L"\x24bf" - L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" L"\x24c2" L"\0" L"\x24c3" L"\0" - L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" L"\0" L"\x24c7" L"\0" L"\x24c8" - L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" L"\x24cb" L"\0" L"\x24cc" L"\0" - L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" L"\0" L"\x24d0" L"\0" L"\x24d1" - L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" L"\x24d4" L"\0" L"\x24d5" L"\0" - L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" L"\0" L"\x24d9" L"\0" L"\x24da" - L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" L"\x24dd" L"\0" L"\x24de" L"\0" - L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" L"\0" L"\x24e2" L"\0" L"\x24e3" - L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" L"\x24e6" L"\0" L"\x24e7" L"\0" - L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" L"\0" L"\x2500" L"\0" L"\x2502" - L"\0" L"\x250c" L"\0" L"\x2510" L"\0" L"\x2514" L"\0" L"\x2518" L"\0" - L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" L"\0" L"\x2534" L"\0" L"\x253c" - L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" L"\x2a75" L"\0" L"\x2a76" L"\0" - L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" L"\0" L"\x3252" L"\0" L"\x3253" - L"\0" L"\x3254" L"\0" L"\x3255" L"\0" L"\x3256" L"\0" L"\x3257" L"\0" - L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" L"\0" L"\x325b" L"\0" L"\x325c" - L"\0" L"\x325d" L"\0" L"\x325e" L"\0" L"\x325f" L"\0" L"\x32b1" L"\0" - L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" L"\0" L"\x32b5" L"\0" L"\x32b6" - L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" L"\x32b9" L"\0" L"\x32ba" L"\0" - L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" L"\0" L"\x32be" L"\0" L"\x32bf" - L"\0" L"\x3371" L"\0" L"\x3372" L"\0" L"\x3373" L"\0" L"\x3374" L"\0" - L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" L"\0" L"\x3381" L"\0" L"\x3382" - L"\0" L"\x3383" L"\0" L"\x3384" L"\0" L"\x3385" L"\0" L"\x3386" L"\0" - L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" L"\0" L"\x338a" L"\0" L"\x338b" - L"\0" L"\x338c" L"\0" L"\x338d" L"\0" L"\x338e" L"\0" L"\x338f" L"\0" - L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" L"\0" L"\x3393" L"\0" L"\x3394" - L"\0" L"\x3395" L"\0" L"\x3396" L"\0" L"\x3397" L"\0" L"\x3398" L"\0" - L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" L"\0" L"\x339c" L"\0" L"\x339d" - L"\0" L"\x339e" L"\0" L"\x339f" L"\0" L"\x33a0" L"\0" L"\x33a1" L"\0" - L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" L"\0" L"\x33a5" L"\0" L"\x33a6" - L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" L"\x33a9" L"\0" L"\x33aa" L"\0" - L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" L"\0" L"\x33ae" L"\0" L"\x33af" - L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" L"\x33b2" L"\0" L"\x33b3" L"\0" - L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" L"\0" L"\x33b7" L"\0" L"\x33b8" - L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" L"\x33bb" L"\0" L"\x33bc" L"\0" - L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" L"\0" L"\x33c2" L"\0" L"\x33c3" - L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" L"\x33c6" L"\0" L"\x33c7" L"\0" - L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" L"\0" L"\x33cb" L"\0" L"\x33cc" - L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" L"\x33cf" L"\0" L"\x33d0" L"\0" - L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" L"\0" L"\x33d4" L"\0" L"\x33d5" - L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" L"\x33d8" L"\0" L"\x33d9" L"\0" - L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" L"\0" L"\x33dd" L"\0" L"\xfb00" - L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" L"\xfb03" L"\0" L"\xfb04" L"\0" - L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" L"\0" L"\xfe01" L"\0" L"\xfe02" - L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" L"\xfe05" L"\0" L"\xfe06" L"\0" - L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" L"\0" L"\xfe0a" L"\0" L"\xfe0b" - L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" L"\xfe0e" L"\0" L"\xfe0f" L"\0" - L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" L"\0" L"\xfe50" L"\0" L"\xfe52" - L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" L"\xfe56" L"\0" L"\xfe57" L"\0" - L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" L"\0" L"\xfe5c" L"\0" L"\xfe5f" - L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" L"\xfe62" L"\0" L"\xfe63" L"\0" - L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" L"\0" L"\xfe68" L"\0" L"\xfe69" - L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" L"\xfeff" L"\0" L"\xff01" L"\0" - L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" L"\0" L"\xff05" L"\0" L"\xff06" - L"\0" L"\xff07" L"\0" L"\xff08" L"\0" L"\xff09" L"\0" L"\xff0a" L"\0" - L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" L"\0" L"\xff0e" L"\0" L"\xff0f" - L"\0" L"\xff10" L"\0" L"\xff11" L"\0" L"\xff12" L"\0" L"\xff13" L"\0" - L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" L"\0" L"\xff17" L"\0" L"\xff18" - L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" L"\xff1b" L"\0" L"\xff1c" L"\0" - L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" L"\0" L"\xff20" L"\0" L"\xff21" - L"\0" L"\xff22" L"\0" L"\xff23" L"\0" L"\xff24" L"\0" L"\xff25" L"\0" - L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" L"\0" L"\xff29" L"\0" L"\xff2a" - L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" L"\xff2d" L"\0" L"\xff2e" L"\0" - L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" L"\0" L"\xff32" L"\0" L"\xff33" - L"\0" L"\xff34" L"\0" L"\xff35" L"\0" L"\xff36" L"\0" L"\xff37" L"\0" - L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" L"\0" L"\xff3b" L"\0" L"\xff3c" - L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" L"\xff3f" L"\0" L"\xff40" L"\0" - L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" L"\0" L"\xff44" L"\0" L"\xff45" - L"\0" L"\xff46" L"\0" L"\xff47" L"\0" L"\xff48" L"\0" L"\xff49" L"\0" - L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" L"\0" L"\xff4d" L"\0" L"\xff4e" - L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" L"\xff51" L"\0" L"\xff52" L"\0" - L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" L"\0" L"\xff56" L"\0" L"\xff57" - L"\0" L"\xff58" L"\0" L"\xff59" L"\0" L"\xff5a" L"\0" L"\xff5b" L"\0" - L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" L"\0" L"\x0001d400" L"\0" - L"\x0001d401" L"\0" L"\x0001d402" L"\0" L"\x0001d403" L"\0" L"\x0001d404" - L"\0" L"\x0001d405" L"\0" L"\x0001d406" L"\0" L"\x0001d407" L"\0" - L"\x0001d408" L"\0" L"\x0001d409" L"\0" L"\x0001d40a" L"\0" L"\x0001d40b" - L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" L"\0" L"\x0001d40e" L"\0" - L"\x0001d40f" L"\0" L"\x0001d410" L"\0" L"\x0001d411" L"\0" L"\x0001d412" - L"\0" L"\x0001d413" L"\0" L"\x0001d414" L"\0" L"\x0001d415" L"\0" - L"\x0001d416" L"\0" L"\x0001d417" L"\0" L"\x0001d418" L"\0" L"\x0001d419" - L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" L"\0" L"\x0001d41c" L"\0" - L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" L"\x0001d41f" L"\0" L"\x0001d420" - L"\0" L"\x0001d421" L"\0" L"\x0001d422" L"\0" L"\x0001d423" L"\0" - L"\x0001d424" L"\0" L"\x0001d425" L"\0" L"\x0001d426" L"\0" L"\x0001d427" - L"\0" L"\x0001d428" L"\0" L"\x0001d429" L"\0" L"\x0001d42a" L"\0" - L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" L"\x0001d42d" L"\0" L"\x0001d42e" - L"\0" L"\x0001d42f" L"\0" L"\x0001d430" L"\0" L"\x0001d431" L"\0" - L"\x0001d432" L"\0" L"\x0001d433" L"\0" L"\x0001d434" L"\0" L"\x0001d435" - L"\0" L"\x0001d436" L"\0" L"\x0001d437" L"\0" L"\x0001d438" L"\0" - L"\x0001d439" L"\0" L"\x0001d43a" L"\0" L"\x0001d43b" L"\0" L"\x0001d43c" - L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" L"\0" L"\x0001d43f" L"\0" - L"\x0001d440" L"\0" L"\x0001d441" L"\0" L"\x0001d442" L"\0" L"\x0001d443" - L"\0" L"\x0001d444" L"\0" L"\x0001d445" L"\0" L"\x0001d446" L"\0" - L"\x0001d447" L"\0" L"\x0001d448" L"\0" L"\x0001d449" L"\0" L"\x0001d44a" - L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" L"\0" L"\x0001d44d" L"\0" - L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" L"\x0001d450" L"\0" L"\x0001d451" - L"\0" L"\x0001d452" L"\0" L"\x0001d453" L"\0" L"\x0001d454" L"\0" - L"\x0001d456" L"\0" L"\x0001d457" L"\0" L"\x0001d458" L"\0" L"\x0001d459" - L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" L"\0" L"\x0001d45c" L"\0" - L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" L"\x0001d45f" L"\0" L"\x0001d460" - L"\0" L"\x0001d461" L"\0" L"\x0001d462" L"\0" L"\x0001d463" L"\0" - L"\x0001d464" L"\0" L"\x0001d465" L"\0" L"\x0001d466" L"\0" L"\x0001d467" - L"\0" L"\x0001d468" L"\0" L"\x0001d469" L"\0" L"\x0001d46a" L"\0" - L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" L"\x0001d46d" L"\0" L"\x0001d46e" - L"\0" L"\x0001d46f" L"\0" L"\x0001d470" L"\0" L"\x0001d471" L"\0" - L"\x0001d472" L"\0" L"\x0001d473" L"\0" L"\x0001d474" L"\0" L"\x0001d475" - L"\0" L"\x0001d476" L"\0" L"\x0001d477" L"\0" L"\x0001d478" L"\0" - L"\x0001d479" L"\0" L"\x0001d47a" L"\0" L"\x0001d47b" L"\0" L"\x0001d47c" - L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" L"\0" L"\x0001d47f" L"\0" - L"\x0001d480" L"\0" L"\x0001d481" L"\0" L"\x0001d482" L"\0" L"\x0001d483" - L"\0" L"\x0001d484" L"\0" L"\x0001d485" L"\0" L"\x0001d486" L"\0" - L"\x0001d487" L"\0" L"\x0001d488" L"\0" L"\x0001d489" L"\0" L"\x0001d48a" - L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" L"\0" L"\x0001d48d" L"\0" - L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" L"\x0001d490" L"\0" L"\x0001d491" - L"\0" L"\x0001d492" L"\0" L"\x0001d493" L"\0" L"\x0001d494" L"\0" - L"\x0001d495" L"\0" L"\x0001d496" L"\0" L"\x0001d497" L"\0" L"\x0001d498" - L"\0" L"\x0001d499" L"\0" L"\x0001d49a" L"\0" L"\x0001d49b" L"\0" - L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" L"\x0001d49f" L"\0" L"\x0001d4a2" - L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" L"\0" L"\x0001d4a9" L"\0" - L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" L"\x0001d4ac" L"\0" L"\x0001d4ae" - L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" L"\0" L"\x0001d4b1" L"\0" - L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" L"\x0001d4b4" L"\0" L"\x0001d4b5" - L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" L"\0" L"\x0001d4b8" L"\0" - L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" L"\x0001d4bd" L"\0" L"\x0001d4be" - L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" L"\0" L"\x0001d4c2" L"\0" - L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" L"\x0001d4c6" L"\0" L"\x0001d4c7" - L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" L"\0" L"\x0001d4ca" L"\0" - L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" L"\x0001d4cd" L"\0" L"\x0001d4ce" - L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" L"\0" L"\x0001d4d1" L"\0" - L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" L"\x0001d4d4" L"\0" L"\x0001d4d5" - L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" L"\0" L"\x0001d4d8" L"\0" - L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" L"\x0001d4db" L"\0" L"\x0001d4dc" - L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" L"\0" L"\x0001d4df" L"\0" - L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" L"\x0001d4e2" L"\0" L"\x0001d4e3" - L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" L"\0" L"\x0001d4e6" L"\0" - L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" L"\x0001d4e9" L"\0" L"\x0001d4ea" - L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" L"\0" L"\x0001d4ed" L"\0" - L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" L"\x0001d4f0" L"\0" L"\x0001d4f1" - L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" L"\0" L"\x0001d4f4" L"\0" - L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" L"\x0001d4f7" L"\0" L"\x0001d4f8" - L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" L"\0" L"\x0001d4fb" L"\0" - L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" L"\x0001d4fe" L"\0" L"\x0001d4ff" - L"\0" L"\x0001d500" L"\0" L"\x0001d501" L"\0" L"\x0001d502" L"\0" - L"\x0001d503" L"\0" L"\x0001d504" L"\0" L"\x0001d505" L"\0" L"\x0001d507" - L"\0" L"\x0001d508" L"\0" L"\x0001d509" L"\0" L"\x0001d50a" L"\0" - L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" L"\x0001d50f" L"\0" L"\x0001d510" - L"\0" L"\x0001d511" L"\0" L"\x0001d512" L"\0" L"\x0001d513" L"\0" - L"\x0001d514" L"\0" L"\x0001d516" L"\0" L"\x0001d517" L"\0" L"\x0001d518" - L"\0" L"\x0001d519" L"\0" L"\x0001d51a" L"\0" L"\x0001d51b" L"\0" - L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" L"\x0001d51f" L"\0" L"\x0001d520" - L"\0" L"\x0001d521" L"\0" L"\x0001d522" L"\0" L"\x0001d523" L"\0" - L"\x0001d524" L"\0" L"\x0001d525" L"\0" L"\x0001d526" L"\0" L"\x0001d527" - L"\0" L"\x0001d528" L"\0" L"\x0001d529" L"\0" L"\x0001d52a" L"\0" - L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" L"\x0001d52d" L"\0" L"\x0001d52e" - L"\0" L"\x0001d52f" L"\0" L"\x0001d530" L"\0" L"\x0001d531" L"\0" - L"\x0001d532" L"\0" L"\x0001d533" L"\0" L"\x0001d534" L"\0" L"\x0001d535" - L"\0" L"\x0001d536" L"\0" L"\x0001d537" L"\0" L"\x0001d538" L"\0" - L"\x0001d539" L"\0" L"\x0001d53b" L"\0" L"\x0001d53c" L"\0" L"\x0001d53d" - L"\0" L"\x0001d53e" L"\0" L"\x0001d540" L"\0" L"\x0001d541" L"\0" - L"\x0001d542" L"\0" L"\x0001d543" L"\0" L"\x0001d544" L"\0" L"\x0001d546" - L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" L"\0" L"\x0001d54c" L"\0" - L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" L"\x0001d54f" L"\0" L"\x0001d550" - L"\0" L"\x0001d552" L"\0" L"\x0001d553" L"\0" L"\x0001d554" L"\0" - L"\x0001d555" L"\0" L"\x0001d556" L"\0" L"\x0001d557" L"\0" L"\x0001d558" - L"\0" L"\x0001d559" L"\0" L"\x0001d55a" L"\0" L"\x0001d55b" L"\0" - L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" L"\x0001d55e" L"\0" L"\x0001d55f" - L"\0" L"\x0001d560" L"\0" L"\x0001d561" L"\0" L"\x0001d562" L"\0" - L"\x0001d563" L"\0" L"\x0001d564" L"\0" L"\x0001d565" L"\0" L"\x0001d566" - L"\0" L"\x0001d567" L"\0" L"\x0001d568" L"\0" L"\x0001d569" L"\0" - L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" L"\x0001d56c" L"\0" L"\x0001d56d" - L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" L"\0" L"\x0001d570" L"\0" - L"\x0001d571" L"\0" L"\x0001d572" L"\0" L"\x0001d573" L"\0" L"\x0001d574" - L"\0" L"\x0001d575" L"\0" L"\x0001d576" L"\0" L"\x0001d577" L"\0" - L"\x0001d578" L"\0" L"\x0001d579" L"\0" L"\x0001d57a" L"\0" L"\x0001d57b" - L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" L"\0" L"\x0001d57e" L"\0" - L"\x0001d57f" L"\0" L"\x0001d580" L"\0" L"\x0001d581" L"\0" L"\x0001d582" - L"\0" L"\x0001d583" L"\0" L"\x0001d584" L"\0" L"\x0001d585" L"\0" - L"\x0001d586" L"\0" L"\x0001d587" L"\0" L"\x0001d588" L"\0" L"\x0001d589" - L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" L"\0" L"\x0001d58c" L"\0" - L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" L"\x0001d58f" L"\0" L"\x0001d590" - L"\0" L"\x0001d591" L"\0" L"\x0001d592" L"\0" L"\x0001d593" L"\0" - L"\x0001d594" L"\0" L"\x0001d595" L"\0" L"\x0001d596" L"\0" L"\x0001d597" - L"\0" L"\x0001d598" L"\0" L"\x0001d599" L"\0" L"\x0001d59a" L"\0" - L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" L"\x0001d59d" L"\0" L"\x0001d59e" - L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" L"\0" L"\x0001d5a1" L"\0" - L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" L"\x0001d5a4" L"\0" L"\x0001d5a5" - L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" L"\0" L"\x0001d5a8" L"\0" - L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" L"\x0001d5ab" L"\0" L"\x0001d5ac" - L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" L"\0" L"\x0001d5af" L"\0" - L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" L"\x0001d5b2" L"\0" L"\x0001d5b3" - L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" L"\0" L"\x0001d5b6" L"\0" - L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" L"\x0001d5b9" L"\0" L"\x0001d5ba" - L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" L"\0" L"\x0001d5bd" L"\0" - L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" L"\x0001d5c0" L"\0" L"\x0001d5c1" - L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" L"\0" L"\x0001d5c4" L"\0" - L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" L"\x0001d5c7" L"\0" L"\x0001d5c8" - L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" L"\0" L"\x0001d5cb" L"\0" - L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" L"\x0001d5ce" L"\0" L"\x0001d5cf" - L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" L"\0" L"\x0001d5d2" L"\0" - L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" L"\x0001d5d5" L"\0" L"\x0001d5d6" - L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" L"\0" L"\x0001d5d9" L"\0" - L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" L"\x0001d5dc" L"\0" L"\x0001d5dd" - L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" L"\0" L"\x0001d5e0" L"\0" - L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" L"\x0001d5e3" L"\0" L"\x0001d5e4" - L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" L"\0" L"\x0001d5e7" L"\0" - L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" L"\x0001d5ea" L"\0" L"\x0001d5eb" - L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" L"\0" L"\x0001d5ee" L"\0" - L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" L"\x0001d5f1" L"\0" L"\x0001d5f2" - L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" L"\0" L"\x0001d5f5" L"\0" - L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" L"\x0001d5f8" L"\0" L"\x0001d5f9" - L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" L"\0" L"\x0001d5fc" L"\0" - L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" L"\x0001d5ff" L"\0" L"\x0001d600" - L"\0" L"\x0001d601" L"\0" L"\x0001d602" L"\0" L"\x0001d603" L"\0" - L"\x0001d604" L"\0" L"\x0001d605" L"\0" L"\x0001d606" L"\0" L"\x0001d607" - L"\0" L"\x0001d608" L"\0" L"\x0001d609" L"\0" L"\x0001d60a" L"\0" - L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" L"\x0001d60d" L"\0" L"\x0001d60e" - L"\0" L"\x0001d60f" L"\0" L"\x0001d610" L"\0" L"\x0001d611" L"\0" - L"\x0001d612" L"\0" L"\x0001d613" L"\0" L"\x0001d614" L"\0" L"\x0001d615" - L"\0" L"\x0001d616" L"\0" L"\x0001d617" L"\0" L"\x0001d618" L"\0" - L"\x0001d619" L"\0" L"\x0001d61a" L"\0" L"\x0001d61b" L"\0" L"\x0001d61c" - L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" L"\0" L"\x0001d61f" L"\0" - L"\x0001d620" L"\0" L"\x0001d621" L"\0" L"\x0001d622" L"\0" L"\x0001d623" - L"\0" L"\x0001d624" L"\0" L"\x0001d625" L"\0" L"\x0001d626" L"\0" - L"\x0001d627" L"\0" L"\x0001d628" L"\0" L"\x0001d629" L"\0" L"\x0001d62a" - L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" L"\0" L"\x0001d62d" L"\0" - L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" L"\x0001d630" L"\0" L"\x0001d631" - L"\0" L"\x0001d632" L"\0" L"\x0001d633" L"\0" L"\x0001d634" L"\0" - L"\x0001d635" L"\0" L"\x0001d636" L"\0" L"\x0001d637" L"\0" L"\x0001d638" - L"\0" L"\x0001d639" L"\0" L"\x0001d63a" L"\0" L"\x0001d63b" L"\0" - L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" L"\x0001d63e" L"\0" L"\x0001d63f" - L"\0" L"\x0001d640" L"\0" L"\x0001d641" L"\0" L"\x0001d642" L"\0" - L"\x0001d643" L"\0" L"\x0001d644" L"\0" L"\x0001d645" L"\0" L"\x0001d646" - L"\0" L"\x0001d647" L"\0" L"\x0001d648" L"\0" L"\x0001d649" L"\0" - L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" L"\x0001d64c" L"\0" L"\x0001d64d" - L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" L"\0" L"\x0001d650" L"\0" - L"\x0001d651" L"\0" L"\x0001d652" L"\0" L"\x0001d653" L"\0" L"\x0001d654" - L"\0" L"\x0001d655" L"\0" L"\x0001d656" L"\0" L"\x0001d657" L"\0" - L"\x0001d658" L"\0" L"\x0001d659" L"\0" L"\x0001d65a" L"\0" L"\x0001d65b" - L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" L"\0" L"\x0001d65e" L"\0" - L"\x0001d65f" L"\0" L"\x0001d660" L"\0" L"\x0001d661" L"\0" L"\x0001d662" - L"\0" L"\x0001d663" L"\0" L"\x0001d664" L"\0" L"\x0001d665" L"\0" - L"\x0001d666" L"\0" L"\x0001d667" L"\0" L"\x0001d668" L"\0" L"\x0001d669" - L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" L"\0" L"\x0001d66c" L"\0" - L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" L"\x0001d66f" L"\0" L"\x0001d670" - L"\0" L"\x0001d671" L"\0" L"\x0001d672" L"\0" L"\x0001d673" L"\0" - L"\x0001d674" L"\0" L"\x0001d675" L"\0" L"\x0001d676" L"\0" L"\x0001d677" - L"\0" L"\x0001d678" L"\0" L"\x0001d679" L"\0" L"\x0001d67a" L"\0" - L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" L"\x0001d67d" L"\0" L"\x0001d67e" - L"\0" L"\x0001d67f" L"\0" L"\x0001d680" L"\0" L"\x0001d681" L"\0" - L"\x0001d682" L"\0" L"\x0001d683" L"\0" L"\x0001d684" L"\0" L"\x0001d685" - L"\0" L"\x0001d686" L"\0" L"\x0001d687" L"\0" L"\x0001d688" L"\0" - L"\x0001d689" L"\0" L"\x0001d68a" L"\0" L"\x0001d68b" L"\0" L"\x0001d68c" - L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" L"\0" L"\x0001d68f" L"\0" - L"\x0001d690" L"\0" L"\x0001d691" L"\0" L"\x0001d692" L"\0" L"\x0001d693" - L"\0" L"\x0001d694" L"\0" L"\x0001d695" L"\0" L"\x0001d696" L"\0" - L"\x0001d697" L"\0" L"\x0001d698" L"\0" L"\x0001d699" L"\0" L"\x0001d69a" - L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" L"\0" L"\x0001d69d" L"\0" - L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" L"\x0001d6a0" L"\0" L"\x0001d6a1" - L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" L"\0" L"\x0001d7ce" L"\0" - L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" L"\x0001d7d1" L"\0" L"\x0001d7d2" - L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" L"\0" L"\x0001d7d5" L"\0" - L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" L"\x0001d7d8" L"\0" L"\x0001d7d9" - L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" L"\0" L"\x0001d7dc" L"\0" - L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" L"\x0001d7df" L"\0" L"\x0001d7e0" - L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" L"\0" L"\x0001d7e3" L"\0" - L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" L"\x0001d7e6" L"\0" L"\x0001d7e7" - L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" L"\0" L"\x0001d7ea" L"\0" - L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" L"\x0001d7ed" L"\0" L"\x0001d7ee" - L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" L"\0" L"\x0001d7f1" L"\0" - L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" L"\x0001d7f4" L"\0" L"\x0001d7f5" - L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" L"\0" L"\x0001d7f8" L"\0" - L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" L"\x0001d7fb" L"\0" L"\x0001d7fc" - L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" L"\0" L"\x0001d7ff"; + L"\x203a" L"\0" L"\x203c" L"\0" L"\x2044" L"\0" L"\x2047" L"\0" L"\x2048" + L"\0" L"\x2049" L"\0" L"\x205f" L"\0" L"\x2060" L"\0" L"\x2061" L"\0" + L"\x2062" L"\0" L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x2100" + L"\0" L"\x2101" L"\0" L"\x2102" L"\0" L"\x2105" L"\0" L"\x2106" L"\0" + L"\x210a" L"\0" L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" L"\0" L"\x210e" + L"\0" L"\x2110" L"\0" L"\x2111" L"\0" L"\x2112" L"\0" L"\x2113" L"\0" + L"\x2115" L"\0" L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" L"\0" L"\x211b" + L"\0" L"\x211c" L"\0" L"\x211d" L"\0" L"\x2121" L"\0" L"\x2122" L"\0" + L"\x2124" L"\0" L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" L"\0" L"\x212d" + L"\0" L"\x212e" L"\0" L"\x212f" L"\0" L"\x2130" L"\0" L"\x2131" L"\0" + L"\x2133" L"\0" L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" L"\0" L"\x2146" + L"\0" L"\x2147" L"\0" L"\x2148" L"\0" L"\x2149" L"\0" L"\x2153" L"\0" + L"\x2154" L"\0" L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" L"\0" L"\x2158" + L"\0" L"\x2159" L"\0" L"\x215a" L"\0" L"\x215b" L"\0" L"\x215c" L"\0" + L"\x215d" L"\0" L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" L"\0" L"\x2161" + L"\0" L"\x2162" L"\0" L"\x2163" L"\0" L"\x2164" L"\0" L"\x2165" L"\0" + L"\x2166" L"\0" L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" L"\0" L"\x216a" + L"\0" L"\x216b" L"\0" L"\x216c" L"\0" L"\x216d" L"\0" L"\x216e" L"\0" + L"\x216f" L"\0" L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" L"\0" L"\x2173" + L"\0" L"\x2174" L"\0" L"\x2175" L"\0" L"\x2176" L"\0" L"\x2177" L"\0" + L"\x2178" L"\0" L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" L"\0" L"\x217c" + L"\0" L"\x217d" L"\0" L"\x217e" L"\0" L"\x217f" L"\0" L"\x2190" L"\0" + L"\x2192" L"\0" L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" L"\0" L"\x21d4" + L"\0" L"\x2212" L"\0" L"\x2215" L"\0" L"\x2216" L"\0" L"\x2217" L"\0" + L"\x2223" L"\0" L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" L"\0" L"\x2265" + L"\0" L"\x226a" L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" L"\x22d9" L"\0" + L"\x2400" L"\0" L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" L"\0" L"\x2404" + L"\0" L"\x2405" L"\0" L"\x2406" L"\0" L"\x2407" L"\0" L"\x2408" L"\0" + L"\x2409" L"\0" L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" L"\0" L"\x240d" + L"\0" L"\x240e" L"\0" L"\x240f" L"\0" L"\x2410" L"\0" L"\x2411" L"\0" + L"\x2412" L"\0" L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" L"\0" L"\x2416" + L"\0" L"\x2417" L"\0" L"\x2418" L"\0" L"\x2419" L"\0" L"\x241a" L"\0" + L"\x241b" L"\0" L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" L"\0" L"\x241f" + L"\0" L"\x2420" L"\0" L"\x2421" L"\0" L"\x2423" L"\0" L"\x2424" L"\0" + L"\x2460" L"\0" L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" L"\0" L"\x2464" + L"\0" L"\x2465" L"\0" L"\x2466" L"\0" L"\x2467" L"\0" L"\x2468" L"\0" + L"\x2469" L"\0" L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" L"\0" L"\x246d" + L"\0" L"\x246e" L"\0" L"\x246f" L"\0" L"\x2470" L"\0" L"\x2471" L"\0" + L"\x2472" L"\0" L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" L"\0" L"\x2476" + L"\0" L"\x2477" L"\0" L"\x2478" L"\0" L"\x2479" L"\0" L"\x247a" L"\0" + L"\x247b" L"\0" L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" L"\0" L"\x247f" + L"\0" L"\x2480" L"\0" L"\x2481" L"\0" L"\x2482" L"\0" L"\x2483" L"\0" + L"\x2484" L"\0" L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" L"\0" L"\x2488" + L"\0" L"\x2489" L"\0" L"\x248a" L"\0" L"\x248b" L"\0" L"\x248c" L"\0" + L"\x248d" L"\0" L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" L"\0" L"\x2491" + L"\0" L"\x2492" L"\0" L"\x2493" L"\0" L"\x2494" L"\0" L"\x2495" L"\0" + L"\x2496" L"\0" L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" L"\0" L"\x249a" + L"\0" L"\x249b" L"\0" L"\x249c" L"\0" L"\x249d" L"\0" L"\x249e" L"\0" + L"\x249f" L"\0" L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" L"\0" L"\x24a3" + L"\0" L"\x24a4" L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" L"\x24a7" L"\0" + L"\x24a8" L"\0" L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" L"\0" L"\x24ac" + L"\0" L"\x24ad" L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" L"\x24b0" L"\0" + L"\x24b1" L"\0" L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" L"\0" L"\x24b5" + L"\0" L"\x24b6" L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" L"\x24b9" L"\0" + L"\x24ba" L"\0" L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" L"\0" L"\x24be" + L"\0" L"\x24bf" L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" L"\x24c2" L"\0" + L"\x24c3" L"\0" L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" L"\0" L"\x24c7" + L"\0" L"\x24c8" L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" L"\x24cb" L"\0" + L"\x24cc" L"\0" L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" L"\0" L"\x24d0" + L"\0" L"\x24d1" L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" L"\x24d4" L"\0" + L"\x24d5" L"\0" L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" L"\0" L"\x24d9" + L"\0" L"\x24da" L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" L"\x24dd" L"\0" + L"\x24de" L"\0" L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" L"\0" L"\x24e2" + L"\0" L"\x24e3" L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" L"\x24e6" L"\0" + L"\x24e7" L"\0" L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" L"\0" L"\x2500" + L"\0" L"\x2502" L"\0" L"\x250c" L"\0" L"\x2510" L"\0" L"\x2514" L"\0" + L"\x2518" L"\0" L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" L"\0" L"\x2534" + L"\0" L"\x253c" L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" L"\x2a75" L"\0" + L"\x2a76" L"\0" L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" L"\0" L"\x3252" + L"\0" L"\x3253" L"\0" L"\x3254" L"\0" L"\x3255" L"\0" L"\x3256" L"\0" + L"\x3257" L"\0" L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" L"\0" L"\x325b" + L"\0" L"\x325c" L"\0" L"\x325d" L"\0" L"\x325e" L"\0" L"\x325f" L"\0" + L"\x32b1" L"\0" L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" L"\0" L"\x32b5" + L"\0" L"\x32b6" L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" L"\x32b9" L"\0" + L"\x32ba" L"\0" L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" L"\0" L"\x32be" + L"\0" L"\x32bf" L"\0" L"\x3371" L"\0" L"\x3372" L"\0" L"\x3373" L"\0" + L"\x3374" L"\0" L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" L"\0" L"\x3381" + L"\0" L"\x3382" L"\0" L"\x3383" L"\0" L"\x3384" L"\0" L"\x3385" L"\0" + L"\x3386" L"\0" L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" L"\0" L"\x338a" + L"\0" L"\x338b" L"\0" L"\x338c" L"\0" L"\x338d" L"\0" L"\x338e" L"\0" + L"\x338f" L"\0" L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" L"\0" L"\x3393" + L"\0" L"\x3394" L"\0" L"\x3395" L"\0" L"\x3396" L"\0" L"\x3397" L"\0" + L"\x3398" L"\0" L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" L"\0" L"\x339c" + L"\0" L"\x339d" L"\0" L"\x339e" L"\0" L"\x339f" L"\0" L"\x33a0" L"\0" + L"\x33a1" L"\0" L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" L"\0" L"\x33a5" + L"\0" L"\x33a6" L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" L"\x33a9" L"\0" + L"\x33aa" L"\0" L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" L"\0" L"\x33ae" + L"\0" L"\x33af" L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" L"\x33b2" L"\0" + L"\x33b3" L"\0" L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" L"\0" L"\x33b7" + L"\0" L"\x33b8" L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" L"\x33bb" L"\0" + L"\x33bc" L"\0" L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" L"\0" L"\x33c2" + L"\0" L"\x33c3" L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" L"\x33c6" L"\0" + L"\x33c7" L"\0" L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" L"\0" L"\x33cb" + L"\0" L"\x33cc" L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" L"\x33cf" L"\0" + L"\x33d0" L"\0" L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" L"\0" L"\x33d4" + L"\0" L"\x33d5" L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" L"\x33d8" L"\0" + L"\x33d9" L"\0" L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" L"\0" L"\x33dd" + L"\0" L"\xfb00" L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" L"\xfb03" L"\0" + L"\xfb04" L"\0" L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" L"\0" L"\xfe01" + L"\0" L"\xfe02" L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" L"\xfe05" L"\0" + L"\xfe06" L"\0" L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" L"\0" L"\xfe0a" + L"\0" L"\xfe0b" L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" L"\xfe0e" L"\0" + L"\xfe0f" L"\0" L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" L"\0" L"\xfe50" + L"\0" L"\xfe52" L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" L"\xfe56" L"\0" + L"\xfe57" L"\0" L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" L"\0" L"\xfe5c" + L"\0" L"\xfe5f" L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" L"\xfe62" L"\0" + L"\xfe63" L"\0" L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" L"\0" L"\xfe68" + L"\0" L"\xfe69" L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" L"\xfeff" L"\0" + L"\xff01" L"\0" L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" L"\0" L"\xff05" + L"\0" L"\xff06" L"\0" L"\xff07" L"\0" L"\xff08" L"\0" L"\xff09" L"\0" + L"\xff0a" L"\0" L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" L"\0" L"\xff0e" + L"\0" L"\xff0f" L"\0" L"\xff10" L"\0" L"\xff11" L"\0" L"\xff12" L"\0" + L"\xff13" L"\0" L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" L"\0" L"\xff17" + L"\0" L"\xff18" L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" L"\xff1b" L"\0" + L"\xff1c" L"\0" L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" L"\0" L"\xff20" + L"\0" L"\xff21" L"\0" L"\xff22" L"\0" L"\xff23" L"\0" L"\xff24" L"\0" + L"\xff25" L"\0" L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" L"\0" L"\xff29" + L"\0" L"\xff2a" L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" L"\xff2d" L"\0" + L"\xff2e" L"\0" L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" L"\0" L"\xff32" + L"\0" L"\xff33" L"\0" L"\xff34" L"\0" L"\xff35" L"\0" L"\xff36" L"\0" + L"\xff37" L"\0" L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" L"\0" L"\xff3b" + L"\0" L"\xff3c" L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" L"\xff3f" L"\0" + L"\xff40" L"\0" L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" L"\0" L"\xff44" + L"\0" L"\xff45" L"\0" L"\xff46" L"\0" L"\xff47" L"\0" L"\xff48" L"\0" + L"\xff49" L"\0" L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" L"\0" L"\xff4d" + L"\0" L"\xff4e" L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" L"\xff51" L"\0" + L"\xff52" L"\0" L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" L"\0" L"\xff56" + L"\0" L"\xff57" L"\0" L"\xff58" L"\0" L"\xff59" L"\0" L"\xff5a" L"\0" + L"\xff5b" L"\0" L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" L"\0" + L"\x0001d400" L"\0" L"\x0001d401" L"\0" L"\x0001d402" L"\0" L"\x0001d403" + L"\0" L"\x0001d404" L"\0" L"\x0001d405" L"\0" L"\x0001d406" L"\0" + L"\x0001d407" L"\0" L"\x0001d408" L"\0" L"\x0001d409" L"\0" L"\x0001d40a" + L"\0" L"\x0001d40b" L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" L"\0" + L"\x0001d40e" L"\0" L"\x0001d40f" L"\0" L"\x0001d410" L"\0" L"\x0001d411" + L"\0" L"\x0001d412" L"\0" L"\x0001d413" L"\0" L"\x0001d414" L"\0" + L"\x0001d415" L"\0" L"\x0001d416" L"\0" L"\x0001d417" L"\0" L"\x0001d418" + L"\0" L"\x0001d419" L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" L"\0" + L"\x0001d41c" L"\0" L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" L"\x0001d41f" + L"\0" L"\x0001d420" L"\0" L"\x0001d421" L"\0" L"\x0001d422" L"\0" + L"\x0001d423" L"\0" L"\x0001d424" L"\0" L"\x0001d425" L"\0" L"\x0001d426" + L"\0" L"\x0001d427" L"\0" L"\x0001d428" L"\0" L"\x0001d429" L"\0" + L"\x0001d42a" L"\0" L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" L"\x0001d42d" + L"\0" L"\x0001d42e" L"\0" L"\x0001d42f" L"\0" L"\x0001d430" L"\0" + L"\x0001d431" L"\0" L"\x0001d432" L"\0" L"\x0001d433" L"\0" L"\x0001d434" + L"\0" L"\x0001d435" L"\0" L"\x0001d436" L"\0" L"\x0001d437" L"\0" + L"\x0001d438" L"\0" L"\x0001d439" L"\0" L"\x0001d43a" L"\0" L"\x0001d43b" + L"\0" L"\x0001d43c" L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" L"\0" + L"\x0001d43f" L"\0" L"\x0001d440" L"\0" L"\x0001d441" L"\0" L"\x0001d442" + L"\0" L"\x0001d443" L"\0" L"\x0001d444" L"\0" L"\x0001d445" L"\0" + L"\x0001d446" L"\0" L"\x0001d447" L"\0" L"\x0001d448" L"\0" L"\x0001d449" + L"\0" L"\x0001d44a" L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" L"\0" + L"\x0001d44d" L"\0" L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" L"\x0001d450" + L"\0" L"\x0001d451" L"\0" L"\x0001d452" L"\0" L"\x0001d453" L"\0" + L"\x0001d454" L"\0" L"\x0001d456" L"\0" L"\x0001d457" L"\0" L"\x0001d458" + L"\0" L"\x0001d459" L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" L"\0" + L"\x0001d45c" L"\0" L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" L"\x0001d45f" + L"\0" L"\x0001d460" L"\0" L"\x0001d461" L"\0" L"\x0001d462" L"\0" + L"\x0001d463" L"\0" L"\x0001d464" L"\0" L"\x0001d465" L"\0" L"\x0001d466" + L"\0" L"\x0001d467" L"\0" L"\x0001d468" L"\0" L"\x0001d469" L"\0" + L"\x0001d46a" L"\0" L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" L"\x0001d46d" + L"\0" L"\x0001d46e" L"\0" L"\x0001d46f" L"\0" L"\x0001d470" L"\0" + L"\x0001d471" L"\0" L"\x0001d472" L"\0" L"\x0001d473" L"\0" L"\x0001d474" + L"\0" L"\x0001d475" L"\0" L"\x0001d476" L"\0" L"\x0001d477" L"\0" + L"\x0001d478" L"\0" L"\x0001d479" L"\0" L"\x0001d47a" L"\0" L"\x0001d47b" + L"\0" L"\x0001d47c" L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" L"\0" + L"\x0001d47f" L"\0" L"\x0001d480" L"\0" L"\x0001d481" L"\0" L"\x0001d482" + L"\0" L"\x0001d483" L"\0" L"\x0001d484" L"\0" L"\x0001d485" L"\0" + L"\x0001d486" L"\0" L"\x0001d487" L"\0" L"\x0001d488" L"\0" L"\x0001d489" + L"\0" L"\x0001d48a" L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" L"\0" + L"\x0001d48d" L"\0" L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" L"\x0001d490" + L"\0" L"\x0001d491" L"\0" L"\x0001d492" L"\0" L"\x0001d493" L"\0" + L"\x0001d494" L"\0" L"\x0001d495" L"\0" L"\x0001d496" L"\0" L"\x0001d497" + L"\0" L"\x0001d498" L"\0" L"\x0001d499" L"\0" L"\x0001d49a" L"\0" + L"\x0001d49b" L"\0" L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" L"\x0001d49f" + L"\0" L"\x0001d4a2" L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" L"\0" + L"\x0001d4a9" L"\0" L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" L"\x0001d4ac" + L"\0" L"\x0001d4ae" L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" L"\0" + L"\x0001d4b1" L"\0" L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" L"\x0001d4b4" + L"\0" L"\x0001d4b5" L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" L"\0" + L"\x0001d4b8" L"\0" L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" L"\x0001d4bd" + L"\0" L"\x0001d4be" L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" L"\0" + L"\x0001d4c2" L"\0" L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" L"\x0001d4c6" + L"\0" L"\x0001d4c7" L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" L"\0" + L"\x0001d4ca" L"\0" L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" L"\x0001d4cd" + L"\0" L"\x0001d4ce" L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" L"\0" + L"\x0001d4d1" L"\0" L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" L"\x0001d4d4" + L"\0" L"\x0001d4d5" L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" L"\0" + L"\x0001d4d8" L"\0" L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" L"\x0001d4db" + L"\0" L"\x0001d4dc" L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" L"\0" + L"\x0001d4df" L"\0" L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" L"\x0001d4e2" + L"\0" L"\x0001d4e3" L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" L"\0" + L"\x0001d4e6" L"\0" L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" L"\x0001d4e9" + L"\0" L"\x0001d4ea" L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" L"\0" + L"\x0001d4ed" L"\0" L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" L"\x0001d4f0" + L"\0" L"\x0001d4f1" L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" L"\0" + L"\x0001d4f4" L"\0" L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" L"\x0001d4f7" + L"\0" L"\x0001d4f8" L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" L"\0" + L"\x0001d4fb" L"\0" L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" L"\x0001d4fe" + L"\0" L"\x0001d4ff" L"\0" L"\x0001d500" L"\0" L"\x0001d501" L"\0" + L"\x0001d502" L"\0" L"\x0001d503" L"\0" L"\x0001d504" L"\0" L"\x0001d505" + L"\0" L"\x0001d507" L"\0" L"\x0001d508" L"\0" L"\x0001d509" L"\0" + L"\x0001d50a" L"\0" L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" L"\x0001d50f" + L"\0" L"\x0001d510" L"\0" L"\x0001d511" L"\0" L"\x0001d512" L"\0" + L"\x0001d513" L"\0" L"\x0001d514" L"\0" L"\x0001d516" L"\0" L"\x0001d517" + L"\0" L"\x0001d518" L"\0" L"\x0001d519" L"\0" L"\x0001d51a" L"\0" + L"\x0001d51b" L"\0" L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" L"\x0001d51f" + L"\0" L"\x0001d520" L"\0" L"\x0001d521" L"\0" L"\x0001d522" L"\0" + L"\x0001d523" L"\0" L"\x0001d524" L"\0" L"\x0001d525" L"\0" L"\x0001d526" + L"\0" L"\x0001d527" L"\0" L"\x0001d528" L"\0" L"\x0001d529" L"\0" + L"\x0001d52a" L"\0" L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" L"\x0001d52d" + L"\0" L"\x0001d52e" L"\0" L"\x0001d52f" L"\0" L"\x0001d530" L"\0" + L"\x0001d531" L"\0" L"\x0001d532" L"\0" L"\x0001d533" L"\0" L"\x0001d534" + L"\0" L"\x0001d535" L"\0" L"\x0001d536" L"\0" L"\x0001d537" L"\0" + L"\x0001d538" L"\0" L"\x0001d539" L"\0" L"\x0001d53b" L"\0" L"\x0001d53c" + L"\0" L"\x0001d53d" L"\0" L"\x0001d53e" L"\0" L"\x0001d540" L"\0" + L"\x0001d541" L"\0" L"\x0001d542" L"\0" L"\x0001d543" L"\0" L"\x0001d544" + L"\0" L"\x0001d546" L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" L"\0" + L"\x0001d54c" L"\0" L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" L"\x0001d54f" + L"\0" L"\x0001d550" L"\0" L"\x0001d552" L"\0" L"\x0001d553" L"\0" + L"\x0001d554" L"\0" L"\x0001d555" L"\0" L"\x0001d556" L"\0" L"\x0001d557" + L"\0" L"\x0001d558" L"\0" L"\x0001d559" L"\0" L"\x0001d55a" L"\0" + L"\x0001d55b" L"\0" L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" L"\x0001d55e" + L"\0" L"\x0001d55f" L"\0" L"\x0001d560" L"\0" L"\x0001d561" L"\0" + L"\x0001d562" L"\0" L"\x0001d563" L"\0" L"\x0001d564" L"\0" L"\x0001d565" + L"\0" L"\x0001d566" L"\0" L"\x0001d567" L"\0" L"\x0001d568" L"\0" + L"\x0001d569" L"\0" L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" L"\x0001d56c" + L"\0" L"\x0001d56d" L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" L"\0" + L"\x0001d570" L"\0" L"\x0001d571" L"\0" L"\x0001d572" L"\0" L"\x0001d573" + L"\0" L"\x0001d574" L"\0" L"\x0001d575" L"\0" L"\x0001d576" L"\0" + L"\x0001d577" L"\0" L"\x0001d578" L"\0" L"\x0001d579" L"\0" L"\x0001d57a" + L"\0" L"\x0001d57b" L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" L"\0" + L"\x0001d57e" L"\0" L"\x0001d57f" L"\0" L"\x0001d580" L"\0" L"\x0001d581" + L"\0" L"\x0001d582" L"\0" L"\x0001d583" L"\0" L"\x0001d584" L"\0" + L"\x0001d585" L"\0" L"\x0001d586" L"\0" L"\x0001d587" L"\0" L"\x0001d588" + L"\0" L"\x0001d589" L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" L"\0" + L"\x0001d58c" L"\0" L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" L"\x0001d58f" + L"\0" L"\x0001d590" L"\0" L"\x0001d591" L"\0" L"\x0001d592" L"\0" + L"\x0001d593" L"\0" L"\x0001d594" L"\0" L"\x0001d595" L"\0" L"\x0001d596" + L"\0" L"\x0001d597" L"\0" L"\x0001d598" L"\0" L"\x0001d599" L"\0" + L"\x0001d59a" L"\0" L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" L"\x0001d59d" + L"\0" L"\x0001d59e" L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" L"\0" + L"\x0001d5a1" L"\0" L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" L"\x0001d5a4" + L"\0" L"\x0001d5a5" L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" L"\0" + L"\x0001d5a8" L"\0" L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" L"\x0001d5ab" + L"\0" L"\x0001d5ac" L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" L"\0" + L"\x0001d5af" L"\0" L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" L"\x0001d5b2" + L"\0" L"\x0001d5b3" L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" L"\0" + L"\x0001d5b6" L"\0" L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" L"\x0001d5b9" + L"\0" L"\x0001d5ba" L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" L"\0" + L"\x0001d5bd" L"\0" L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" L"\x0001d5c0" + L"\0" L"\x0001d5c1" L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" L"\0" + L"\x0001d5c4" L"\0" L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" L"\x0001d5c7" + L"\0" L"\x0001d5c8" L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" L"\0" + L"\x0001d5cb" L"\0" L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" L"\x0001d5ce" + L"\0" L"\x0001d5cf" L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" L"\0" + L"\x0001d5d2" L"\0" L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" L"\x0001d5d5" + L"\0" L"\x0001d5d6" L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" L"\0" + L"\x0001d5d9" L"\0" L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" L"\x0001d5dc" + L"\0" L"\x0001d5dd" L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" L"\0" + L"\x0001d5e0" L"\0" L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" L"\x0001d5e3" + L"\0" L"\x0001d5e4" L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" L"\0" + L"\x0001d5e7" L"\0" L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" L"\x0001d5ea" + L"\0" L"\x0001d5eb" L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" L"\0" + L"\x0001d5ee" L"\0" L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" L"\x0001d5f1" + L"\0" L"\x0001d5f2" L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" L"\0" + L"\x0001d5f5" L"\0" L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" L"\x0001d5f8" + L"\0" L"\x0001d5f9" L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" L"\0" + L"\x0001d5fc" L"\0" L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" L"\x0001d5ff" + L"\0" L"\x0001d600" L"\0" L"\x0001d601" L"\0" L"\x0001d602" L"\0" + L"\x0001d603" L"\0" L"\x0001d604" L"\0" L"\x0001d605" L"\0" L"\x0001d606" + L"\0" L"\x0001d607" L"\0" L"\x0001d608" L"\0" L"\x0001d609" L"\0" + L"\x0001d60a" L"\0" L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" L"\x0001d60d" + L"\0" L"\x0001d60e" L"\0" L"\x0001d60f" L"\0" L"\x0001d610" L"\0" + L"\x0001d611" L"\0" L"\x0001d612" L"\0" L"\x0001d613" L"\0" L"\x0001d614" + L"\0" L"\x0001d615" L"\0" L"\x0001d616" L"\0" L"\x0001d617" L"\0" + L"\x0001d618" L"\0" L"\x0001d619" L"\0" L"\x0001d61a" L"\0" L"\x0001d61b" + L"\0" L"\x0001d61c" L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" L"\0" + L"\x0001d61f" L"\0" L"\x0001d620" L"\0" L"\x0001d621" L"\0" L"\x0001d622" + L"\0" L"\x0001d623" L"\0" L"\x0001d624" L"\0" L"\x0001d625" L"\0" + L"\x0001d626" L"\0" L"\x0001d627" L"\0" L"\x0001d628" L"\0" L"\x0001d629" + L"\0" L"\x0001d62a" L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" L"\0" + L"\x0001d62d" L"\0" L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" L"\x0001d630" + L"\0" L"\x0001d631" L"\0" L"\x0001d632" L"\0" L"\x0001d633" L"\0" + L"\x0001d634" L"\0" L"\x0001d635" L"\0" L"\x0001d636" L"\0" L"\x0001d637" + L"\0" L"\x0001d638" L"\0" L"\x0001d639" L"\0" L"\x0001d63a" L"\0" + L"\x0001d63b" L"\0" L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" L"\x0001d63e" + L"\0" L"\x0001d63f" L"\0" L"\x0001d640" L"\0" L"\x0001d641" L"\0" + L"\x0001d642" L"\0" L"\x0001d643" L"\0" L"\x0001d644" L"\0" L"\x0001d645" + L"\0" L"\x0001d646" L"\0" L"\x0001d647" L"\0" L"\x0001d648" L"\0" + L"\x0001d649" L"\0" L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" L"\x0001d64c" + L"\0" L"\x0001d64d" L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" L"\0" + L"\x0001d650" L"\0" L"\x0001d651" L"\0" L"\x0001d652" L"\0" L"\x0001d653" + L"\0" L"\x0001d654" L"\0" L"\x0001d655" L"\0" L"\x0001d656" L"\0" + L"\x0001d657" L"\0" L"\x0001d658" L"\0" L"\x0001d659" L"\0" L"\x0001d65a" + L"\0" L"\x0001d65b" L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" L"\0" + L"\x0001d65e" L"\0" L"\x0001d65f" L"\0" L"\x0001d660" L"\0" L"\x0001d661" + L"\0" L"\x0001d662" L"\0" L"\x0001d663" L"\0" L"\x0001d664" L"\0" + L"\x0001d665" L"\0" L"\x0001d666" L"\0" L"\x0001d667" L"\0" L"\x0001d668" + L"\0" L"\x0001d669" L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" L"\0" + L"\x0001d66c" L"\0" L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" L"\x0001d66f" + L"\0" L"\x0001d670" L"\0" L"\x0001d671" L"\0" L"\x0001d672" L"\0" + L"\x0001d673" L"\0" L"\x0001d674" L"\0" L"\x0001d675" L"\0" L"\x0001d676" + L"\0" L"\x0001d677" L"\0" L"\x0001d678" L"\0" L"\x0001d679" L"\0" + L"\x0001d67a" L"\0" L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" L"\x0001d67d" + L"\0" L"\x0001d67e" L"\0" L"\x0001d67f" L"\0" L"\x0001d680" L"\0" + L"\x0001d681" L"\0" L"\x0001d682" L"\0" L"\x0001d683" L"\0" L"\x0001d684" + L"\0" L"\x0001d685" L"\0" L"\x0001d686" L"\0" L"\x0001d687" L"\0" + L"\x0001d688" L"\0" L"\x0001d689" L"\0" L"\x0001d68a" L"\0" L"\x0001d68b" + L"\0" L"\x0001d68c" L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" L"\0" + L"\x0001d68f" L"\0" L"\x0001d690" L"\0" L"\x0001d691" L"\0" L"\x0001d692" + L"\0" L"\x0001d693" L"\0" L"\x0001d694" L"\0" L"\x0001d695" L"\0" + L"\x0001d696" L"\0" L"\x0001d697" L"\0" L"\x0001d698" L"\0" L"\x0001d699" + L"\0" L"\x0001d69a" L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" L"\0" + L"\x0001d69d" L"\0" L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" L"\x0001d6a0" + L"\0" L"\x0001d6a1" L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" L"\0" + L"\x0001d7ce" L"\0" L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" L"\x0001d7d1" + L"\0" L"\x0001d7d2" L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" L"\0" + L"\x0001d7d5" L"\0" L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" L"\x0001d7d8" + L"\0" L"\x0001d7d9" L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" L"\0" + L"\x0001d7dc" L"\0" L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" L"\x0001d7df" + L"\0" L"\x0001d7e0" L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" L"\0" + L"\x0001d7e3" L"\0" L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" L"\x0001d7e6" + L"\0" L"\x0001d7e7" L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" L"\0" + L"\x0001d7ea" L"\0" L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" L"\x0001d7ed" + L"\0" L"\x0001d7ee" L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" L"\0" + L"\x0001d7f1" L"\0" L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" L"\x0001d7f4" + L"\0" L"\x0001d7f5" L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" L"\0" + L"\x0001d7f8" L"\0" L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" L"\x0001d7fb" + L"\0" L"\x0001d7fc" L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" L"\0" + L"\x0001d7ff"; static const uint32_t translit_to_idx[] = { 0, 3, 8, 12, 15, 20, 23, 26, 30, 37, 44, 51, @@ -469,47 +470,47 @@ static const uint32_t translit_to_idx[] = 145, 148, 151, 154, 157, 160, 163, 166, 169, 172, 175, 178, 180, 183, 186, 189, 192, 196, 199, 202, 205, 208, 211, 214, 217, 221, 224, 227, 230, 233, 237, 242, 245, 248, 252, 257, - 260, 263, 267, 271, 275, 279, 282, 284, 286, 288, 290, 294, - 299, 304, 309, 312, 317, 322, 325, 328, 331, 334, 337, 340, - 343, 346, 349, 352, 356, 359, 362, 365, 368, 371, 376, 382, - 385, 390, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, - 423, 426, 429, 432, 435, 442, 449, 456, 463, 470, 477, 484, - 491, 498, 505, 512, 519, 524, 527, 531, 536, 540, 543, 547, - 552, 558, 562, 565, 569, 574, 577, 580, 583, 586, 589, 593, - 598, 602, 605, 609, 614, 620, 624, 627, 631, 636, 639, 642, - 645, 648, 652, 656, 661, 665, 669, 674, 677, 680, 683, 686, - 689, 692, 695, 699, 703, 707, 711, 716, 721, 726, 731, 736, - 741, 746, 751, 756, 761, 765, 769, 773, 777, 781, 785, 789, - 793, 798, 803, 808, 813, 818, 823, 828, 833, 838, 842, 847, - 852, 856, 860, 864, 868, 872, 877, 880, 884, 889, 894, 899, - 904, 909, 914, 919, 924, 929, 935, 941, 947, 953, 959, 965, - 971, 977, 983, 989, 995, 1000, 1005, 1010, 1015, 1020, 1025, 1030, - 1035, 1040, 1046, 1052, 1058, 1064, 1070, 1076, 1082, 1088, 1094, 1100, - 1106, 1110, 1114, 1118, 1122, 1126, 1130, 1134, 1138, 1142, 1147, 1152, - 1157, 1162, 1167, 1172, 1177, 1182, 1187, 1192, 1197, 1202, 1207, 1212, - 1217, 1222, 1227, 1232, 1237, 1242, 1247, 1252, 1257, 1262, 1267, 1272, - 1277, 1282, 1287, 1292, 1297, 1302, 1307, 1312, 1317, 1322, 1327, 1332, - 1337, 1342, 1347, 1352, 1357, 1362, 1367, 1372, 1377, 1382, 1387, 1392, - 1397, 1402, 1407, 1412, 1417, 1422, 1427, 1432, 1437, 1442, 1447, 1452, - 1457, 1462, 1467, 1472, 1477, 1482, 1487, 1492, 1497, 1502, 1507, 1512, - 1517, 1522, 1527, 1532, 1537, 1542, 1547, 1552, 1557, 1562, 1567, 1572, - 1577, 1582, 1587, 1592, 1595, 1598, 1601, 1604, 1607, 1610, 1613, 1616, - 1619, 1622, 1625, 1628, 1633, 1637, 1642, 1645, 1648, 1654, 1660, 1666, - 1672, 1678, 1684, 1690, 1696, 1702, 1708, 1714, 1720, 1726, 1732, 1738, - 1744, 1750, 1756, 1762, 1768, 1774, 1780, 1786, 1792, 1798, 1804, 1810, - 1816, 1822, 1828, 1833, 1837, 1841, 1846, 1850, 1854, 1858, 1862, 1866, - 1870, 1874, 1878, 1882, 1886, 1891, 1897, 1901, 1905, 1909, 1913, 1917, - 1921, 1925, 1930, 1935, 1940, 1945, 1949, 1953, 1957, 1961, 1965, 1969, - 1973, 1977, 1981, 1985, 1991, 1997, 2002, 2008, 2014, 2020, 2025, 2031, - 2036, 2043, 2047, 2052, 2057, 2062, 2067, 2074, 2083, 2087, 2091, 2095, - 2099, 2103, 2107, 2111, 2115, 2119, 2123, 2127, 2131, 2135, 2139, 2143, - 2147, 2153, 2157, 2161, 2165, 2171, 2176, 2180, 2184, 2188, 2192, 2196, - 2200, 2204, 2208, 2212, 2216, 2221, 2225, 2229, 2234, 2239, 2243, 2249, - 2254, 2258, 2262, 2266, 2270, 2274, 2278, 2282, 2287, 2292, 2296, 2299, - 2301, 2303, 2305, 2307, 2309, 2311, 2313, 2315, 2317, 2319, 2321, 2323, - 2325, 2327, 2329, 2331, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, + 260, 263, 267, 270, 274, 278, 282, 285, 287, 289, 291, 293, + 297, 302, 307, 312, 315, 320, 325, 328, 331, 334, 337, 340, + 343, 346, 349, 352, 355, 359, 362, 365, 368, 371, 374, 379, + 385, 388, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, + 423, 426, 429, 432, 435, 438, 445, 452, 459, 466, 473, 480, + 487, 494, 501, 508, 515, 522, 527, 530, 534, 539, 543, 546, + 550, 555, 561, 565, 568, 572, 577, 580, 583, 586, 589, 592, + 596, 601, 605, 608, 612, 617, 623, 627, 630, 634, 639, 642, + 645, 648, 651, 655, 659, 664, 668, 672, 677, 680, 683, 686, + 689, 692, 695, 698, 702, 706, 710, 714, 719, 724, 729, 734, + 739, 744, 749, 754, 759, 764, 768, 772, 776, 780, 784, 788, + 792, 796, 801, 806, 811, 816, 821, 826, 831, 836, 841, 845, + 850, 855, 859, 863, 867, 871, 875, 880, 883, 887, 892, 897, + 902, 907, 912, 917, 922, 927, 932, 938, 944, 950, 956, 962, + 968, 974, 980, 986, 992, 998, 1003, 1008, 1013, 1018, 1023, 1028, + 1033, 1038, 1043, 1049, 1055, 1061, 1067, 1073, 1079, 1085, 1091, 1097, + 1103, 1109, 1113, 1117, 1121, 1125, 1129, 1133, 1137, 1141, 1145, 1150, + 1155, 1160, 1165, 1170, 1175, 1180, 1185, 1190, 1195, 1200, 1205, 1210, + 1215, 1220, 1225, 1230, 1235, 1240, 1245, 1250, 1255, 1260, 1265, 1270, + 1275, 1280, 1285, 1290, 1295, 1300, 1305, 1310, 1315, 1320, 1325, 1330, + 1335, 1340, 1345, 1350, 1355, 1360, 1365, 1370, 1375, 1380, 1385, 1390, + 1395, 1400, 1405, 1410, 1415, 1420, 1425, 1430, 1435, 1440, 1445, 1450, + 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1505, 1510, + 1515, 1520, 1525, 1530, 1535, 1540, 1545, 1550, 1555, 1560, 1565, 1570, + 1575, 1580, 1585, 1590, 1595, 1598, 1601, 1604, 1607, 1610, 1613, 1616, + 1619, 1622, 1625, 1628, 1631, 1636, 1640, 1645, 1648, 1651, 1657, 1663, + 1669, 1675, 1681, 1687, 1693, 1699, 1705, 1711, 1717, 1723, 1729, 1735, + 1741, 1747, 1753, 1759, 1765, 1771, 1777, 1783, 1789, 1795, 1801, 1807, + 1813, 1819, 1825, 1831, 1836, 1840, 1844, 1849, 1853, 1857, 1861, 1865, + 1869, 1873, 1877, 1881, 1885, 1889, 1894, 1900, 1904, 1908, 1912, 1916, + 1920, 1924, 1928, 1933, 1938, 1943, 1948, 1952, 1956, 1960, 1964, 1968, + 1972, 1976, 1980, 1984, 1988, 1994, 2000, 2005, 2011, 2017, 2023, 2028, + 2034, 2039, 2046, 2050, 2055, 2060, 2065, 2070, 2077, 2086, 2090, 2094, + 2098, 2102, 2106, 2110, 2114, 2118, 2122, 2126, 2130, 2134, 2138, 2142, + 2146, 2150, 2156, 2160, 2164, 2168, 2174, 2179, 2183, 2187, 2191, 2195, + 2199, 2203, 2207, 2211, 2215, 2219, 2224, 2228, 2232, 2237, 2242, 2246, + 2252, 2257, 2261, 2265, 2269, 2273, 2277, 2281, 2285, 2290, 2295, 2299, + 2302, 2304, 2306, 2308, 2310, 2312, 2314, 2316, 2318, 2320, 2322, 2324, + 2326, 2328, 2330, 2332, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, 2358, 2361, 2364, 2367, 2370, 2373, 2376, 2379, 2382, 2385, 2388, 2391, - 2394, 2397, 2400, 2403, 2406, 2408, 2411, 2414, 2417, 2420, 2423, 2426, + 2394, 2397, 2400, 2403, 2406, 2409, 2411, 2414, 2417, 2420, 2423, 2426, 2429, 2432, 2435, 2438, 2441, 2444, 2447, 2450, 2453, 2456, 2459, 2462, 2465, 2468, 2471, 2474, 2477, 2480, 2483, 2486, 2489, 2492, 2495, 2498, 2501, 2504, 2507, 2510, 2513, 2516, 2519, 2522, 2525, 2528, 2531, 2534, @@ -575,7 +576,7 @@ static const uint32_t translit_to_idx[] = 4661, 4664, 4667, 4670, 4673, 4676, 4679, 4682, 4685, 4688, 4691, 4694, 4697, 4700, 4703, 4706, 4709, 4712, 4715, 4718, 4721, 4724, 4727, 4730, 4733, 4736, 4739, 4742, 4745, 4748, 4751, 4754, 4757, 4760, 4763, 4766, - 4769, 4772, 4775, 4778, 4781, 4784, 4787, 4790 + 4769, 4772, 4775, 4778, 4781, 4784, 4787, 4790, 4793 }; static const wchar_t translit_to_tbl[] = L" \0" L"\0" L"(C)\0" L"\0" L"<<\0" L"\0" L"-\0" L"\0" L"(R)\0" L"\0" L"u\0" @@ -591,13 +592,13 @@ static const wchar_t translit_to_tbl[] = L"\0" L"'\0" L"\0" L"'\0" L"\0" L",\0" L"\0" L"'\0" L"\0" L"\"\0" L"\0" L"\"\0" L"\0" L",,\0" L"\0" L"\"\0" L"\0" L"+\0" L"\0" L"o\0" L"\0" L".\0" L"\0" L"..\0" L"\0" L"...\0" L"\0" L" \0" L"\0" L"`\0" L"\0" L"``\0" L"\0" - L"```\0" L"\0" L"<\0" L"\0" L">\0" L"\0" L"!!\0" L"\0" L"??\0" L"\0" L"?!\0" - L"\0" L"!?\0" L"\0" L" \0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" - L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"a/c\0" L"\0" L"a/s\0" L"\0" L"C\0" - L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" L"H\0" L"\0" L"H\0" L"\0" - L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" L"\0" L"L\0" L"\0" L"l\0" - L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" L"\0" - L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" L"\0" L"Z\0" L"\0" + L"```\0" L"\0" L"<\0" L"\0" L">\0" L"\0" L"!!\0" L"\0" L"/\0" L"\0" L"??\0" + L"\0" L"?!\0" L"\0" L"!?\0" L"\0" L" \0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" + L"\0" L"\0" L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"a/c\0" L"\0" L"a/s\0" L"\0" + L"C\0" L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" L"H\0" L"\0" L"H\0" + L"\0" L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" L"\0" L"L\0" L"\0" + L"l\0" L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" + L"\0" L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" L"\0" L"Z\0" L"\0" L"Ohm\0" L"\0" L"Z\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"e\0" L"\0" L"e\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"M\0" L"\0" L"o\0" L"\0" L"i\0" L"\0" L"D\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L" 1/3 \0" diff --git a/locale/C-translit.h.in b/locale/C-translit.h.in index d440c9b9ab..ab0b130983 100644 --- a/locale/C-translit.h.in +++ b/locale/C-translit.h.in @@ -1,5 +1,5 @@ /* Transliteration for the C locale. -*-C-*- - Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2000. @@ -94,6 +94,7 @@ "\x2039" "<" /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ "\x203a" ">" /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ "\x203c" "!!" /* DOUBLE EXCLAMATION MARK */ +"\x2044" "/" /* FRACTION SLASH */ "\x2047" "??" /* DOUBLE QUESTION MARK */ "\x2048" "?!" /* QUESTION EXCLAMATION MARK */ "\x2049" "!?" /* EXCLAMATION QUESTION MARK */ diff --git a/locale/global-locale.c b/locale/global-locale.c index 2280f68df4..a5cae3c5d1 100644 --- a/locale/global-locale.c +++ b/locale/global-locale.c @@ -1,5 +1,5 @@ /* Locale object representing the global locale controlled by setlocale. - Copyright (C) 2002, 2006 Free Software Foundation, Inc. + Copyright (C) 2002 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 @@ -60,7 +60,7 @@ struct __locale_struct _nl_global_locale attribute_hidden = }; #include -#if HAVE___THREAD +#if USE_TLS && HAVE___THREAD /* The tsd macros don't permit an initializer. */ __thread void *__libc_tsd_LOCALE = &_nl_global_locale; #else diff --git a/locale/iso-3166.def b/locale/iso-3166.def index bae42caed2..a0dd56385a 100644 --- a/locale/iso-3166.def +++ b/locale/iso-3166.def @@ -198,6 +198,7 @@ DEFINE_COUNTRY_CODE ("SAO TOME AND PRINCIPE", ST, STP, 678) DEFINE_COUNTRY_CODE ("SAUDI ARABIA", SA, SAU, 682) DEFINE_COUNTRY_CODE ("SENEGAL", SN, SEN, 686) DEFINE_COUNTRY_CODE ("SERBIA AND MONTENEGRO", CS, SCG, 891) +DEFINE_COUNTRY_CODE ("SERBIA", RS, SRB, 688) DEFINE_COUNTRY_CODE ("SEYCHELLES", SC, SYC, 690) DEFINE_COUNTRY_CODE ("SIERRA LEONE", SL, SLE, 694) DEFINE_COUNTRY_CODE ("SINGAPORE", SG, SGP, 702) diff --git a/locale/iso-4217.def b/locale/iso-4217.def index 1af6ef4496..8f2c9acaf5 100644 --- a/locale/iso-4217.def +++ b/locale/iso-4217.def @@ -129,6 +129,7 @@ DEFINE_INT_CURR("PYG") /* Paraguay Guarani */ DEFINE_INT_CURR("QAR") /* Qatar Rial */ DEFINE_INT_CURR("ROL") /* Romanian Leu */ DEFINE_INT_CURR("RON") /* Romanian New Leu */ +DEFINE_INT_CURR("RSD") /* Serbian Dinars */ DEFINE_INT_CURR("RUB") /* Russian Ruble */ DEFINE_INT_CURR("RWF") /* Rwanda Franc */ DEFINE_INT_CURR("SAR") /* Saudi Arabia Riyal */ diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 5c1f27f7e1..4f746a298d 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -215,7 +215,9 @@ __libc_tsd_define (extern, LOCALE) we can use __thread variables. So only in that case do we attempt this. */ #if !defined SHARED && defined HAVE___THREAD && defined HAVE_WEAK_SYMBOLS # include -# define NL_CURRENT_INDIRECT 1 +# if USE_TLS +# define NL_CURRENT_INDIRECT 1 +# endif #endif #ifdef NL_CURRENT_INDIRECT diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c index dbc1101fd0..52a69de4b0 100644 --- a/locale/programs/charmap.c +++ b/locale/programs/charmap.c @@ -607,7 +607,7 @@ character sets with locking states are not supported")); case 90: if (nowtok != expected_tok) lr_error (cmfile, _("\ -%1$s: definition does not end with `END %1$s'"), expected_str); +`%1$s' definition does not end with `END %1$s'"), expected_str); lr_ignore_rest (cmfile, nowtok == expected_tok); state = 91; @@ -1019,13 +1019,13 @@ hexadecimal range format should use only capital characters")); && errno == ERANGE) || *to_end != '\0') { - lr_error (lr, _("<%s> and <%s> are invalid names for range"), from, to); + lr_error (lr, _("<%s> and <%s> are illegal names for range"), from, to); return; } if (from_nr > to_nr) { - lr_error (lr, _("upper limit in range is smaller than lower limit")); + lr_error (lr, _("upper limit in range is not higher then lower limit")); return; } diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index af47279958..cf1bff130f 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -1146,7 +1146,7 @@ handle_ellipsis (struct linereader *ldfile, const char *symstr, size_t symlen, { if (ret > 0) lr_error (ldfile, _("%s: byte sequence of first character of \ -range is not lower than that of the last character"), "LC_COLLATE"); +sequence is not lower than that of the last character"), "LC_COLLATE"); return; } @@ -1164,7 +1164,7 @@ range is not lower than that of the last character"), "LC_COLLATE"); struct element_t *elem; size_t namelen; - /* I don't think this can ever happen. */ + /* I don't this this can ever happen. */ assert (seq->name != NULL); namelen = strlen (seq->name); diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index 69fc05f4ee..40d5e4b17f 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1995-2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1995. @@ -1866,6 +1866,9 @@ find_translit (struct localedef_t *locale, const struct charmap_t *charmap, assert (locale != NULL); ctype = locale->categories[LC_CTYPE].ctype; + if (ctype == NULL) + return NULL; + if (ctype->translit != NULL) result = find_translit2 (ctype, charmap, wch); @@ -3036,7 +3039,7 @@ set_class_defaults (struct locale_ctype_t *ctype, { if (!be_quiet) WITH_CUR_LOCALE (error (0, 0, _("\ -%s: character `%s' not defined while needed as default value"), +%s: character `%s' not defined in charmap while needed as default value"), "LC_CTYPE", tmp)); } else if (seq->nbytes != 1) @@ -3161,8 +3164,8 @@ set_class_defaults (struct locale_ctype_t *ctype, { if (!be_quiet) WITH_CUR_LOCALE (error (0, 0, _("\ -%s: character `%s' not defined while needed as default value"), - "LC_CTYPE", "")); +character `%s' not defined while needed as default value"), + "")); } else if (seq->nbytes != 1) WITH_CUR_LOCALE (error (0, 0, _("\ diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c index d493a142b5..27636d6498 100644 --- a/locale/programs/ld-monetary.c +++ b/locale/programs/ld-monetary.c @@ -252,7 +252,7 @@ not correspond to a valid name in ISO 4217"), else if (monetary->mon_decimal_point[0] == '\0' && ! be_quiet && ! nothing) { WITH_CUR_LOCALE (error (0, 0, _("\ -%s: value for field `%s' must not be an empty string"), +%s: value for field `%s' must not be the empty string"), "LC_MONETARY", "mon_decimal_point")); } if (monetary->mon_decimal_point_wc == L'\0') diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c index d7ffe75bee..a901c4d985 100644 --- a/locale/programs/ld-numeric.c +++ b/locale/programs/ld-numeric.c @@ -115,7 +115,7 @@ No definition for %s category found"), "LC_NUMERIC")); else if (numeric->decimal_point[0] == '\0' && ! be_quiet && ! nothing) { WITH_CUR_LOCALE (error (0, 0, _("\ -%s: value for field `%s' must not be an empty string"), +%s: value for field `%s' must not be the empty string"), "LC_NUMERIC", "decimal_point")); } if (numeric->decimal_point_wc == L'\0') diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c index 0d19350371..bf5151858a 100644 --- a/locale/programs/ld-time.c +++ b/locale/programs/ld-time.c @@ -502,7 +502,7 @@ No definition for %s category found"), "LC_TIME")); time->first_weekday = 1; else if (time->first_weekday > time->week_ndays) WITH_CUR_LOCALE (error (0, 0, _("\ -%s: values for field `%s' must not be larger than %d"), +%s: values of field `%s' must not be larger than %d"), "LC_TIME", "first_weekday", 7)); if (time->first_workday == '\0') @@ -510,7 +510,7 @@ No definition for %s category found"), "LC_TIME")); time->first_workday = 1; else if (time->first_workday > time->week_ndays) WITH_CUR_LOCALE (error (0, 0, _("\ -%s: values for field `%s' must not be larger than %d"), +%s: values of field `%s' must not be larger than %d"), "LC_TIME", "first_workday", 7)); if (time->cal_direction == '\0') diff --git a/locale/programs/locale.c b/locale/programs/locale.c index cc3082d48a..a03974e8a1 100644 --- a/locale/programs/locale.c +++ b/locale/programs/locale.c @@ -1,5 +1,5 @@ /* Implementation of the locale program according to POSIX 9945-2. - Copyright (C) 1995-1997, 1999-2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1995-1997, 1999-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1995. @@ -275,7 +275,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 04dcf8ee0d..9c3acbebcc 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2004, 2005, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1995-2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1995. @@ -387,7 +387,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } diff --git a/locale/programs/repertoire.c b/locale/programs/repertoire.c index b6c0a6ad58..e9bdf9e7ba 100644 --- a/locale/programs/repertoire.c +++ b/locale/programs/repertoire.c @@ -311,7 +311,7 @@ argument to <%s> must be a single character"), case 90: if (nowtok != tok_charids) lr_error (repfile, _("\ -%1$s: definition does not end with `END %1$s'"), "CHARIDS"); +`%1$s' definition does not end with `END %1$s'"), "CHARIDS"); lr_ignore_rest (repfile, nowtok == tok_charids); break; @@ -453,7 +453,7 @@ hexadecimal range format should use only capital characters")); if (from_nr > to_nr) { - lr_error (lr, _("upper limit in range is smaller than lower limit")); + lr_error (lr, _("upper limit in range is not smaller then lower limit")); return; } diff --git a/localedata/ChangeLog b/localedata/ChangeLog index 85b2d7948d..db9b1ef921 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,8 +1,58 @@ -2006-12-05 Jakub Jelinek +2007-05-07 Ulrich Drepper - * locales/cs_CZ (LC_TIME): Change d_fmt to %e.%m.%Y from %-d.%-m.%Y. - Change d_t_fmt to %a %-d. %B %Y, %H:%M:%S %Z from - %a %e. %B %Y, %H:%M:%S %Z. + * locales/as_IN: Fix currency_symbol, abday for Sunday, abmon for + January, February, and September to December, mon for January, + February, September, and December, am_pm, and name_*. + Patch by Amitakhya Phukan . + +2007-04-27 Ulrich Drepper + + [BZ #3213] + * locales/translit_neutral: Add entry for U2044. + +2007-04-24 Ulrich Drepper + + [BZ #4411] + * locales/en_ZA: Update int_select. + Patch by Dwayne Bailey . + +2007-02-16 Ulrich Drepper + + [BZ #3995] + * locales/ru_RU (LC_TIME): Set first_weekday and first_workday. + +2007-02-16 Ulrich Drepper + + [BZ #3851] + * locales/bn_BD: Fix full name of January and February. + Patch by Jamil Ahmed . + +2007-02-17 Ulrich Drepper + + [BZ #3334] + * locales/sr_ME: Update from maintainer. + +2007-02-16 Ulrich Drepper + + [BZ #3322] + * SUPPORTED (SUPPORTED-LOCALES): Add sr_RS and sr_RS@latin. + * locales/sr_RS: New file. + * locales/sr_RS@latin: New file. + +2007-02-02 Bruno Haible + + * charmaps/EUC-KR: Add mapping for 0xA2 0xE8. + * charmaps/JOHAB: Add mapping for 0xD9 0xE8. + Reported by Jungshik Shin . + + * charmaps/JOHAB: Add mappings for 0xD9 0xE6 and 0xD9 0xE7. + Reported by Jungshik Shin . + +2007-01-12 Gwenole Beauchesne + + [BZ #3884] + * locales/sl_SI: Slovenia joined the Euro zone. + Fix negative number format. 2006-11-02 Ulrich Drepper diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED index dff286997e..4eff7115ec 100644 --- a/localedata/SUPPORTED +++ b/localedata/SUPPORTED @@ -321,6 +321,8 @@ sq_AL/ISO-8859-1 \ sr_CS.UTF-8/UTF-8 \ sr_CS/ISO-8859-5 \ sr_ME/UTF-8 \ +sr_RS/UTF-8 \ +sr_RS@latin/UTF-8 \ ss_ZA/UTF-8 \ st_ZA.UTF-8/UTF-8 \ st_ZA/ISO-8859-1 \ diff --git a/localedata/charmaps/EUC-KR b/localedata/charmaps/EUC-KR index 9957c44d69..9c48668b72 100644 --- a/localedata/charmaps/EUC-KR +++ b/localedata/charmaps/EUC-KR @@ -341,6 +341,7 @@ CHARMAP /xa2/xe5 TELEPHONE SIGN /xa2/xe6 EURO SIGN /xa2/xe7 REGISTERED SIGN + /xa2/xe8 CIRCLED HANGUL IEUNG U /xa3/xa1 FULLWIDTH EXCLAMATION MARK /xa3/xa2 FULLWIDTH QUOTATION MARK /xa3/xa3 FULLWIDTH NUMBER SIGN diff --git a/localedata/charmaps/JOHAB b/localedata/charmaps/JOHAB index e0e6f5751d..b088b23042 100644 --- a/localedata/charmaps/JOHAB +++ b/localedata/charmaps/JOHAB @@ -11520,6 +11520,9 @@ CHARMAP /xd9/xe3 SQUARE AM /xd9/xe4 SQUARE PM /xd9/xe5 TELEPHONE SIGN + /xd9/xe6 EURO SIGN + /xd9/xe7 REGISTERED SIGN + /xd9/xe8 CIRCLED HANGUL IEUNG U /xda/x31 FULLWIDTH EXCLAMATION MARK /xda/x32 FULLWIDTH QUOTATION MARK /xda/x33 FULLWIDTH NUMBER SIGN diff --git a/localedata/locales/as_IN b/localedata/locales/as_IN index 2ab76f8477..d3c779b7a6 100644 --- a/localedata/locales/as_IN +++ b/localedata/locales/as_IN @@ -610,7 +610,7 @@ END LC_NUMERIC %%%%%%%%%%%%% LC_MONETARY int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 @@ -634,7 +634,7 @@ END LC_MONETARY %%%%%%%%%%%%% LC_TIME -abday "";/ +abday "";/ "";/ "";/ "";/ @@ -648,37 +648,37 @@ day "";/ "";/ "";/ "" -abmon "";/ - "";/ +abmon "";/ + "";/ "";/ "";/ "";/ "";/ "";/ "";/ - "";/ - "";/ - "";/ - "" -mon "";/ - "";/ + "";/ + "";/ + "";/ + "" +mon "";/ + "";/ "";/ "";/ "";/ "";/ "";/ "";/ - "";/ + "";/ "";/ "";/ - "" + "" % d_fmt "%e-%m-%Y" d_fmt "" % t_fmt "%I.%M.%S %p" t_fmt "" % d_t_fmt"%e %B, %Y %I.%M.%S %p %Z" d_t_fmt "" -am_pm "";"" +am_pm "";"" % t_fmt_ampm "%I.%M.%S %p" t_fmt_ampm "" END LC_TIME @@ -704,10 +704,10 @@ LC_NAME name_fmt "/ " name_gen "" -name_mr "" -name_mrs "" -name_miss "" -name_ms "" +name_mr "" +name_mrs "" +name_miss "" +name_ms "" END LC_NAME %%%%%%%%%%%%% diff --git a/localedata/locales/bn_BD b/localedata/locales/bn_BD index 23f821ad6e..dfbe47f050 100644 --- a/localedata/locales/bn_BD +++ b/localedata/locales/bn_BD @@ -13,8 +13,8 @@ tel "" fax "" language "Bengali/Bangla" territory "Bangladesh" -revision "0.3" -date "2005-01-18" +revision "0.5" +date "2007-01-10" category "bn_BD:2001";LC_IDENTIFICATION category "bn_BD:2001";LC_COLLATE @@ -101,8 +101,8 @@ abmon "";/ "";/ "" -mon "";/ - "";/ +mon "";/ + "";/ "";/ "";/ "";/ diff --git a/localedata/locales/cs_CZ b/localedata/locales/cs_CZ index 5d279187eb..9667700a93 100644 --- a/localedata/locales/cs_CZ +++ b/localedata/locales/cs_CZ @@ -2440,9 +2440,9 @@ abmon "";/ week 7;19971201;4 -d_t_fmt "" +d_t_fmt "" -d_fmt "" +d_fmt "" t_fmt "" diff --git a/localedata/locales/en_ZA b/localedata/locales/en_ZA index 4f13a96237..f5476da6e6 100644 --- a/localedata/locales/en_ZA +++ b/localedata/locales/en_ZA @@ -8,8 +8,8 @@ comment_char % % Fax: +27 12 3430389 % Language: en % Territory: ZA -% Revision: 1.2.1 -% Date: 2005-10-13 +% Revision: 1.3 +% Date: 2007-04-19 % Users: general % Repertoiremap: mnemonic,ds % Charset: ISO-8859-1 @@ -17,6 +17,9 @@ comment_char % % for commercial purposes. % % Changelog +% 1.3 (2007-04-19): +% 2007-04-19 Dwayne Bailey +% - Change int_select from 09 to 00 % 1.2.1 (2005-10-13): % 2005-10-12 Dwayne Bailey % - Update contact information @@ -55,8 +58,8 @@ territory "South Africa" % audience "" % application "" abbreviation "Translate.org.za" -revision "1.2.1" -date "2005-10-13" +revision "1.3" +date "2007-04-19" % category "en_ZA:2003";LC_IDENTIFICATION category "en_ZA:2000";LC_CTYPE @@ -235,8 +238,8 @@ tel_int_fmt "/ tel_dom_fmt "" % Prefix for making international calls -% "09" -int_select "" +% "00" +int_select "" % International dialing code % "27" diff --git a/localedata/locales/ru_RU b/localedata/locales/ru_RU index 279eaab1ea..d00f3451db 100644 --- a/localedata/locales/ru_RU +++ b/localedata/locales/ru_RU @@ -149,6 +149,8 @@ t_fmt_ampm "" date_fmt "/ / " +first_weekday 2 +first_workday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/sl_SI b/localedata/locales/sl_SI index 8f7230d468..b7e119443f 100644 --- a/localedata/locales/sl_SI +++ b/localedata/locales/sl_SI @@ -2126,8 +2126,8 @@ noexpr "" END LC_MESSAGES LC_MONETARY -int_curr_symbol "" -currency_symbol "" +int_curr_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;3 @@ -2136,11 +2136,11 @@ negative_sign "" int_frac_digits 2 frac_digits 2 p_cs_precedes 0 -p_sep_by_space 2 +p_sep_by_space 1 n_cs_precedes 0 -n_sep_by_space 2 -p_sign_posn 2 -n_sign_posn 2 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 END LC_MONETARY LC_NUMERIC diff --git a/localedata/locales/sr_ME b/localedata/locales/sr_ME index 30afe44b61..5c0961f60c 100644 --- a/localedata/locales/sr_ME +++ b/localedata/locales/sr_ME @@ -1,42 +1,38 @@ comment_char % escape_char / % -% Serbian Language in Jekavian dialect Locale for Serbia and Montenegro -% Source: sr_YU locale +% Serbian Language locale for Montenegro +% Source: sr_YU, sr_CS locale % Address: % % Contact: Danilo Segan -% Email: dsegan@gmx.net -% Tel: +381 63 8626082 +% Email: danilo@gnome.org +% Tel: +381 63 323456 % Fax: none % Language: sr -% Territory: CS -% Revision: 1.0 -% Date: 2003-08-13 +% Territory: ME +% Revision: 1.2 +% Date: 2006-10-11 % Application: general % Users: general % Charset: UTF-8, ISO-8859-5 % Distribution and use is free, also % for commercial purposes. -% -% TODO: -% -- fix LC_COLLATE to work correctly for latin alphabet too -% LC_IDENTIFICATION -title "Serbian locale for Serbia and Montenegro" -source "sr_YU locale" +title "Serbian locale for Montenegro" +source "sr_YU, sr_CS locale" address "" contact "Danilo Segan" email "bug-glibc@gnu.org" tel "" fax "" language "Serbian" -territory "Serbia and Montenegro" -revision "1.1" -date "2004-01-10" +territory "Montenegro" +revision "1.2" +date "2006-10-11" audience "general" -application "" +application "GNU locale" abbreviation "" % category i18n:1997;LC_IDENTIFICATION @@ -54,19 +50,33 @@ category i18n:1997;LC_MEASUREMENT END LC_IDENTIFICATION LC_CTYPE -copy "sr_CS" +copy "i18n" END LC_CTYPE LC_COLLATE -copy "sr_CS" +copy "sr_RS" END LC_COLLATE LC_MONETARY -copy "sr_CS" +int_curr_symbol "" +currency_symbol "" +mon_decimal_point "" +mon_thousands_sep "" +mon_grouping 3;3 +positive_sign "" +negative_sign "" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sep_by_space 1 +n_cs_precedes 0 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 END LC_MONETARY LC_NUMERIC -copy "sr_CS" +copy "sr_RS" END LC_NUMERIC LC_TIME @@ -110,31 +120,46 @@ t_fmt_ampm "" date_fmt "/ / " -week 7;19971201;4 +% week 7;19971201;4 first_weekday 2 first_workday 2 END LC_TIME LC_MESSAGES -copy "sr_CS" +copy "sr_RS" END LC_MESSAGES LC_PAPER -copy "sr_CS" +copy "sr_RS" END LC_PAPER LC_NAME -copy "sr_CS" +copy "sr_RS" END LC_NAME LC_ADDRESS -copy "sr_CS" +postal_fmt "/ +/ +/ +/ +" +country_ab2 "" +country_ab3 "" +country_post "" +country_name "" +country_num 499 +country_car "" +country_isbn "" +lang_name "" +lang_term "" +lang_lib "" +lang_ab "" END LC_ADDRESS LC_TELEPHONE -copy "sr_CS" +copy "sr_RS" END LC_TELEPHONE LC_MEASUREMENT -copy "sr_CS" +copy "sr_RS" END LC_MEASUREMENT diff --git a/localedata/locales/sr_RS b/localedata/locales/sr_RS new file mode 100644 index 0000000000..b818592c0e --- /dev/null +++ b/localedata/locales/sr_RS @@ -0,0 +1,360 @@ +comment_char % +escape_char / +% +% Serbian Language Locale for Serbia +% Source: sr_YU, sr_CS locales +% Address: +% +% Contact: Danilo Segan +% Email: danilo@gnome.org +% Tel: +381 63 323456 +% Fax: none +% Language: sr +% Territory: RS +% Revision: 1.3 +% Date: 2006-10-09 +% Application: general +% Users: general +% Charset: UTF-8 +% Distribution and use is free, also +% for commercial purposes. +% + +LC_IDENTIFICATION +title "Serbian locale for Serbia" +source "sr_YU, sr_CS locale" +address "" +contact "Danilo Segan" +email "bug-glibc-locales@gnu.org" +tel "" +fax "" +language "Serbian" +territory "Serbia" +revision "1.3" +date "2006-10-09" +audience "general" +application "GNU locale" +abbreviation "" +% +category "i18n:1997";LC_IDENTIFICATION +category "i18n:1997";LC_CTYPE +category "i18n:1997";LC_COLLATE +category "i18n:1997";LC_MONETARY +category "i18n:1997";LC_NUMERIC +category "i18n:1997";LC_TIME +category "i18n:1997";LC_MESSAGES +category "i18n:1997";LC_PAPER +category "i18n:1997";LC_NAME +category "i18n:1997";LC_ADDRESS +category "i18n:1997";LC_TELEPHONE +category "i18n:1997";LC_MEASUREMENT +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" +translit_start +include "translit_combining";"" + +% cyrillic -> latin + "";"" % d- + "" % gj + "" % dz + "" % j + "" % lj + "" % nj + "";"" % c' + "" % kj + "";"" % dz< + + "";"" % D- + "" % Gj + "" % Dz + "" % J + "" % Lj + "" % Nj + "";"" % C' + "" % Kj + "";"" % Dz< + + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "";"" % z< + "";"" % s< + "";"" % c< + + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "";"" % z< + "";"" % s< + "";"" % c< + +translit_end +END LC_CTYPE + + +LC_COLLATE + +copy "iso14651_t1" + +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" + +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" + +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" + +collating-symbol +collating-symbol +collating-symbol + +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +collating-symbol +collating-symbol + +reorder-after + +reorder-after + + +reorder-after + + + + + +reorder-after + +reorder-after + +reorder-after + +reorder-after + + +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-end + +END LC_COLLATE + +LC_MONETARY +int_curr_symbol "" +currency_symbol "" +mon_decimal_point "" +mon_thousands_sep "" +mon_grouping 3;3 +positive_sign "" +negative_sign "" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sep_by_space 1 +n_cs_precedes 0 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_NUMERIC +decimal_point "" +thousands_sep "" +grouping 0;0 +END LC_NUMERIC + +LC_TIME + +abday "";"";/ + "";"";/ + "";"";/ + "" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +abmon "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" + +d_t_fmt "/ +/ +" +d_fmt "" +t_fmt "" +am_pm "";"" +t_fmt_ampm "" +date_fmt "/ +/ +" +% week 7;19971201;4 +first_weekday 2 +first_workday 2 +END LC_TIME + +LC_MESSAGES +yesexpr "" +noexpr "" +END LC_MESSAGES + +LC_PAPER +height 297 +width 210 +END LC_PAPER + +LC_NAME +name_fmt "/ +" +name_gen "" +name_mr "" +name_mrs "" +name_miss "" +name_ms "" +END LC_NAME + +LC_ADDRESS +postal_fmt "/ +/ +/ +/ +" +country_ab2 "" +country_ab3 "" +% FIXME: country_post is probably incorrect +country_post "" +country_name "" +country_num 688 +country_car "" +% FIXME: ISBN code is what? "86" that preceedes all the numbers? +country_isbn "" +lang_name "" +lang_term "" +lang_lib "" +lang_ab "" +END LC_ADDRESS + +LC_TELEPHONE +tel_int_fmt "/ +" +tel_dom_fmt "" +int_prefix "" +int_select "" +END LC_TELEPHONE + +LC_MEASUREMENT +measurement 1 +END LC_MEASUREMENT diff --git a/localedata/locales/sr_RS@latin b/localedata/locales/sr_RS@latin new file mode 100644 index 0000000000..d9b9133268 --- /dev/null +++ b/localedata/locales/sr_RS@latin @@ -0,0 +1,174 @@ +comment_char % +escape_char / +% +% Serbian Language Locale for Serbia +% Source: sr_YU, sr_CS locales +% Address: +% +% Contact: Danilo Segan +% Email: danilo@gnome.org +% Tel: +381 63 323456 +% Fax: none +% Language: sr +% Territory: RS +% Revision: 1.3 +% Date: 2006-10-09 +% Application: general +% Users: general +% Charset: UTF-8, ISO-8859-2 +% Distribution and use is free, also +% for commercial purposes. +% + +LC_IDENTIFICATION +title "Serbian Latin locale for Serbia" +source "sr_YU, sr_CS locale" +address "" +contact "Danilo Segan" +email "bug-glibc-locales@gnu.org" +tel "" +fax "" +language "Serbian" +territory "Serbia" +revision "1.3" +date "2006-10-09" +audience "general" +application "GNU locale" +abbreviation "" +% +category "i18n:1997";LC_IDENTIFICATION +category "i18n:1997";LC_CTYPE +category "i18n:1997";LC_COLLATE +category "i18n:1997";LC_MONETARY +category "i18n:1997";LC_NUMERIC +category "i18n:1997";LC_TIME +category "i18n:1997";LC_MESSAGES +category "i18n:1997";LC_PAPER +category "i18n:1997";LC_NAME +category "i18n:1997";LC_ADDRESS +category "i18n:1997";LC_TELEPHONE +category "i18n:1997";LC_MEASUREMENT +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" +END LC_CTYPE + +LC_COLLATE +copy "sr_RS" +END LC_COLLATE + +LC_MONETARY +int_curr_symbol "" +currency_symbol "" +mon_decimal_point "" +mon_thousands_sep "" +mon_grouping 3;3 +positive_sign "" +negative_sign "" +int_frac_digits 0 +frac_digits 0 +p_cs_precedes 1 +p_sep_by_space 1 +n_cs_precedes 1 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_NUMERIC +copy "sr_RS" +END LC_NUMERIC + +LC_TIME +abday "";"";/ + "";"";/ + "";"";/ + "" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +abmon "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" + +d_t_fmt "/ +/ +" +d_fmt "" +t_fmt "" +am_pm "";"" +t_fmt_ampm "" +date_fmt "/ +/ +" +% week 7;19971201;4 +first_weekday 2 +first_workday 2 +END LC_TIME + +LC_MESSAGES +yesexpr "" +noexpr "" +END LC_MESSAGES + +LC_PAPER +copy "sr_RS" +END LC_PAPER + +LC_NAME +name_fmt "/ +" +name_gen "" +name_mr "" +name_mrs "" +name_miss "" +name_ms "" +END LC_NAME + +LC_ADDRESS +postal_fmt "/ +/ +/ +/ +" +country_ab2 "" +country_ab3 "" +country_post "" +country_name "/ +" +country_num 688 +country_car "" +country_isbn "" +lang_name "" +lang_term "" +lang_lib "" +lang_ab "" +END LC_ADDRESS + +LC_TELEPHONE +copy "sr_RS" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "sr_RS" +END LC_MEASUREMENT diff --git a/localedata/locales/translit_neutral b/localedata/locales/translit_neutral index 413b14d70e..5883d28004 100644 --- a/localedata/locales/translit_neutral +++ b/localedata/locales/translit_neutral @@ -116,6 +116,8 @@ include "translit_wide";"" % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +% FRACTION SLASH + % WORD JOINER "" % FUNCTION APPLICATION diff --git a/login/utmp_file.c b/login/utmp_file.c index e7743bfac8..871c856071 100644 --- a/login/utmp_file.c +++ b/login/utmp_file.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1996-2002, 2003, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper and Paul Janzen , 1996. @@ -140,11 +140,11 @@ setutent_file (void) file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name); - file_fd = open_not_cancel_2 (file_name, O_RDWR); + file_fd = open_not_cancel_2 (file_name, O_RDWR | O_LARGEFILE); if (file_fd == -1) { /* Hhm, read-write access did not work. Try read-only. */ - file_fd = open_not_cancel_2 (file_name, O_RDONLY); + file_fd = open_not_cancel_2 (file_name, O_RDONLY | O_LARGEFILE); if (file_fd == -1) return 0; } @@ -459,7 +459,7 @@ updwtmp_file (const char *file, const struct utmp *utmp) int fd; /* Open WTMP file. */ - fd = open_not_cancel_2 (file, O_WRONLY); + fd = open_not_cancel_2 (file, O_WRONLY | O_LARGEFILE); if (fd < 0) return -1; diff --git a/malloc/arena.c b/malloc/arena.c index 1d9f952112..0dcb7cb9f8 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -1,5 +1,6 @@ /* Malloc implementation for multiple threads without lock contention. - Copyright (C) 2001,2002,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 2001,2002,2003,2004,2005,2006,2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Wolfram Gloger , 2001. @@ -59,10 +60,12 @@ typedef struct _heap_info { mstate ar_ptr; /* Arena for this heap. */ struct _heap_info *prev; /* Previous heap. */ size_t size; /* Current size in bytes. */ + size_t mprotect_size; /* Size in bytes that has been mprotected + PROT_READ|PROT_WRITE. */ /* Make sure the following data is properly aligned, particularly that sizeof (heap_info) + 2 * SIZE_SZ is a multiple of - MALLOG_ALIGNMENT. */ - char pad[-5 * SIZE_SZ & MALLOC_ALIGN_MASK]; + MALLOC_ALIGNMENT. */ + char pad[-6 * SIZE_SZ & MALLOC_ALIGN_MASK]; } heap_info; /* Get a compile-time error if the heap_info padding is not correct @@ -149,7 +152,7 @@ int __malloc_initialized = -1; static __malloc_ptr_t (*save_malloc_hook) (size_t __size, __const __malloc_ptr_t); -# if !defined _LIBC || (defined SHARED && !USE___THREAD) +# if !defined _LIBC || !defined USE_TLS || (defined SHARED && !USE___THREAD) static __malloc_ptr_t (*save_memalign_hook) (size_t __align, size_t __size, __const __malloc_ptr_t); # endif @@ -385,7 +388,7 @@ extern struct dl_open_hook *_dl_open_hook; libc_hidden_proto (_dl_open_hook); # endif -# if defined SHARED && !USE___THREAD +# if defined SHARED && defined USE_TLS && !USE___THREAD /* This is called by __pthread_initialize_minimal when it needs to use malloc to set up the TLS state. We cannot do the full work of ptmalloc_init (below) until __pthread_initialize_minimal has finished, @@ -428,7 +431,7 @@ ptmalloc_init (void) __malloc_initialized = 0; #ifdef _LIBC -# if defined SHARED && !USE___THREAD +# if defined SHARED && defined USE_TLS && !USE___THREAD /* ptmalloc_init_minimal may already have been called via __libc_malloc_pthread_startup, above. */ if (mp_.pagesize == 0) @@ -437,7 +440,7 @@ ptmalloc_init (void) ptmalloc_init_minimal(); #ifndef NO_THREADS -# if defined _LIBC +# if defined _LIBC && defined USE_TLS /* We know __pthread_initialize_minimal has already been called, and that is enough. */ # define NO_STARTER @@ -692,6 +695,7 @@ new_heap(size, top_pad) size_t size, top_pad; } h = (heap_info *)p2; h->size = size; + h->mprotect_size = size; THREAD_STAT(stat_n_heaps++); return h; } @@ -714,17 +718,34 @@ grow_heap(h, diff) heap_info *h; long diff; new_size = (long)h->size + diff; if((unsigned long) new_size > (unsigned long) HEAP_MAX_SIZE) return -1; - if(mprotect((char *)h + h->size, diff, PROT_READ|PROT_WRITE) != 0) - return -2; + if((unsigned long) new_size > h->mprotect_size) { + if (mprotect((char *)h + h->mprotect_size, + (unsigned long) new_size - h->mprotect_size, + PROT_READ|PROT_WRITE) != 0) + return -2; + h->mprotect_size = new_size; + } } else { new_size = (long)h->size + diff; if(new_size < (long)sizeof(*h)) return -1; /* Try to re-map the extra heap space freshly to save memory, and make it inaccessible. */ - if((char *)MMAP((char *)h + new_size, -diff, PROT_NONE, - MAP_PRIVATE|MAP_FIXED) == (char *) MAP_FAILED) - return -2; +#ifdef _LIBC + if (__builtin_expect (__libc_enable_secure, 0)) +#else + if (1) +#endif + { + if((char *)MMAP((char *)h + new_size, -diff, PROT_NONE, + MAP_PRIVATE|MAP_FIXED) == (char *) MAP_FAILED) + return -2; + h->mprotect_size = new_size; + } +#ifdef _LIBC + else + madvise ((char *)h + new_size, -diff, MADV_DONTNEED); +#endif /*fprintf(stderr, "shrink %p %08lx\n", h, new_size);*/ } h->size = new_size; diff --git a/malloc/hooks.c b/malloc/hooks.c index 8346e73453..708f0faf83 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -1,5 +1,5 @@ /* Malloc implementation for multiple threads without lock contention. - Copyright (C) 2001,2002,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Wolfram Gloger , 2001. @@ -414,7 +414,7 @@ memalign_check(alignment, bytes, caller) #ifndef NO_THREADS # ifdef _LIBC -# if USE___THREAD || !defined SHARED +# if USE___THREAD || (defined USE_TLS && !defined SHARED) /* These routines are never needed in this configuration. */ # define NO_STARTER # endif diff --git a/malloc/malloc.c b/malloc/malloc.c index 6427608a79..a369001520 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1618,7 +1618,7 @@ static Void_t* memalign_check(size_t alignment, size_t bytes, const Void_t *caller); #ifndef NO_THREADS # ifdef _LIBC -# if USE___THREAD || !defined SHARED +# if USE___THREAD || (defined USE_TLS && !defined SHARED) /* These routines are never needed in this configuration. */ # define NO_STARTER # endif @@ -2741,19 +2741,8 @@ static void do_check_malloc_state(mstate av) for (i = 0; i < NFASTBINS; ++i) { p = av->fastbins[i]; - /* The following test can only be performed for the main arena. - While mallopt calls malloc_consolidate to get rid of all fast - bins (especially those larger than the new maximum) this does - only happen for the main arena. Trying to do this for any - other arena would mean those arenas have to be locked and - malloc_consolidate be called for them. This is excessive. And - even if this is acceptable to somebody it still cannot solve - the problem completely since if the arena is locked a - concurrent malloc call might create a new arena which then - could use the newly invalid fast bins. */ - /* all bins past max_fast are empty */ - if (av == &main_arena && i > max_fast_bin) + if (i > max_fast_bin) assert(p == 0); while (p != 0) { @@ -2896,13 +2885,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; is one SIZE_SZ unit larger than for normal chunks, because there is no following chunk whose prev_size field could be used. */ -#if 1 - /* See the front_misalign handling below, for glibc there is no - need for further alignments. */ - size = (nb + SIZE_SZ + pagemask) & ~pagemask; -#else size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask; -#endif tried_mmap = true; /* Don't try if size wraps around 0 */ @@ -2920,12 +2903,6 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; address argument for later munmap in free() and realloc(). */ -#if 1 - /* For glibc, chunk2mem increases the address by 2*SIZE_SZ and - MALLOC_ALIGN_MASK is 2*SIZE_SZ-1. Each mmap'ed area is page - aligned and therefore definitely MALLOC_ALIGN_MASK-aligned. */ - assert (((INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK) == 0); -#else front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK; if (front_misalign > 0) { correction = MALLOC_ALIGNMENT - front_misalign; @@ -2933,12 +2910,10 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; p->prev_size = correction; set_head(p, (size - correction) |IS_MMAPPED); } - else -#endif - { - p = (mchunkptr)mm; - set_head(p, size|IS_MMAPPED); - } + else { + p = (mchunkptr)mm; + set_head(p, size|IS_MMAPPED); + } /* update statistics */ @@ -4122,6 +4097,7 @@ _int_malloc(mstate av, size_t bytes) for(;;) { int iters = 0; + bool any_larger = false; while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) { bck = victim->bk; if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0) @@ -4218,6 +4194,8 @@ _int_malloc(mstate av, size_t bytes) fwd->bk = victim; bck->fd = victim; + if (size >= nb + MINSIZE) + any_larger = true; #define MAX_ITERS 10000 if (++iters >= MAX_ITERS) break; @@ -4706,15 +4684,7 @@ static void malloc_consolidate(av) mstate av; reused anyway. */ -#if 0 - /* It is wrong to limit the fast bins to search using get_max_fast - because, except for the main arena, all the others might have - blocks in the high fast bins. It's not worth it anyway, just - search all bins all the time. */ maxfb = &(av->fastbins[fastbin_index(get_max_fast ())]); -#else - maxfb = &(av->fastbins[NFASTBINS - 1]); -#endif fb = &(av->fastbins[0]); do { if ( (p = *fb) != 0) { diff --git a/malloc/memusage.c b/malloc/memusage.c index d11e9e6ed5..b5077ffe0b 100644 --- a/malloc/memusage.c +++ b/malloc/memusage.c @@ -80,7 +80,6 @@ static memusage_cntr_t large; static memusage_cntr_t calls_total; static memusage_cntr_t inplace; static memusage_cntr_t decreasing; -static memusage_cntr_t realloc_free; static memusage_cntr_t inplace_mremap; static memusage_cntr_t decreasing_mremap; static memusage_size_t current_heap; @@ -104,8 +103,8 @@ extern const char *__progname; struct entry { - uint64_t heap; - uint64_t stack; + size_t heap; + size_t stack; uint32_t time_low; uint32_t time_high; }; @@ -129,8 +128,8 @@ update_data (struct header *result, size_t len, size_t old_len) /* Compute current heap usage and compare it with the maximum value. */ memusage_size_t heap - = catomic_exchange_and_add (¤t_heap, len - old_len) + len - old_len; - catomic_max (&peak_heap, heap); + = atomic_exchange_and_add (¤t_heap, len - old_len) + len - old_len; + atomic_max (&peak_heap, heap); /* Compute current stack usage and compare it with the maximum value. The base stack pointer might not be set if this is not @@ -153,15 +152,15 @@ update_data (struct header *result, size_t len, size_t old_len) start_sp = sp; size_t current_stack = start_sp - sp; #endif - catomic_max (&peak_stack, current_stack); + atomic_max (&peak_stack, current_stack); /* Add up heap and stack usage and compare it with the maximum value. */ - catomic_max (&peak_total, heap + current_stack); + atomic_max (&peak_total, heap + current_stack); /* Store the value only if we are writing to a file. */ if (fd != -1) { - uatomic32_t idx = catomic_exchange_and_add (&buffer_cnt, 1); + uatomic32_t idx = atomic_exchange_and_add (&buffer_cnt, 1); if (idx >= 2 * buffer_size) { /* We try to reset the counter to the correct range. If @@ -169,7 +168,7 @@ update_data (struct header *result, size_t len, size_t old_len) counter it does not matter since that thread will take care of the correction. */ unsigned int reset = idx - 2 * buffer_size; - catomic_compare_and_exchange_val_acq (&buffer_size, reset, idx); + atomic_compare_and_exchange_val_acq (&buffer_size, reset, idx); idx = reset; } @@ -268,7 +267,6 @@ me (void) GETTIME (first.time_low, first.time_high); /* Write it two times since we need the starting and end time. */ write (fd, &first, sizeof (first)); - write (fd, &first, sizeof (first)); /* Determine the buffer size. We use the default if the environment variable is not present. */ @@ -339,24 +337,24 @@ malloc (size_t len) return (*mallocp) (len); /* Keep track of number of calls. */ - catomic_increment (&calls[idx_malloc]); + atomic_increment (&calls[idx_malloc]); /* Keep track of total memory consumption for `malloc'. */ - catomic_add (&total[idx_malloc], len); + atomic_add (&total[idx_malloc], len); /* Keep track of total memory requirement. */ - catomic_add (&grand_total, len); + atomic_add (&grand_total, len); /* Remember the size of the request. */ if (len < 65536) - catomic_increment (&histogram[len / 16]); + atomic_increment (&histogram[len / 16]); else - catomic_increment (&large); + atomic_increment (&large); /* Total number of calls of any of the functions. */ - catomic_increment (&calls_total); + atomic_increment (&calls_total); /* Do the real work. */ result = (struct header *) (*mallocp) (len + sizeof (struct header)); if (result == NULL) { - catomic_increment (&failed[idx_malloc]); + atomic_increment (&failed[idx_malloc]); return NULL; } @@ -405,53 +403,36 @@ realloc (void *old, size_t len) } /* Keep track of number of calls. */ - catomic_increment (&calls[idx_realloc]); + atomic_increment (&calls[idx_realloc]); if (len > old_len) { /* Keep track of total memory consumption for `realloc'. */ - catomic_add (&total[idx_realloc], len - old_len); + atomic_add (&total[idx_realloc], len - old_len); /* Keep track of total memory requirement. */ - catomic_add (&grand_total, len - old_len); + atomic_add (&grand_total, len - old_len); } - - if (len == 0 && old != NULL) - { - /* Special case. */ - catomic_increment (&realloc_free); - /* Keep track of total memory freed using `free'. */ - catomic_add (&total[idx_free], real->length); - - /* Update the allocation data and write out the records if necessary. */ - update_data (NULL, 0, old_len); - - /* Do the real work. */ - (*freep) (real); - - return NULL; - } - /* Remember the size of the request. */ if (len < 65536) - catomic_increment (&histogram[len / 16]); + atomic_increment (&histogram[len / 16]); else - catomic_increment (&large); + atomic_increment (&large); /* Total number of calls of any of the functions. */ - catomic_increment (&calls_total); + atomic_increment (&calls_total); /* Do the real work. */ result = (struct header *) (*reallocp) (real, len + sizeof (struct header)); if (result == NULL) { - catomic_increment (&failed[idx_realloc]); + atomic_increment (&failed[idx_realloc]); return NULL; } /* Record whether the reduction/increase happened in place. */ if (real == result) - catomic_increment (&inplace); + atomic_increment (&inplace); /* Was the buffer increased? */ if (old_len > len) - catomic_increment (&decreasing); + atomic_increment (&decreasing); /* Update the allocation data and write out the records if necessary. */ update_data (result, len, old_len); @@ -482,16 +463,16 @@ calloc (size_t n, size_t len) return (*callocp) (n, len); /* Keep track of number of calls. */ - catomic_increment (&calls[idx_calloc]); + atomic_increment (&calls[idx_calloc]); /* Keep track of total memory consumption for `calloc'. */ - catomic_add (&total[idx_calloc], size); + atomic_add (&total[idx_calloc], size); /* Keep track of total memory requirement. */ - catomic_add (&grand_total, size); + atomic_add (&grand_total, size); /* Remember the size of the request. */ if (size < 65536) - catomic_increment (&histogram[size / 16]); + atomic_increment (&histogram[size / 16]); else - catomic_increment (&large); + atomic_increment (&large); /* Total number of calls of any of the functions. */ ++calls_total; @@ -499,7 +480,7 @@ calloc (size_t n, size_t len) result = (struct header *) (*mallocp) (size + sizeof (struct header)); if (result == NULL) { - catomic_increment (&failed[idx_calloc]); + atomic_increment (&failed[idx_calloc]); return NULL; } @@ -536,7 +517,7 @@ free (void *ptr) /* `free (NULL)' has no effect. */ if (ptr == NULL) { - catomic_increment (&calls[idx_free]); + atomic_increment (&calls[idx_free]); return; } @@ -550,9 +531,9 @@ free (void *ptr) } /* Keep track of number of calls. */ - catomic_increment (&calls[idx_free]); + atomic_increment (&calls[idx_free]); /* Keep track of total memory freed using `free'. */ - catomic_add (&total[idx_free], real->length); + atomic_add (&total[idx_free], real->length); /* Update the allocation data and write out the records if necessary. */ update_data (NULL, 0, real->length); @@ -586,22 +567,22 @@ mmap (void *start, size_t len, int prot, int flags, int fd, off_t offset) ? idx_mmap_a : prot & PROT_WRITE ? idx_mmap_w : idx_mmap_r); /* Keep track of number of calls. */ - catomic_increment (&calls[idx]); + atomic_increment (&calls[idx]); /* Keep track of total memory consumption for `malloc'. */ - catomic_add (&total[idx], len); + atomic_add (&total[idx], len); /* Keep track of total memory requirement. */ - catomic_add (&grand_total, len); + atomic_add (&grand_total, len); /* Remember the size of the request. */ if (len < 65536) - catomic_increment (&histogram[len / 16]); + atomic_increment (&histogram[len / 16]); else - catomic_increment (&large); + atomic_increment (&large); /* Total number of calls of any of the functions. */ - catomic_increment (&calls_total); + atomic_increment (&calls_total); /* Check for failures. */ if (result == NULL) - catomic_increment (&failed[idx]); + atomic_increment (&failed[idx]); else if (idx == idx_mmap_w) /* Update the allocation data and write out the records if necessary. Note the first parameter is NULL which means @@ -638,22 +619,22 @@ mmap64 (void *start, size_t len, int prot, int flags, int fd, off64_t offset) ? idx_mmap_a : prot & PROT_WRITE ? idx_mmap_w : idx_mmap_r); /* Keep track of number of calls. */ - catomic_increment (&calls[idx]); + atomic_increment (&calls[idx]); /* Keep track of total memory consumption for `malloc'. */ - catomic_add (&total[idx], len); + atomic_add (&total[idx], len); /* Keep track of total memory requirement. */ - catomic_add (&grand_total, len); + atomic_add (&grand_total, len); /* Remember the size of the request. */ if (len < 65536) - catomic_increment (&histogram[len / 16]); + atomic_increment (&histogram[len / 16]); else - catomic_increment (&large); + atomic_increment (&large); /* Total number of calls of any of the functions. */ - catomic_increment (&calls_total); + atomic_increment (&calls_total); /* Check for failures. */ if (result == NULL) - catomic_increment (&failed[idx]); + atomic_increment (&failed[idx]); else if (idx == idx_mmap_w) /* Update the allocation data and write out the records if necessary. Note the first parameter is NULL which means @@ -692,33 +673,33 @@ mremap (void *start, size_t old_len, size_t len, int flags, ...) if (!not_me && trace_mmap) { /* Keep track of number of calls. */ - catomic_increment (&calls[idx_mremap]); + atomic_increment (&calls[idx_mremap]); if (len > old_len) { /* Keep track of total memory consumption for `malloc'. */ - catomic_add (&total[idx_mremap], len - old_len); + atomic_add (&total[idx_mremap], len - old_len); /* Keep track of total memory requirement. */ - catomic_add (&grand_total, len - old_len); + atomic_add (&grand_total, len - old_len); } /* Remember the size of the request. */ if (len < 65536) - catomic_increment (&histogram[len / 16]); + atomic_increment (&histogram[len / 16]); else - catomic_increment (&large); + atomic_increment (&large); /* Total number of calls of any of the functions. */ - catomic_increment (&calls_total); + atomic_increment (&calls_total); /* Check for failures. */ if (result == NULL) - catomic_increment (&failed[idx_mremap]); + atomic_increment (&failed[idx_mremap]); else { /* Record whether the reduction/increase happened in place. */ if (start == result) - catomic_increment (&inplace_mremap); + atomic_increment (&inplace_mremap); /* Was the buffer increased? */ if (old_len > len) - catomic_increment (&decreasing_mremap); + atomic_increment (&decreasing_mremap); /* Update the allocation data and write out the records if necessary. Note the first parameter is NULL which means @@ -752,19 +733,19 @@ munmap (void *start, size_t len) if (!not_me && trace_mmap) { /* Keep track of number of calls. */ - catomic_increment (&calls[idx_munmap]); + atomic_increment (&calls[idx_munmap]); if (__builtin_expect (result == 0, 1)) { /* Keep track of total memory freed using `free'. */ - catomic_add (&total[idx_munmap], len); + atomic_add (&total[idx_munmap], len); /* Update the allocation data and write out the records if necessary. */ update_data (NULL, 0, len); } else - catomic_increment (&failed[idx_munmap]); + atomic_increment (&failed[idx_munmap]); } return result; @@ -789,12 +770,7 @@ dest (void) if (fd != -1) { /* Write the partially filled buffer. */ - if (buffer_cnt > buffer_size) - write (fd, buffer + buffer_size, - (buffer_cnt - buffer_size) * sizeof (struct entry)); - else - write (fd, buffer, buffer_cnt * sizeof (struct entry)); - + write (fd, buffer, buffer_cnt * sizeof (struct entry)); /* Go back to the beginning of the file. We allocated two records here when we opened the file. */ lseek (fd, 0, SEEK_SET); @@ -818,7 +794,7 @@ dest (void) \e[01;32mMemory usage summary:\e[0;0m heap total: %llu, heap peak: %lu, stack peak: %lu\n\ \e[04;34m total calls total memory failed calls\e[0m\n\ \e[00;34m malloc|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\ -\e[00;34mrealloc|\e[0m %10lu %12llu %s%12lu\e[00;00m (nomove:%ld, dec:%ld, free:%ld)\n\ +\e[00;34mrealloc|\e[0m %10lu %12llu %s%12lu\e[00;00m (in place: %ld, dec: %ld)\n\ \e[00;34m calloc|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\ \e[00;34m free|\e[0m %10lu %12llu\n", (unsigned long long int) grand_total, (unsigned long int) peak_heap, @@ -831,9 +807,7 @@ dest (void) (unsigned long long int) total[idx_realloc], failed[idx_realloc] ? "\e[01;41m" : "", (unsigned long int) failed[idx_realloc], - (unsigned long int) inplace, - (unsigned long int) decreasing, - (unsigned long int) realloc_free, + (unsigned long int) inplace, (unsigned long int) decreasing, (unsigned long int) calls[idx_calloc], (unsigned long long int) total[idx_calloc], failed[idx_calloc] ? "\e[01;41m" : "", @@ -846,7 +820,7 @@ dest (void) \e[00;34mmmap(r)|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\ \e[00;34mmmap(w)|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\ \e[00;34mmmap(a)|\e[0m %10lu %12llu %s%12lu\e[00;00m\n\ -\e[00;34m mremap|\e[0m %10lu %12llu %s%12lu\e[00;00m (nomove: %ld, dec:%ld)\n\ +\e[00;34m mremap|\e[0m %10lu %12llu %s%12lu\e[00;00m (in place: %ld, dec: %ld)\n\ \e[00;34m munmap|\e[0m %10lu %12llu %s%12lu\e[00;00m\n", (unsigned long int) calls[idx_mmap_r], (unsigned long long int) total[idx_mmap_r], diff --git a/malloc/memusage.sh b/malloc/memusage.sh index 67af4998ca..47f8cc22ff 100755 --- a/malloc/memusage.sh +++ b/malloc/memusage.sh @@ -44,7 +44,7 @@ Profile memory usage of PROGRAM. -d,--data=FILE Generate binary data file and store it in FILE -u,--unbuffered Don't buffer output -b,--buffer=SIZE Collect SIZE entries before writing them out - --no-timer Don't collect additional information through timer + --no-timer Don't collect additional information though timer -m,--mmap Also trace mmap & friends -?,--help Print this help and exit @@ -71,12 +71,21 @@ do_version() { printf $"Copyright (C) %s Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -" "2007" +" "2006" printf $"Written by %s. " "Ulrich Drepper" exit 0 } +# These variables are local +buffer= +data= +memusagestat_args= +notimer= +png= +progname= +tracemmap= + # Process arguments. But stop as soon as the program name is found. while test $# -gt 0; do case "$1" in @@ -213,15 +222,8 @@ datafile= if test -n "$data"; then datafile="$data" elif test -n "$png"; then - datafile=$(mktemp ${TMPDIR:-/tmp}/memusage.XXXXXX 2> /dev/null) - if test $? -ne 0; then - # Lame, but if there is no `mktemp' program the user cannot expect more. - if test "$RANDOM" != "$RANDOM"; then - datafile=${TMPDIR:-/tmp}/memusage.$RANDOM - else - datafile=${TMPDIR:-/tmp}/memusage.$$ - fi - fi + datafile=$(mktemp -t memusage.XXXXXX) || exit + trap 'rm -f "$datafile"; exit 1' HUP INT QUIT TERM PIPE fi if test -n "$datafile"; then add_env="$add_env MEMUSAGE_OUTPUT=$datafile" diff --git a/malloc/memusagestat.c b/malloc/memusagestat.c index 93ac2cd744..5d35ee0236 100644 --- a/malloc/memusagestat.c +++ b/malloc/memusagestat.c @@ -55,8 +55,8 @@ static const struct argp_option options[] = { "time", 't', NULL, 0, N_("Generate output linear to time (default is linear to number of function calls)") }, { "total", 'T', NULL, 0, N_("Also draw graph for total memory consumption") }, - { "x-size", 'x', "VALUE", 0, N_("Make output graphic VALUE pixels wide") }, - { "y-size", 'y', "VALUE", 0, N_("Make output graphic VALUE pixels high") }, + { "x-size", 'x', "VALUE", 0, N_("make output graphic VALUE pixel wide") }, + { "y-size", 'y', "VALUE", 0, N_("make output graphic VALUE pixel high") }, { NULL, 0, NULL, 0, NULL } }; @@ -81,8 +81,8 @@ static struct argp argp = struct entry { - uint64_t heap; - uint64_t stack; + size_t heap; + size_t stack; uint32_t time_low; uint32_t time_high; }; diff --git a/malloc/mtrace.pl b/malloc/mtrace.pl index 280b469d92..8a0fbc7e95 100644 --- a/malloc/mtrace.pl +++ b/malloc/mtrace.pl @@ -1,7 +1,7 @@ #! @PERL@ eval "exec @PERL@ -S $0 $*" if 0; -# Copyright (C) 1997-2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# Copyright (C) 1997-2004, 2005, 2006 Free Software Foundation, Inc. # This file is part of the GNU C Library. # Contributed by Ulrich Drepper , 1997. # Based on the mtrace.awk script. @@ -45,7 +45,7 @@ arglist: while (@ARGV) { $ARGV[0] eq "--vers" || $ARGV[0] eq "--versi" || $ARGV[0] eq "--versio" || $ARGV[0] eq "--version") { print "mtrace (GNU $PACKAGE) $VERSION\n"; - print "Copyright (C) 2007 Free Software Foundation, Inc.\n"; + print "Copyright (C) 2006 Free Software Foundation, Inc.\n"; print "This is free software; see the source for copying conditions. There is NO\n"; print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"; print "Written by Ulrich Drepper \n"; diff --git a/manual/argp.texi b/manual/argp.texi index b37232306b..090d49f7a5 100644 --- a/manual/argp.texi +++ b/manual/argp.texi @@ -832,7 +832,7 @@ Don't exit on errors, although they may still result in error messages. @item ARGP_LONG_ONLY Use the gnu getopt `long-only' rules for parsing arguments. This allows long-options to be recognized with only a single @samp{-} -(i.e., @samp{-help}). This results in a less useful interface, and its +(i.e. @samp{-help}). This results in a less useful interface, and its use is discouraged as it conflicts with the way most GNU programs work as well as the GNU coding standards. diff --git a/manual/charset.texi b/manual/charset.texi index 8b2c09ca79..5063246d61 100644 --- a/manual/charset.texi +++ b/manual/charset.texi @@ -207,7 +207,7 @@ and transmittal. Because each single wide character consists of more than one byte, they are effected by byte-ordering. Thus, machines with different endianesses would see different values when accessing the same data. This byte ordering concern also applies for communication protocols -that are all byte-based and therefore require that the sender has to +that are all byte-based and, thereforet require that the sender has to decide about splitting the wide character in bytes. A last (but not least important) point is that wide characters often require more storage space than a customized byte-oriented character set. @@ -737,7 +737,7 @@ the return value is @math{0}. If the next @var{n} bytes form a valid multibyte character, the number of bytes belonging to this multibyte character byte sequence is returned. -If the first @var{n} bytes possibly form a valid multibyte +If the the first @var{n} bytes possibly form a valid multibyte character but the character is incomplete, the return value is @code{(size_t) -2}. Otherwise the multibyte character sequence is invalid and the return value is @code{(size_t) -1}. @@ -2231,7 +2231,7 @@ ordering of the processor (or at least the running process) is not the same as the one required for UCS-4. This is done for performance reasons as one does not want to perform unnecessary byte-swapping operations if one is not interested in actually seeing the result in UCS-4. To avoid -trouble with endianness, the internal representation consistently is named +trouble with endianess, the internal representation consistently is named @code{INTERNAL} even on big-endian systems where the representations are identical. diff --git a/manual/conf.texi b/manual/conf.texi index 605e305071..ef00db6b7b 100644 --- a/manual/conf.texi +++ b/manual/conf.texi @@ -1455,6 +1455,11 @@ Inquire about the value of @code{_POSIX_ASYNC_IO}. Inquire about the value of @code{_POSIX_PRIO_IO}. @comment unistd.h +@comment POSIX.1g +@item _PC_SOCK_MAXBUF +Inquire about the value of @code{_POSIX_PIPE_BUF}. + +@comment unistd.h @comment LFS @item _PC_FILESIZEBITS Inquire about the availability of large files on the filesystem. diff --git a/manual/errno.texi b/manual/errno.texi index dd9f861dc8..e230506427 100644 --- a/manual/errno.texi +++ b/manual/errno.texi @@ -1434,7 +1434,7 @@ like those given to the @code{printf} family of functions. The arguments required for the format can follow the @var{format} parameter. Just like @code{perror}, @code{error} also can report an error code in textual form. But unlike @code{perror} the error value is explicitly -passed to the function in the @var{errnum} parameter. This eliminates +passed to the function in the @var{errnum} parameter. This elimintates the problem mentioned above that the error reporting function must be called immediately after the function causing the error since otherwise @code{errno} might have a different value. @@ -1479,7 +1479,7 @@ in an input file (like a programming language source code file etc). If the global variable @code{error_one_per_line} is set to a non-zero value @code{error_at_line} will avoid printing consecutive messages for -the same file and line. Repetition which are not directly following +the same file anem line. Repetition which are not directly following each other are not caught. Just like @code{error} this function only returned if @var{status} is diff --git a/manual/filesys.texi b/manual/filesys.texi index 9719d41946..2436f22e88 100644 --- a/manual/filesys.texi +++ b/manual/filesys.texi @@ -131,7 +131,7 @@ this function is deprecated. @comment GNU @deftypefun {char *} get_current_dir_name (void) @vindex PWD -This @code{get_current_dir_name} function is basically equivalent to +This @code{get_current_dir_name} function is bascially equivalent to @w{@code{getcwd (NULL, 0)}}. The only difference is that the value of the @code{PWD} variable is returned if this value is correct. This is a subtle difference which is visible if the path described by the @@ -917,7 +917,7 @@ function returns a value other than @math{0} this value is returned as the return value of @code{ftw}. When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} on a -32-bit system this function is in fact @code{ftw64}, i.e., the LFS +32-bit system this function is in fact @code{ftw64}, i.e. the LFS interface transparently replaces the old interface. @end deftypefun @@ -990,7 +990,7 @@ accordingly. If the return value of a callback invocation was non-zero then that value is returned. When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} on a -32-bit system this function is in fact @code{nftw64}, i.e., the LFS +32-bit system this function is in fact @code{nftw64}, i.e. the LFS interface transparently replaces the old interface. @end deftypefun @@ -1434,7 +1434,7 @@ the existing directory named @var{newname} is deleted first. The name One useful feature of @code{rename} is that the meaning of @var{newname} changes ``atomically'' from any previously existing file by that name to -its new meaning (i.e., the file that was called @var{oldname}). There is +its new meaning (i.e. the file that was called @var{oldname}). There is no instant at which @var{newname} is non-existent ``in between'' the old meaning and the new meaning. If there is a system crash during the operation, it is possible for both names to still exist; but @@ -3104,7 +3104,7 @@ terminates abnormally). This function is reentrant. When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} on a -32-bit system this function is in fact @code{tmpfile64}, i.e., the LFS +32-bit system this function is in fact @code{tmpfile64}, i.e. the LFS interface transparently replaces the old interface. @end deftypefun diff --git a/manual/lang.texi b/manual/lang.texi index 82c5e962a0..96f6d9df55 100644 --- a/manual/lang.texi +++ b/manual/lang.texi @@ -1274,7 +1274,7 @@ type of a particular structure member. @comment ISO @deftypefn {Macro} size_t offsetof (@var{type}, @var{member}) This expands to a integer constant expression that is the offset of the -structure member named @var{member} in the structure type @var{type}. +structure member named @var{member} in a the structure type @var{type}. For example, @code{offsetof (struct s, elem)} is the offset, in bytes, of the member @code{elem} in a @code{struct s}. diff --git a/manual/maint.texi b/manual/maint.texi index 567db981a3..2b9221233a 100644 --- a/manual/maint.texi +++ b/manual/maint.texi @@ -156,7 +156,7 @@ subdirectories under it intended to be new specific categories. to look for a system-dependent version of a file that's not in @file{generic}. This means that any system-dependent source file must have an analogue in @file{generic}, even if the routines defined by that -file are not implemented on other platforms. Second, the @file{generic} +file are not implemented on other platforms. Second. the @file{generic} version of a system-dependent file is used if the makefiles do not find a version specific to the system you're compiling for. diff --git a/manual/memory.texi b/manual/memory.texi index cbe147b712..91b9d84eb2 100644 --- a/manual/memory.texi +++ b/manual/memory.texi @@ -31,7 +31,7 @@ One of the most basic resources a process has available to it is memory. There are a lot of different ways systems organize memory, but in a typical one, each process has one linear virtual address space, with addresses running from zero to some huge maximum. It need not be -contiguous; i.e., not all of these addresses actually can be used to +contiguous; i.e. not all of these addresses actually can be used to store data. The virtual memory is divided into pages (4 kilobytes is typical). @@ -1065,7 +1065,7 @@ This is the total size of memory occupied by free (not in use) chunks. @item int keepcost This is the size of the top-most releasable chunk that normally -borders the end of the heap (i.e., the high end of the virtual address +borders the end of the heap (i.e. the high end of the virtual address space's data segment). @end table @@ -2407,7 +2407,7 @@ of the data segment is. @cindex paging You can tell the system to associate a particular virtual memory page -with a real page frame and keep it that way --- i.e., cause the page to +with a real page frame and keep it that way --- i.e. cause the page to be paged in if it isn't already and mark it so it will never be paged out and consequently will never cause a page fault. This is called @dfn{locking} a page. @@ -2467,7 +2467,7 @@ A memory lock is associated with a virtual page, not a real frame. The paging rule is: If a frame backs at least one locked page, don't page it out. -Memory locks do not stack. I.e., you can't lock a particular page twice +Memory locks do not stack. I.e. you can't lock a particular page twice so that it has to be unlocked twice before it is truly unlocked. It is either locked or it isn't. diff --git a/manual/message.texi b/manual/message.texi index e772b2de1f..1507a6d04a 100644 --- a/manual/message.texi +++ b/manual/message.texi @@ -1810,8 +1810,8 @@ help to understand the input better. Other programs help to manage development cycle when new messages appear in the source files or when a new translation of the messages appear. -Here it should only be noted that using all the tools in GNU gettext it -is possible to @emph{completely} automate the handling of message +here it should only be noted that using all the tools in GNU gettext it +is possible to @emph{completely} automize the handling of message catalog. Beside marking the translatable string in the source code and generating the translations the developers do not have anything to do themselves. diff --git a/manual/resource.texi b/manual/resource.texi index aabd28976a..df77408e68 100644 --- a/manual/resource.texi +++ b/manual/resource.texi @@ -584,7 +584,7 @@ to}, but doesn't @emph{need to} run occupies the CPU. @cindex preemptive scheduling When two processes are in contention to use the CPU at any instant, the one with the higher absolute priority always gets it. This is true even if the -process with the lower priority is already using the CPU (i.e., the +process with the lower priority is already using the CPU (i.e. the scheduling is preemptive). Of course, we're only talking about processes that are running or ``ready to run,'' which means they are ready to execute instructions right now. When a process blocks to wait @@ -819,7 +819,7 @@ existing policy is not @code{SCHED_OTHER}. @item The calling process does not have @code{CAP_SYS_NICE} permission and its -owner is not the target process' owner. I.e., the effective uid of the +owner is not the target process' owner. I.e. the effective uid of the calling process is neither the effective nor the real uid of process @var{pid}. @c We need a cross reference to the capabilities section, when written. @@ -1185,7 +1185,7 @@ The value of @var{class} is not valid. @item EPERM The call would set the nice value of a process which is owned by a different -user than the calling process (i.e., the target process' real or effective +user than the calling process (i.e. the target process' real or effective uid does not match the calling process' effective uid) and the calling process does not have @code{CAP_SYS_NICE} permission. @@ -1215,7 +1215,7 @@ a process group ID (pgid). @comment sys/resource.h @comment BSD @item PRIO_USER -All the processes owned by a particular user (i.e., whose real uid +All the processes owned by a particular user (i.e. whose real uid indicates the user). The argument @var{id} is a user ID (uid). @end vtable @@ -1272,7 +1272,7 @@ other process or thread is allowed to use. @item The access to certain resources (RAM, I/O ports) has different costs from different CPUs. This is the case in NUMA (Non-Uniform Memory -Architecture) machines. Preferably memory should be accessed locally +Architecture) machines. Preferrably memory should be accessed locally but this requirement is usually not visible to the scheduler. Therefore forcing a process or thread to the CPUs which have local access to the mostly used memory helps to significantly boost the diff --git a/manual/search.texi b/manual/search.texi index 0afd0aecd0..1ac2653f16 100644 --- a/manual/search.texi +++ b/manual/search.texi @@ -82,7 +82,7 @@ starting at @var{base} if it is found. If no matching element is available @code{NULL} is returned. The mean runtime of this function is @code{*@var{nmemb}}/2. This -function should only be used if elements often get added to or deleted from +function should only be used elements often get added to or deleted from the array in which case it might not be useful to sort the array before searching. @end deftypefun @@ -247,21 +247,21 @@ Couldn't find Janice. @node Hash Search Function @section The @code{hsearch} function. -The functions mentioned so far in this chapter are for searching in a sorted +The functions mentioned so far in this chapter are searching in a sorted or unsorted array. There are other methods to organize information which later should be searched. The costs of insert, delete and search differ. One possible implementation is using hashing tables. -The following functions are declared in the header file @file{search.h}. +The following functions are declared in the the header file @file{search.h}. @comment search.h @comment SVID @deftypefun int hcreate (size_t @var{nel}) The @code{hcreate} function creates a hashing table which can contain at least @var{nel} elements. There is no possibility to grow this table so -it is necessary to choose the value for @var{nel} wisely. The method -used to implement this function might make it necessary to make the +it is necessary to choose the value for @var{nel} wisely. The used +methods to implement this function might make it necessary to make the number of elements in the hashing table larger than the expected maximal -number of elements. Hashing tables usually work inefficiently if they are +number of elements. Hashing tables usually work inefficient if they are filled 80% or more. The constant access time guaranteed by hashing can only be achieved if few collisions exist. See Knuth's ``The Art of Computer Programming, Part 3: Searching and Sorting'' for more @@ -368,9 +368,9 @@ necessary for the @code{struct hsearch_data} object can be allocated dynamically. It must be initialized with zero before calling this function. -The return value is non-zero if the operation was successful. If the -return value is zero, something went wrong, which probably means the -programs ran out of memory. +The return value is non-zero if the operation were successful. if the +return value is zero something went wrong which probably means the +programs runs out of memory. @end deftypefun @comment search.h diff --git a/manual/signal.texi b/manual/signal.texi index dfaaa88950..cbf746639a 100644 --- a/manual/signal.texi +++ b/manual/signal.texi @@ -2567,7 +2567,7 @@ The prototype for the @code{sigprocmask} function is in @file{signal.h}. Note that you must not use @code{sigprocmask} in multi-threaded processes, because each thread has its own signal mask and there is no single process signal mask. According to POSIX, the behavior of @code{sigprocmask} in a -multi-threaded process is ``unspecified''. +multi-threaded process is ``unspeficied''. Instead, use @code{pthread_sigmask}. @ifset linuxthreads @xref{Threads and Signal Handling}. diff --git a/manual/startup.texi b/manual/startup.texi index 79c79683f7..5ccb78b958 100644 --- a/manual/startup.texi +++ b/manual/startup.texi @@ -830,7 +830,7 @@ mean that there was difficulty in opening the files. Don't confuse a program's exit status with a process' termination status. There are lots of ways a process can terminate besides having it's program finish. In the event that the process termination @emph{is} caused by program -termination (i.e., @code{exit}), though, the program's exit status becomes +termination (i.e. @code{exit}), though, the program's exit status becomes part of the process' termination status. @node Cleanups on Exit diff --git a/manual/stdio.texi b/manual/stdio.texi index 30a6e6ebe0..977989d95e 100644 --- a/manual/stdio.texi +++ b/manual/stdio.texi @@ -433,7 +433,7 @@ see @ref{Stream Buffering}. @cindex multi-threaded application Streams can be used in multi-threaded applications in the same way they are used in single-threaded applications. But the programmer must be -aware of the possible complications. It is important to know about +aware of a the possible complications. It is important to know about these also if the program one writes never use threads since the design and implementation of many stream functions is heavily influenced by the requirements added by multi-threaded programming. @@ -1992,7 +1992,7 @@ the precision. The exponent always contains at least two digits. The The @samp{%g} and @samp{%G} conversions print the argument in the style of @samp{%e} or @samp{%E} (respectively) if the exponent would be less than -4 or greater than or equal to the precision; otherwise they use -the @samp{%f} style. A precision of @code{0}, is taken as 1. +the @samp{%f} style. A precision of @code{0}, is taken as 1. is Trailing zeros are removed from the fractional portion of the result and a decimal-point character appears only if it is followed by a digit. diff --git a/manual/string.texi b/manual/string.texi index 2fe60395eb..f582bad96d 100644 --- a/manual/string.texi +++ b/manual/string.texi @@ -1187,8 +1187,8 @@ regards these characters as parts of the alphabet they do match. @comment ISO @deftypefun int strncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{size}) This function is the similar to @code{strcmp}, except that no more than -@var{size} characters are compared. In other words, if the two -strings are the same in their first @var{size} characters, the +@var{size} wide characters are compared. In other words, if the two +strings are the same in their first @var{size} wide characters, the return value is zero. @end deftypefun @@ -1966,6 +1966,11 @@ Note that ``character'' is here used in the sense of byte. In a string using a multibyte character encoding (abstract) character consisting of more than one byte are not treated as an entity. Each byte is treated separately. The function is not locale-dependent. + +Note that ``character'' is here used in the sense of byte. In a string +using a multibyte character encoding (abstract) character consisting of +more than one byte are not treated as an entity. Each byte is treated +separately. The function is not locale-dependent. @end deftypefun @comment wchar.h diff --git a/manual/sysinfo.texi b/manual/sysinfo.texi index 8f2dd451be..0a44830359 100644 --- a/manual/sysinfo.texi +++ b/manual/sysinfo.texi @@ -872,7 +872,7 @@ shall be accessible while the filesystem is mounted. @item MS_SYNCHRONOUS This bit on specifies that all writes to the filesystem while it is -mounted shall be synchronous; i.e., data shall be synced before each +mounted shall be synchronous; i.e. data shall be synced before each write completes rather than held in the buffer cache. @item MS_MANDLOCK diff --git a/manual/syslog.texi b/manual/syslog.texi index 3d7def83f7..df4179e27a 100644 --- a/manual/syslog.texi +++ b/manual/syslog.texi @@ -370,7 +370,7 @@ The message is only for debugging purposes. Results are undefined if the priority code is anything else. -If the process does not presently have a Syslog connection open (i.e., +If the process does not presently have a Syslog connection open (i.e. it did not call @code{openlog}), @code{syslog} implicitly opens the connection the same as @code{openlog} would, with the following defaults for information that would otherwise be included in an @code{openlog} diff --git a/manual/time.texi b/manual/time.texi index a3e8438bce..9b87d3eed0 100644 --- a/manual/time.texi +++ b/manual/time.texi @@ -193,7 +193,7 @@ total amount of time a process has actively used a CPU since some arbitrary event. On the GNU system, that event is the creation of the process. While arbitrary in general, the event is always the same event for any particular process, so you can always measure how much time on -the CPU a particular computation takes by examining the process' CPU +the CPU a particular computation takes by examinining the process' CPU time before and after the computation. @cindex CPU time @cindex clock ticks @@ -447,7 +447,7 @@ current calendar time is not available, the value @comment time.h @comment SVID, XPG @deftypefun int stime (time_t *@var{newtime}) -@code{stime} sets the system clock, i.e., it tells the system that the +@code{stime} sets the system clock, i.e. it tells the system that the current calendar time is @var{newtime}, where @code{newtime} is interpreted as described in the above definition of @code{time_t}. @@ -1470,7 +1470,7 @@ widely available. @node Low-Level Time String Parsing @subsubsection Interpret string according to given format -The first function is rather low-level. It is nevertheless frequently +he first function is rather low-level. It is nevertheless frequently used in software since it is better known. Its interface and implementation are heavily influenced by the @code{getdate} function, which is defined and implemented in terms of calls to @code{strptime}. @@ -1790,7 +1790,7 @@ process. If the input string contains more characters than required by the format string the return value points right after the last consumed input character. If the whole input string is consumed the return value points to the @code{NULL} byte at the end of the string. If an error -occurs, i.e., @code{strptime} fails to match all of the format string, +occurs, i.e. @code{strptime} fails to match all of the format string, the function returns @code{NULL}. @end deftypefun diff --git a/math/atest-exp.c b/math/atest-exp.c index 2f168c9a6d..158be4231a 100644 --- a/math/atest-exp.c +++ b/math/atest-exp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2000, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Geoffrey Keating , 1997. @@ -171,10 +171,8 @@ main (void) memset (e2, '\0', sizeof (mp1)); for (i = -1; i < 100 && i < FRAC / 4; i++) - e2[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig, - exp1[i + 1]) - - hexdig) - << (FRAC - i * 4 - 4) % mpbpl); + e2[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, exp1[i + 1]) - hexdig) + << (FRAC - i * 4 - 4) % mpbpl); if (mpn_cmp (ex, e2, SZ) >= 0) mpn_sub_n (e3, ex, e2, SZ); diff --git a/math/atest-exp2.c b/math/atest-exp2.c index 2c028a2b83..33d942fc61 100644 --- a/math/atest-exp2.c +++ b/math/atest-exp2.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2000, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Geoffrey Keating , 1997. @@ -73,9 +73,8 @@ read_mpn_hex(mp_limb_t *x, const char *str) memset (x, 0, sizeof (mp1)); for (i = -1; i < 100 && i < FRAC / 4; ++i) - x[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig, str[i + 1]) - - hexdig) - << (FRAC - i * 4 - 4) % mpbpl); + x[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, str[i + 1]) - hexdig) + << (FRAC - i * 4 - 4) % mpbpl); } static mp_limb_t *get_log2(void) __attribute__((const)); diff --git a/math/atest-sincos.c b/math/atest-sincos.c index bef3521c96..911aaec275 100644 --- a/math/atest-sincos.c +++ b/math/atest-sincos.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2000, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Geoffrey Keating , 1997. @@ -239,11 +239,9 @@ main (void) memset (c2, 0, sizeof (mp1)); for (i = 0; i < 100 && i < FRAC / 4; i++) { - s2[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig, sin1[i]) - - hexdig) - << (FRAC - i * 4 - 4) % mpbpl); - c2[(FRAC - i * 4 - 4) / mpbpl] |= ((mp_limb_t) (strchr (hexdig, cos1[i]) - - hexdig) + s2[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, sin1[i]) - hexdig) + << (FRAC - i * 4 - 4) % mpbpl); + c2[(FRAC - i * 4 - 4) / mpbpl] |= ((strchr (hexdig, cos1[i]) - hexdig) << (FRAC - i * 4 - 4) % mpbpl); } diff --git a/math/basic-test.c b/math/basic-test.c index e42c014572..e48a3ae4e0 100644 --- a/math/basic-test.c +++ b/math/basic-test.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1999 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger , 1999. @@ -44,7 +44,7 @@ NAME (void) \ \ zero_var = 0.0; \ one_var = 1.0; \ - NaN_var = zero_var/zero_var; \ + NaN_var = zero_var / zero_var; \ Inf_var = one_var / zero_var; \ \ (void) &zero_var; \ @@ -103,21 +103,51 @@ NAME (void) \ check (#FLOAT " isinf (-HUGE_VALx) == -1", isinf (x1) == -1); \ } +#define TEST_TRUNC(NAME, FLOAT, DOUBLE) \ +void \ +NAME (void) \ +{ \ + volatile DOUBLE Inf_var, NaN_var, zero_var, one_var; \ + FLOAT x1, x2; \ + \ + zero_var = 0.0; \ + one_var = 1.0; \ + NaN_var = zero_var / zero_var; \ + Inf_var = one_var / zero_var; \ + \ + (void) &NaN_var; \ + (void) &Inf_var; \ + \ + x1 = (FLOAT) NaN_var; \ + check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") NaN", isnan (x1) != 0); \ + x2 = (FLOAT) Inf_var; \ + check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") Inf", isinf (x2) != 0); \ +} + TEST_FUNC (float_test, float, nanf, FLT_EPSILON, HUGE_VALF) TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL) +TEST_TRUNC (truncdfsf_test, float, double) #ifndef NO_LONG_DOUBLE TEST_FUNC (ldouble_test, long double, nanl, LDBL_EPSILON, HUGE_VALL) +TEST_TRUNC (trunctfsf_test, float, long double) +TEST_TRUNC (trunctfdf_test, double, long double) #endif int -main (void) +do_test (void) { float_test (); double_test (); + truncdfsf_test(); #ifndef NO_LONG_DOUBLE ldouble_test (); + trunctfsf_test(); + trunctfdf_test(); #endif return errors != 0; } + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/math/bug-nextafter.c b/math/bug-nextafter.c index 2a967c75bf..1d21841ea6 100644 --- a/math/bug-nextafter.c +++ b/math/bug-nextafter.c @@ -4,6 +4,9 @@ #include #include +float zero = 0.0; +float inf = INFINITY; + int main (void) { @@ -34,6 +37,81 @@ main (void) ++result; } + i = 0; + m = FLT_MIN; + feclearexcept (FE_ALL_EXCEPT); + i = nextafterf (m, i); + if (i < 0 || i >= FLT_MIN) + { + puts ("nextafterf+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterf+ did not underflow"); + ++result; + } + i = 0; + feclearexcept (FE_ALL_EXCEPT); + i = nextafterf (-m, -i); + if (i > 0 || i <= -FLT_MIN) + { + puts ("nextafterf- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterf- did not underflow"); + ++result; + } + i = -INFINITY; + feclearexcept (FE_ALL_EXCEPT); + m = nextafterf (zero, inf); + if (m < 0.0 || m >= FLT_MIN) + { + puts ("nextafterf+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterf+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nextafterf (m, i) != 0.0) + { + puts ("nextafterf+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterf+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + m = nextafterf (copysignf (zero, -1.0), -inf); + if (m > 0.0 || m <= -FLT_MIN) + { + puts ("nextafterf- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterf- did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nextafterf (m, -i) != 0.0) + { + puts ("nextafterf- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterf- did not underflow"); + ++result; + } + double di = INFINITY; double dm = DBL_MAX; feclearexcept (FE_ALL_EXCEPT); @@ -59,5 +137,182 @@ main (void) ++result; } + di = 0; + dm = DBL_MIN; + feclearexcept (FE_ALL_EXCEPT); + di = nextafter (dm, di); + if (di < 0 || di >= DBL_MIN) + { + puts ("nextafter+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafter+ did not underflow"); + ++result; + } + di = 0; + feclearexcept (FE_ALL_EXCEPT); + di = nextafter (-dm, -di); + if (di > 0 || di <= -DBL_MIN) + { + puts ("nextafter- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafter- did not underflow"); + ++result; + } + di = -INFINITY; + feclearexcept (FE_ALL_EXCEPT); + dm = nextafter (zero, inf); + if (dm < 0.0 || dm >= DBL_MIN) + { + puts ("nextafter+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafter+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nextafter (dm, di) != 0.0) + { + puts ("nextafter+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafter+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + dm = nextafter (copysign (zero, -1.0), -inf); + if (dm > 0.0 || dm <= -DBL_MIN) + { + puts ("nextafter- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafter- did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nextafter (dm, -di) != 0.0) + { + puts ("nextafter- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafter- did not underflow"); + ++result; + } + +#ifndef NO_LONG_DOUBLE + long double li = INFINITY; + long double lm = LDBL_MAX; + feclearexcept (FE_ALL_EXCEPT); + if (nextafterl (lm, li) != li) + { + puts ("nextafterl+ failed"); + ++result; + } + if (fetestexcept (FE_OVERFLOW) == 0) + { + puts ("nextafterl+ did not overflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nextafterl (-lm, -li) != -li) + { + puts ("nextafterl failed"); + ++result; + } + if (fetestexcept (FE_OVERFLOW) == 0) + { + puts ("nextafterl- did not overflow"); + ++result; + } + + li = 0; + lm = LDBL_MIN; + feclearexcept (FE_ALL_EXCEPT); + li = nextafterl (lm, li); + if (li < 0 || li >= LDBL_MIN) + { + puts ("nextafterl+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterl+ did not underflow"); + ++result; + } + li = 0; + feclearexcept (FE_ALL_EXCEPT); + li = nextafterl (-lm, -li); + if (li > 0 || li <= -LDBL_MIN) + { + puts ("nextafterl- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterl- did not underflow"); + ++result; + } + li = -INFINITY; + feclearexcept (FE_ALL_EXCEPT); + lm = nextafterl (zero, inf); + if (lm < 0.0 || lm >= LDBL_MIN) + { + puts ("nextafterl+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterl+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nextafterl (lm, li) != 0.0) + { + puts ("nextafterl+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterl+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + lm = nextafterl (copysign (zero, -1.0), -inf); + if (lm > 0.0 || lm <= -LDBL_MIN) + { + puts ("nextafterl- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterl- did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nextafterl (lm, -li) != 0.0) + { + puts ("nextafterl- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nextafterl- did not underflow"); + ++result; + } +#endif + return result; } diff --git a/math/bug-nexttoward.c b/math/bug-nexttoward.c index e306a129c2..ff57e5e3f5 100644 --- a/math/bug-nexttoward.c +++ b/math/bug-nexttoward.c @@ -4,6 +4,9 @@ #include #include +float zero = 0.0; +float inf = INFINITY; + int main (void) { @@ -35,6 +38,81 @@ main (void) ++result; } + fi = 0; + m = FLT_MIN; + feclearexcept (FE_ALL_EXCEPT); + fi = nexttowardf (m, fi); + if (fi < 0 || fi >= FLT_MIN) + { + puts ("nexttowardf+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardf+ did not underflow"); + ++result; + } + fi = 0; + feclearexcept (FE_ALL_EXCEPT); + fi = nexttowardf (-m, -fi); + if (fi > 0 || fi <= -FLT_MIN) + { + puts ("nexttowardf- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardf- did not underflow"); + ++result; + } + fi = -INFINITY; + feclearexcept (FE_ALL_EXCEPT); + m = nexttowardf (zero, inf); + if (m < 0.0 || m >= FLT_MIN) + { + puts ("nexttowardf+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardf+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nexttowardf (m, fi) != 0.0) + { + puts ("nexttowardf+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardf+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + m = nexttowardf (copysignf (zero, -1.0), -inf); + if (m > 0.0 || m <= -FLT_MIN) + { + puts ("nexttowardf- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardf- did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nexttowardf (m, -fi) != 0.0) + { + puts ("nexttowardf- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardf- did not underflow"); + ++result; + } + tl = (long double) DBL_MAX + 1.0e305L; double di = INFINITY; double dm = DBL_MAX; @@ -61,5 +139,182 @@ main (void) ++result; } + di = 0; + dm = DBL_MIN; + feclearexcept (FE_ALL_EXCEPT); + di = nexttoward (dm, di); + if (di < 0 || di >= DBL_MIN) + { + puts ("nexttoward+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttoward+ did not underflow"); + ++result; + } + di = 0; + feclearexcept (FE_ALL_EXCEPT); + di = nexttoward (-dm, -di); + if (di > 0 || di <= -DBL_MIN) + { + puts ("nexttoward- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttoward- did not underflow"); + ++result; + } + di = -INFINITY; + feclearexcept (FE_ALL_EXCEPT); + dm = nexttoward (zero, inf); + if (dm < 0.0 || dm >= DBL_MIN) + { + puts ("nexttoward+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttoward+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nexttoward (dm, di) != 0.0) + { + puts ("nexttoward+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttoward+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + dm = nexttoward (copysign (zero, -1.0), -inf); + if (dm > 0.0 || dm <= -DBL_MIN) + { + puts ("nexttoward- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttoward- did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nexttoward (dm, -di) != 0.0) + { + puts ("nexttoward- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttoward- did not underflow"); + ++result; + } + +#ifndef NO_LONG_DOUBLE + long double li = INFINITY; + long double lm = LDBL_MAX; + feclearexcept (FE_ALL_EXCEPT); + if (nexttowardl (lm, li) != li) + { + puts ("nexttowardl+ failed"); + ++result; + } + if (fetestexcept (FE_OVERFLOW) == 0) + { + puts ("nexttowardl+ did not overflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nexttowardl (-lm, -li) != -li) + { + puts ("nexttowardl failed"); + ++result; + } + if (fetestexcept (FE_OVERFLOW) == 0) + { + puts ("nexttowardl- did not overflow"); + ++result; + } + + li = 0; + lm = LDBL_MIN; + feclearexcept (FE_ALL_EXCEPT); + li = nexttowardl (lm, li); + if (li < 0 || li >= LDBL_MIN) + { + puts ("nexttowardl+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardl+ did not underflow"); + ++result; + } + li = 0; + feclearexcept (FE_ALL_EXCEPT); + li = nexttowardl (-lm, -li); + if (li > 0 || li <= -LDBL_MIN) + { + puts ("nexttowardl- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardl- did not underflow"); + ++result; + } + li = -INFINITY; + feclearexcept (FE_ALL_EXCEPT); + lm = nexttowardl (zero, inf); + if (lm < 0.0 || lm >= LDBL_MIN) + { + puts ("nexttowardl+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardl+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nexttowardl (lm, li) != 0.0) + { + puts ("nexttowardl+ failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardl+ did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + lm = nexttowardl (copysign (zero, -1.0), -inf); + if (lm > 0.0 || lm <= -LDBL_MIN) + { + puts ("nexttowardl- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardl- did not underflow"); + ++result; + } + feclearexcept (FE_ALL_EXCEPT); + if (nexttowardl (lm, -li) != 0.0) + { + puts ("nexttowardl- failed"); + ++result; + } + if (fetestexcept (FE_UNDERFLOW) == 0) + { + puts ("nexttowardl- did not underflow"); + ++result; + } +#endif + return result; } diff --git a/math/libm-test.inc b/math/libm-test.inc index 23ee6beaa8..81dd364f77 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -4127,7 +4127,9 @@ log_test (void) TEST_f_f (log, 1, 0); TEST_f_f (log, -1, nan_value, INVALID_EXCEPTION); + TEST_f_f (log, minus_infty, nan_value, INVALID_EXCEPTION); TEST_f_f (log, plus_infty, plus_infty); + TEST_f_f (log, nan_value, nan_value); TEST_f_f (log, M_El, 1); TEST_f_f (log, 1.0 / M_El, -1); @@ -4157,6 +4159,7 @@ log10_test (void) /* log10 (x) == NaN plus invalid exception if x < 0. */ TEST_f_f (log10, -1, nan_value, INVALID_EXCEPTION); + TEST_f_f (log10, minus_infty, nan_value, INVALID_EXCEPTION); TEST_f_f (log10, plus_infty, plus_infty); TEST_f_f (log10, nan_value, nan_value); @@ -4188,6 +4191,7 @@ log1p_test (void) TEST_f_f (log1p, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION); TEST_f_f (log1p, -2, nan_value, INVALID_EXCEPTION); + TEST_f_f (log1p, minus_infty, nan_value, INVALID_EXCEPTION); TEST_f_f (log1p, plus_infty, plus_infty); TEST_f_f (log1p, nan_value, nan_value); @@ -4218,6 +4222,7 @@ log2_test (void) TEST_f_f (log2, 1, 0); TEST_f_f (log2, -1, nan_value, INVALID_EXCEPTION); + TEST_f_f (log2, minus_infty, nan_value, INVALID_EXCEPTION); TEST_f_f (log2, plus_infty, plus_infty); TEST_f_f (log2, nan_value, nan_value); @@ -4614,6 +4619,17 @@ pow_test (void) /* pow (x, NaN) == NaN. */ TEST_ff_f (pow, 3.0, nan_value, nan_value); + TEST_ff_f (pow, minus_zero, nan_value, nan_value); + TEST_ff_f (pow, plus_infty, nan_value, nan_value); + TEST_ff_f (pow, -3.0, nan_value, nan_value); + TEST_ff_f (pow, minus_infty, nan_value, nan_value); + + TEST_ff_f (pow, nan_value, 3.0, nan_value); + TEST_ff_f (pow, nan_value, -3.0, nan_value); + TEST_ff_f (pow, nan_value, plus_infty, nan_value); + TEST_ff_f (pow, nan_value, minus_infty, nan_value); + TEST_ff_f (pow, nan_value, 2.5, nan_value); + TEST_ff_f (pow, nan_value, -2.5, nan_value); TEST_ff_f (pow, 1, plus_infty, 1); TEST_ff_f (pow, -1, plus_infty, 1); diff --git a/math/math_private.h b/math/math_private.h index 572e546831..129646f8c5 100644 --- a/math/math_private.h +++ b/math/math_private.h @@ -332,4 +332,10 @@ extern double __slowexp (double __x); extern double __slowpow (double __x, double __y, double __z); extern void __docos (double __x, double __dx, double __v[]); +#ifndef math_opt_barrier +#define math_opt_barrier(x) \ +({ __typeof (x) __x = x; __asm ("" : "+m" (__x)); __x; }) +#define math_force_eval(x) __asm __volatile ("" : : "m" (x)) +#endif + #endif /* _MATH_PRIVATE_H_ */ diff --git a/math/s_nextafter.c b/math/s_nextafter.c index 9c678b79c5..d2af52dda3 100644 --- a/math/s_nextafter.c +++ b/math/s_nextafter.c @@ -26,7 +26,7 @@ static char rcsid[] = "$NetBSD: s_nextafter.c,v 1.8 1995/05/10 20:47:58 jtc Exp #define nexttoward __internal_nexttoward #include -#include "math_private.h" +#include #include #ifdef __STDC__ @@ -49,9 +49,12 @@ static char rcsid[] = "$NetBSD: s_nextafter.c,v 1.8 1995/05/10 20:47:58 jtc Exp return x+y; if(x==y) return y; /* x=y, return y */ if((ix|lx)==0) { /* x == 0 */ + double u; INSERT_WORDS(x,hy&0x80000000,1); /* return +-minsubnormal */ - y = x*x; - if(y==x) return y; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u*u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(hx>hy||((hx==hy)&&(lx>ly))) { /* x > y, x -= ulp */ @@ -74,15 +77,12 @@ static char rcsid[] = "$NetBSD: s_nextafter.c,v 1.8 1995/05/10 20:47:58 jtc Exp if(hy>=0x7ff00000) { x = x+x; /* overflow */ if (FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1) - asm ("" : "=m"(x) : "m"(x)); + asm ("" : "+m"(x)); return x; /* overflow */ } - if(hy<0x00100000) { /* underflow */ - y = x*x; - if(y!=x) { /* raise underflow flag */ - INSERT_WORDS(y,hx,lx); - return y; - } + if(hy<0x00100000) { + double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } INSERT_WORDS(x,hx,lx); return x; diff --git a/math/s_nexttowardf.c b/math/s_nexttowardf.c index 1a1026612e..0494d1a4e9 100644 --- a/math/s_nexttowardf.c +++ b/math/s_nexttowardf.c @@ -21,7 +21,7 @@ */ #include -#include "math_private.h" +#include #include #ifdef __STDC__ @@ -45,10 +45,12 @@ return x+y; if((long double) x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ - float x2; + float u; SET_FLOAT_WORD(x,(u_int32_t)(hy&0x80000000)|1);/* return +-minsub*/ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(hy<0||(ix>>23)>(iy>>20)-0x380 @@ -70,15 +72,12 @@ x = x+x; /* overflow */ if (FLT_EVAL_METHOD != 0) /* Force conversion to float. */ - asm ("" : "=m"(x) : "m"(x)); + asm ("" : "+m"(x)); return x; } - if(hy<0x00800000) { /* underflow */ - float x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - SET_FLOAT_WORD(x2,hx); - return x2; - } + if(hy<0x00800000) { + float u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_FLOAT_WORD(x,hx); return x; diff --git a/math/test-misc.c b/math/test-misc.c index d2393cc840..862e11f0c3 100644 --- a/math/test-misc.c +++ b/math/test-misc.c @@ -1,5 +1,5 @@ /* Miscellaneous tests which don't fit anywhere else. - Copyright (C) 2000, 2001, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2004, 2005, 2007 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 @@ -44,7 +44,6 @@ main (void) } } -# if __GNUC__ >= 3 || __GNUC_MINOR__ >= 96 { long double x; long double m; @@ -52,17 +51,17 @@ main (void) int e; int i; -# if LDBL_MANT_DIG == 64 +# if LDBL_MANT_DIG == 64 m = 0xf.fffffffffffffffp-4L; -# elif LDBL_MANT_DIG == 106 +# elif LDBL_MANT_DIG == 106 /* This has to match the mantissa of LDBL_MAX which actually does have a missing bit in the middle. */ m = 0x1.fffffffffffff7ffffffffffff8p-1L; -# elif LDBL_MANT_DIG == 113 +# elif LDBL_MANT_DIG == 113 m = 0x1.ffffffffffffffffffffffffffffp-1L; -# else -# error "Please adjust" -# endif +# else +# error "Please adjust" +# endif for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L) { @@ -106,9 +105,8 @@ main (void) } } -# endif -#if 0 +# if 0 { int e; long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e); @@ -126,7 +124,7 @@ main (void) result = 1; } } -#endif +# endif #endif { @@ -1183,5 +1181,59 @@ main (void) } #endif + volatile float f1 = FLT_MAX; + volatile float f2 = FLT_MAX / 2; + (void) &f1; + (void) &f2; + feclearexcept (FE_ALL_EXCEPT); + f2 += f1; + int fe = fetestexcept (FE_ALL_EXCEPT); + if (fe != (FE_OVERFLOW | FE_INEXACT)) + { + printf ("float overflow test failed: %x\n", fe); + result = 1; + } + + volatile double d1 = DBL_MAX; + volatile double d2 = DBL_MAX / 2; + (void) &d1; + (void) &d2; + feclearexcept (FE_ALL_EXCEPT); + d2 += d1; + fe = fetestexcept (FE_ALL_EXCEPT); + if (fe != (FE_OVERFLOW | FE_INEXACT)) + { + printf ("double overflow test failed: %x\n", fe); + result = 1; + } + +#ifndef NO_LONG_DOUBLE + volatile long double ld1 = LDBL_MAX; + volatile long double ld2 = LDBL_MAX / 2; + (void) &ld1; + (void) &ld2; + feclearexcept (FE_ALL_EXCEPT); + ld2 += ld1; + fe = fetestexcept (FE_ALL_EXCEPT); + if (fe != (FE_OVERFLOW | FE_INEXACT)) + { + printf ("long double overflow test failed: %x\n", fe); + result = 1; + } +#endif + +#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG == 113 + volatile long double ld3 = 0x1.0000000000010000000100000001p+1; + volatile long double ld4 = 0x1.0000000000000000000000000001p+1; + (void) &ld3; + (void) &ld4; + ld3 -= ld4; + if (ld3 != 0x1.0p-47) + { + printf ("long double subtraction test failed %.28La\n", ld3); + result = 1; + } +#endif + return result; } diff --git a/misc/madvise.c b/misc/madvise.c index dbef959dd8..7a4aa8ab8e 100644 --- a/misc/madvise.c +++ b/misc/madvise.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1994,1995,1996,1997,2000,2007 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 @@ -29,5 +29,6 @@ madvise (__ptr_t addr, size_t len, int advice) __set_errno (ENOSYS); return -1; } +libc_hidden_def (madvise) stub_warning (madvise) #include diff --git a/nis/Banner b/nis/Banner new file mode 100644 index 0000000000..cf7987171c --- /dev/null +++ b/nis/Banner @@ -0,0 +1 @@ +NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk diff --git a/nis/nis_call.c b/nis/nis_call.c index 928053daf5..c571e8f367 100644 --- a/nis/nis_call.c +++ b/nis/nis_call.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1997,1998,2001,2004,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 2001, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -25,8 +26,11 @@ #include #include #include +#include +#include #include #include +#include #include "nis_xdr.h" #include "nis_intern.h" @@ -107,10 +111,79 @@ __nisbind_next (dir_binding *bind) } libnsl_hidden_def (__nisbind_next) +static struct ckey_cache_entry +{ + struct in_addr inaddr; + in_port_t port; + unsigned int protocol; + des_block ckey; +} *ckey_cache; +static size_t ckey_cache_size; +static size_t ckey_cache_allocated; +static pid_t ckey_cache_pid; +static uid_t ckey_cache_euid; +__libc_lock_define_initialized (static, ckey_cache_lock) + +static bool_t +get_ckey (des_block *ckey, struct sockaddr_in *addr, unsigned int protocol) +{ + size_t i; + pid_t pid = getpid (); + uid_t euid = geteuid (); + bool_t ret = FALSE; + + __libc_lock_lock (ckey_cache_lock); + + if (ckey_cache_pid != pid || ckey_cache_euid != euid) + { + ckey_cache_size = 0; + ckey_cache_pid = pid; + ckey_cache_euid = euid; + } + + for (i = 0; i < ckey_cache_size; ++i) + if (ckey_cache[i].port == addr->sin_port + && ckey_cache[i].protocol == protocol + && memcmp (&ckey_cache[i].inaddr, &addr->sin_addr, + sizeof (addr->sin_addr)) == 0) + { + *ckey = ckey_cache[i].ckey; + ret = TRUE; + break; + } + + if (!ret && key_gendes (ckey) >= 0) + { + ret = TRUE; + /* Don't grow the cache indefinitely. */ + if (ckey_cache_size == 256) + ckey_cache_size = 0; + if (ckey_cache_size == ckey_cache_allocated) + { + size_t size = ckey_cache_allocated ? ckey_cache_allocated * 2 : 16; + struct ckey_cache_entry *new_cache + = realloc (ckey_cache, size * sizeof (*ckey_cache)); + if (new_cache != NULL) + { + ckey_cache = new_cache; + ckey_cache_allocated = size; + } + } + ckey_cache[ckey_cache_size].inaddr = addr->sin_addr; + ckey_cache[ckey_cache_size].port = addr->sin_port; + ckey_cache[ckey_cache_size].protocol = protocol; + ckey_cache[ckey_cache_size++].ckey = *ckey; + } + + __libc_lock_unlock (ckey_cache_lock); + return ret; +} + nis_error __nisbind_connect (dir_binding *dbp) { nis_server *serv; + u_short port; if (dbp == NULL) return NIS_FAIL; @@ -128,9 +201,12 @@ __nisbind_connect (dir_binding *dbp) /* Check, if the host is online and rpc.nisd is running. Much faster then the clnt*_create functions: */ - if (__pmap_getnisport (&dbp->addr, NIS_PROG, NIS_VERSION, IPPROTO_UDP) == 0) + port = __pmap_getnisport (&dbp->addr, NIS_PROG, NIS_VERSION, + dbp->use_udp ? IPPROTO_UDP : IPPROTO_TCP); + if (port == 0) return NIS_RPCERROR; + dbp->addr.sin_port = htons (port); dbp->socket = RPC_ANYSOCK; if (dbp->use_udp) dbp->clnt = clntudp_create (&dbp->addr, NIS_PROG, NIS_VERSION, @@ -153,17 +229,16 @@ __nisbind_connect (dir_binding *dbp) { char netname[MAXNETNAMELEN + 1]; char *p; + des_block ckey; - p = stpcpy (netname, "unix."); + p = stpcpy (netname, "unix@"); strncpy (p, serv->name, MAXNETNAMELEN - 5); netname[MAXNETNAMELEN] = '\0'; - // XXX What is this supposed to do? If we really want to replace - // XXX the first dot, then we might as well use unix@ as the - // XXX prefix string. --drepper - p = strchr (netname, '.'); - *p = '@'; - dbp->clnt->cl_auth = - authdes_pk_create (netname, &serv->pkey, 300, NULL, NULL); + dbp->clnt->cl_auth = NULL; + if (get_ckey (&ckey, &dbp->addr, + dbp->use_udp ? IPPROTO_UDP : IPPROTO_TCP)) + dbp->clnt->cl_auth = + authdes_pk_create (netname, &serv->pkey, 300, NULL, &ckey); if (!dbp->clnt->cl_auth) dbp->clnt->cl_auth = authunix_create_default (); } @@ -177,7 +252,8 @@ libnsl_hidden_def (__nisbind_connect) nis_error __nisbind_create (dir_binding *dbp, const nis_server *serv_val, - unsigned int serv_len, unsigned int flags) + unsigned int serv_len, unsigned int server_used, + unsigned int current_ep, unsigned int flags) { dbp->clnt = NULL; @@ -203,8 +279,16 @@ __nisbind_create (dir_binding *dbp, const nis_server *serv_val, dbp->trys = 1; dbp->class = -1; - if (__nis_findfastest (dbp) < 1) - return NIS_NAMEUNREACHABLE; + if (server_used == ~0) + { + if (__nis_findfastest (dbp) < 1) + return NIS_NAMEUNREACHABLE; + } + else + { + dbp->server_used = server_used; + dbp->current_ep = current_ep; + } return NIS_SUCCESS; } @@ -306,7 +390,7 @@ __do_niscall2 (const nis_server *server, u_int server_len, u_long prog, if (flags & MASTER_ONLY) server_len = 1; - status = __nisbind_create (&dbp, server, server_len, flags); + status = __nisbind_create (&dbp, server, server_len, ~0, ~0, flags); if (status != NIS_SUCCESS) return status; @@ -338,9 +422,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) case HIGHER_NAME: { /* We need data from a parent domain */ directory_obj *obj; - char ndomain[strlen (dir->do_name) + 3]; - - nis_domain_of_r (dir->do_name, ndomain, sizeof (ndomain)); + const char *ndomain = __nis_domain_of (dir->do_name); /* The root server of our domain is a replica of the parent domain ! (Now I understand why a root server must be a @@ -384,7 +466,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) size_t namelen = strlen (name); char leaf[namelen + 3]; char domain[namelen + 3]; - char ndomain[namelen + 3]; + const char *ndomain; char *cp; strcpy (domain, name); @@ -397,8 +479,8 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) return NULL; } nis_leaf_of_r (domain, leaf, sizeof (leaf)); - nis_domain_of_r (domain, ndomain, sizeof (ndomain)); - strcpy (domain, ndomain); + ndomain = __nis_domain_of (domain); + memmove (domain, ndomain, strlen (ndomain) + 1); } while (nis_dir_cmp (domain, dir->do_name) != SAME_NAME); @@ -451,29 +533,16 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) /* We try to query the current server for the searched object, maybe he know about it ? */ static directory_obj * -first_shoot (const_nis_name name, int search_parent_first, directory_obj *dir) +first_shoot (const_nis_name name, directory_obj *dir) { directory_obj *obj = NULL; fd_result *fd_res; XDR xdrs; - char domain[strlen (name) + 3]; -#if 0 if (nis_dir_cmp (name, dir->do_name) == SAME_NAME) return dir; -#endif - const char *search_name = name; - if (search_parent_first) - { - nis_domain_of_r (name, domain, sizeof (domain)); - search_name = domain; - } - - if (nis_dir_cmp (search_name, dir->do_name) == SAME_NAME) - return dir; - - fd_res = __nis_finddirectory (dir, search_name); + fd_res = __nis_finddirectory (dir, name); if (fd_res == NULL) return NULL; if (fd_res->status == NIS_SUCCESS @@ -499,42 +568,224 @@ first_shoot (const_nis_name name, int search_parent_first, directory_obj *dir) return obj; } +static struct nis_server_cache +{ + int search_parent; + int uses; + unsigned int size; + unsigned int server_used; + unsigned int current_ep; + time_t expires; + char name[]; +} *nis_server_cache[16]; +static time_t nis_cold_start_mtime; +__libc_lock_define_initialized (static, nis_server_cache_lock) + +static directory_obj * +nis_server_cache_search (const_nis_name name, int search_parent, + unsigned int *server_used, unsigned int *current_ep, + struct timeval *now) +{ + directory_obj *ret = NULL; + int i; + char *addr; + XDR xdrs; + struct stat64 st; + + if (stat64 ("/var/nis/NIS_COLD_START", &st) < 0) + st.st_mtime = nis_cold_start_mtime + 1; + + __libc_lock_lock (nis_server_cache_lock); + + for (i = 0; i < 16; ++i) + if (nis_server_cache[i] == NULL) + continue; + else if (st.st_mtime != nis_cold_start_mtime + || now->tv_sec > nis_server_cache[i]->expires) + { + free (nis_server_cache[i]); + nis_server_cache[i] = NULL; + } + else if (nis_server_cache[i]->search_parent == search_parent + && strcmp (nis_server_cache[i]->name, name) == 0) + { + ret = calloc (1, sizeof (directory_obj)); + if (ret == NULL) + break; + + addr = rawmemchr (nis_server_cache[i]->name, '\0') + 8; + addr = (char *) ((uintptr_t) addr & ~(uintptr_t) 7); + xdrmem_create (&xdrs, addr, nis_server_cache[i]->size, XDR_DECODE); + if (!_xdr_directory_obj (&xdrs, ret)) + { + xdr_destroy (&xdrs); + free (ret); + ret = NULL; + free (nis_server_cache[i]); + nis_server_cache[i] = NULL; + break; + } + xdr_destroy (&xdrs); + *server_used = nis_server_cache[i]->server_used; + *current_ep = nis_server_cache[i]->current_ep; + break; + } + + nis_cold_start_mtime = st.st_mtime; + + __libc_lock_unlock (nis_server_cache_lock); + return ret; +} + +static void +nis_server_cache_add (const_nis_name name, int search_parent, + directory_obj *dir, unsigned int server_used, + unsigned int current_ep, struct timeval *now) +{ + struct nis_server_cache **loc; + struct nis_server_cache *new; + struct nis_server_cache *old; + int i; + char *addr; + unsigned int size; + XDR xdrs; + + if (dir == NULL) + return; + + size = xdr_sizeof ((xdrproc_t) _xdr_directory_obj, (char *) dir); + new = calloc (1, sizeof (*new) + strlen (name) + 8 + size); + if (new == NULL) + return; + new->search_parent = search_parent; + new->uses = 1; + new->expires = now->tv_sec + dir->do_ttl; + new->size = size; + new->server_used = server_used; + new->current_ep = current_ep; + addr = stpcpy (new->name, name) + 8; + addr = (char *) ((uintptr_t) addr & ~(uintptr_t) 7); + + xdrmem_create(&xdrs, addr, size, XDR_ENCODE); + if (!_xdr_directory_obj (&xdrs, dir)) + { + xdr_destroy (&xdrs); + free (new); + return; + } + xdr_destroy (&xdrs); + + __libc_lock_lock (nis_server_cache_lock); + + /* Choose which entry should be evicted from the cache. */ + loc = &nis_server_cache[0]; + if (*loc != NULL) + for (i = 1; i < 16; ++i) + if (nis_server_cache[i] == NULL) + { + loc = &nis_server_cache[i]; + break; + } + else if ((*loc)->uses > nis_server_cache[i]->uses + || ((*loc)->uses == nis_server_cache[i]->uses + && (*loc)->expires > nis_server_cache[i]->expires)) + loc = &nis_server_cache[i]; + old = *loc; + *loc = new; + + __libc_lock_unlock (nis_server_cache_lock); + free (old); +} + nis_error -__nisfind_server (const_nis_name name, int search_parent_first, - directory_obj **dir) +__nisfind_server (const_nis_name name, int search_parent, + directory_obj **dir, dir_binding *dbp, unsigned int flags) { + nis_error result = NIS_SUCCESS; + nis_error status; + directory_obj *obj; + struct timeval now; + unsigned int server_used = ~0; + unsigned int current_ep = ~0; + if (name == NULL) return NIS_BADNAME; -#if 0 - /* Search in local cache. In the moment, we ignore the fastest server */ - if (!(flags & NO_CACHE)) - dir = __nis_cache_search (name, flags, &cinfo); -#endif + if (*dir != NULL) + return NIS_SUCCESS; - nis_error result = NIS_SUCCESS; - if (*dir == NULL) + (void) gettimeofday (&now, NULL); + + if ((flags & NO_CACHE) == 0) + *dir = nis_server_cache_search (name, search_parent, &server_used, + ¤t_ep, &now); + if (*dir != NULL) { - nis_error status; - directory_obj *obj; + unsigned int server_len = (*dir)->do_servers.do_servers_len; + if (flags & MASTER_ONLY) + { + server_len = 1; + if (server_used != 0) + { + server_used = ~0; + current_ep = ~0; + } + } + result = __nisbind_create (dbp, (*dir)->do_servers.do_servers_val, + server_len, server_used, current_ep, flags); + if (result != NIS_SUCCESS) + { + nis_free_directory (*dir); + *dir = NULL; + } + return result; + } - *dir = readColdStartFile (); - if (*dir == NULL) - /* No /var/nis/NIS_COLD_START->no NIS+ installed. */ - return NIS_UNAVAIL; + *dir = readColdStartFile (); + if (*dir == NULL) + /* No /var/nis/NIS_COLD_START->no NIS+ installed. */ + return NIS_UNAVAIL; - /* Try at first, if servers in "dir" know our object */ - obj = first_shoot (name, search_parent_first, *dir); + /* Try at first, if servers in "dir" know our object */ + const char *search_name = name; + if (search_parent) + search_name = __nis_domain_of (name); + obj = first_shoot (search_name, *dir); + if (obj == NULL) + { + obj = rec_dirsearch (search_name, *dir, &status); if (obj == NULL) + result = status; + } + + if (result == NIS_SUCCESS) + { + unsigned int server_len = obj->do_servers.do_servers_len; + if (flags & MASTER_ONLY) + server_len = 1; + result = __nisbind_create (dbp, obj->do_servers.do_servers_val, + server_len, ~0, ~0, flags); + if (result == NIS_SUCCESS) { - obj = rec_dirsearch (name, *dir, &status); - if (obj == NULL) - result = status; + if ((flags & MASTER_ONLY) == 0 + || obj->do_servers.do_servers_len == 1) + { + server_used = dbp->server_used; + current_ep = dbp->current_ep; + } + if ((flags & NO_CACHE) == 0) + nis_server_cache_add (name, search_parent, obj, + server_used, current_ep, &now); + } + else + { + nis_free_directory (obj); + obj = NULL; } - - *dir = obj; } + *dir = obj; + return result; } @@ -543,38 +794,19 @@ nis_error __prepare_niscall (const_nis_name name, directory_obj **dirp, dir_binding *bptrp, unsigned int flags) { - nis_error retcode = __nisfind_server (name, 1, dirp); + nis_error retcode = __nisfind_server (name, 1, dirp, bptrp, flags); if (__builtin_expect (retcode != NIS_SUCCESS, 0)) return retcode; - nis_server *server; - u_int server_len; - - if (flags & MASTER_ONLY) - { - server = (*dirp)->do_servers.do_servers_val; - server_len = 1; - } - else - { - server = (*dirp)->do_servers.do_servers_val; - server_len = (*dirp)->do_servers.do_servers_len; - } - - retcode = __nisbind_create (bptrp, server, server_len, flags); - if (retcode == NIS_SUCCESS) - { - do - if (__nisbind_connect (bptrp) == NIS_SUCCESS) - return NIS_SUCCESS; - while (__nisbind_next (bptrp) == NIS_SUCCESS); - - __nisbind_destroy (bptrp); - memset (bptrp, '\0', sizeof (*bptrp)); + do + if (__nisbind_connect (bptrp) == NIS_SUCCESS) + return NIS_SUCCESS; + while (__nisbind_next (bptrp) == NIS_SUCCESS); - retcode = NIS_NAMEUNREACHABLE; - } + __nisbind_destroy (bptrp); + memset (bptrp, '\0', sizeof (*bptrp)); + retcode = NIS_NAMEUNREACHABLE; nis_free_directory (*dirp); *dirp = NULL; diff --git a/nis/nis_domain_of.c b/nis/nis_domain_of.c index eca2066aa3..4d6b48640e 100644 --- a/nis/nis_domain_of.c +++ b/nis/nis_domain_of.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1997 Free Software Foundation, Inc. +/* Copyright (c) 1997, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -26,3 +26,17 @@ nis_domain_of (const_nis_name name) return nis_domain_of_r (name, result, NIS_MAXNAMELEN); } + +const_nis_name +__nis_domain_of (const_nis_name name) +{ + const_nis_name cptr = strchr (name, '.'); + + if (cptr++ == NULL) + return ""; + + if (*cptr == '\0') + return "."; + + return cptr; +} diff --git a/nis/nis_lookup.c b/nis/nis_lookup.c index 839ee4ee42..9677b4d3d1 100644 --- a/nis/nis_lookup.c +++ b/nis/nis_lookup.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1997-1999, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1997-1999, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -74,7 +75,6 @@ nis_lookup (const_nis_name name, const unsigned int flags) { static const struct timeval RPCTIMEOUT = {10, 0}; enum clnt_stat result; - char ndomain[strlen (req.ns_name) + 1]; again: result = clnt_call (bptr.clnt, NIS_LOOKUP, @@ -127,27 +127,18 @@ nis_lookup (const_nis_name name, const unsigned int flags) /* Otherwise __nisfind_server will not do anything. */ dir = NULL; - if (__nisfind_server (req.ns_name, 1, &dir) + if (__nisfind_server (req.ns_name, 1, &dir, &bptr, + flags & ~MASTER_ONLY) != NIS_SUCCESS) goto out; - - if (__nisbind_create (&bptr, - dir->do_servers.do_servers_val, - dir->do_servers.do_servers_len, - flags) != NIS_SUCCESS) - { - nis_free_directory (dir); - goto out; - } } else if (__nisbind_next (&bptr) != NIS_SUCCESS) { /* No more servers to search. Try parent. */ - nis_domain_of_r (req.ns_name, ndomain, - sizeof (ndomain)); + const char *ndomain = __nis_domain_of (req.ns_name); req.ns_name = strdupa (ndomain); - if (strcmp (ndomain, ".") == 0) + if (strcmp (req.ns_name, ".") == 0) { NIS_RES_STATUS (res) = NIS_NAMEUNREACHABLE; goto out; diff --git a/nis/nis_print_group_entry.c b/nis/nis_print_group_entry.c index 11680ae7dc..91e6399b90 100644 --- a/nis/nis_print_group_entry.c +++ b/nis/nis_print_group_entry.c @@ -162,7 +162,7 @@ nis_print_group_entry (const_nis_name group) fputs (_(" No implicit nonmembers\n"), stdout); if (nomem_rec_cnt) { - fputs (_(" Recursive nonmembers:\n"), stdout); + fputs (_(" Explicit nonmembers:\n"), stdout); for (i = 0; i < nomem_rec_cnt; ++i) printf ("\t%s=n", &nomem_rec[i][2]); } diff --git a/nis/nis_table.c b/nis/nis_table.c index cb25be61e2..70b4701419 100644 --- a/nis/nis_table.c +++ b/nis/nis_table.c @@ -1,4 +1,5 @@ -/* Copyright (c) 1997-1999,2003,2004,2005,2006 Free Software Foundation, Inc. +/* Copyright (c) 1997-1999, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -274,21 +275,14 @@ nis_list (const_nis_name name, unsigned int flags, memset (res, '\0', sizeof (nis_result)); status = __nisfind_server (ibreq->ibr_name, - ibreq->ibr_srch.ibr_srch_val != NULL, &dir); + ibreq->ibr_srch.ibr_srch_val != NULL, + &dir, &bptr, flags & ~MASTER_ONLY); if (status != NIS_SUCCESS) { NIS_RES_STATUS (res) = status; goto fail3; } - status = __nisbind_create (&bptr, dir->do_servers.do_servers_val, - dir->do_servers.do_servers_len, flags); - if (__builtin_expect (status != NIS_SUCCESS, 0)) - { - NIS_RES_STATUS (res) = status; - goto fail2; - } - while (__nisbind_connect (&bptr) != NIS_SUCCESS) if (__builtin_expect (__nisbind_next (&bptr) != NIS_SUCCESS, 0)) { @@ -338,7 +332,6 @@ nis_list (const_nis_name name, unsigned int flags, NIS_RES_STATUS (res) = NIS_NOMEMORY; fail: __nisbind_destroy (&bptr); - fail2: nis_free_directory (dir); fail3: free (tablepath); diff --git a/nis/nss-default.c b/nis/nss-default.c index 577f7c2d47..046ddfee8d 100644 --- a/nis/nss-default.c +++ b/nis/nss-default.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 2001, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996, 2001, 2004, 2006, 2007 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,7 @@ 02111-1307 USA. */ #include +#include #include #include #include @@ -54,6 +55,7 @@ static const struct static void init (void) { + int saved_errno = errno; FILE *fp = fopen (default_nss, "rc"); if (fp != NULL) { @@ -111,6 +113,7 @@ init (void) fclose (fp); } + __set_errno (saved_errno); } diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c index 4fa0361681..bde0a3291f 100644 --- a/nis/nss_nis/nis-hosts.c +++ b/nis/nss_nis/nis-hosts.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2000, 2002, 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1996-2000, 2002, 2003, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1996. @@ -134,13 +134,17 @@ internal_nis_gethostent_r (struct hostent *host, char *buffer, if (__builtin_expect (yp_get_default_domain (&domain), 0)) return NSS_STATUS_UNAVAIL; + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct parser_data); + buffer += pad; + struct parser_data *data = (void *) buffer; - if (__builtin_expect (buflen < sizeof *data + 1, 0)) + if (__builtin_expect (buflen < sizeof *data + 1 + pad, 0)) { *errnop = ERANGE; *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } + buflen -= pad; /* Get the next entry until we found a correct one. */ const size_t linebuflen = buffer + buflen - data->linebuffer; @@ -234,6 +238,9 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host, char *buffer, size_t buflen, int *errnop, int *h_errnop, int flags) { + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct parser_data); + buffer += pad; + struct parser_data *data = (void *) buffer; if (name == NULL) @@ -246,12 +253,13 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host, if (yp_get_default_domain (&domain)) return NSS_STATUS_UNAVAIL; - if (buflen < sizeof *data + 1) + if (buflen < sizeof *data + 1 + pad) { *h_errnop = NETDB_INTERNAL; *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } + buflen -= pad; /* Convert name to lowercase. */ size_t namlen = strlen (name); @@ -352,13 +360,17 @@ _nss_nis_gethostbyaddr_r (const void *addr, socklen_t addrlen, int af, if (__builtin_expect (yp_get_default_domain (&domain), 0)) return NSS_STATUS_UNAVAIL; + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct parser_data); + buffer += pad; + struct parser_data *data = (void *) buffer; - if (__builtin_expect (buflen < sizeof *data + 1, 0)) + if (__builtin_expect (buflen < sizeof *data + 1 + pad, 0)) { *errnop = ERANGE; *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } + buflen -= pad; char *buf = inet_ntoa (*(const struct in_addr *) addr); diff --git a/nis/nss_nis/nis-service.c b/nis/nss_nis/nis-service.c index 0c176095c8..59a598f296 100644 --- a/nis/nss_nis/nis-service.c +++ b/nis/nss_nis/nis-service.c @@ -271,7 +271,7 @@ _nss_nis_getservbyname_r (const char *name, const char *protocol, /* If the protocol is given, we could try if our NIS server knows about services.byservicename map. If yes, we only need one query. */ - size_t keylen = strlen (name) + 1 + (protocol ? strlen (protocol) : 0); + size_t keylen = strlen (name) + (protocol ? 1 + strlen (protocol) : 0); char key[keylen + 1]; /* key is: "name/proto" */ diff --git a/nis/nss_nisplus/nisplus-ethers.c b/nis/nss_nisplus/nisplus-ethers.c index 8d69ad9373..298869f931 100644 --- a/nis/nss_nisplus/nisplus-ethers.c +++ b/nis/nss_nisplus/nisplus-ethers.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1997,1998,2000-2003,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1997,1998,2000-2003,2005,2006,2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -256,7 +257,8 @@ _nss_nisplus_gethostton_r (const char *name, struct etherent *eth, snprintf (buf, sizeof (buf), "[name=%s],%s", name, tablename_val); - nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, + NULL, NULL); if (result == NULL) { @@ -322,7 +324,8 @@ _nss_nisplus_getntohost_r (const struct ether_addr *addr, struct etherent *eth, addr->ether_addr_octet[4], addr->ether_addr_octet[5], tablename_val); - nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, + NULL, NULL); if (result == NULL) { diff --git a/nis/nss_nisplus/nisplus-network.c b/nis/nss_nisplus/nisplus-network.c index 286a4ccbdc..1cf652f071 100644 --- a/nis/nss_nisplus/nisplus-network.c +++ b/nis/nss_nisplus/nisplus-network.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1997,1998,2000-2003,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1997,1998,2000-2003,2005,2006,2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -338,7 +339,7 @@ _nss_nisplus_getnetbyname_r (const char *name, struct netent *network, /* 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_LINKS | FOLLOW_PATH, NULL, NULL); + result = nis_list (buf, FOLLOW_LINKS | FOLLOW_PATH | USE_DGRAM, NULL, NULL); if (result != NULL) { @@ -366,7 +367,8 @@ _nss_nisplus_getnetbyname_r (const char *name, struct netent *network, } nis_freeresult (result); - result = nis_list (bufptr, FOLLOW_LINKS | FOLLOW_PATH, NULL, NULL); + result = nis_list (bufptr, FOLLOW_LINKS | FOLLOW_PATH | USE_DGRAM, + NULL, NULL); } if (result == NULL) @@ -438,7 +440,8 @@ _nss_nisplus_getnetbyaddr_r (uint32_t addr, const int type, while (1) { snprintf (buf, sizeof (buf), "[addr=%s],%s", buf2, tablename_val); - nis_result *result = nis_list (buf, EXPAND_NAME, NULL, NULL); + nis_result *result = nis_list (buf, EXPAND_NAME | USE_DGRAM, + NULL, NULL); if (result == NULL) { diff --git a/nis/nss_nisplus/nisplus-publickey.c b/nis/nss_nisplus/nisplus-publickey.c index 14e7d41dbe..f6b32f8827 100644 --- a/nis/nss_nisplus/nisplus-publickey.c +++ b/nis/nss_nisplus/nisplus-publickey.c @@ -217,7 +217,7 @@ parse_grp_str (const char *s, gid_t *gidp, int *gidlenp, gid_t *gidlist, if (!s || (!isdigit (*s))) { - syslog (LOG_ERR, _("netname2user: missing group id list in `%s'"), s); + syslog (LOG_ERR, _("netname2user: missing group id list in `%s'."), s); return NSS_STATUS_NOTFOUND; } diff --git a/nis/nss_nisplus/nisplus-pwd.c b/nis/nss_nisplus/nisplus-pwd.c index 93e37dddab..cd33aebbcc 100644 --- a/nis/nss_nisplus/nisplus-pwd.c +++ b/nis/nss_nisplus/nisplus-pwd.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1999, 2001, 2002, 2003, 2005, 2006 +/* Copyright (C) 1997, 1999, 2001, 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -311,7 +311,7 @@ _nss_nisplus_getpwnam_r (const char *name, struct passwd *pw, snprintf (buf, sizeof (buf), "[name=%s],%s", name, pwd_tablename_val); - result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, NULL, NULL); if (result == NULL) { @@ -370,7 +370,7 @@ _nss_nisplus_getpwuid_r (const uid_t uid, struct passwd *pw, snprintf (buf, sizeof (buf), "[uid=%lu],%s", (unsigned long int) uid, pwd_tablename_val); - result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, NULL, NULL); if (result == NULL) { diff --git a/nis/nss_nisplus/nisplus-rpc.c b/nis/nss_nisplus/nisplus-rpc.c index 5875bbe98d..711c6bc273 100644 --- a/nis/nss_nisplus/nisplus-rpc.c +++ b/nis/nss_nisplus/nisplus-rpc.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2001, 2002, 2003, 2005, 2006 +/* Copyright (C) 1997, 1998, 2001, 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -315,7 +315,8 @@ _nss_nisplus_getrpcbyname_r (const char *name, struct rpcent *rpc, /* 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); - nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, + NULL, NULL); if (result != NULL) { @@ -342,7 +343,8 @@ _nss_nisplus_getrpcbyname_r (const char *name, struct rpcent *rpc, } nis_freeresult (result); - result = nis_list (bufptr, FOLLOW_PATH | FOLLOW_LINKS , NULL, NULL); + result = nis_list (bufptr, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, + NULL, NULL); } if (result == NULL) @@ -402,7 +404,8 @@ _nss_nisplus_getrpcbynumber_r (const int number, struct rpcent *rpc, snprintf (buf, sizeof (buf), "[number=%d],%s", number, tablename_val); - nis_result *result = nis_list (buf, FOLLOW_LINKS | FOLLOW_PATH, NULL, NULL); + nis_result *result = nis_list (buf, FOLLOW_LINKS | FOLLOW_PATH | USE_DGRAM, + NULL, NULL); if (result == NULL) { diff --git a/nis/nss_nisplus/nisplus-service.c b/nis/nss_nisplus/nisplus-service.c index 51c1956e2f..607ce80b01 100644 --- a/nis/nss_nisplus/nisplus-service.c +++ b/nis/nss_nisplus/nisplus-service.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2005, 2006 +/* Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -322,7 +322,8 @@ _nss_nisplus_getservbyname_r (const char *name, const char *protocol, for the next search */ snprintf (buf, sizeof (buf), "[name=%s,proto=%s],%s", name, protocol, tablename_val); - nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, + NULL, NULL); if (result != NULL) { @@ -351,7 +352,8 @@ _nss_nisplus_getservbyname_r (const char *name, const char *protocol, } nis_freeresult (result); - result = nis_list (bufptr, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + result = nis_list (bufptr, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, + NULL, NULL); } if (result == NULL) @@ -420,7 +422,8 @@ _nss_nisplus_getservbyport_r (const int number, const char *protocol, snprintf (buf, sizeof (buf), "[port=%d,proto=%s],%s", number, protocol, tablename_val); - nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + nis_result *result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, + NULL, NULL); if (result == NULL) { diff --git a/nis/nss_nisplus/nisplus-spwd.c b/nis/nss_nisplus/nisplus-spwd.c index e63e1eeaec..f256f3eb90 100644 --- a/nis/nss_nisplus/nisplus-spwd.c +++ b/nis/nss_nisplus/nisplus-spwd.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1997, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1997, 2001, 2002, 2003, 2005, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -182,7 +183,7 @@ _nss_nisplus_getspnam_r (const char *name, struct spwd *sp, snprintf (buf, sizeof (buf), "[name=%s],%s", name, pwd_tablename_val); - result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); + result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS | USE_DGRAM, NULL, NULL); if (result == NULL) { diff --git a/nis/rpcsvc/nislib.h b/nis/rpcsvc/nislib.h index c993bac5e8..c8927ece17 100644 --- a/nis/rpcsvc/nislib.h +++ b/nis/rpcsvc/nislib.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 1999, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 1999, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1997. @@ -272,12 +272,13 @@ struct dir_binding typedef struct dir_binding dir_binding; extern nis_error __nisbind_create (dir_binding *, const nis_server *, - unsigned int, unsigned int) __THROW; + unsigned int, unsigned int, unsigned int, + unsigned int) __THROW; extern nis_error __nisbind_connect (dir_binding *) __THROW; extern nis_error __nisbind_next (dir_binding *) __THROW; extern void __nisbind_destroy (dir_binding *) __THROW; -extern nis_error __nisfind_server (const_nis_name, int, directory_obj **) - __THROW; +extern nis_error __nisfind_server (const_nis_name, int, directory_obj **, + dir_binding *, unsigned int) __THROW; #endif diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 0b1d6300ac..47ea82ff5d 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,41 +1,107 @@ -2007-01-10 Ulrich Drepper +2007-07-27 Jakub Jelinek - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Cleanups. Define - FUTEX_CMP_REQUEUE and lll_futex_requeue. + * sysdeps/sparc/tls.h (tcbhead_t): Move gscope_flag to the end + of the structure for sparc32. -2006-12-28 David S. Miller +2007-07-26 Aurelien Jarno - * shlib-versions: Fix sparc64 linux target specification. + * sysdeps/sparc/tls.h (tcbhead_t): Add gscope_flag. -2007-01-10 Jakub Jelinek +2007-06-22 Jakub Jelinek - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c: - Adjust include path for pthread_barrier_wait.c move. + * pthread_getattr_np.c (pthread_getattr_np): Clear cpuset and + cpusetsize if pthread_getaffinity_np failed with ENOSYS. -2006-12-21 Jakub Jelinek +2007-05-28 Jakub Jelinek - * sysdeps/unix/sysv/linux/pthread_kill.c (pthread_kill): Make sure - tid isn't reread from pd->tid in between ESRCH test and the syscall. + * sysdeps/i386/tls.h (THREAD_GSCOPE_RESET_FLAG): Use explicit + insn suffix. + (THREAD_GSCOPE_GET_FLAG): Remove. + * sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Remove. + * allocatestack.c (__wait_lookup_done): Revert 2007-05-24 + changes. + * sysdeps/powerpc/tls.h (tcbhead_t): Remove gscope_flag. + (THREAD_GSCOPE_GET_FLAG): Remove. + (THREAD_GSCOPE_RESET_FLAG): Use THREAD_SELF->header.gscope_flag + instead of THREAD_GSCOPE_GET_FLAG. + (THREAD_GSCOPE_SET_FLAG): Likewise. Add atomic_write_barrier after + it. + * sysdeps/s390/tls.h (THREAD_GSCOPE_FLAG_UNUSED, + THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, + THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_WAIT): Define. + * sysdeps/sparc/tls.h (THREAD_GSCOPE_FLAG_UNUSED, + THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, + THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_WAIT): Define. + * sysdeps/sh/tls.h (THREAD_GSCOPE_FLAG_UNUSED, + THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, + THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_WAIT): Define. + * sysdeps/ia64/tls.h (THREAD_GSCOPE_FLAG_UNUSED, + THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, + THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_WAIT): Define. + +2007-05-24 Richard Henderson + + * descr.h (struct pthread): Add header.gscope_flag. + * sysdeps/alpha/tls.h (THREAD_GSCOPE_FLAG_UNUSED, + THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, + THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_WAIT): Define. + +2007-05-26 Ulrich Drepper + + * allocatestack.c: Revert last change. + * init.c: Likewise. + * sysdeps/i386/tls.h: Likewise. + * sysdeps/x86_64/tls.h: Likewise. + +2007-05-24 Jakub Jelinek -2006-12-06 Jakub Jelinek + * sysdeps/powerpc/tls.h (tcbhead_t): Add gscope_flag. + (THREAD_GSCOPE_FLAG_UNUSED, THREAD_GSCOPE_FLAG_USED, + THREAD_GSCOPE_FLAG_WAIT): Define. + (THREAD_GSCOPE_GET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_WAIT): Define. + * sysdeps/i386/tls.h (THREAD_GSCOPE_WAIT): Don't use + PTR_DEMANGLE. + (THREAD_GSCOPE_GET_FLAG): Define. + * sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Define. + * allocatestack.c (__wait_lookup_done): Use THREAD_GSCOPE_GET_FLAG + instead of ->header.gscope_flag directly. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Handle - 6 argument cancellable syscalls. - (STM_6, LM_6, LR7_0, LR7_1, LR7_2, LR7_3, LR7_4, LR7_5, LR7_6): Define. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Handle - 6 argument cancellable syscalls. - (STM_6, LM_6, LR7_0, LR7_1, LR7_2, LR7_3, LR7_4, LR7_5, LR7_6): Define. +2007-05-21 Ulrich Drepper + + * sysdeps/pthread/pthread-functions.h (struct pthread_functions): + Remove ptr_wait_lookup_done again. + * init.c (pthread_functions): Don't add .ptr_wait_lookup_done here. + (__pthread_initialize_minimal_internal): Initialize + _dl_wait_lookup_done pointer in _rtld_global directly. + * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): + Remove code to code _dl_wait_lookup_done. + * sysdeps/x86_64/tls.h (THREAD_GSCOPE_WAIT): The pointer is not + encrypted for now. + +2007-05-19 Ulrich Drepper + + * allocatestack.c (__wait_lookup_done): New function. + * sysdeps/pthread/pthread-functions.h (struct pthread_functions): + Add ptr_wait_lookup_done. + * init.c (pthread_functions): Initialize .ptr_wait_lookup_done. + * pthreadP.h: Declare __wait_lookup_done. + * sysdeps/i386/tls.h (tcbhead_t): Add gscope_flag. + Define macros to implement reference handling of global scope. + * sysdeps/x86_64/tls.h: Likewise. + * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): + Initialize GL(dl_wait_lookup_done). 2006-12-09 Ulrich Drepper * sysdeps/unix/sysv/linux/rtld-lowlevel.h (__rtld_mrlock_initialize): Add missing closing parenthesis. -2006-10-30 Jakub Jelinek - - * sysdeps/ia64/pthread_spin_unlock.c (pthread_spin_unlock): Use - __sync_lock_release instead of __sync_lock_release_si. - 2006-10-29 Jakub Jelinek * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): @@ -52,50 +118,6 @@ * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. -2006-10-27 Ulrich Drepper - - * sysdeps/pthread/pthread_barrier_wait.c: Move to... - * pthread_barrier_wait.c: ...here. - * sysdeps/pthread/pthread_cond_broadcast.c: Move to... - * pthread_cond_broadcast.c: ...here. - * sysdeps/pthread/pthread_cond_signal.c: Move to... - * pthread_cond_signal.c: ...here. - * sysdeps/pthread/pthread_cond_timedwait.c: Move to... - * pthread_cond_timedwait.c: ...here. - * sysdeps/pthread/pthread_cond_wait.c: Move to... - * pthread_cond_wait.c: ...here. - * sysdeps/pthread/pthread_once.c: Move to... - * pthread_once.c: ...here. - * sysdeps/pthread/pthread_rwlock_rdlock.c: Move to... - * pthread_rwlock_rdlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Move to... - * pthread_rwlock_timedrdlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c: Move to... - * pthread_rwlock_timedwrlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_unlock.c: Move to... - * pthread_rwlock_unlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_wrlock.c: Move to... - * pthread_rwlock_wrlock.c: ...here. - * sysdeps/pthread/pthread_spin_destroy.c: Move to... - * pthread_spin_destroy.c: ...here. - * sysdeps/pthread/pthread_spin_init.c: Move to... - * pthread_spin_init.c: ...here. - * sysdeps/pthread/pthread_spin_unlock.c: Move to... - * pthread_spin_unlock.c: ...here. - * sysdeps/pthread/pthread_getcpuclockid.c: Move to... - * pthread_getcpuclockid.c: ...here. - - * init.c: USE_TLS support is now always enabled. - * tst-tls5.h: Likewise. - * sysdeps/alpha/tls.h: Likewise. - * sysdeps/i386/tls.h: Likewise. - * sysdeps/ia64/tls.h: Likewise. - * sysdeps/powerpc/tls.h: Likewise. - * sysdeps/s390/tls.h: Likewise. - * sysdeps/sh/tls.h: Likewise. - * sysdeps/sparc/tls.h: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - 2006-10-27 Jakub Jelinek * sysdeps/unix/sysv/linux/rtld-lowlevel.h (__rtld_mrlock_lock, @@ -125,59 +147,74 @@ * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (SINGLE_THREAD_P): Likewise. -2006-10-26 Jakub Jelinek +2006-10-09 Ulrich Drepper - * pthread_attr_setstacksize.c (NEW_VERNUM): Define to GLIBC_2_3_3 - by default rather than 2_3_3. + * sysdeps/unix/sysv/linux/rtld-lowlevel.h: New file.. -2006-10-17 Jakub Jelinek +2007-05-25 Ulrich Drepper - * sysdeps/unix/sysv/linux/rtld-lowlevel.h (__rtld_mrlock_lock, - __rtld_mrlock_unlock, __rtld_mrlock_change, __rtld_mrlock_done): Use - atomic_* instead of catomic_* macros. + * Makefile (tests): Add tst-sem10. + * tst-sem10.c: New file. -2006-10-12 Ulrich Drepper +2007-05-25 Ulrich Drepper + Jakub Jelinek - [BZ #3285] - * sysdeps/unix/sysv/linux/bits/local_lim.h: Add SEM_VALUE_MAX. - * sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/semaphore.h: Remove SEM_VALUE_MAX. - * sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/semaphore.h: Likewise. + * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait): + Move __pthread_enable_asynccancel right before futex syscall. + * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): + Likewise. -2006-10-11 Ulrich Drepper +2007-05-21 Jakub Jelinek - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Add support for - cancelable syscalls with six parameters. + * tst-robust9.c (do_test): Don't fail if ENABLE_PI and + pthread_mutex_init failed with ENOTSUP. - * sysdeps/unix/sysv/linux/rtld-lowlevel.h: Use catomic_* - operations instead of atomic_*. +2007-05-17 Ulrich Drepper -2006-10-09 Ulrich Drepper + [BZ #4512] + * pthread_mutex_lock.c: Preserve FUTEX_WAITERS bit when dead owner + is detected. + * pthread_mutex_timedlock.c: Likewise. + * pthread_mutex_trylock.c: Likewise. + Patch in part by Atsushi Nemoto . - * sysdeps/unix/sysv/linux/rtld-lowlevel.h: New file.. + * Makefile (tests): Add tst-robust9 and tst-robustpi9. + * tst-robust9.c: New file. + * tst-robustpi9.c: New file. -2006-10-07 Ulrich Drepper +2007-05-07 Ulrich Drepper - * sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h: New file. - * sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstack.c: New file. - * sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c: - New file. - * pthread_attr_setstack.c: Allow overwriting the version number of the - new symbol. - * pthread_attr_setstacksize.c: Likewise. - (__old_pthread_attr_setstacksize): If STACKSIZE_ADJUST is defined use - it. - * sysdeps/unix/sysv/linux/powerpc/Versions (libpthread): Add - pthread_attr_setstack and pthread_attr_setstacksize to GLIBC_2.6. + * sysdeps/unix/sysv/linux/lowlevelrobustlock.c + (__lll_robust_lock_wait): Fix race caused by reloading of futex value. + (__lll_robust_timedlock_wait): Likewise. + Reported by Alexey Kuznetsov . + +2007-05-06 Mike Frysinger + + [BZ #4465] + * tst-cancel-wrappers.sh: Set C["fdatasync"] to 1. + * tst-cancel4.c (tf_fdatasync): New test. + +2007-02-25 Ulrich Drepper + + * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Reset refcntr in + new thread, don't just decrement it. + Patch by Suzuki K P . + +2007-02-09 Jakub Jelinek + + * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S + (__lll_mutex_timedlock_wait): Use correct pointer when we don't + call into the kernel to delay. + +2006-12-28 David S. Miller + + * shlib-versions: Fix sparc64 linux target specification. + +2006-12-21 Jakub Jelinek + + * sysdeps/unix/sysv/linux/pthread_kill.c (pthread_kill): Make sure + tid isn't reread from pd->tid in between ESRCH test and the syscall. 2006-09-24 Ulrich Drepper diff --git a/nptl/Makefile b/nptl/Makefile index 9393cab009..61cd25756c 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 2002,2003,2004,2005,2006 Free Software Foundation, Inc. +# Copyright (C) 2002,2003,2004,2005,2006,2007 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 @@ -209,16 +209,16 @@ tests = tst-typesizes \ tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \ tst-cond20 tst-cond21 tst-cond22 \ tst-robust1 tst-robust2 tst-robust3 tst-robust4 tst-robust5 \ - tst-robust6 tst-robust7 tst-robust8 \ - tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 \ - tst-robustpi5 tst-robustpi6 tst-robustpi7 tst-robustpi8 \ + tst-robust6 tst-robust7 tst-robust8 tst-robust9 \ + tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \ + tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \ tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \ tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \ tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \ tst-once1 tst-once2 tst-once3 tst-once4 \ tst-key1 tst-key2 tst-key3 tst-key4 \ tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \ - tst-sem8 tst-sem9 \ + tst-sem8 tst-sem9 tst-sem10 \ tst-barrier1 tst-barrier2 tst-barrier3 tst-barrier4 \ tst-align tst-align2 tst-align3 \ tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \ diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index c05cd47dff..736c63d69f 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -982,3 +982,60 @@ __pthread_init_static_tls (struct link_map *map) lll_unlock (stack_cache_lock); } + + +void +attribute_hidden +__wait_lookup_done (void) +{ + lll_lock (stack_cache_lock); + + struct pthread *self = THREAD_SELF; + + /* Iterate over the list with system-allocated threads first. */ + list_t *runp; + list_for_each (runp, &stack_used) + { + struct pthread *t = list_entry (runp, struct pthread, list); + if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED) + continue; + + int *const gscope_flagp = &t->header.gscope_flag; + + /* We have to wait until this thread is done with the global + scope. First tell the thread that we are waiting and + possibly have to be woken. */ + if (atomic_compare_and_exchange_bool_acq (gscope_flagp, + THREAD_GSCOPE_FLAG_WAIT, + THREAD_GSCOPE_FLAG_USED)) + continue; + + do + lll_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT); + while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT); + } + + /* Now the list with threads using user-allocated stacks. */ + list_for_each (runp, &__stack_user) + { + struct pthread *t = list_entry (runp, struct pthread, list); + if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED) + continue; + + int *const gscope_flagp = &t->header.gscope_flag; + + /* We have to wait until this thread is done with the global + scope. First tell the thread that we are waiting and + possibly have to be woken. */ + if (atomic_compare_and_exchange_bool_acq (gscope_flagp, + THREAD_GSCOPE_FLAG_WAIT, + THREAD_GSCOPE_FLAG_USED)) + continue; + + do + lll_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT); + while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT); + } + + lll_unlock (stack_cache_lock); +} diff --git a/nptl/descr.h b/nptl/descr.h index 321ce85085..241ba527ed 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002-2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -131,6 +131,7 @@ struct pthread struct { int multiple_threads; + int gscope_flag; } header; #endif diff --git a/nptl/init.c b/nptl/init.c index dddc975a5e..7144abd3fb 100644 --- a/nptl/init.c +++ b/nptl/init.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -73,7 +73,7 @@ int __set_robust_list_avail; static const char nptl_version[] __attribute_used__ = VERSION; -#ifndef SHARED +#if defined USE_TLS && !defined SHARED extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign); #endif @@ -386,6 +386,8 @@ __pthread_initialize_minimal_internal (void) GL(dl_init_static_tls) = &__pthread_init_static_tls; + GL(dl_wait_lookup_done) = &__wait_lookup_done; + /* Register the fork generation counter with the libc. */ #ifndef TLS_MULTIPLE_THREADS_IN_TCB __libc_multiple_threads_ptr = diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index f9634ab0ff..21ce6fe0b7 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -545,6 +545,8 @@ extern int __nptl_setxid (struct xid_command *cmdp) attribute_hidden; extern void __free_stack_cache (void) attribute_hidden; +extern void __wait_lookup_done (void) attribute_hidden; + #ifdef SHARED # define PTHREAD_STATIC_FN_REQUIRE(name) #else diff --git a/nptl/pthread_attr_setstack.c b/nptl/pthread_attr_setstack.c index be79e32082..622e4a2250 100644 --- a/nptl/pthread_attr_setstack.c +++ b/nptl/pthread_attr_setstack.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -23,11 +23,6 @@ #include "pthreadP.h" -#ifndef NEW_VERNUM -# define NEW_VERNUM GLIBC_2_3_3 -#endif - - int __pthread_attr_setstack (attr, stackaddr, stacksize) pthread_attr_t *attr; @@ -59,9 +54,9 @@ strong_alias (__pthread_attr_setstack, pthread_attr_setstack) #else # include versioned_symbol (libpthread, __pthread_attr_setstack, pthread_attr_setstack, - NEW_VERNUM); + GLIBC_2_3_3); -# if SHLIB_COMPAT(libpthread, GLIBC_2_2, NEW_VERNUM) +# if SHLIB_COMPAT(libpthread, GLIBC_2_2, GLIBC_2_3_3) int __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, @@ -76,9 +71,9 @@ __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, if (stacksize < 16384) return EINVAL; -# ifdef EXTRA_PARAM_CHECKS +# ifdef EXTRA_PARAM_CHECKS EXTRA_PARAM_CHECKS; -# endif +# endif iattr->stacksize = stacksize; iattr->stackaddr = (char *) stackaddr + stacksize; diff --git a/nptl/pthread_attr_setstacksize.c b/nptl/pthread_attr_setstacksize.c index 0974538986..f84a9f68e3 100644 --- a/nptl/pthread_attr_setstacksize.c +++ b/nptl/pthread_attr_setstacksize.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -22,10 +22,6 @@ #include #include "pthreadP.h" -#ifndef NEW_VERNUM -# define NEW_VERNUM GLIBC_2_3_3 -#endif - int __pthread_attr_setstacksize (attr, stacksize) @@ -51,9 +47,9 @@ strong_alias (__pthread_attr_setstacksize, pthread_attr_setstacksize) #else # include versioned_symbol (libpthread, __pthread_attr_setstacksize, - pthread_attr_setstacksize, NEW_VERNUM); + pthread_attr_setstacksize, GLIBC_2_3_3); -# if SHLIB_COMPAT(libpthread, GLIBC_2_1, NEW_VERNUM) +# if SHLIB_COMPAT(libpthread, GLIBC_2_1, GLIBC_2_3_3) int __old_pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize) @@ -67,10 +63,6 @@ __old_pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize) if (stacksize < 16384) return EINVAL; -# ifdef STACKSIZE_ADJUST - STACKSIZE_ADJUST; -# endif - iattr->stacksize = stacksize; return 0; diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c index 4bdc7b5b15..f6cd8899d8 100644 --- a/nptl/pthread_getattr_np.c +++ b/nptl/pthread_getattr_np.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -168,8 +168,12 @@ pthread_getattr_np (thread_id, attr) { free (cpuset); if (ret == ENOSYS) - /* There is no such functionality. */ - ret = 0; + { + /* There is no such functionality. */ + ret = 0; + iattr->cpuset = NULL; + iattr->cpusetsize = 0; + } } } diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c index 52cc47f4cc..1c3ee4fe25 100644 --- a/nptl/pthread_mutex_lock.c +++ b/nptl/pthread_mutex_lock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -127,6 +127,8 @@ __pthread_mutex_lock (mutex) int newval = id; #ifdef NO_INCR newval |= FUTEX_WAITERS; +#else + newval |= (oldval & FUTEX_WAITERS); #endif newval diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c index c8e6b8507a..8fd681c6ef 100644 --- a/nptl/pthread_mutex_timedlock.c +++ b/nptl/pthread_mutex_timedlock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -119,9 +119,11 @@ pthread_mutex_timedlock (mutex, abstime) if ((oldval & FUTEX_OWNER_DIED) != 0) { /* The previous owner died. Try locking the mutex. */ - int newval + int newval = id | (oldval & FUTEX_WAITERS); + + newval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - id, oldval); + newval, oldval); if (newval != oldval) { oldval = newval; diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c index 94d519233b..66aca8e4b2 100644 --- a/nptl/pthread_mutex_trylock.c +++ b/nptl/pthread_mutex_trylock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -91,9 +91,11 @@ __pthread_mutex_trylock (mutex) if ((oldval & FUTEX_OWNER_DIED) != 0) { /* The previous owner died. Try locking the mutex. */ - int newval + int newval = id | (oldval & FUTEX_WAITERS); + + newval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - id, oldval); + newval, oldval); if (newval != oldval) { diff --git a/nptl/sysdeps/alpha/tls.h b/nptl/sysdeps/alpha/tls.h index be2430f676..07db15939d 100644 --- a/nptl/sysdeps/alpha/tls.h +++ b/nptl/sysdeps/alpha/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. NPTL/Alpha version. - Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2005, 2007 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 @@ -48,6 +48,9 @@ typedef union dtv # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +# define USE_TLS 1 + #ifndef __ASSEMBLER__ /* Get system call information. */ @@ -121,6 +124,29 @@ typedef struct #define THREAD_SETMEM_NC(descr, member, idx, value) \ descr->member[idx] = (value) +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h index d5b3797e69..b3d9142fc5 100644 --- a/nptl/sysdeps/i386/tls.h +++ b/nptl/sysdeps/i386/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. nptl/i386 version. - Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2002,2003,2004,2005,2007 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 @@ -51,6 +51,7 @@ typedef struct uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; + int gscope_flag; } tcbhead_t; # define TLS_MULTIPLE_THREADS_IN_TCB 1 @@ -65,6 +66,9 @@ typedef struct # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +#define USE_TLS 1 + /* Alignment requirement for the stack. For IA-32 this is governed by the SSE memory functions. */ #define STACK_ALIGN 16 @@ -431,6 +435,26 @@ union user_desc_init = THREAD_GETMEM (THREAD_SELF, header.pointer_guard)) +/* Get and set the global scope generation counter in the TCB head. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res; \ + asm volatile ("xchgl %0, %%gs:%P1" \ + : "=r" (__res) \ + : "i" (offsetof (struct pthread, header.gscope_flag)), \ + "0" (THREAD_GSCOPE_FLAG_UNUSED)); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/sysdeps/ia64/pthread_spin_unlock.c b/nptl/sysdeps/ia64/pthread_spin_unlock.c index 50d9c5f6a8..6232764b13 100644 --- a/nptl/sysdeps/ia64/pthread_spin_unlock.c +++ b/nptl/sysdeps/ia64/pthread_spin_unlock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2003. @@ -23,6 +23,6 @@ int pthread_spin_unlock (pthread_spinlock_t *lock) { - __sync_lock_release ((int *) lock); + __sync_lock_release_si ((int *) lock); return 0; } diff --git a/nptl/sysdeps/ia64/tls.h b/nptl/sysdeps/ia64/tls.h index 22a8b08144..a43f096798 100644 --- a/nptl/sysdeps/ia64/tls.h +++ b/nptl/sysdeps/ia64/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. nptl/IA-64 version. - Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007 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 @@ -61,6 +61,9 @@ register struct pthread *__thread_self __asm__("r13"); # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +#define USE_TLS 1 + /* Alignment requirement for the stack. */ #define STACK_ALIGN 16 @@ -163,6 +166,29 @@ register struct pthread *__thread_self __asm__("r13"); (((uintptr_t *) ((char *) (descr) + TLS_PRE_TCB_SIZE))[-2] \ = THREAD_GET_POINTER_GUARD ()) +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/sysdeps/powerpc/tls.h b/nptl/sysdeps/powerpc/tls.h index ddaafe23d0..ad5698c6f8 100644 --- a/nptl/sysdeps/powerpc/tls.h +++ b/nptl/sysdeps/powerpc/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. NPTL/PowerPC version. - Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2005, 2007 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 @@ -48,6 +48,9 @@ typedef union dtv # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +# define USE_TLS 1 + #ifndef __ASSEMBLER__ /* Get system call information. */ @@ -180,6 +183,29 @@ register void *__thread_register __asm__ ("r13"); different value to mean unset l_tls_offset. */ # define NO_TLS_OFFSET -1 +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/pthread_barrier_wait.c b/nptl/sysdeps/pthread/pthread_barrier_wait.c similarity index 100% rename from nptl/pthread_barrier_wait.c rename to nptl/sysdeps/pthread/pthread_barrier_wait.c diff --git a/nptl/pthread_cond_broadcast.c b/nptl/sysdeps/pthread/pthread_cond_broadcast.c similarity index 100% rename from nptl/pthread_cond_broadcast.c rename to nptl/sysdeps/pthread/pthread_cond_broadcast.c diff --git a/nptl/pthread_cond_signal.c b/nptl/sysdeps/pthread/pthread_cond_signal.c similarity index 100% rename from nptl/pthread_cond_signal.c rename to nptl/sysdeps/pthread/pthread_cond_signal.c diff --git a/nptl/pthread_cond_timedwait.c b/nptl/sysdeps/pthread/pthread_cond_timedwait.c similarity index 100% rename from nptl/pthread_cond_timedwait.c rename to nptl/sysdeps/pthread/pthread_cond_timedwait.c diff --git a/nptl/pthread_cond_wait.c b/nptl/sysdeps/pthread/pthread_cond_wait.c similarity index 100% rename from nptl/pthread_cond_wait.c rename to nptl/sysdeps/pthread/pthread_cond_wait.c diff --git a/nptl/pthread_getcpuclockid.c b/nptl/sysdeps/pthread/pthread_getcpuclockid.c similarity index 100% rename from nptl/pthread_getcpuclockid.c rename to nptl/sysdeps/pthread/pthread_getcpuclockid.c diff --git a/nptl/pthread_once.c b/nptl/sysdeps/pthread/pthread_once.c similarity index 100% rename from nptl/pthread_once.c rename to nptl/sysdeps/pthread/pthread_once.c diff --git a/nptl/pthread_rwlock_rdlock.c b/nptl/sysdeps/pthread/pthread_rwlock_rdlock.c similarity index 100% rename from nptl/pthread_rwlock_rdlock.c rename to nptl/sysdeps/pthread/pthread_rwlock_rdlock.c diff --git a/nptl/pthread_rwlock_timedrdlock.c b/nptl/sysdeps/pthread/pthread_rwlock_timedrdlock.c similarity index 100% rename from nptl/pthread_rwlock_timedrdlock.c rename to nptl/sysdeps/pthread/pthread_rwlock_timedrdlock.c diff --git a/nptl/pthread_rwlock_timedwrlock.c b/nptl/sysdeps/pthread/pthread_rwlock_timedwrlock.c similarity index 100% rename from nptl/pthread_rwlock_timedwrlock.c rename to nptl/sysdeps/pthread/pthread_rwlock_timedwrlock.c diff --git a/nptl/pthread_rwlock_unlock.c b/nptl/sysdeps/pthread/pthread_rwlock_unlock.c similarity index 100% rename from nptl/pthread_rwlock_unlock.c rename to nptl/sysdeps/pthread/pthread_rwlock_unlock.c diff --git a/nptl/pthread_rwlock_wrlock.c b/nptl/sysdeps/pthread/pthread_rwlock_wrlock.c similarity index 100% rename from nptl/pthread_rwlock_wrlock.c rename to nptl/sysdeps/pthread/pthread_rwlock_wrlock.c diff --git a/nptl/pthread_spin_destroy.c b/nptl/sysdeps/pthread/pthread_spin_destroy.c similarity index 100% rename from nptl/pthread_spin_destroy.c rename to nptl/sysdeps/pthread/pthread_spin_destroy.c diff --git a/nptl/pthread_spin_init.c b/nptl/sysdeps/pthread/pthread_spin_init.c similarity index 100% rename from nptl/pthread_spin_init.c rename to nptl/sysdeps/pthread/pthread_spin_init.c diff --git a/nptl/pthread_spin_unlock.c b/nptl/sysdeps/pthread/pthread_spin_unlock.c similarity index 100% rename from nptl/pthread_spin_unlock.c rename to nptl/sysdeps/pthread/pthread_spin_unlock.c diff --git a/nptl/sysdeps/s390/tls.h b/nptl/sysdeps/s390/tls.h index 6f6f17b975..8e8f86d64e 100644 --- a/nptl/sysdeps/s390/tls.h +++ b/nptl/sysdeps/s390/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. NPTL/s390 version. - Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2007 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 @@ -50,6 +50,7 @@ typedef struct int multiple_threads; uintptr_t sysinfo; uintptr_t stack_guard; + int gscope_flag; } tcbhead_t; # ifndef __s390x__ @@ -66,6 +67,9 @@ typedef struct # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +#define USE_TLS 1 + /* Alignment requirement for the stack. For IA-32 this is governed by the SSE memory functions. */ #define STACK_ALIGN 16 @@ -168,6 +172,29 @@ typedef struct #define THREAD_SET_POINTER_GUARD(value) #define THREAD_COPY_POINTER_GUARD(descr) +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/sysdeps/sh/tls.h b/nptl/sysdeps/sh/tls.h index d9aa1073b8..2873fe73a8 100644 --- a/nptl/sysdeps/sh/tls.h +++ b/nptl/sysdeps/sh/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. NPTL/SH version. - Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2005, 2007 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,6 +56,9 @@ typedef struct # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +# define USE_TLS 1 + #ifndef __ASSEMBLER__ /* Get system call information. */ @@ -150,6 +153,29 @@ typedef struct __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ ((tcbhead_t *) (descr + 1))->pointer_guard = __tcbp->pointer_guard;}) +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/sysdeps/sparc/tls.h b/nptl/sysdeps/sparc/tls.h index 4fbe426595..90a3e0bf3d 100644 --- a/nptl/sysdeps/sparc/tls.h +++ b/nptl/sysdeps/sparc/tls.h @@ -1,5 +1,5 @@ /* Definitions for thread-local data handling. NPTL/sparc version. - Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2005, 2006, 2007 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 @@ -46,9 +46,15 @@ typedef struct dtv_t *dtv; void *self; int multiple_threads; +#if __WORDSIZE == 64 + int gscope_flag; +#endif uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; +#if __WORDSIZE != 64 + int gscope_flag; +#endif } tcbhead_t; #else /* __ASSEMBLER__ */ @@ -60,6 +66,9 @@ typedef struct # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +#define USE_TLS 1 + #ifndef __ASSEMBLER__ /* Get system call information. */ # include @@ -141,6 +150,29 @@ register struct pthread *__thread_self __asm__("%g7"); # define THREAD_COPY_POINTER_GUARD(descr) \ ((descr)->header.pointer_guard = THREAD_GET_POINTER_GUARD ()) +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* !ASSEMBLER */ #endif /* tls.h */ diff --git a/nptl/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h b/nptl/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h index 9b27b1ff48..e0718780cc 100644 --- a/nptl/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h +++ b/nptl/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h @@ -87,6 +87,3 @@ /* Maximum message queue priority level. */ #define MQ_PRIO_MAX 32768 - -/* Maximum value the semaphore can have. */ -#define SEM_VALUE_MAX (2147483647) diff --git a/nptl/sysdeps/unix/sysv/linux/alpha/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/alpha/bits/semaphore.h index be4469c69d..6dadfda206 100644 --- a/nptl/sysdeps/unix/sysv/linux/alpha/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/alpha/bits/semaphore.h @@ -26,6 +26,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/bits/local_lim.h b/nptl/sysdeps/unix/sysv/linux/bits/local_lim.h index 4b7b29787e..b639ba44af 100644 --- a/nptl/sysdeps/unix/sysv/linux/bits/local_lim.h +++ b/nptl/sysdeps/unix/sysv/linux/bits/local_lim.h @@ -87,6 +87,3 @@ /* Maximum message queue priority level. */ #define MQ_PRIO_MAX 32768 - -/* Maximum value the semaphore can have. */ -#define SEM_VALUE_MAX (2147483647) diff --git a/nptl/sysdeps/unix/sysv/linux/fork.c b/nptl/sysdeps/unix/sysv/linux/fork.c index 840974401b..98bb237c06 100644 --- a/nptl/sysdeps/unix/sysv/linux/fork.c +++ b/nptl/sysdeps/unix/sysv/linux/fork.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -167,8 +167,11 @@ __libc_fork (void) allp->handler->child_handler (); /* Note that we do not have to wake any possible waiter. - This is the only thread in the new process. */ - --allp->handler->refcntr; + This is the only thread in the new process. The count + may have been bumped up by other threads doing a fork. + We reset it to 1, to avoid waiting for non-existing + thread(s) to release the count. */ + allp->handler->refcntr = 1; /* XXX We could at this point look through the object pool and mark all objects not on the __fork_handlers list as diff --git a/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h index 934493c308..e6c5d845ce 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/i386/bits/semaphore.h @@ -28,6 +28,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S index aa1f9f41ca..bf70e17fca 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -79,10 +79,7 @@ sem_timedwait: jae 6f cfi_offset(3, -16) /* %ebx */ -7: call __pthread_enable_asynccancel - movl %eax, 8(%esp) - - xorl %ecx, %ecx +7: xorl %ecx, %ecx movl %esp, %ebx movl %ecx, %edx movl $SYS_gettimeofday, %eax @@ -105,6 +102,10 @@ sem_timedwait: movl %ecx, (%esp) /* Store relative timeout. */ movl %edx, 4(%esp) + + call __pthread_enable_asynccancel + movl %eax, 8(%esp) + movl 28(%esp), %ebx xorl %ecx, %ecx movl %esp, %esi diff --git a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h index 1cd4b9b8b6..d60dcd33d5 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h @@ -58,7 +58,6 @@ # define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2 # define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2 # define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2 -# define SAVE_OLDTYPE_6 SAVE_OLDTYPE_2 # define PUSHCARGS_0 /* No arguments to push. */ # define DOCARGS_0 /* No arguments to frob. */ @@ -102,14 +101,6 @@ # define _POPCARGS_5 _POPCARGS_4; popl %edi; \ cfi_adjust_cfa_offset (-4); cfi_restore (edi); -# define PUSHCARGS_6 _PUSHCARGS_6 -# define DOCARGS_6 _DOARGS_6 (44) -# define POPCARGS_6 _POPCARGS_6 -# define _PUSHCARGS_6 pushl %ebp; cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (ebp, 0); _PUSHCARGS_5 -# define _POPCARGS_6 _POPCARGS_5; popl %ebp; \ - cfi_adjust_cfa_offset (-4); cfi_restore (ebp); - # ifdef IS_IN_libpthread # define CENABLE call __pthread_enable_asynccancel; # define CDISABLE call __pthread_disable_asynccancel @@ -131,7 +122,6 @@ # define POPSTATE_3 POPSTATE_2 # define POPSTATE_4 POPSTATE_3 # define POPSTATE_5 POPSTATE_4 -# define POPSTATE_6 POPSTATE_5 # ifndef __ASSEMBLER__ # define SINGLE_THREAD_P \ diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h b/nptl/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h index 83db31efcb..f837250b95 100644 --- a/nptl/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h +++ b/nptl/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h @@ -87,6 +87,3 @@ /* Maximum message queue priority level. */ #define MQ_PRIO_MAX 32768 - -/* Maximum value the semaphore can have. */ -#define SEM_VALUE_MAX (2147483647) diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/ia64/bits/semaphore.h index 0684aebe24..2329e98667 100644 --- a/nptl/sysdeps/unix/sysv/linux/ia64/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/ia64/bits/semaphore.h @@ -28,6 +28,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c b/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c index 3e88ee1866..30ef991bd0 100644 --- a/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c +++ b/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 Free Software Foundation, Inc. +/* Copyright (C) 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2006. @@ -30,6 +30,10 @@ __lll_robust_lock_wait (int *futex) int oldval = *futex; int tid = THREAD_GETMEM (THREAD_SELF, tid); + /* If the futex changed meanwhile try locking again. */ + if (oldval == 0) + goto try; + do { if (__builtin_expect (oldval & FUTEX_OWNER_DIED, 0)) @@ -41,6 +45,9 @@ __lll_robust_lock_wait (int *futex) continue; lll_futex_wait (futex, newval); + + try: + ; } while ((oldval = atomic_compare_and_exchange_val_acq (futex, tid | FUTEX_WAITERS, @@ -57,6 +64,11 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime) return EINVAL; int tid = THREAD_GETMEM (THREAD_SELF, tid); + int oldval = *futex; + + /* If the futex changed meanwhile try locking again. */ + if (oldval == 0) + goto try; do { @@ -80,7 +92,6 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime) return ETIMEDOUT; /* Wait. */ - int oldval = *futex; if (__builtin_expect (oldval & FUTEX_OWNER_DIED, 0)) return oldval; @@ -90,8 +101,13 @@ __lll_robust_timedlock_wait (int *futex, const struct timespec *abstime) continue; lll_futex_timed_wait (futex, newval, &rt); + + try: + ; } - while (atomic_compare_and_exchange_bool_acq (futex, tid | FUTEX_WAITERS, 0)); + while ((oldval = atomic_compare_and_exchange_val_acq (futex, + tid | FUTEX_WAITERS, + 0)) != 0); return 0; } diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/Versions b/nptl/sysdeps/unix/sysv/linux/powerpc/Versions index 6b5a0362da..9977847984 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/Versions +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/Versions @@ -2,8 +2,4 @@ libpthread { GLIBC_2.3.4 { longjmp; siglongjmp; } - GLIBC_2.6 { - # Changed PTHREAD_STACK_MIN. - pthread_attr_setstack; pthread_attr_setstacksize; - } } diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h b/nptl/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h deleted file mode 100644 index 02e2d17343..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Minimum guaranteed maximum values for system limits. Linux/PPC version. - Copyright (C) 1993-1998,2000,2002-2004,2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - 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; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* The kernel header pollutes the namespace with the NR_OPEN symbol - and defines LINK_MAX although filesystems have different maxima. A - similar thing is true for OPEN_MAX: the limit can be changed at - runtime and therefore the macro must not be defined. Remove this - after including the header if necessary. */ -#ifndef NR_OPEN -# define __undef_NR_OPEN -#endif -#ifndef LINK_MAX -# define __undef_LINK_MAX -#endif -#ifndef OPEN_MAX -# define __undef_OPEN_MAX -#endif - -/* The kernel sources contain a file with all the needed information. */ -#include - -/* Have to remove NR_OPEN? */ -#ifdef __undef_NR_OPEN -# undef NR_OPEN -# undef __undef_NR_OPEN -#endif -/* Have to remove LINK_MAX? */ -#ifdef __undef_LINK_MAX -# undef LINK_MAX -# undef __undef_LINK_MAX -#endif -/* Have to remove OPEN_MAX? */ -#ifdef __undef_OPEN_MAX -# undef OPEN_MAX -# undef __undef_OPEN_MAX -#endif - -/* The number of data keys per process. */ -#define _POSIX_THREAD_KEYS_MAX 128 -/* This is the value this implementation supports. */ -#define PTHREAD_KEYS_MAX 1024 - -/* Controlling the iterations of destructors for thread-specific data. */ -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 -/* Number of iterations this implementation does. */ -#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS - -/* The number of threads per process. */ -#define _POSIX_THREAD_THREADS_MAX 64 -/* We have no predefined limit on the number of threads. */ -#undef PTHREAD_THREADS_MAX - -/* Maximum amount by which a process can descrease its asynchronous I/O - priority level. */ -#define AIO_PRIO_DELTA_MAX 20 - -/* Minimum size for a thread. At least two pages for systems with 64k - pages. */ -#define PTHREAD_STACK_MIN 131072 - -/* Maximum number of timer expiration overruns. */ -#define DELAYTIMER_MAX 2147483647 - -/* Maximum tty name length. */ -#define TTY_NAME_MAX 32 - -/* Maximum login name length. This is arbitrary. */ -#define LOGIN_NAME_MAX 256 - -/* Maximum host name length. */ -#define HOST_NAME_MAX 64 - -/* Maximum message queue priority level. */ -#define MQ_PRIO_MAX 32768 - -/* Maximum value the semaphore can have. */ -#define SEM_VALUE_MAX (2147483647) diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h index c7f121ba5b..8123b418b5 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h @@ -33,6 +33,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstack.c b/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstack.c deleted file mode 100644 index 2cb0a13bcb..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstack.c +++ /dev/null @@ -1,2 +0,0 @@ -#define NEW_VERNUM GLIBC_2_6 -#include diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c b/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c deleted file mode 100644 index 9472dd17ef..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c +++ /dev/null @@ -1,8 +0,0 @@ -#define NEW_VERNUM GLIBC_2_6 -#define STACKSIZE_ADJUST \ - do { \ - size_t ps = __getpagesize (); \ - if (stacksize < 2 * ps) \ - stacksize = 2 * ps; \ - } while (0) -#include diff --git a/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h b/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h index 6b3d3682da..39db5a3bd4 100644 --- a/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h +++ b/nptl/sysdeps/unix/sysv/linux/rtld-lowlevel.h @@ -1,5 +1,5 @@ /* Defintions for lowlevel handling in ld.so. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006, 2007 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 diff --git a/nptl/sysdeps/unix/sysv/linux/s390/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/s390/bits/semaphore.h index 111462f0fb..ead2663047 100644 --- a/nptl/sysdeps/unix/sysv/linux/s390/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/s390/bits/semaphore.h @@ -32,6 +32,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h index 6b0240243a..17ab562daa 100644 --- a/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h @@ -45,13 +45,7 @@ L(pseudo_cancel): \ bas %r14,0(%r1,%r13); \ lr %r0,%r2; \ LM_##args \ - .if SYS_ify (syscall_name) < 256; \ - svc SYS_ify (syscall_name); \ - .else; \ - lhi %r1,SYS_ify (syscall_name); \ - svc 0; \ - .endif; \ - LR7_##args \ + DO_CALL(syscall_name, args); \ l %r1,2f-0b(%r13); \ lr %r12,%r2; \ lr %r2,%r0; \ @@ -95,7 +89,6 @@ L(pseudo_end): #define STM_3 stm %r2,%r4,8(%r15); #define STM_4 stm %r2,%r5,8(%r15); #define STM_5 stm %r2,%r5,8(%r15); -#define STM_6 stm %r2,%r7,8(%r15); #define LM_0 /* Nothing */ #define LM_1 l %r2,8+96(%r15); @@ -103,18 +96,6 @@ L(pseudo_end): #define LM_3 lm %r2,%r4,8+96(%r15); #define LM_4 lm %r2,%r5,8+96(%r15); #define LM_5 lm %r2,%r5,8+96(%r15); -#define LM_6 lm %r2,%r5,8+96(%r15); \ - cfi_offset (%r7, -68); \ - l %r7,96+96(%r15); - -#define LR7_0 /* Nothing */ -#define LR7_1 /* Nothing */ -#define LR7_2 /* Nothing */ -#define LR7_3 /* Nothing */ -#define LR7_4 /* Nothing */ -#define LR7_5 /* Nothing */ -#define LR7_6 l %r7,28+96(%r15); \ - cfi_restore (%r7); # ifndef __ASSEMBLER__ # define SINGLE_THREAD_P \ diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h index 70d5a86429..77ce742495 100644 --- a/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h @@ -42,13 +42,7 @@ L(pseudo_cancel): \ brasl %r14,CENABLE; \ lgr %r0,%r2; \ LM_##args \ - .if SYS_ify (syscall_name) < 256; \ - svc SYS_ify (syscall_name); \ - .else; \ - lghi %r1,SYS_ify (syscall_name); \ - svc 0; \ - .endif; \ - LR7_##args \ + DO_CALL(syscall_name, args); \ lgr %r13,%r2; \ lgr %r2,%r0; \ brasl %r14,CDISABLE; \ @@ -91,7 +85,6 @@ L(pseudo_end): #define STM_3 stmg %r2,%r4,16(%r15); #define STM_4 stmg %r2,%r5,16(%r15); #define STM_5 stmg %r2,%r5,16(%r15); -#define STM_6 stmg %r2,%r7,16(%r15); #define LM_0 /* Nothing */ #define LM_1 lg %r2,16+160(%r15); @@ -99,18 +92,6 @@ L(pseudo_end): #define LM_3 lmg %r2,%r4,16+160(%r15); #define LM_4 lmg %r2,%r5,16+160(%r15); #define LM_5 lmg %r2,%r5,16+160(%r15); -#define LM_6 lmg %r2,%r5,16+160(%r15); \ - cfi_offset (%r7, -104); \ - lg %r7,160+160(%r15); - -#define LR7_0 /* Nothing */ -#define LR7_1 /* Nothing */ -#define LR7_2 /* Nothing */ -#define LR7_3 /* Nothing */ -#define LR7_4 /* Nothing */ -#define LR7_5 /* Nothing */ -#define LR7_6 lg %r7,56+160(%r15); \ - cfi_restore (%r7); # if defined IS_IN_libpthread || !defined NOT_IN_libc # ifndef __ASSEMBLER__ diff --git a/nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h index 934493c308..e6c5d845ce 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/sh/bits/semaphore.h @@ -28,6 +28,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h b/nptl/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h index 2576f121c3..e082ea8f04 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h +++ b/nptl/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h @@ -87,6 +87,3 @@ /* Maximum message queue priority level. */ #define MQ_PRIO_MAX 32768 - -/* Maximum value the semaphore can have. */ -#define SEM_VALUE_MAX (2147483647) diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/sparc/bits/semaphore.h index 8fd7d344ea..7f3a328326 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/sparc/bits/semaphore.h @@ -33,6 +33,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c index 55d20eb8f8..7613863bba 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c @@ -1 +1 @@ -#include "../../../../../../../pthread_barrier_wait.c" +#include "../../../../../../pthread/pthread_barrier_wait.c" diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h index e973bc5bfb..57edbbbfb3 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h @@ -33,6 +33,9 @@ /* Value returned if `sem_open' failed. */ #define SEM_FAILED ((sem_t *) 0) +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + typedef union { diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S index 90f10e6f4f..394dec8d82 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002-2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -164,7 +164,7 @@ __lll_mutex_timedlock_wait: 8: /* NB: %edx == 2 */ xorl %eax, %eax LOCK - cmpxchgl %edx, (%rdi) + cmpxchgl %edx, (%r12) jnz 7f 6: addq $16, %rsp diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h index 4030bb7fb8..97085bf018 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -35,7 +35,6 @@ #define SYS_futex 202 #define FUTEX_WAIT 0 #define FUTEX_WAKE 1 -#define FUTEX_CMP_REQUEUE 4 #define FUTEX_LOCK_PI 6 #define FUTEX_UNLOCK_PI 7 #define FUTEX_TRYLOCK_PI 8 @@ -151,7 +150,7 @@ LLL_STUB_UNWIND_INFO_END #define lll_futex_wait(futex, val) \ ({ \ int __status; \ - register __typeof (val) _val __asm ("edx") = (val); \ + register __typeof (val) _val asm ("edx") = (val); \ __asm __volatile ("xorq %%r10, %%r10\n\t" \ "syscall" \ : "=a" (__status) \ @@ -164,22 +163,22 @@ LLL_STUB_UNWIND_INFO_END #define lll_futex_timed_wait(futex, val, timeout) \ ({ \ - register const struct timespec *__to __asm ("r10") = timeout; \ + register const struct timespec *__to __asm__ ("r10") = timeout; \ int __status; \ - register __typeof (val) _val __asm ("edx") = (val); \ + register __typeof (val) _val asm ("edx") = (val); \ __asm __volatile ("syscall" \ : "=a" (__status) \ : "0" (SYS_futex), "D" (futex), "S" (FUTEX_WAIT), \ "d" (_val), "r" (__to) \ : "memory", "cc", "r11", "cx"); \ - -__status; \ + __status; \ }) #define lll_futex_wake(futex, nr) \ do { \ int __ignore; \ - register __typeof (nr) _nr __asm ("edx") = (nr); \ + register __typeof (nr) _nr asm ("edx") = (nr); \ __asm __volatile ("syscall" \ : "=a" (__ignore) \ : "0" (SYS_futex), "D" (futex), "S" (FUTEX_WAKE), \ @@ -424,21 +423,6 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden; : "cx", "r11", "cc", "memory"); }) -/* Returns non-zero if error happened, zero if success. */ -#define lll_futex_requeue(ftx, nr_wake, nr_move, mutex, val) \ - ({ int __res; \ - register int __nr_move __asm ("r10") = nr_move; \ - register void *__mutex __asm ("r8") = mutex; \ - register int __val __asm ("r9") = val; \ - __asm __volatile ("syscall" \ - : "=a" (__res) \ - : "0" (__NR_futex), "D" ((void *) ftx), \ - "S" (FUTEX_CMP_REQUEUE), "d" (nr_wake), \ - "r" (__nr_move), "r" (__mutex), "r" (__val) \ - : "cx", "r11", "cc", "memory"); \ - __res < 0; }) - - #define lll_mutex_islocked(futex) \ (futex != LLL_MUTEX_LOCK_INITIALIZER) diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S index c44d3f5e77..51136cf2dc 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -79,10 +79,7 @@ sem_timedwait: cfi_offset(14, -24) /* %r14 */ jae 6f -7: call __pthread_enable_asynccancel - movl %eax, 16(%rsp) - - xorl %esi, %esi +7: xorl %esi, %esi movq %rsp, %rdi movq $VSYSCALL_ADDR_vgettimeofday, %rax callq *%rax @@ -105,6 +102,9 @@ sem_timedwait: movq %rdi, (%rsp) /* Store relative timeout. */ movq %rsi, 8(%rsp) + call __pthread_enable_asynccancel + movl %eax, 16(%rsp) + movq %rsp, %r10 movq %r12, %rdi xorl %esi, %esi diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index 7618573e0b..b6385b135c 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. nptl/x86_64 version. - Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -47,6 +47,7 @@ typedef struct dtv_t *dtv; void *self; /* Pointer to the thread descriptor. */ int multiple_threads; + int gscope_flag; uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; @@ -62,6 +63,9 @@ typedef struct # error "TLS support is required." #endif +/* Signal that TLS support is available. */ +#define USE_TLS 1 + /* Alignment requirement for the stack. */ #define STACK_ALIGN 16 @@ -336,6 +340,26 @@ typedef struct = THREAD_GETMEM (THREAD_SELF, header.pointer_guard)) +/* Get and set the global scope generation counter in the TCB head. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res; \ + asm volatile ("xchgl %0, %%fs:%P1" \ + : "=r" (__res) \ + : "i" (offsetof (struct pthread, header.gscope_flag)), \ + "0" (THREAD_GSCOPE_FLAG_UNUSED)); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/tst-cancel-wrappers.sh b/nptl/tst-cancel-wrappers.sh index d6f16d1ed2..61b9fb52de 100644 --- a/nptl/tst-cancel-wrappers.sh +++ b/nptl/tst-cancel-wrappers.sh @@ -1,6 +1,6 @@ #! /bin/sh # Test whether all cancelable functions are cancelable. -# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2007 Free Software Foundation, Inc. # This file is part of the GNU C Library. # Contributed by Jakub Jelinek , 2002. @@ -26,6 +26,7 @@ C["close"]=1 C["connect"]=1 C["creat"]=1 C["fcntl"]=1 +C["fdatasync"]=1 C["fsync"]=1 C["msgrcv"]=1 C["msgsnd"]=1 diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c index 73cfa44614..45df6ce076 100644 --- a/nptl/tst-cancel4.c +++ b/nptl/tst-cancel4.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -1571,6 +1571,47 @@ tf_fsync (void *arg) static void * +tf_fdatasync (void *arg) +{ + if (arg == NULL) + // XXX If somebody can provide a portable test case in which fdatasync() + // blocks we can enable this test to run in both rounds. + abort (); + + tempfd = open ("Makefile", O_RDONLY); + if (tempfd == -1) + { + printf ("%s: cannot open Makefile\n", __FUNCTION__); + exit (1); + } + + int r = pthread_barrier_wait (&b2); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + printf ("%s: barrier_wait failed\n", __FUNCTION__); + exit (1); + } + + r = pthread_barrier_wait (&b2); + if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) + { + printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__); + exit (1); + } + + pthread_cleanup_push (cl, NULL); + + fdatasync (tempfd); + + pthread_cleanup_pop (0); + + printf ("%s: fdatasync returned\n", __FUNCTION__); + + exit (1); +} + + +static void * tf_msync (void *arg) { if (arg == NULL) @@ -2078,6 +2119,7 @@ static struct ADD_TEST (pread, 2, 1), ADD_TEST (pwrite, 2, 1), ADD_TEST (fsync, 2, 1), + ADD_TEST (fdatasync, 2, 1), ADD_TEST (msync, 2, 1), ADD_TEST (sendto, 2, 1), ADD_TEST (sendmsg, 2, 1), diff --git a/nptl/tst-robust9.c b/nptl/tst-robust9.c new file mode 100644 index 0000000000..1d6ba179be --- /dev/null +++ b/nptl/tst-robust9.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include +#include + + +static pthread_mutex_t m; + +static void * +tf (void *data) +{ + int err = pthread_mutex_lock (&m); + if (err == EOWNERDEAD) + { + err = pthread_mutex_consistent_np (&m); + if (err) + { + puts ("pthread_mutex_consistent_np"); + exit (1); + } + } + else if (err) + { + puts ("pthread_mutex_lock"); + exit (1); + } + printf ("thread%ld got the lock.\n", (long int) data); + sleep (1); + /* exit without unlock */ + return NULL; +} + +static int +do_test (void) +{ + int err, i; + pthread_t t[3]; + pthread_mutexattr_t ma; + + pthread_mutexattr_init (&ma); + err = pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP); + if (err) + { + puts ("pthread_mutexattr_setrobust_np"); + return 1; + } +#ifdef ENABLE_PI + if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT) != 0) + { + puts ("pthread_mutexattr_setprotocol failed"); + return 1; + } +#endif + err = pthread_mutex_init (&m, &ma); +#ifdef ENABLE_PI + if (err == ENOTSUP) + { + puts ("PI robust mutexes not supported"); + return 0; + } +#endif + if (err) + { + puts ("pthread_mutex_init"); + return 1; + } + + for (i = 0; i < sizeof (t) / sizeof (t[0]); i++) + { + err = pthread_create (&t[i], NULL, tf, (void *) (long int) i); + if (err) + { + puts ("pthread_create"); + return 1; + } + } + + for (i = 0; i < sizeof (t) / sizeof (t[0]); i++) + { + err = pthread_join (t[i], NULL); + if (err) + { + puts ("pthread_join"); + return 1; + } + } + return 0; +} + +#define TIMEOUT 5 +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/nptl/tst-robustpi9.c b/nptl/tst-robustpi9.c new file mode 100644 index 0000000000..d059aa7d88 --- /dev/null +++ b/nptl/tst-robustpi9.c @@ -0,0 +1,2 @@ +#define ENABLE_PI 1 +#include "tst-robust9.c" diff --git a/nptl/tst-sem10.c b/nptl/tst-sem10.c new file mode 100644 index 0000000000..9f6e870a85 --- /dev/null +++ b/nptl/tst-sem10.c @@ -0,0 +1,88 @@ +/* Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2007. + + 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 +#include + + +static int +do_test (void) +{ + sem_t s; + if (sem_init (&s, 0, 0) == -1) + { + puts ("sem_init failed"); + return 1; + } + + struct timeval tv; + if (gettimeofday (&tv, NULL) != 0) + { + puts ("gettimeofday failed"); + return 1; + } + + struct timespec ts; + TIMEVAL_TO_TIMESPEC (&tv, &ts); + + /* Set ts to yesterday. */ + ts.tv_sec -= 86400; + + int type_before; + if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &type_before) != 0) + { + puts ("first pthread_setcanceltype failed"); + return 1; + } + + errno = 0; + if (TEMP_FAILURE_RETRY (sem_timedwait (&s, &ts)) != -1) + { + puts ("sem_timedwait succeeded"); + return 1; + } + if (errno != ETIMEDOUT) + { + printf ("sem_timedwait return errno = %d instead of ETIMEDOUT\n", + errno); + return 1; + } + + int type_after; + if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &type_after) != 0) + { + puts ("second pthread_setcanceltype failed"); + return 1; + } + if (type_after != PTHREAD_CANCEL_DEFERRED) + { + puts ("sem_timedwait changed cancellation type"); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/nptl/tst-tls5.h b/nptl/tst-tls5.h index 9a76ab7827..b7c14eb82c 100644 --- a/nptl/tst-tls5.h +++ b/nptl/tst-tls5.h @@ -2,7 +2,7 @@ #include #include -#if HAVE___THREAD +#if USE_TLS && HAVE___THREAD struct tls_obj { diff --git a/nptl_db/ChangeLog b/nptl_db/ChangeLog index 3a8c3c68e8..6ec5ea3be0 100644 --- a/nptl_db/ChangeLog +++ b/nptl_db/ChangeLog @@ -3,10 +3,6 @@ * nptl_db/db_info.c [TLS_DTV_AT_TP]: Fixed size init for dtvp to sizeof a pointer, instead of sizeof the union. -2006-10-27 Ulrich Drepper - - * structs.def: USE_TLS support is now default. - 2006-02-03 Roland McGrath * structs.def: Add a descriptor for pointer.val field of dtv_t. diff --git a/nptl_db/structs.def b/nptl_db/structs.def index 20fa014909..823af5cba2 100644 --- a/nptl_db/structs.def +++ b/nptl_db/structs.def @@ -68,11 +68,15 @@ DB_STRUCT_FIELD (pthread_key_data, data) DB_STRUCT (pthread_key_data_level2) DB_STRUCT_ARRAY_FIELD (pthread_key_data_level2, data) +#if USE_TLS DB_STRUCT_FIELD (link_map, l_tls_modid) +#endif +#if !defined IS_IN_libpthread || USE_TLS DB_STRUCT_ARRAY_FIELD (dtv, dtv) -#define pointer_val pointer.val /* Field of anonymous struct in dtv_t. */ +# define pointer_val pointer.val /* Field of anonymous struct in dtv_t. */ DB_STRUCT_FIELD (dtv_t, pointer_val) +#endif #if !defined IS_IN_libpthread || TLS_TCB_AT_TP DB_STRUCT_FIELD (pthread, dtvp) #endif diff --git a/nscd/Makefile b/nscd/Makefile index 21657abeb7..9c98018217 100644 --- a/nscd/Makefile +++ b/nscd/Makefile @@ -119,7 +119,9 @@ CFLAGS-initgrcache.c += $(nscd-cflags) CFLAGS-gai.c += $(nscd-cflags) ifeq (yesyes,$(have-fpie)$(build-shared)) +ifeq (yes,$(have-z-relro)) relro-LDFLAGS += -Wl,-z,now +endif $(objpfx)nscd: $(addprefix $(objpfx),$(nscd-modules:=.o)) $(LINK.o) -pie -Wl,-O1 $(nscd-cflags) \ diff --git a/nscd/cache.c b/nscd/cache.c index ef986f374a..be9be2aa4f 100644 --- a/nscd/cache.c +++ b/nscd/cache.c @@ -125,7 +125,7 @@ cache_add (int type, const void *key, size_t len, struct datahead *packet, dbg_log (_("add new entry \"%s\" of type %s for %s to cache%s"), str, serv2str[type], dbnames[table - dbs], - first ? _(" (first)") : ""); + first ? " (first)" : ""); } unsigned long int hash = __nis_hash (key, len) % table->head->module; diff --git a/nscd/gai.c b/nscd/gai.c index 2e706bdfe7..68719d876a 100644 --- a/nscd/gai.c +++ b/nscd/gai.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2004. @@ -15,6 +15,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include /* This file uses the getaddrinfo code but it compiles it without NSCD support. We just need a few symbol renames. */ #define __getservbyname_r getservbyname_r @@ -26,6 +27,8 @@ #define __sendto sendto #define __strchrnul strchrnul #define __getline getline +/* nscd uses 1MB or 2MB thread stacks. */ +#define __libc_use_alloca(size) (size <= __MAX_ALLOCA_CUTOFF) #include diff --git a/nscd/grpcache.c b/nscd/grpcache.c index 5a8fba4759..c207492cc0 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -1,5 +1,5 @@ /* Cache handling for group lookup. - Copyright (C) 1998-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1998-2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -279,6 +279,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, /* Adjust pointers into the memory block. */ gr_name = (char *) newp + (gr_name - (char *) dataset); cp = (char *) newp + (cp - (char *) dataset); + key_copy = (char *) newp + (key_copy - (char *) dataset); dataset = memcpy (newp, dataset, total + n); alloca_used = false; diff --git a/nscd/nscd-client.h b/nscd/nscd-client.h index 0fd2d9f547..8946b6315b 100644 --- a/nscd/nscd-client.h +++ b/nscd/nscd-client.h @@ -1,4 +1,4 @@ -/* Copyright (c) 1998, 1999, 2000, 2003, 2004, 2005, 2006 +/* Copyright (c) 1998, 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1998. @@ -307,10 +307,10 @@ static inline int __nscd_drop_map_ref (struct mapped_database *map, /* Search the mapped database. */ -extern const struct datahead *__nscd_cache_search (request_type type, - const char *key, - size_t keylen, - const struct mapped_database *mapped); +extern struct datahead *__nscd_cache_search (request_type type, + const char *key, + size_t keylen, + const struct mapped_database *mapped); /* Wrappers around read, readv and write that only read/write less than LEN bytes on error or EOF. */ diff --git a/nscd/nscd.c b/nscd/nscd.c index b68ae2f413..add4698406 100644 --- a/nscd/nscd.c +++ b/nscd/nscd.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1998-2006, 2007 Free Software Foundation, Inc. +/* Copyright (c) 1998-2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1998. @@ -402,7 +402,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Thorsten Kukuk and Ulrich Drepper"); } diff --git a/nscd/nscd.init b/nscd/nscd.init index a882da7d8b..a0074b99e5 100644 --- a/nscd/nscd.init +++ b/nscd/nscd.init @@ -49,8 +49,15 @@ prog=nscd start () { [ -d /var/run/nscd ] || mkdir /var/run/nscd [ -d /var/db/nscd ] || mkdir /var/db/nscd + secure="" +# for table in passwd group hosts +# do +# if egrep -q '^'$table':.*nisplus' /etc/nsswitch.conf; then +# /usr/lib/nscd_nischeck $table || secure="$secure -S $table,yes" +# fi +# done echo -n $"Starting $prog: " - daemon /usr/sbin/nscd + daemon /usr/sbin/nscd $secure RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/nscd diff --git a/nscd/nscd_getai.c b/nscd/nscd_getai.c index b59c31ea26..5df32dc6dc 100644 --- a/nscd/nscd_getai.c +++ b/nscd/nscd_getai.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2004. @@ -42,6 +42,7 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop) { size_t keylen = strlen (key) + 1; int gc_cycle; + int nretries = 0; /* If the mapping is available, try to search there instead of communicating with the nscd. */ @@ -50,49 +51,53 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop) &gc_cycle); retry:; - const ai_response_header *ai_resp = NULL; struct nscd_ai_result *resultbuf = NULL; const char *recend = (const char *) ~UINTMAX_C (0); char *respdata = NULL; int retval = -1; int sock = -1; + ai_response_header ai_resp; if (mapped != NO_MAPPING) { - const struct datahead *found = __nscd_cache_search (GETAI, key, keylen, - mapped); + struct datahead *found = __nscd_cache_search (GETAI, key, keylen, + mapped); if (found != NULL) { - ai_resp = &found->data[0].aidata; - respdata = (char *) (ai_resp + 1); + respdata = (char *) (&found->data[0].aidata + 1); + ai_resp = found->data[0].aidata; recend = (const char *) found->data + found->recsize; + /* Now check if we can trust ai_resp fields. If GC is + in progress, it can contain anything. */ + if (mapped->head->gc_cycle != gc_cycle) + { + retval = -2; + goto out; + } } } /* If we do not have the cache mapped, try to get the data over the socket. */ - ai_response_header ai_resp_mem; - if (ai_resp == NULL) + if (respdata == NULL) { - sock = __nscd_open_socket (key, keylen, GETAI, &ai_resp_mem, - sizeof (ai_resp_mem)); + sock = __nscd_open_socket (key, keylen, GETAI, &ai_resp, + sizeof (ai_resp)); if (sock == -1) { /* nscd not running or wrong version. */ __nss_not_use_nscd_hosts = 1; goto out; } - - ai_resp = &ai_resp_mem; } - if (ai_resp->found == 1) + if (ai_resp.found == 1) { - size_t datalen = ai_resp->naddrs + ai_resp->addrslen + ai_resp->canonlen; + size_t datalen = ai_resp.naddrs + ai_resp.addrslen + ai_resp.canonlen; - /* This check is really only affects the case where the data + /* This check really only affects the case where the data comes from the mapped cache. */ - if ((char *) (ai_resp + 1) + datalen > recend) + if (respdata + datalen > recend) { assert (sock == -1); goto out; @@ -108,10 +113,10 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop) } /* Set up the data structure, including pointers. */ - resultbuf->naddrs = ai_resp->naddrs; + resultbuf->naddrs = ai_resp.naddrs; resultbuf->addrs = (char *) (resultbuf + 1); - resultbuf->family = (uint8_t *) (resultbuf->addrs + ai_resp->addrslen); - if (ai_resp->canonlen != 0) + resultbuf->family = (uint8_t *) (resultbuf->addrs + ai_resp.addrslen); + if (ai_resp.canonlen != 0) resultbuf->canon = (char *) (resultbuf->family + resultbuf->naddrs); else resultbuf->canon = NULL; @@ -137,10 +142,13 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop) /* Try to detect corrupt databases. */ if (resultbuf->canon != NULL - && resultbuf->canon[ai_resp->canonlen - 1] != '\0') + && resultbuf->canon[ai_resp.canonlen - 1] != '\0') /* We cannot use the database. */ { - free (resultbuf); + if (mapped->head->gc_cycle != gc_cycle) + retval = -2; + else + free (resultbuf); goto out_close; } @@ -150,7 +158,7 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop) } else { - if (__builtin_expect (ai_resp->found == -1, 0)) + if (__builtin_expect (ai_resp.found == -1, 0)) { /* The daemon does not cache this database. */ __nss_not_use_nscd_hosts = 1; @@ -158,7 +166,7 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop) } /* Store the error number. */ - *h_errnop = ai_resp->error; + *h_errnop = ai_resp.error; /* The `errno' to some value != ERANGE. */ __set_errno (ENOENT); @@ -170,22 +178,25 @@ __nscd_getai (const char *key, struct nscd_ai_result **result, int *h_errnop) if (sock != -1) close_not_cancel_no_status (sock); out: - if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0 && retval != -1) + if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0) { /* When we come here this means there has been a GC cycle while we were looking for the data. This means the data might have been inconsistent. Retry if possible. */ - if ((gc_cycle & 1) != 0) + if ((gc_cycle & 1) != 0 || ++nretries == 5 || retval == -1) { /* nscd is just running gc now. Disable using the mapping. */ - __nscd_unmap (mapped); + if (atomic_decrement_val (&mapped->counter) == 0) + __nscd_unmap (mapped); mapped = NO_MAPPING; } - *result = NULL; - free (resultbuf); - - goto retry; + if (retval != -1) + { + *result = NULL; + free (resultbuf); + goto retry; + } } return retval; diff --git a/nscd/nscd_getgr_r.c b/nscd/nscd_getgr_r.c index 922b906c19..fc036f2888 100644 --- a/nscd/nscd_getgr_r.c +++ b/nscd/nscd_getgr_r.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1998-2000, 2002-2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1998-2000, 2002-2005, 2006, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1998. @@ -88,6 +89,7 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, struct group **result) { int gc_cycle; + int nretries = 0; const uint32_t *len = NULL; size_t lensize = 0; @@ -97,55 +99,59 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, &__gr_map_handle, &gc_cycle); retry:; - const gr_response_header *gr_resp = NULL; const char *gr_name = NULL; size_t gr_name_len = 0; int retval = -1; const char *recend = (const char *) ~UINTMAX_C (0); + gr_response_header gr_resp; if (mapped != NO_MAPPING) { - const struct datahead *found = __nscd_cache_search (type, key, keylen, - mapped); + struct datahead *found = __nscd_cache_search (type, key, keylen, mapped); if (found != NULL) { - gr_resp = &found->data[0].grdata; - len = (const uint32_t *) (gr_resp + 1); - /* The alignment is always sufficient. */ - assert (((uintptr_t) len & (__alignof__ (*len) - 1)) == 0); + len = (const uint32_t *) (&found->data[0].grdata + 1); + gr_resp = found->data[0].grdata; gr_name = ((const char *) len - + gr_resp->gr_mem_cnt * sizeof (uint32_t)); - gr_name_len = gr_resp->gr_name_len + gr_resp->gr_passwd_len; + + gr_resp.gr_mem_cnt * sizeof (uint32_t)); + gr_name_len = gr_resp.gr_name_len + gr_resp.gr_passwd_len; recend = (const char *) found->data + found->recsize; + /* Now check if we can trust gr_resp fields. If GC is + in progress, it can contain anything. */ + if (mapped->head->gc_cycle != gc_cycle) + { + retval = -2; + goto out; + } + + /* The alignment is always sufficient, unless GC is in progress. */ + assert (((uintptr_t) len & (__alignof__ (*len) - 1)) == 0); } } - gr_response_header gr_resp_mem; int sock = -1; - if (gr_resp == NULL) + if (gr_name == NULL) { - sock = __nscd_open_socket (key, keylen, type, &gr_resp_mem, - sizeof (gr_resp_mem)); + sock = __nscd_open_socket (key, keylen, type, &gr_resp, + sizeof (gr_resp)); if (sock == -1) { __nss_not_use_nscd_group = 1; goto out; } - - gr_resp = &gr_resp_mem; } /* No value found so far. */ *result = NULL; - if (__builtin_expect (gr_resp->found == -1, 0)) + if (__builtin_expect (gr_resp.found == -1, 0)) { /* The daemon does not cache this database. */ __nss_not_use_nscd_group = 1; goto out_close; } - if (gr_resp->found == 1) + if (gr_resp.found == 1) { struct iovec vec[2]; char *p = buffer; @@ -157,8 +163,8 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, align the pointer. */ align = ((__alignof__ (char *) - (p - ((char *) 0))) & (__alignof__ (char *) - 1)); - total_len = (align + (1 + gr_resp->gr_mem_cnt) * sizeof (char *) - + gr_resp->gr_name_len + gr_resp->gr_passwd_len); + total_len = (align + (1 + gr_resp.gr_mem_cnt) * sizeof (char *) + + gr_resp.gr_name_len + gr_resp.gr_passwd_len); if (__builtin_expect (buflen < total_len, 0)) { no_room: @@ -170,16 +176,16 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, p += align; resultbuf->gr_mem = (char **) p; - p += (1 + gr_resp->gr_mem_cnt) * sizeof (char *); + p += (1 + gr_resp.gr_mem_cnt) * sizeof (char *); /* Set pointers for strings. */ resultbuf->gr_name = p; - p += gr_resp->gr_name_len; + p += gr_resp.gr_name_len; resultbuf->gr_passwd = p; - p += gr_resp->gr_passwd_len; + p += gr_resp.gr_passwd_len; /* Fill in what we know now. */ - resultbuf->gr_gid = gr_resp->gr_gid; + resultbuf->gr_gid = gr_resp.gr_gid; /* Read the length information, group name, and password. */ if (gr_name == NULL) @@ -187,17 +193,17 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, /* Allocate array to store lengths. */ if (lensize == 0) { - lensize = gr_resp->gr_mem_cnt * sizeof (uint32_t); + lensize = gr_resp.gr_mem_cnt * sizeof (uint32_t); len = (uint32_t *) alloca (lensize); } - else if (gr_resp->gr_mem_cnt * sizeof (uint32_t) > lensize) + else if (gr_resp.gr_mem_cnt * sizeof (uint32_t) > lensize) len = extend_alloca (len, lensize, - gr_resp->gr_mem_cnt * sizeof (uint32_t)); + gr_resp.gr_mem_cnt * sizeof (uint32_t)); vec[0].iov_base = (void *) len; - vec[0].iov_len = gr_resp->gr_mem_cnt * sizeof (uint32_t); + vec[0].iov_len = gr_resp.gr_mem_cnt * sizeof (uint32_t); vec[1].iov_base = resultbuf->gr_name; - vec[1].iov_len = gr_resp->gr_name_len + gr_resp->gr_passwd_len; + vec[1].iov_len = gr_resp.gr_name_len + gr_resp.gr_passwd_len; total_len = vec[0].iov_len + vec[1].iov_len; /* Get this data. */ @@ -209,14 +215,14 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, /* We already have the data. Just copy the group name and password. */ memcpy (resultbuf->gr_name, gr_name, - gr_resp->gr_name_len + gr_resp->gr_passwd_len); + gr_resp.gr_name_len + gr_resp.gr_passwd_len); /* Clear the terminating entry. */ - resultbuf->gr_mem[gr_resp->gr_mem_cnt] = NULL; + resultbuf->gr_mem[gr_resp.gr_mem_cnt] = NULL; /* Prepare reading the group members. */ total_len = 0; - for (cnt = 0; cnt < gr_resp->gr_mem_cnt; ++cnt) + for (cnt = 0; cnt < gr_resp.gr_mem_cnt; ++cnt) { resultbuf->gr_mem[cnt] = p; total_len += len[cnt]; @@ -224,9 +230,25 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, } if (__builtin_expect (gr_name + gr_name_len + total_len > recend, 0)) - goto out_close; + { + /* len array might contain garbage during nscd GC cycle, + retry rather than fail in that case. */ + if (gr_name != NULL && mapped->head->gc_cycle != gc_cycle) + retval = -2; + goto out_close; + } if (__builtin_expect (total_len > buflen, 0)) - goto no_room; + { + /* len array might contain garbage during nscd GC cycle, + retry rather than fail in that case. */ + if (gr_name != NULL && mapped->head->gc_cycle != gc_cycle) + { + retval = -2; + goto out_close; + } + else + goto no_room; + } retval = 0; if (gr_name == NULL) @@ -248,14 +270,14 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, /* Try to detect corrupt databases. */ if (resultbuf->gr_name[gr_name_len - 1] != '\0' - || resultbuf->gr_passwd[gr_resp->gr_passwd_len - 1] != '\0' - || ({for (cnt = 0; cnt < gr_resp->gr_mem_cnt; ++cnt) + || resultbuf->gr_passwd[gr_resp.gr_passwd_len - 1] != '\0' + || ({for (cnt = 0; cnt < gr_resp.gr_mem_cnt; ++cnt) if (resultbuf->gr_mem[cnt][len[cnt] - 1] != '\0') break; - cnt < gr_resp->gr_mem_cnt; })) + cnt < gr_resp.gr_mem_cnt; })) { /* We cannot use the database. */ - retval = -1; + retval = mapped->head->gc_cycle != gc_cycle ? -2 : -1; goto out_close; } @@ -274,19 +296,21 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type, if (sock != -1) close_not_cancel_no_status (sock); out: - if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0 && retval != -1) + if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0) { /* When we come here this means there has been a GC cycle while we were looking for the data. This means the data might have been inconsistent. Retry if possible. */ - if ((gc_cycle & 1) != 0) + if ((gc_cycle & 1) != 0 || ++nretries == 5 || retval == -1) { /* nscd is just running gc now. Disable using the mapping. */ - __nscd_unmap (mapped); + if (atomic_decrement_val (&mapped->counter) == 0) + __nscd_unmap (mapped); mapped = NO_MAPPING; } - goto retry; + if (retval != -1) + goto retry; } return retval; diff --git a/nscd/nscd_gethst_r.c b/nscd/nscd_gethst_r.c index 516977bcc4..90e1815bdd 100644 --- a/nscd/nscd_gethst_r.c +++ b/nscd/nscd_gethst_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1998-2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -118,7 +118,6 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, &gc_cycle); retry:; - const hst_response_header *hst_resp = NULL; const char *h_name = NULL; const uint32_t *aliases_len = NULL; const char *addr_list = NULL; @@ -126,18 +125,27 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, int retval = -1; const char *recend = (const char *) ~UINTMAX_C (0); int sock = -1; + hst_response_header hst_resp; if (mapped != NO_MAPPING) { - const struct datahead *found = __nscd_cache_search (type, key, keylen, - mapped); + /* No const qualifier, as it can change during garbage collection. */ + struct datahead *found = __nscd_cache_search (type, key, keylen, mapped); if (found != NULL) { - hst_resp = &found->data[0].hstdata; - h_name = (char *) (hst_resp + 1); - aliases_len = (uint32_t *) (h_name + hst_resp->h_name_len); + h_name = (char *) (&found->data[0].hstdata + 1); + hst_resp = found->data[0].hstdata; + aliases_len = (uint32_t *) (h_name + hst_resp.h_name_len); addr_list = ((char *) aliases_len - + hst_resp->h_aliases_cnt * sizeof (uint32_t)); - addr_list_len = hst_resp->h_addr_list_cnt * INADDRSZ; + + hst_resp.h_aliases_cnt * sizeof (uint32_t)); + addr_list_len = hst_resp.h_addr_list_cnt * INADDRSZ; + recend = (const char *) found->data + found->recsize; + /* Now check if we can trust hst_resp fields. If GC is + in progress, it can contain anything. */ + if (mapped->head->gc_cycle != gc_cycle) + { + retval = -2; + goto out; + } #ifndef _STRING_ARCH_unaligned /* The aliases_len array in the mapped database might very @@ -147,51 +155,47 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, if (((uintptr_t) aliases_len & (__alignof__ (*aliases_len) - 1)) != 0) { - uint32_t *tmp = alloca (hst_resp->h_aliases_cnt + uint32_t *tmp = alloca (hst_resp.h_aliases_cnt * sizeof (uint32_t)); aliases_len = memcpy (tmp, aliases_len, - hst_resp->h_aliases_cnt + hst_resp.h_aliases_cnt * sizeof (uint32_t)); } #endif if (type != GETHOSTBYADDR && type != GETHOSTBYNAME) { - if (hst_resp->h_length == INADDRSZ) + if (hst_resp.h_length == INADDRSZ) addr_list += addr_list_len; - addr_list_len = hst_resp->h_addr_list_cnt * IN6ADDRSZ; + addr_list_len = hst_resp.h_addr_list_cnt * IN6ADDRSZ; } - recend = (const char *) found->data + found->recsize; if (__builtin_expect ((const char *) addr_list + addr_list_len > recend, 0)) - goto out_close; + goto out; } } - hst_response_header hst_resp_mem; - if (hst_resp == NULL) + if (h_name == NULL) { - sock = __nscd_open_socket (key, keylen, type, &hst_resp_mem, - sizeof (hst_resp_mem)); + sock = __nscd_open_socket (key, keylen, type, &hst_resp, + sizeof (hst_resp)); if (sock == -1) { __nss_not_use_nscd_hosts = 1; - goto out;; + goto out; } - - hst_resp = &hst_resp_mem; } /* No value found so far. */ *result = NULL; - if (__builtin_expect (hst_resp->found == -1, 0)) + if (__builtin_expect (hst_resp.found == -1, 0)) { /* The daemon does not cache this database. */ __nss_not_use_nscd_hosts = 1; goto out_close; } - if (hst_resp->found == 1) + if (hst_resp.found == 1) { struct iovec vec[4]; char *cp = buffer; @@ -207,15 +211,15 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, align the pointer and the base of the h_addr_list pointers. */ align1 = ((__alignof__ (char *) - (cp - ((char *) 0))) & (__alignof__ (char *) - 1)); - align2 = ((__alignof__ (char *) - ((cp + align1 + hst_resp->h_name_len) + align2 = ((__alignof__ (char *) - ((cp + align1 + hst_resp.h_name_len) - ((char *) 0))) & (__alignof__ (char *) - 1)); - if (buflen < (align1 + hst_resp->h_name_len + align2 - + ((hst_resp->h_aliases_cnt + hst_resp->h_addr_list_cnt + if (buflen < (align1 + hst_resp.h_name_len + align2 + + ((hst_resp.h_aliases_cnt + hst_resp.h_addr_list_cnt + 2) * sizeof (char *)) - + hst_resp->h_addr_list_cnt * (type == AF_INET - ? INADDRSZ : IN6ADDRSZ))) + + hst_resp.h_addr_list_cnt * (type == AF_INET + ? INADDRSZ : IN6ADDRSZ))) { no_room: *h_errnop = NETDB_INTERNAL; @@ -227,12 +231,12 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, /* Prepare the result as far as we can. */ resultbuf->h_aliases = (char **) cp; - cp += (hst_resp->h_aliases_cnt + 1) * sizeof (char *); + cp += (hst_resp.h_aliases_cnt + 1) * sizeof (char *); resultbuf->h_addr_list = (char **) cp; - cp += (hst_resp->h_addr_list_cnt + 1) * sizeof (char *); + cp += (hst_resp.h_addr_list_cnt + 1) * sizeof (char *); resultbuf->h_name = cp; - cp += hst_resp->h_name_len + align2; + cp += hst_resp.h_name_len + align2; if (type == GETHOSTBYADDR || type == GETHOSTBYNAME) { @@ -244,7 +248,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, resultbuf->h_addrtype = AF_INET6; resultbuf->h_length = IN6ADDRSZ; } - for (cnt = 0; cnt < hst_resp->h_addr_list_cnt; ++cnt) + for (cnt = 0; cnt < hst_resp.h_addr_list_cnt; ++cnt) { resultbuf->h_addr_list[cnt] = cp; cp += resultbuf->h_length; @@ -254,47 +258,47 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, if (h_name == NULL) { vec[0].iov_base = resultbuf->h_name; - vec[0].iov_len = hst_resp->h_name_len; - total_len = hst_resp->h_name_len; + vec[0].iov_len = hst_resp.h_name_len; + total_len = hst_resp.h_name_len; n = 1; - if (hst_resp->h_aliases_cnt > 0) + if (hst_resp.h_aliases_cnt > 0) { - aliases_len = alloca (hst_resp->h_aliases_cnt + aliases_len = alloca (hst_resp.h_aliases_cnt * sizeof (uint32_t)); vec[n].iov_base = (void *) aliases_len; - vec[n].iov_len = hst_resp->h_aliases_cnt * sizeof (uint32_t); + vec[n].iov_len = hst_resp.h_aliases_cnt * sizeof (uint32_t); - total_len += hst_resp->h_aliases_cnt * sizeof (uint32_t); + total_len += hst_resp.h_aliases_cnt * sizeof (uint32_t); ++n; } if (type == GETHOSTBYADDR || type == GETHOSTBYNAME) { vec[n].iov_base = resultbuf->h_addr_list[0]; - vec[n].iov_len = hst_resp->h_addr_list_cnt * INADDRSZ; + vec[n].iov_len = hst_resp.h_addr_list_cnt * INADDRSZ; - total_len += hst_resp->h_addr_list_cnt * INADDRSZ; + total_len += hst_resp.h_addr_list_cnt * INADDRSZ; ++n; } else { - if (hst_resp->h_length == INADDRSZ) + if (hst_resp.h_length == INADDRSZ) { - ignore = alloca (hst_resp->h_addr_list_cnt * INADDRSZ); + ignore = alloca (hst_resp.h_addr_list_cnt * INADDRSZ); vec[n].iov_base = ignore; - vec[n].iov_len = hst_resp->h_addr_list_cnt * INADDRSZ; + vec[n].iov_len = hst_resp.h_addr_list_cnt * INADDRSZ; - total_len += hst_resp->h_addr_list_cnt * INADDRSZ; + total_len += hst_resp.h_addr_list_cnt * INADDRSZ; ++n; } vec[n].iov_base = resultbuf->h_addr_list[0]; - vec[n].iov_len = hst_resp->h_addr_list_cnt * IN6ADDRSZ; + vec[n].iov_len = hst_resp.h_addr_list_cnt * IN6ADDRSZ; - total_len += hst_resp->h_addr_list_cnt * IN6ADDRSZ; + total_len += hst_resp.h_addr_list_cnt * IN6ADDRSZ; ++n; } @@ -304,13 +308,13 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, } else { - memcpy (resultbuf->h_name, h_name, hst_resp->h_name_len); + memcpy (resultbuf->h_name, h_name, hst_resp.h_name_len); memcpy (resultbuf->h_addr_list[0], addr_list, addr_list_len); } /* Now we also can read the aliases. */ total_len = 0; - for (cnt = 0; cnt < hst_resp->h_aliases_cnt; ++cnt) + for (cnt = 0; cnt < hst_resp.h_aliases_cnt; ++cnt) { resultbuf->h_aliases[cnt] = cp; cp += aliases_len[cnt]; @@ -320,10 +324,25 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, if (__builtin_expect ((const char *) addr_list + addr_list_len + total_len > recend, 0)) - goto out_close; + { + /* aliases_len array might contain garbage during nscd GC cycle, + retry rather than fail in that case. */ + if (addr_list != NULL && mapped->head->gc_cycle != gc_cycle) + retval = -2; + goto out_close; + } /* See whether this would exceed the buffer capacity. */ if (__builtin_expect (cp > buffer + buflen, 0)) - goto no_room; + { + /* aliases_len array might contain garbage during nscd GC cycle, + retry rather than fail in that case. */ + if (addr_list != NULL && mapped->head->gc_cycle != gc_cycle) + { + retval = -2; + goto out_close; + } + goto no_room; + } /* And finally read the aliases. */ if (addr_list == NULL) @@ -342,14 +361,18 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, (const char *) addr_list + addr_list_len, total_len); /* Try to detect corrupt databases. */ - if (resultbuf->h_name[hst_resp->h_name_len - 1] != '\0' - || ({for (cnt = 0; cnt < hst_resp->h_aliases_cnt; ++cnt) + if (resultbuf->h_name[hst_resp.h_name_len - 1] != '\0' + || ({for (cnt = 0; cnt < hst_resp.h_aliases_cnt; ++cnt) if (resultbuf->h_aliases[cnt][aliases_len[cnt] - 1] != '\0') break; - cnt < hst_resp->h_aliases_cnt; })) - /* We cannot use the database. */ - goto out_close; + cnt < hst_resp.h_aliases_cnt; })) + { + /* We cannot use the database. */ + if (mapped->head->gc_cycle != gc_cycle) + retval = -2; + goto out_close; + } retval = 0; *result = resultbuf; @@ -358,7 +381,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, else { /* Store the error number. */ - *h_errnop = hst_resp->error; + *h_errnop = hst_resp.error; /* The `errno' to some value != ERANGE. */ __set_errno (ENOENT); @@ -370,19 +393,21 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type, if (sock != -1) close_not_cancel_no_status (sock); out: - if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0 && retval != -1) + if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0) { /* When we come here this means there has been a GC cycle while we were looking for the data. This means the data might have been inconsistent. Retry if possible. */ - if ((gc_cycle & 1) != 0 || ++nretries == 5) + if ((gc_cycle & 1) != 0 || ++nretries == 5 || retval == -1) { /* nscd is just running gc now. Disable using the mapping. */ - __nscd_unmap (mapped); + if (atomic_decrement_val (&mapped->counter) == 0) + __nscd_unmap (mapped); mapped = NO_MAPPING; } - goto retry; + if (retval != -1) + goto retry; } return retval; diff --git a/nscd/nscd_getpw_r.c b/nscd/nscd_getpw_r.c index e8e4d7364f..b84baa1a66 100644 --- a/nscd/nscd_getpw_r.c +++ b/nscd/nscd_getpw_r.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1998, 1999, 2003, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2003, 2004, 2005, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1998. @@ -88,76 +89,81 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type, struct passwd **result) { int gc_cycle; + int nretries = 0; + /* If the mapping is available, try to search there instead of communicating with the nscd. */ struct mapped_database *mapped; mapped = __nscd_get_map_ref (GETFDPW, "passwd", &map_handle, &gc_cycle); retry:; - const pw_response_header *pw_resp = NULL; const char *pw_name = NULL; int retval = -1; const char *recend = (const char *) ~UINTMAX_C (0); + pw_response_header pw_resp; if (mapped != NO_MAPPING) { - const struct datahead *found = __nscd_cache_search (type, key, keylen, - mapped); + struct datahead *found = __nscd_cache_search (type, key, keylen, mapped); if (found != NULL) { - pw_resp = &found->data[0].pwdata; - pw_name = (const char *) (pw_resp + 1); + pw_name = (const char *) (&found->data[0].pwdata + 1); + pw_resp = found->data[0].pwdata; recend = (const char *) found->data + found->recsize; + /* Now check if we can trust pw_resp fields. If GC is + in progress, it can contain anything. */ + if (mapped->head->gc_cycle != gc_cycle) + { + retval = -2; + goto out; + } } } - pw_response_header pw_resp_mem; int sock = -1; - if (pw_resp == NULL) + if (pw_name == NULL) { - sock = __nscd_open_socket (key, keylen, type, &pw_resp_mem, - sizeof (pw_resp_mem)); + sock = __nscd_open_socket (key, keylen, type, &pw_resp, + sizeof (pw_resp)); if (sock == -1) { __nss_not_use_nscd_passwd = 1; goto out; } - - pw_resp = &pw_resp_mem; } /* No value found so far. */ *result = NULL; - if (__builtin_expect (pw_resp->found == -1, 0)) + if (__builtin_expect (pw_resp.found == -1, 0)) { /* The daemon does not cache this database. */ __nss_not_use_nscd_passwd = 1; goto out_close; } - if (pw_resp->found == 1) + if (pw_resp.found == 1) { /* Set the information we already have. */ - resultbuf->pw_uid = pw_resp->pw_uid; - resultbuf->pw_gid = pw_resp->pw_gid; + resultbuf->pw_uid = pw_resp.pw_uid; + resultbuf->pw_gid = pw_resp.pw_gid; char *p = buffer; /* get pw_name */ resultbuf->pw_name = p; - p += pw_resp->pw_name_len; + p += pw_resp.pw_name_len; /* get pw_passwd */ resultbuf->pw_passwd = p; - p += pw_resp->pw_passwd_len; + p += pw_resp.pw_passwd_len; /* get pw_gecos */ resultbuf->pw_gecos = p; - p += pw_resp->pw_gecos_len; + p += pw_resp.pw_gecos_len; /* get pw_dir */ resultbuf->pw_dir = p; - p += pw_resp->pw_dir_len; + p += pw_resp.pw_dir_len; /* get pw_pshell */ resultbuf->pw_shell = p; - p += pw_resp->pw_shell_len; + p += pw_resp.pw_shell_len; ssize_t total = p - buffer; if (__builtin_expect (pw_name + total > recend, 0)) @@ -189,14 +195,14 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type, memcpy (resultbuf->pw_name, pw_name, total); /* Try to detect corrupt databases. */ - if (resultbuf->pw_name[pw_resp->pw_name_len - 1] != '\0' - || resultbuf->pw_passwd[pw_resp->pw_passwd_len - 1] != '\0' - || resultbuf->pw_gecos[pw_resp->pw_gecos_len - 1] != '\0' - || resultbuf->pw_dir[pw_resp->pw_dir_len - 1] != '\0' - || resultbuf->pw_shell[pw_resp->pw_shell_len - 1] != '\0') + if (resultbuf->pw_name[pw_resp.pw_name_len - 1] != '\0' + || resultbuf->pw_passwd[pw_resp.pw_passwd_len - 1] != '\0' + || resultbuf->pw_gecos[pw_resp.pw_gecos_len - 1] != '\0' + || resultbuf->pw_dir[pw_resp.pw_dir_len - 1] != '\0' + || resultbuf->pw_shell[pw_resp.pw_shell_len - 1] != '\0') { /* We cannot use the database. */ - retval = -1; + retval = mapped->head->gc_cycle != gc_cycle ? -2 : -1; goto out_close; } @@ -215,19 +221,21 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type, if (sock != -1) close_not_cancel_no_status (sock); out: - if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0 && retval != -1) + if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0) { /* When we come here this means there has been a GC cycle while we were looking for the data. This means the data might have been inconsistent. Retry if possible. */ - if ((gc_cycle & 1) != 0) + if ((gc_cycle & 1) != 0 || ++nretries == 5 || retval == -1) { /* nscd is just running gc now. Disable using the mapping. */ - __nscd_unmap (mapped); + if (atomic_decrement_val (&mapped->counter) == 0) + __nscd_unmap (mapped); mapped = NO_MAPPING; } - goto retry; + if (retval != -1) + goto retry; } return retval; diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c index 7c45981586..71ea53e19d 100644 --- a/nscd/nscd_helper.c +++ b/nscd/nscd_helper.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1998-2002,2003,2004,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1998-2002,2003,2004,2005,2006,2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -21,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -186,6 +188,7 @@ get_mapping (request_type type, const char *key, request_header req; char key[keylen]; } reqdata; + size_t real_sizeof_reqdata = sizeof (request_header) + keylen; int sock = open_socket (); if (sock < 0) @@ -200,9 +203,9 @@ get_mapping (request_type type, const char *key, # define MSG_NOSIGNAL 0 # endif if (__builtin_expect (TEMP_FAILURE_RETRY (__send (sock, &reqdata, - sizeof (reqdata), + real_sizeof_reqdata, MSG_NOSIGNAL)) - != sizeof (reqdata), 0)) + != real_sizeof_reqdata, 0)) /* We cannot even write the request. */ goto out_close2; @@ -240,11 +243,12 @@ get_mapping (request_type type, const char *key, != keylen, 0)) goto out_close2; - mapfd = *(int *) CMSG_DATA (cmsg); + if (__builtin_expect (CMSG_FIRSTHDR (&msg) == NULL + || (CMSG_FIRSTHDR (&msg)->cmsg_len + != CMSG_LEN (sizeof (int))), 0)) + goto out_close2; - if (__builtin_expect (CMSG_FIRSTHDR (&msg)->cmsg_len - != CMSG_LEN (sizeof (int)), 0)) - goto out_close; + mapfd = *(int *) CMSG_DATA (cmsg); struct stat64 st; if (__builtin_expect (strcmp (resdata, key) != 0, 0) @@ -362,7 +366,10 @@ __nscd_get_map_ref (request_type type, const char *name, } -const struct datahead * +/* Don't return const struct datahead *, as eventhough the record + is normally constant, it can change arbitrarily during nscd + garbage collection. */ +struct datahead * __nscd_cache_search (request_type type, const char *key, size_t keylen, const struct mapped_database *mapped) { @@ -374,16 +381,32 @@ __nscd_cache_search (request_type type, const char *key, size_t keylen, { struct hashentry *here = (struct hashentry *) (mapped->data + work); +#ifndef _STRING_ARCH_unaligned + /* Although during garbage collection when moving struct hashentry + records around we first copy from old to new location and then + adjust pointer from previous hashentry to it, there is no barrier + between those memory writes. It is very unlikely to hit it, + so check alignment only if a misaligned load can crash the + application. */ + if ((uintptr_t) here & (__alignof__ (*here) - 1)) + return NULL; +#endif + if (type == here->type && keylen == here->len - && here->key + here->len <= datasize + && here->key + keylen <= datasize && memcmp (key, mapped->data + here->key, keylen) == 0 && here->packet + sizeof (struct datahead) <= datasize) { /* We found the entry. Increment the appropriate counter. */ - const struct datahead *dh + struct datahead *dh = (struct datahead *) (mapped->data + here->packet); +#ifndef _STRING_ARCH_unaligned + if ((uintptr_t) dh & (__alignof__ (*dh) - 1)) + return NULL; +#endif + /* See whether we must ignore the entry or whether something is wrong because garbage collection is in progress. */ if (dh->usable && here->packet + dh->allocsize <= datasize) diff --git a/nscd/nscd_initgroups.c b/nscd/nscd_initgroups.c index 97a037d4a9..866455a96c 100644 --- a/nscd/nscd_initgroups.c +++ b/nscd/nscd_initgroups.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2004. @@ -39,6 +39,7 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size, { size_t userlen = strlen (user) + 1; int gc_cycle; + int nretries = 0; /* If the mapping is available, try to search there instead of communicating with the nscd. */ @@ -46,44 +47,49 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size, mapped = __nscd_get_map_ref (GETFDGR, "group", &__gr_map_handle, &gc_cycle); retry:; - const initgr_response_header *initgr_resp = NULL; char *respdata = NULL; int retval = -1; int sock = -1; + initgr_response_header initgr_resp; if (mapped != NO_MAPPING) { - const struct datahead *found = __nscd_cache_search (INITGROUPS, user, - userlen, mapped); + struct datahead *found = __nscd_cache_search (INITGROUPS, user, + userlen, mapped); if (found != NULL) { - initgr_resp = &found->data[0].initgrdata; - respdata = (char *) (initgr_resp + 1); + respdata = (char *) (&found->data[0].initgrdata + 1); + initgr_resp = found->data[0].initgrdata; char *recend = (char *) found->data + found->recsize; - if (respdata + initgr_resp->ngrps * sizeof (int32_t) > recend) + /* Now check if we can trust initgr_resp fields. If GC is + in progress, it can contain anything. */ + if (mapped->head->gc_cycle != gc_cycle) + { + retval = -2; + goto out; + } + + if (respdata + initgr_resp.ngrps * sizeof (int32_t) > recend) goto out; } } /* If we do not have the cache mapped, try to get the data over the socket. */ - initgr_response_header initgr_resp_mem; - if (initgr_resp == NULL) + if (respdata == NULL) { - sock = __nscd_open_socket (user, userlen, INITGROUPS, &initgr_resp_mem, - sizeof (initgr_resp_mem)); + sock = __nscd_open_socket (user, userlen, INITGROUPS, &initgr_resp, + sizeof (initgr_resp)); if (sock == -1) { /* nscd not running or wrong version. */ __nss_not_use_nscd_group = 1; goto out; } - - initgr_resp = &initgr_resp_mem; } - if (initgr_resp->found == 1) + if (initgr_resp.found == 1) { /* The following code assumes that gid_t and int32_t are the same size. This is the case for al existing implementation. @@ -91,40 +97,40 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size, doesn't use memcpy but instead copies each array element one by one. */ assert (sizeof (int32_t) == sizeof (gid_t)); - assert (initgr_resp->ngrps >= 0); + assert (initgr_resp.ngrps >= 0); /* Make sure we have enough room. We always count GROUP in even though we might not end up adding it. */ - if (*size < initgr_resp->ngrps + 1) + if (*size < initgr_resp.ngrps + 1) { gid_t *newp = realloc (*groupsp, - (initgr_resp->ngrps + 1) * sizeof (gid_t)); + (initgr_resp.ngrps + 1) * sizeof (gid_t)); if (newp == NULL) /* We cannot increase the buffer size. */ goto out_close; *groupsp = newp; - *size = initgr_resp->ngrps + 1; + *size = initgr_resp.ngrps + 1; } if (respdata == NULL) { /* Read the data from the socket. */ - if ((size_t) __readall (sock, *groupsp, initgr_resp->ngrps + if ((size_t) __readall (sock, *groupsp, initgr_resp.ngrps * sizeof (gid_t)) - == initgr_resp->ngrps * sizeof (gid_t)) - retval = initgr_resp->ngrps; + == initgr_resp.ngrps * sizeof (gid_t)) + retval = initgr_resp.ngrps; } else { /* Just copy the data. */ - retval = initgr_resp->ngrps; + retval = initgr_resp.ngrps; memcpy (*groupsp, respdata, retval * sizeof (gid_t)); } } else { - if (__builtin_expect (initgr_resp->found == -1, 0)) + if (__builtin_expect (initgr_resp.found == -1, 0)) { /* The daemon does not cache this database. */ __nss_not_use_nscd_group = 1; @@ -153,19 +159,21 @@ __nscd_getgrouplist (const char *user, gid_t group, long int *size, if (sock != -1) close_not_cancel_no_status (sock); out: - if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0 && retval != -1) + if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0) { /* When we come here this means there has been a GC cycle while we were looking for the data. This means the data might have been inconsistent. Retry if possible. */ - if ((gc_cycle & 1) != 0) + if ((gc_cycle & 1) != 0 || ++nretries == 5 || retval == -1) { /* nscd is just running gc now. Disable using the mapping. */ - __nscd_unmap (mapped); + if (atomic_decrement_val (&mapped->counter) == 0) + __nscd_unmap (mapped); mapped = NO_MAPPING; } - goto retry; + if (retval != -1) + goto retry; } return retval; diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c index 01c223add5..ae579df510 100644 --- a/nscd/pwdcache.c +++ b/nscd/pwdcache.c @@ -1,5 +1,5 @@ /* Cache handling for passwd lookup. - Copyright (C) 1998-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1998-2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -274,6 +274,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, { /* Adjust pointer into the memory block. */ cp = (char *) newp + (cp - (char *) dataset); + key_copy = (char *) newp + (key_copy - (char *) dataset); dataset = memcpy (newp, dataset, total + n); alloca_used = false; diff --git a/nscd/selinux.c b/nscd/selinux.c index f0620d1012..b826031150 100644 --- a/nscd/selinux.c +++ b/nscd/selinux.c @@ -1,5 +1,5 @@ /* SELinux access controls for nscd. - Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Matthew Rickard , 2004. @@ -182,18 +182,22 @@ preserve_capabilities (void) if (tmp_caps == NULL || new_caps == NULL) { if (tmp_caps != NULL) - free_caps (tmp_caps); + cap_free (tmp_caps); dbg_log (_("Failed to initialize drop of capabilities")); error (EXIT_FAILURE, 0, _("cap_init failed")); } /* There is no reason why these should not work. */ - cap_set_flag (new_caps, CAP_PERMITTED, nnew_cap_list, new_cap_list, CAP_SET); - cap_set_flag (new_caps, CAP_EFFECTIVE, nnew_cap_list, new_cap_list, CAP_SET); + cap_set_flag (new_caps, CAP_PERMITTED, nnew_cap_list, + (cap_value_t *) new_cap_list, CAP_SET); + cap_set_flag (new_caps, CAP_EFFECTIVE, nnew_cap_list, + (cap_value_t *) new_cap_list, CAP_SET); - cap_set_flag (tmp_caps, CAP_PERMITTED, ntmp_cap_list, tmp_cap_list, CAP_SET); - cap_set_flag (tmp_caps, CAP_EFFECTIVE, ntmp_cap_list, tmp_cap_list, CAP_SET); + cap_set_flag (tmp_caps, CAP_PERMITTED, ntmp_cap_list, + (cap_value_t *) tmp_cap_list, CAP_SET); + cap_set_flag (tmp_caps, CAP_EFFECTIVE, ntmp_cap_list, + (cap_value_t *) tmp_cap_list, CAP_SET); int res = cap_set_proc (tmp_caps); @@ -202,7 +206,7 @@ preserve_capabilities (void) if (__builtin_expect (res != 0, 0)) { cap_free (new_caps); - dbg_log (_("Failed to drop capabilities")); + dbg_log (_("Failed to drop capabilities\n")); error (EXIT_FAILURE, 0, _("cap_set_proc failed")); } diff --git a/nscd/selinux.h b/nscd/selinux.h index 9ce0628486..27afcd6e86 100644 --- a/nscd/selinux.h +++ b/nscd/selinux.h @@ -1,5 +1,5 @@ /* Header for nscd SELinux access controls. - Copyright (C) 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Matthew Rickard , 2004. @@ -23,7 +23,7 @@ #include "nscd.h" #ifdef HAVE_LIBCAP -# include +# include #endif #ifdef HAVE_SELINUX diff --git a/nss/getent.c b/nss/getent.c index 8b9a9030ff..14ec3c4755 100644 --- a/nss/getent.c +++ b/nss/getent.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1998-2006, 2007 Free Software Foundation, Inc. +/* Copyright (c) 1998-2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk , 1998. @@ -84,7 +84,7 @@ print_version (FILE *stream, struct argp_state *state) 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\ -"), "2007"); +"), "2006"); fprintf (stream, gettext ("Written by %s.\n"), "Thorsten Kukuk"); } diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c index 6daafdeeed..b1ba3aa76d 100644 --- a/nss/nss_files/files-hosts.c +++ b/nss/nss_files/files-hosts.c @@ -1,5 +1,6 @@ /* Hosts file parser in nss_files module. - Copyright (C) 1996-2001, 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2001, 2003, 2004, 2007 + 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,30 +56,14 @@ LINE_PARSER STRING_FIELD (addr, isspace, 1); /* Parse address. */ - if (inet_pton (af, addr, entdata->host_addr) <= 0) - { - if (af == AF_INET6 && (flags & AI_V4MAPPED) != 0 - && inet_pton (AF_INET, addr, entdata->host_addr) > 0) - map_v4v6_address ((char *) entdata->host_addr, - (char *) entdata->host_addr); - else if (af == AF_INET - && inet_pton (AF_INET6, addr, entdata->host_addr) > 0) - { - if (IN6_IS_ADDR_V4MAPPED (entdata->host_addr)) - memcpy (entdata->host_addr, entdata->host_addr + 12, INADDRSZ); - else if (IN6_IS_ADDR_LOOPBACK (entdata->host_addr)) - { - in_addr_t localhost = htonl (INADDR_LOOPBACK); - memcpy (entdata->host_addr, &localhost, sizeof (localhost)); - } - else - /* Illegal address: ignore line. */ - return 0; - } - else - /* Illegal address: ignore line. */ - return 0; - } + if (inet_pton (af, addr, entdata->host_addr) <= 0 + && (af != AF_INET6 || (flags & AI_V4MAPPED) == 0 + || inet_pton (AF_INET, addr, entdata->host_addr) <= 0 + || (map_v4v6_address ((char *) entdata->host_addr, + (char *) entdata->host_addr), + 0))) + /* Illegal address: ignore line. */ + return 0; /* We always return entries of the requested form. */ result->h_addrtype = af; @@ -102,6 +87,10 @@ _nss_files_get##name##_r (proto, \ { \ enum nss_status status; \ \ + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data); \ + buffer += pad; \ + buflen = buflen > pad ? buflen - pad : 0; \ + \ __libc_lock_lock (lock); \ \ /* Reset file pointer to beginning or open file. */ \ @@ -122,7 +111,8 @@ _nss_files_get##name##_r (proto, \ { \ /* We have to get all host entries from the file. */ \ const size_t tmp_buflen = MIN (buflen, 4096); \ - char tmp_buffer[tmp_buflen]; \ + char tmp_buffer[tmp_buflen] \ + __attribute__ ((__aligned__ (__alignof__ (struct hostent_data))));\ struct hostent tmp_result_buf; \ int naddrs = 1; \ int naliases = 0; \ diff --git a/po/sv.po b/po/ru.po similarity index 67% copy from po/sv.po copy to po/ru.po index 6aeb308fe5..e1d94a77ca 100644 --- a/po/sv.po +++ b/po/ru.po @@ -1,136 +1,133 @@ -# GNU libc message catalog for swedish -# Copyright © 1996, 1998, 2001, 2002, 2003, 2006 Free Software Foundation, Inc. -# Jan Djärv , 1996, 1998, 2001, 2002, 2003, 2006. -# Revision: 1.52 +# ÐÅÒÅ×ÏÄ ÓÏÏÂÝÅÎÉÊ GNU libc +# Copyright (C) 2005 Free Software Foundation, Inc. +# Oleg Tihonov , 2005, 2007. # msgid "" msgstr "" "Project-Id-Version: libc 2.5\n" "POT-Creation-Date: 2006-09-29 11:38-0700\n" -"PO-Revision-Date: 2006-11-09 13:51+0100\n" -"Last-Translator: Jan Djärv \n" -"Language-Team: Swedish \n" +"PO-Revision-Date: 2007-02-13 13:52+0300\n" +"Last-Translator: Oleg Tihonov \n" +"Language-Team: Russian \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" #: argp/argp-help.c:227 #, c-format msgid "%.*s: ARGP_HELP_FMT parameter requires a value" -msgstr "%.*s: parameter till ARGP_HELP_FMT kräver ett värde" +msgstr "%.*s: ÐÁÒÁÍÅÔÒ ARGP_HELP_FMT ÔÒÅÂÕÅÔ ÚÎÁÞÅÎÉÅ" #: argp/argp-help.c:237 #, c-format msgid "%.*s: Unknown ARGP_HELP_FMT parameter" -msgstr "%.*s: Parameter till ARGP_HELP_FMT okänd" +msgstr "%.*s: ÎÅÉÚ×ÅÓÔÎÙÊ ÐÁÒÁÍÅÔÒ ARGP_HELP_FMT" #: argp/argp-help.c:250 #, c-format msgid "Garbage in ARGP_HELP_FMT: %s" -msgstr "Skräp i ARGP_HELP_FMT: %s" +msgstr "íÕÓÏÒ × ARGP_HELP_FMT: %s" #: argp/argp-help.c:1214 msgid "Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options." -msgstr "Obligatoriska respektive valfria argument för långa flaggor är obligatoriska repektive valfria även för korta." +msgstr "ïÂÑÚÁÔÅÌØÎÙÅ ÉÌÉ ÎÅÏÂÑÚÁÔÅÌØÎÙÅ ÁÒÇÕÍÅÎÔÙ ÄÌÑ ÄÌÉÎÎÙÈ ËÌÀÞÅÊ ÔÁËÖÅ Ñ×ÌÑÀÔÓÑ ÏÂÑÚÁÔÅÌØÎÙÍÉ ÉÌÉ ÎÅÏÂÑÚÁÔÅÌØÎÙÍÉ ÄÌÑ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ËÏÒÏÔËÉÈ ËÌÀÞÅÊ." #: argp/argp-help.c:1600 msgid "Usage:" -msgstr "Användning:" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ:" #: argp/argp-help.c:1604 msgid " or: " -msgstr " eller: " +msgstr " ÉÌÉ: " #: argp/argp-help.c:1616 msgid " [OPTION...]" -msgstr " [FLAGGA...]" +msgstr " [ëìàþ...]" #: argp/argp-help.c:1643 #, c-format msgid "Try `%s --help' or `%s --usage' for more information.\n" -msgstr "Försök med \"%s --help\" eller \"%s --usage\" för mer information\n" +msgstr "ðÏÐÒÏÂÕÊÔÅ `%s --help' ÉÌÉ `%s --usage' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÇÏ ÏÐÉÓÁÎÉÑ.\n" #: argp/argp-help.c:1671 #, c-format msgid "Report bugs to %s.\n" -msgstr "" -"Rapportera fel till %s.\n" -"Rapportera fel eller synpunkter på översättningen till .\n" +msgstr "óÏÏÂÝÅÎÉÑ Ï ÏÛÉÂËÁÈ ÏÔÐÒÁ×ÌÑÊÔÅ ÐÏ ÁÄÒÅÓÕ %s.\n" #: argp/argp-parse.c:102 msgid "Give this help list" -msgstr "Skriv denna hjälplista" +msgstr "÷ÙÄÁÅÔ ÜÔÏÔ ÓÐÒÁ×ÏÞÎÙÊ ÓÐÉÓÏË" #: argp/argp-parse.c:103 msgid "Give a short usage message" -msgstr "Ge ett kort hjälpmeddelande" +msgstr "÷ÙÄÁÅÔ ËÒÁÔËÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ÉÓÐÏÌØÚÏ×ÁÎÉÉ" #: argp/argp-parse.c:104 msgid "Set the program name" -msgstr "Sätt programnamnet" +msgstr "õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÉÍÑ ÐÒÏÇÒÁÍÍÙ" #: argp/argp-parse.c:106 msgid "Hang for SECS seconds (default 3600)" -msgstr "Vänta i SEK sekunder (standardvärde 3600)" +msgstr "÷ÉÓÉÔ ÕËÁÚÁÎÎÏÅ ÞÉÓÌÏ ÓÅËÕÎÄ (ÐÏ ÕÍÏÌÞÁÎÉÀ 3600)" #: argp/argp-parse.c:167 msgid "Print program version" -msgstr "Skriv programversion" +msgstr "ðÅÞÁÔÁÅÔ ×ÅÒÓÉÀ ÐÒÏÇÒÁÍÍÙ" #: argp/argp-parse.c:183 msgid "(PROGRAM ERROR) No version known!?" -msgstr "(PROGRAMFEL) Ingen version känd!?" +msgstr "(ïûéâëá ðòïçòáííù) ÷ÅÒÓÉÑ ÎÅÉÚ×ÅÓÔÎÁ!?" #: argp/argp-parse.c:623 #, c-format msgid "%s: Too many arguments\n" -msgstr "%s: För många argument\n" +msgstr "%s: óÌÉÛËÏÍ ÍÎÏÇÏ ÁÒÇÕÍÅÎÔÏ×\n" #: argp/argp-parse.c:766 msgid "(PROGRAM ERROR) Option should have been recognized!?" -msgstr "(PROGRAMFEL) Flagga skulle känts igen!?" +msgstr "(ïûéâëá ðòïçòáííù) ëÌÀÞ ÄÏÌÖÅÎ ÂÙÔØ ÒÁÓÐÏÚÎÁÎ!?" #: assert/assert-perr.c:57 #, c-format msgid "%s%s%s:%u: %s%sUnexpected error: %s.\n" -msgstr "%s%s%s:%u: %s%sOväntat fel: %s.\n" +msgstr "%s%s%s:%u: %s%sîÅÏÖÉÄÁÎÎÁÑ ÏÛÉÂËÁ: %s.\n" #: assert/assert.c:57 #, c-format msgid "%s%s%s:%u: %s%sAssertion `%s' failed.\n" -msgstr "%s%s%s:%u: %s%sFörsäkran \"%s\" falsk.\n" +msgstr "%s%s%s:%u: %s%sðÒÏ×ÅÒÏÞÎÏÅ ÕÔ×ÅÒÖÄÅÎÉÅ `%s' ÎÅ ×ÙÐÏÌÎÅÎÏ.\n" #: catgets/gencat.c:109 catgets/gencat.c:113 nscd/nscd.c:96 nss/makedb.c:61 msgid "NAME" -msgstr "NAMN" +msgstr "æáêì" #: catgets/gencat.c:110 msgid "Create C header file NAME containing symbol definitions" -msgstr "Skapa C-huvudfil NAMN innehållande symboldefinitioner" +msgstr "óÏÚÄÁÅÔ ÚÁÇÏÌÏ×ÏÞÎÙÊ æáêì ÎÁ óÉ, ÓÏÄÅÒÖÁÝÉÊ ÏÐÒÅÄÅÌÅÎÉÑ ÓÉÍ×ÏÌÏ×." #: catgets/gencat.c:112 msgid "Do not use existing catalog, force new output file" -msgstr "Använd inte existerande katalog, gör en ny utfil" +msgstr "îÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÕÝÅÓÔ×ÕÀÝÉÊ ËÁÔÁÌÏÇ, ÐÒÉÎÕÄÉÔÅÌØÎÏ ÓÏÚÄÁÔØ ÎÏ×ÙÊ ×ÙÈÏÄÎÏÊ ÆÁÊÌ" #: catgets/gencat.c:113 nss/makedb.c:61 msgid "Write output to file NAME" -msgstr "Skriv resultatet till NAMN" +msgstr "úÁÐÉÓÁÔØ ×Ù×ÏÄ × æáêì" #: catgets/gencat.c:118 msgid "" "Generate message catalog. If INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE\n" "is -, output is written to standard output.\n" msgstr "" -"Skapa meddelandekatalog. Om INFIL är - så läses standard in. Om UTFIL\n" -"är - så skrivs resultatet till standard ut.\n" +"çÅÎÅÒÉÒÕÅÔ ËÁÔÁÌÏÇ ÓÏÏÂÝÅÎÉÊ. åÓÌÉ ÷èïäîïê-æáêì ÚÁÄÁÎ ËÁË -, ÞÉÔÁÅÔ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ. åÓÌÉ\n" +"÷ùèïäîïê-æáêì ÚÁÄÁÎ ËÁË -, ÒÅÚÕÌØÔÁÔ ÐÅÞÁÔÁÅÔÓÑ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ.\n" #: catgets/gencat.c:123 msgid "" "-o OUTPUT-FILE [INPUT-FILE]...\n" "[OUTPUT-FILE [INPUT-FILE]...]" msgstr "" -"-o UTFIL [INFIL]...\n" -"[UTFIL [INFIL]...]" +"-o ÷ùèïäîïê-æáêì [÷èïäîïê-æáêì]...\n" +"[÷ùèïäîïê-æáêì [÷èïäîïê-æáêì]...]" #: catgets/gencat.c:231 debug/pcprofiledump.c:199 iconv/iconv_prog.c:410 #: iconv/iconvconfig.c:379 locale/programs/localedef.c:370 @@ -139,9 +136,8 @@ msgid "" "For bug reporting instructions, please see:\n" ".\n" msgstr "" -"För felrapporteringsinstruktioner, se:\n" +"éÎÓÔÒÕËÃÉÉ ÐÏ ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÁÈ ÓÍÏÔÒÉÔÅ ÎÁ\n" ".\n" -"Rapportera fel eller synpunkter på översättningen till .\n" #: catgets/gencat.c:245 debug/xtrace.sh:64 elf/ldconfig.c:285 #: elf/ldd.bash.in:39 elf/sprof.c:355 iconv/iconv_prog.c:425 @@ -155,10 +151,10 @@ msgid "" "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 "" -"Copyright © %s Free Software Foundation, Inc.\n" -"Detta är fri programvara; se källkoden för kopieringsvillkor. Det finns\n" -"INGEN garanti; inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT\n" -"ÄNDAMÅL.\n" +"Copyright (C) %s Free Software Foundation, Inc.\n" +"üÔÏ Ó×ÏÂÏÄÎÁÑ ÐÒÏÇÒÁÍÍÁ; ÐÏÄÒÏÂÎÏÓÔÉ Ï ÕÓÌÏ×ÉÑÈ ÒÁÓÐÒÏÓÔÒÁÎÅÎÉÑ\n" +"ÓÍÏÔÒÉÔÅ × ÉÓÈÏÄÎÏÍ ÔÅËÓÔÅ. íÙ îå ÐÒÅÄÏÓÔÁ×ÌÑÅÍ ÇÁÒÁÎÔÉÊ; ÄÁÖÅ ÇÁÒÁÎÔÉÊ\n" +"ëïííåòþåóëïê ðòéçïäîïóôé ÉÌÉ ðòéçïäîïóôé äìñ ëáëïê-ìéâï ãåìé.\n" #: catgets/gencat.c:250 debug/xtrace.sh:68 elf/ldconfig.c:290 elf/sprof.c:361 #: iconv/iconv_prog.c:430 iconv/iconvconfig.c:399 locale/programs/locale.c:279 @@ -166,130 +162,130 @@ msgstr "" #: nss/getent.c:88 nss/makedb.c:250 posix/getconf.c:1012 #, c-format msgid "Written by %s.\n" -msgstr "Skrivet av %s.\n" +msgstr "á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ -- %s.\n" #: catgets/gencat.c:281 msgid "*standard input*" -msgstr "*standard in*" +msgstr "*ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ*" #: catgets/gencat.c:287 iconv/iconv_charmap.c:157 iconv/iconv_prog.c:297 #: nss/makedb.c:170 #, c-format msgid "cannot open input file `%s'" -msgstr "kan inte öppna infil \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ×ÈÏÄÎÏÊ ÆÁÊÌ `%s'" #: catgets/gencat.c:416 catgets/gencat.c:493 msgid "illegal set number" -msgstr "otillåtet tal för mängd" +msgstr "ÎÅ×ÅÒÎÙÊ ÎÏÍÅÒ ÍÎÏÖÅÓÔ×Á" #: catgets/gencat.c:443 msgid "duplicate set definition" -msgstr "dubblerad definition av mängd" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ÍÎÏÖÅÓÔ×Á" #: catgets/gencat.c:445 catgets/gencat.c:622 catgets/gencat.c:676 msgid "this is the first definition" -msgstr "detta är den första definitionen" +msgstr "ÜÔÏ ÐÅÒ×ÏÅ ÏÐÒÅÄÅÌÅÎÉÅ" #: catgets/gencat.c:521 #, c-format msgid "unknown set `%s'" -msgstr "okänd mängd \"%s\"" +msgstr "ÎÅÉÚ×ÅÓÔÎÏÅ ÍÎÏÖÅÓÔ×Ï `%s'" #: catgets/gencat.c:562 msgid "invalid quote character" -msgstr "ogiltigt citattecken" +msgstr "ÎÅ×ÅÒÎÙÊ ÜËÒÁÎÉÒÕÀÝÉÊ ÚÎÁË" #: catgets/gencat.c:575 #, c-format msgid "unknown directive `%s': line ignored" -msgstr "okänt direktiv \"%s\": rad ignorerad" +msgstr "ÎÅÉÚ×ÅÓÔÎÁÑ ÄÉÒÅËÔÉ×Á `%s': ÓÔÒÏËÁ ÉÇÎÏÒÉÒÏ×ÁÎÁ" #: catgets/gencat.c:620 msgid "duplicated message number" -msgstr "dubblerat meddelandenummer" +msgstr "ÐÏ×ÔÏÒÎÙÊ ÎÏÍÅÒ ÓÏÏÂÝÅÎÉÑ" #: catgets/gencat.c:673 msgid "duplicated message identifier" -msgstr "dubblerad meddelandeidentifierare" +msgstr "ÐÏ×ÔÏÒÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÓÏÏÂÝÅÎÉÑ" #: catgets/gencat.c:730 msgid "invalid character: message ignored" -msgstr "ogiltigt tecken: meddelandet ignorerat" +msgstr "ÎÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË: ÓÏÏÂÝÅÎÉÅ ÉÇÎÏÒÉÒÏ×ÁÎÏ" #: catgets/gencat.c:773 msgid "invalid line" -msgstr "ogiltig rad" +msgstr "ÎÅ×ÅÒÎÁÑ ÓÔÒÏËÁ" #: catgets/gencat.c:827 msgid "malformed line ignored" -msgstr "felaktig rad ignorerad" +msgstr "ÎÅÐÒÁ×ÉÌØÎÁÑ ÓÔÒÏËÁ ÉÇÎÏÒÉÒÏ×ÁÎÁ" #: catgets/gencat.c:991 catgets/gencat.c:1032 nss/makedb.c:183 #, c-format msgid "cannot open output file `%s'" -msgstr "kan inte öppna utfil \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ×ÙÈÏÄÎÏÊ ÆÁÊÌ `%s'" #: catgets/gencat.c:1194 locale/programs/linereader.c:559 msgid "invalid escape sequence" -msgstr "ogiltig kontrollsekvens" +msgstr "ÎÅ×ÅÒÎÁÑ ÕÐÒÁ×ÌÑÀÝÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ" #: catgets/gencat.c:1216 msgid "unterminated message" -msgstr "oavslutat meddelande" +msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÏÅ ÓÏÏÂÝÅÎÉÅ" #: catgets/gencat.c:1240 #, c-format msgid "while opening old catalog file" -msgstr "när gammal katalogfil öppnades" +msgstr "ÐÒÉ ÏÔËÒÙÔÉÉ ÓÔÁÒÏÇÏ ÆÁÊÌÁ ËÁÔÁÌÏÇÁ" #: catgets/gencat.c:1331 #, c-format msgid "conversion modules not available" -msgstr "konverteringsmoduler inte tillgängliga" +msgstr "ÍÏÄÕÌÉ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÎÅÄÏÓÔÕÐÎÙ" #: catgets/gencat.c:1357 #, c-format msgid "cannot determine escape character" -msgstr "kan inte avgöra kontrolltecken" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÐÒÅÄÅÌÉÔØ ÚÎÁË ×ÙÈÏÄÁ" #: debug/pcprofiledump.c:52 msgid "Don't buffer output" -msgstr "Buffra inte resultatet" +msgstr "îÅ ÂÕÆÅÒÉÒÏ×ÁÔØ ×Ù×ÏÄ" #: debug/pcprofiledump.c:57 msgid "Dump information generated by PC profiling." -msgstr "Visa information genererad av PC-profilering." +msgstr "óÂÒÁÓÙ×ÁÅÔ ÉÎÆÏÒÍÁÃÉÀ, ÓÏÂÒÁÎÎÕÀ ÐÒÉ ÐÒÏÆÉÌÉÒÏ×ÁÎÉÉ PC." #: debug/pcprofiledump.c:60 msgid "[FILE]" -msgstr "[FIL]" +msgstr "[æáêì]" #: debug/pcprofiledump.c:100 #, c-format msgid "cannot open input file" -msgstr "kan inte öppna infil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ×ÈÏÄÎÏÊ ÆÁÊÌ" #: debug/pcprofiledump.c:106 #, c-format msgid "cannot read header" -msgstr "kan inte läsa huvud" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÞÉÔÁÔØ ÚÁÇÏÌÏ×ÏË" #: debug/pcprofiledump.c:170 #, c-format msgid "invalid pointer size" -msgstr "ogiltig pekarstorlek" +msgstr "ÎÅ×ÅÒÎÙÊ ÒÁÚÍÅÒ ÕËÁÚÁÔÅÌÑ" #: debug/xtrace.sh:27 debug/xtrace.sh:45 msgid "Usage: xtrace [OPTION]... PROGRAM [PROGRAMOPTION]...\\n" -msgstr "Användning: xtrace [FLAGGA]... PROGRAM [PROGRAMFLAGGA}...\\n" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ: xtrace [ëìàþ]... ðòïçòáííá [ëìàþ-ðòïçòáííù]...\\n" #: debug/xtrace.sh:33 msgid "Try `xtrace --help' for more information.\\n" -msgstr "Försök med \"xtrace --help\" för mer information\\n" +msgstr "ðÏÐÒÏÂÕÊÔÅ `xtrace --help' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÇÏ ÏÐÉÓÁÎÉÑ.\\n" #: debug/xtrace.sh:39 msgid "xtrace: option `$1' requires an argument.\\n" -msgstr "xtrace: flaggan \"$1\" behöver ett argument\\n" +msgstr "xtrace: ËÌÀÞ `%1' ÔÒÅÂÕÅÔ ÁÒÇÕÍÅÎÔ.\\n" #: debug/xtrace.sh:46 msgid "" @@ -307,625 +303,623 @@ msgid "" "For bug reporting instructions, please see:\n" ".\\n" msgstr "" -"Spåra exekvering av ett program genom att skriva ut funktionen som exekveras.\n" +"ôÒÁÓÓÉÒÕÅÔ ×ÙÐÏÌÎÅÎÉÅ ÐÒÏÇÒÁÍÍÙ, ÐÅÞÁÔÁÑ ×ÙÐÏÌÎÑÀÝÕÀÓÑ × ÄÁÎÎÏÅ ×ÒÅÍÑ ÆÕÎËÃÉÀ.\n" "\n" -" --data=FIL Kör inte programmet, skriv bara ut data från FIL.\n" +" --data=æáêì îÅ ×ÙÐÏÌÎÑÔØ ÐÒÏÇÒÁÍÍÕ, ÐÒÏÓÔÏ ÎÁÐÅÞÁÔÁÔØ ÄÁÎÎÙÅ ÉÚ æáêìá.\n" +" \n" +" -?,--help ðÏËÁÚÁÔØ ÜÔÕ ÓÐÒÁ×ËÕ É ×ÙÊÔÉ\n" +" --usage ðÏËÁÚÁÔØ ËÒÁÔËÏÅ ÓÏÏÂÝÅÎÉÅ Ï ÉÓÐÏÌØÚÏ×ÁÎÉÉ\n" +" -V,--version ðÏËÁÚÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ É ×ÙÊÔÉ\n" "\n" -" -?,--help Visa denna hjälptext och avsluta\n" -" --usage Visa en kort hjälptext\n" -" -V,--version Visa versionsinformation och avsluta\n" +"áÒÇÕÍÅÎÔÙ, ÏÂÑÚÁÔÅÌØÎÙÅ ÄÌÑ ÄÌÉÎÎÙÈ ËÌÀÞÅÊ, ÏÂÑÚÁÔÅÌØÎÙ É ÄÌÑ\n" +"ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ËÏÒÏÔËÉÈ.\n" "\n" -"Obligatoriska argument för långa flaggor är obligatoriska även för\n" -"motsvarande korta.\n" -"\n" -"För felrapporteringsinstruktioner, se:\n" -".\n" -"Rapportera fel eller synpunkter på översättningen till .\\n" +"éÎÓÔÒÕËÃÉÉ ÐÏ ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÁÈ ÓÍÏÔÒÉÔÅ ÎÁ\n" +".\\n" #: debug/xtrace.sh:125 msgid "xtrace: unrecognized option `$1'\\n" -msgstr "xtrace: okänd flagga `$1'\\n" +msgstr "xtrace: ÎÅÒÁÓÐÏÚÎÁÎÎÙÊ ËÌÀÞ `$1'\\n" #: debug/xtrace.sh:138 msgid "No program name given\\n" -msgstr "Inget programnamn givet\\n" +msgstr "îÅ ÚÁÄÁÎÏ ÉÍÑ ÐÒÏÇÒÁÍÍÙ\\n" #: debug/xtrace.sh:146 #, sh-format msgid "executable `$program' not found\\n" -msgstr "program \"$program\" hittades inte\\n" +msgstr "ÉÓÐÏÌÎÑÅÍÙÊ ÆÁÊÌ `$program' ÎÅ ÎÁÊÄÅÎ\\n" #: debug/xtrace.sh:150 #, sh-format msgid "`$program' is no executable\\n" -msgstr "`$program' är inte en körbar binär\\n" +msgstr "`$program' ÎÅ Ñ×ÌÑÅÔÓÑ ÉÓÐÏÌÎÑÅÍÙÍ ÆÁÊÌÏÍ\\n" #: dlfcn/dlinfo.c:67 msgid "RTLD_SELF used in code not dynamically loaded" -msgstr "RTLD_SELF används i kod som inte är dynamiskt laddad" +msgstr "RTLD_SELF ÉÓÐÏÌØÚÏ×ÁÎÏ × ÎÅ ÄÉÎÁÍÉÞÅÓËÉ ÚÁÇÒÕÖÅÎÎÏÍ ËÏÄÅ" #: dlfcn/dlinfo.c:76 msgid "unsupported dlinfo request" -msgstr "dlinfo-begäran som inte stöds" +msgstr "ÎÅÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ ÚÁÐÒÏÓ dlinfo" #: dlfcn/dlmopen.c:64 msgid "invalid namespace" -msgstr "ogiltig namnrymd" +msgstr "ÎÅ×ÅÒÎÏÅ ÐÒÏÓÔÒÁÎÓÔ×Ï ÉÍÅÎ" #: dlfcn/dlmopen.c:69 msgid "invalid mode" -msgstr "ogiltigt läge" +msgstr "ÎÅ×ÅÒÎÙÊ ÒÅÖÉÍ" #: dlfcn/dlopen.c:64 msgid "invalid mode parameter" -msgstr "ogiltig lägesparameter" +msgstr "ÎÅ×ÅÒÎÙÊ ÐÁÒÁÍÅÔÒ ÒÅÖÉÍÁ" #: elf/cache.c:67 msgid "unknown" -msgstr "okänt" +msgstr "ÎÅÉÚ×ÅÓÔÎÏ" #: elf/cache.c:110 msgid "Unknown OS" -msgstr "Okänt OS" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ïó" #: elf/cache.c:115 #, c-format msgid ", OS ABI: %s %d.%d.%d" -msgstr ", OS ABI: %s %d.%d.%d" +msgstr ", ABI ïó: %s %d.%d.%d" #: elf/cache.c:141 elf/ldconfig.c:1231 #, c-format msgid "Can't open cache file %s\n" -msgstr "Kan inte öppna cache-fil \"%s\"\n" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ËÜÛ-ÆÁÊÌ %s\n" #: elf/cache.c:153 #, c-format msgid "mmap of cache file failed.\n" -msgstr "minnesmappning av cache-fil misslyckades.\n" +msgstr "ÏÔÏÂÒÁÖÅÎÉÅ ËÜÛ-ÆÁÊÌÁ × ÐÁÍÑÔØ ÎÅ ÕÄÁÌÏÓØ.\n" #: elf/cache.c:157 elf/cache.c:167 #, c-format msgid "File is not a cache file.\n" -msgstr "Filen är inte en cache-fil.\n" +msgstr "üÔÏ ÎÅ ËÜÛ-ÆÁÊÌ.\n" #: elf/cache.c:200 elf/cache.c:210 #, c-format msgid "%d libs found in cache `%s'\n" -msgstr "%d bibliotek hittades i cache \"%s\"\n" +msgstr "%d ÂÉÂÌÉÏÔÅË ÎÁÊÄÅÎÏ × ËÜÛÅ `%s'\n" #: elf/cache.c:409 #, c-format msgid "Can't remove old temporary cache file %s" -msgstr "Kan inte ta bort gammal temporär cache-fil %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÓÔÁÒÙÊ ×ÒÅÍÅÎÎÙÊ ËÜÛ-ÆÁÊÌ %s" #: elf/cache.c:416 #, c-format msgid "Can't create temporary cache file %s" -msgstr "Kan inte skapa temporär cache-fil \"%s\"" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ×ÒÅÍÅÎÎÙÊ ËÜÛ-ÆÁÊÌ %s" #: elf/cache.c:424 elf/cache.c:434 elf/cache.c:438 #, c-format msgid "Writing of cache data failed" -msgstr "Skrivning av cache-data misslyckades" +msgstr "úÁÐÉÓØ ÄÁÎÎÙÈ ËÜÛÁ ÎÅÕÓÐÅÛÎÁ" #: elf/cache.c:442 #, c-format msgid "Writing of cache data failed." -msgstr "Skrivning av cache-data misslyckades." +msgstr "úÁÐÉÓØ ÄÁÎÎÙÈ ËÜÛÁ ÎÅÕÓÐÅÛÎÁ." #: elf/cache.c:449 #, c-format msgid "Changing access rights of %s to %#o failed" -msgstr "Misslyckades med att byta åtkomsträttigheter för %s till %#o" +msgstr "éÚÍÅÎÅÎÉÅ ÐÒÁ× ÄÏÓÔÕÐÁ ÄÌÑ %s ÎÁ %#o ÎÅÕÓÐÅÛÎÏ" #: elf/cache.c:454 #, c-format msgid "Renaming of %s to %s failed" -msgstr "Namnbyte på %s till %s misslyckades" +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÎÉÅ %s × %s ÎÅÕÓÐÅÛÎÏ" #: elf/dl-close.c:116 msgid "shared object not open" -msgstr "delat objekt är inte öppnat" +msgstr "ÒÁÚÄÅÌÑÅÍÙÊ ÏÂßÅËÔ ÎÅ ÏÔËÒÙÔ" #: elf/dl-deps.c:112 msgid "DST not allowed in SUID/SGID programs" -msgstr "DST inte tillåten i SUID/SGID-program" +msgstr "DST ÎÅ ÄÏÐÕÓËÁÅÔÓÑ × ÐÒÏÇÒÁÍÍÁÈ Ó SUID/SGID" #: elf/dl-deps.c:125 msgid "empty dynamics string token substitution" -msgstr "substitution av \"dynamic string token\" är tom" +msgstr "" #: elf/dl-deps.c:131 #, c-format msgid "cannot load auxiliary `%s' because of empty dynamic string token substitution\n" msgstr "" -"kan ite ladda extra \"%s\" på grund av att substitution av\n" -"\"dynamic string token\" är tom\n" #: elf/dl-deps.c:472 msgid "cannot allocate dependency list" -msgstr "kan inte allokera beroendelista" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ ÓÐÉÓÏË ÚÁ×ÉÓÉÍÏÓÔÅÊ" #: elf/dl-deps.c:505 elf/dl-deps.c:560 msgid "cannot allocate symbol search list" -msgstr "kan inte allokera söklista för symboler" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ ÓÐÉÓÏË ÐÏÉÓËÁ ÓÉÍ×ÏÌÏ×" #: elf/dl-deps.c:545 msgid "Filters not supported with LD_TRACE_PRELINKING" -msgstr "Filter stöds ej med LD_TRACE_PRELINKING" +msgstr "æÉÌØÔÒÙ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÔÓÑ Ó LD_TRACE_PRELINKING" #: elf/dl-error.c:77 msgid "DYNAMIC LINKER BUG!!!" -msgstr "FEL I DYNAMISK LÄNKARE!!!" +msgstr "ïûéâëá äéîáíéþåóëïçï ëïíðïîï÷ýéëá!!!" #: elf/dl-error.c:124 msgid "error while loading shared libraries" -msgstr "fel när delade bibliotek laddades" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÚÁÇÒÕÚËÅ ÒÁÚÄÅÌÑÅÍÙÈ ÂÉÂÌÉÏÔÅË" #: elf/dl-fptr.c:88 msgid "cannot map pages for fdesc table" -msgstr "kan inte minnesmappa sidor för fdesc-tabell" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÒÁÎÉÃÙ ÄÌÑ ÔÁÂÌÉÃÙ fdesc" #: elf/dl-fptr.c:192 msgid "cannot map pages for fptr table" -msgstr "kan inte minnesmappa sidor för fptr-tabell" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÒÁÎÉÃÙ ÄÌÑ ÔÁÂÌÉÃÙ fptr" #: elf/dl-fptr.c:221 msgid "internal error: symidx out of range of fptr table" -msgstr "internt fel: symidx är utanför intervallet för fptr-tabellen" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ: symidx ×ÙÈÏÄÉÔ ÚÁ ÐÒÅÄÅÌÙ ÔÁÂÌÉÃÙ fptr" #: elf/dl-load.c:372 msgid "cannot allocate name record" -msgstr "kan inte allokera namnpost" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ ÚÁÐÉÓØ ÉÍÅÎÉ" #: elf/dl-load.c:474 elf/dl-load.c:553 elf/dl-load.c:673 elf/dl-load.c:786 msgid "cannot create cache for search path" -msgstr "kan inte skapa cache för sökväg" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ËÜÛ ÄÌÑ ÐÕÔÅÊ ÐÏÉÓËÁ" #: elf/dl-load.c:576 msgid "cannot create RUNPATH/RPATH copy" -msgstr "kan inte skapa kopia av RUNPATH/RPATH" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ËÏÐÉÀ RUNPATH/RPATH" #: elf/dl-load.c:659 msgid "cannot create search path array" -msgstr "kan inte skapa sökvägslista" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÍÁÓÓÉ× ÐÕÔÅÊ ÐÏÉÓËÁ" #: elf/dl-load.c:870 msgid "cannot stat shared object" -msgstr "kan inte ta status på delat objekt" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ stat ÄÌÑ ÒÁÚÄÅÌÑÅÍÏÇÏ ÏÂßÅËÔÁ" #: elf/dl-load.c:940 msgid "cannot open zero fill device" -msgstr "kan inte öppna nollfyllnadsenhet" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÆÁÊÌ-ÉÓÔÏÞÎÉË ÎÕÌÅÊ" #: elf/dl-load.c:985 elf/dl-load.c:2215 msgid "cannot create shared object descriptor" -msgstr "kan inte skapa delad objektdeskriptor" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÄÅÓËÒÉÐÔÏÒ ÒÁÚÄÅÌÑÅÍÏÇÏ ÏÂßÅËÔÁ" #: elf/dl-load.c:1004 elf/dl-load.c:1663 elf/dl-load.c:1755 msgid "cannot read file data" -msgstr "kan inte läsa fildata" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ ÄÁÎÎÙÅ ÆÁÊÌÁ" #: elf/dl-load.c:1048 msgid "ELF load command alignment not page-aligned" -msgstr "ELF-laddkommando är inte på sidgräns" +msgstr "×ÙÒÁ×ÎÉ×ÁÎÉÅ ËÏÍÁÎÄÙ ÚÁÇÒÕÚËÉ ELF ÎÅ ×ÙÒÏ×ÎÅÎÏ ÐÏ ÓÔÒÁÎÉÃÅ" #: elf/dl-load.c:1055 msgid "ELF load command address/offset not properly aligned" -msgstr "Address/position för ELF-laddkommando är inte på rätt bytegräns" +msgstr "ÁÄÒÅÓ/ÓÍÅÝÅÎÉÅ ËÏÍÁÎÄÙ ÚÁÇÒÕÚËÉ ELF ÎÅ ×ÙÒÏ×ÎÅÎÏ ÐÒÁ×ÉÌØÎÏ" #: elf/dl-load.c:1139 msgid "cannot allocate TLS data structures for initial thread" -msgstr "kan inte skapa TLS-datastrukturer för första tråden" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ TLS-ÓÔÒÕËÔÕÒÙ ÄÌÑ ÎÁÞÁÌØÎÏÇÏ ÔÒÅÄÁ" #: elf/dl-load.c:1163 msgid "cannot handle TLS data" -msgstr "kan inte hantera TLS-data" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÂÒÁÂÏÔÁÔØ ÄÁÎÎÙÅ TLS" #: elf/dl-load.c:1182 msgid "object file has no loadable segments" -msgstr "objektfilen har inga laddbara segment" +msgstr "× ÏÂßÅËÔÎÏÍ ÆÁÊÌÅ ÎÅÔ ÚÁÇÒÕÖÁÅÍÙÈ ÓÅÇÍÅÎÔÏ×" #: elf/dl-load.c:1218 msgid "failed to map segment from shared object" -msgstr "misslyckades att mappa segment från delat objekt" +msgstr "ÓÂÏÊ ÏÔÏÂÒÁÖÅÎÉÑ ÓÅÇÍÅÎÔÁ ÉÚ ÒÁÚÄÅÌÑÅÍÏÇÏ ÏÂßÅËÔÁ" #: elf/dl-load.c:1242 msgid "cannot dynamically load executable" -msgstr "kan inte ladda exekverbar fil dynamiskt" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÄÉÎÁÍÉÞÅÓËÉ ÚÁÇÒÕÚÉÔØ ÉÓÐÏÌÎÑÅÍÙÊ ÆÁÊÌ" #: elf/dl-load.c:1303 msgid "cannot change memory protections" -msgstr "kan inte ändra minnesskydd" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÉÚÍÅÎÉÔØ ÚÁÝÉÔÕ ÐÁÍÑÔÉ" #: elf/dl-load.c:1322 msgid "cannot map zero-fill pages" -msgstr "kan inte mappa nollfyllda sidor" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÒÁÎÉÃÙ ÚÁÐÏÌÎÅÎÉÑ ÎÕÌÑÍÉ" #: elf/dl-load.c:1336 msgid "object file has no dynamic section" -msgstr "objektfilen har ingen dynamisk sektion" +msgstr "× ÏÂßÅËÔÎÏÍ ÆÁÊÌÅ ÎÅÔ ÄÉÎÁÍÉÞÅÓËÏÊ ÓÅËÃÉÉ" #: elf/dl-load.c:1359 msgid "shared object cannot be dlopen()ed" -msgstr "delat objekt kan inte göras dlopen() på" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÒÉÍÅÎÉÔØ dlopen() Ë ÒÁÚÄÅÌÑÅÍÏÍÕ ÏÂßÅËÔÕ" #: elf/dl-load.c:1372 msgid "cannot allocate memory for program header" -msgstr "kan inte allokera minne för programhuvud" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ ÚÁÇÏÌÏ×ÏË ÐÒÏÇÒÁÍÍÙ" #: elf/dl-load.c:1389 elf/dl-open.c:174 msgid "invalid caller" -msgstr "ogiltig anropare" +msgstr "ÎÅ×ÅÒÎÁÑ ×ÙÚÙ×ÁÀÝÁÑ ÆÕÎËÃÉÑ" #: elf/dl-load.c:1428 msgid "cannot enable executable stack as shared object requires" -msgstr "kan inte skapa exekverbar stack som delat objekt kräver" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÄÅÊÓÔ×Ï×ÁÔØ ÉÓÐÏÌÎÑÅÍÙÊ ÓÔÅË, ËÁË ÔÒÅÂÕÅÔ ÒÁÚÄÅÌÑÅÍÙÊ ÏÂßÅËÔ" #: elf/dl-load.c:1443 msgid "cannot close file descriptor" -msgstr "kan inte stänga filidentifierare" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁËÒÙÔØ ÄÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ" #: elf/dl-load.c:1485 msgid "cannot create searchlist" -msgstr "kan inte skapa söklista" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÓÐÉÓÏË ÐÏÉÓËÁ" #: elf/dl-load.c:1663 msgid "file too short" -msgstr "fil för kort" +msgstr "ÆÁÊÌ ÓÌÉÛËÏÍ ÍÁÌ" #: elf/dl-load.c:1692 msgid "invalid ELF header" -msgstr "ogiltigt ELF-huvud" +msgstr "ÎÅ×ÅÒÎÙÊ ÚÁÇÏÌÏ×ÏË ELF" #: elf/dl-load.c:1704 msgid "ELF file data encoding not big-endian" -msgstr "Kodning för ELF-fildata är inte rak byteordning" +msgstr "ËÏÄÉÒÏ×ËÁ ÄÁÎÎÙÈ × ELF-ÆÁÊÌÅ ÎÅ ÔÕÐÏËÏÎÅÞÎÁÑ" #: elf/dl-load.c:1706 msgid "ELF file data encoding not little-endian" -msgstr "Kodning för ELF-fildata är inte omvänd byteordning" +msgstr "ËÏÄÉÒÏ×ËÁ ÄÁÎÎÙÈ × ELF-ÆÁÊÌÅ ÎÅ ÏÓÔÒÏËÏÎÅÞÎÁÑ" #: elf/dl-load.c:1710 msgid "ELF file version ident does not match current one" -msgstr "ELF-filens versionsidentitet stämmer inte med nuvarande" +msgstr "ÉÄÅÎÔÉÆÉËÁÔÏÒ ×ÅÒÓÉÉ ELF-ÆÁÊÌÁ ÎÅ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÔÅËÕÝÅÊ ×ÅÒÓÉÉ" #: elf/dl-load.c:1714 msgid "ELF file OS ABI invalid" -msgstr "ELF-fil har felaktig version på OS-ABI" +msgstr "ÎÅ×ÅÒÎÙÊ ABI ïó ELF-ÆÁÊÌÁ" #: elf/dl-load.c:1716 msgid "ELF file ABI version invalid" -msgstr "ELF-fil har felaktig version på ABI" +msgstr "ÎÅ×ÅÒÎÁÑ ×ÅÒÓÉÑ ABI ELF-ÆÁÊÌÁ" #: elf/dl-load.c:1719 msgid "internal error" -msgstr "internt fel" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ" #: elf/dl-load.c:1726 msgid "ELF file version does not match current one" -msgstr "ELF-filens version stämmer inte med nuvarande" +msgstr "×ÅÒÓÉÑ ELF-ÆÁÊÌÁ ÎÅ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÔÅËÕÝÅÊ ×ÅÒÓÉÉ" #: elf/dl-load.c:1734 msgid "only ET_DYN and ET_EXEC can be loaded" -msgstr "bara ET_DYN och ET_EXEC kan laddas" +msgstr "ÍÏÖÎÏ ÚÁÇÒÕÚÉÔØ ÔÏÌØËÏ ET_DYN É ET_EXEC" +# ??? #: elf/dl-load.c:1740 msgid "ELF file's phentsize not the expected size" -msgstr "ELF-filens värde på \"phentsize\" är inte den förväntade" +msgstr "phentsize ELF-ÆÁÊÌÁ ÎÅ ÓÏ×ÐÁÄÁÅÔ Ó ÏÖÉÄÁÅÍÙÍ ÒÁÚÍÅÒÏÍ" #: elf/dl-load.c:2231 msgid "wrong ELF class: ELFCLASS64" -msgstr "fel ELF-klass: ELFCLASS64" +msgstr "ÎÅÐÒÁ×ÉÌØÎÙÊ ËÌÁÓÓ ELF: ELFCLASS64" #: elf/dl-load.c:2232 msgid "wrong ELF class: ELFCLASS32" -msgstr "fel ELF-klass: ELFCLASS32" +msgstr "ÎÅÐÒÁ×ÉÌØÎÙÊ ËÌÁÓÓ ELF: ELFCLASS32" #: elf/dl-load.c:2235 msgid "cannot open shared object file" -msgstr "kan inte öppna delad objektfil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÒÁÚÄÅÌÑÅÍÙÊ ÏÂßÅËÔÎÙÊ ÆÁÊÌ" #: elf/dl-lookup.c:261 msgid "relocation error" -msgstr "fel vid relokering" +msgstr "ÏÛÉÂËÁ ÐÅÒÅÍÅÝÅÎÉÑ" #: elf/dl-lookup.c:289 msgid "symbol lookup error" -msgstr "fel vid symboluppslagning" +msgstr "ÏÛÉÂËÁ ÐÏÉÓËÁ ÓÉÍ×ÏÌÁ" #: elf/dl-open.c:112 msgid "cannot extend global scope" -msgstr "kan inte utöka globalt område" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÒÁÓÛÉÒÉÔØ ÇÌÏÂÁÌØÎÕÀ ÏÂÌÁÓÔØ" #: elf/dl-open.c:237 msgid "empty dynamic string token substitution" -msgstr "substitution av \"dynamic string token\" är tom" +msgstr "" #: elf/dl-open.c:406 elf/dl-open.c:417 elf/dl-open.c:425 msgid "cannot create scope list" -msgstr "kan inte skapa omfångslista" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÓÐÉÓÏË ÏÂÌÁÓÔÅÊ" #: elf/dl-open.c:470 msgid "TLS generation counter wrapped! Please report this." -msgstr "Generationsräknare för TLS slog runt! Var snäll och rapportera detta." +msgstr "ðÅÒÅÐÏÌÎÅÎÉÅ ÓÞÅÔÞÉËÁ ÐÏËÏÌÅÎÉÊ TLS! ðÏÖÁÌÕÊÓÔÁ, ÓÏÏÂÝÉÔÅ Ï ÜÔÏÍ." #: elf/dl-open.c:508 msgid "invalid mode for dlopen()" -msgstr "ogiltiga flaggor för dlopen()" +msgstr "ÎÅ×ÅÒÎÙÊ ÒÅÖÉÍ ÄÌÑ dlopen()" #: elf/dl-open.c:525 msgid "no more namespaces available for dlmopen()" -msgstr "inga fler namnrymder tillgängliga för dlmopen()" +msgstr "ÂÏÌØÛÅ ÎÅÔ ÄÏÓÔÕÐÎÙÈ ÐÒÏÓÔÒÁÎÓÔ× ÉÍÅÎ ÄÌÑ dlmopen()" #: elf/dl-open.c:538 msgid "invalid target namespace in dlmopen()" -msgstr "ogiltig målnamnrymd för dlmopen()" +msgstr "ÎÅ×ÅÒÎÏÅ ÃÅÌÅ×ÏÅ ÐÒÏÓÔÒÁÎÓÔ×Ï ÉÍÅÎ × dlmopen()" #: elf/dl-reloc.c:55 msgid "cannot allocate memory in static TLS block" -msgstr "kan inte allokera minne i statiskt TLS-block" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ × ÓÔÁÔÉÞÎÏÍ ÂÌÏËÅ TLS" #: elf/dl-reloc.c:198 msgid "cannot make segment writable for relocation" -msgstr "kan inte göra segment skrivbart för relokering" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÄÅÌÁÔØ ÓÅÇÍÅÎÔ ÚÁÐÉÓÙ×ÁÅÍÙÍ ÄÌÑ ÐÅÒÅÍÅÝÅÎÉÑ" #: elf/dl-reloc.c:279 #, c-format msgid "%s: no PLTREL found in object %s\n" -msgstr "%s: hittade inga PLTREL i objekt %s\n" +msgstr "%s: × ÏÂßÅËÔÅ %s ÎÅ ÎÁÊÄÅÎÏ PLTREL\n" #: elf/dl-reloc.c:290 #, c-format msgid "%s: out of memory to store relocation results for %s\n" -msgstr "%s: slut på minne för att lagra relokeringsresultat för %s\n" +msgstr "%s: ÎÅÄÏÓÔÁÔÏÞÎÏ ÐÁÍÑÔÉ ÄÌÑ ÚÁÐÉÓÉ ÒÅÚÕÌØÔÁÔÏ× ÒÅÌÏËÁÃÉÉ ÄÌÑ %s\n" #: elf/dl-reloc.c:306 msgid "cannot restore segment prot after reloc" -msgstr "kan inte återställa segmenträttigheter efter relokering" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÏÓÓÔÁÎÏ×ÉÔØ ÚÁÝÉÔÕ ÓÅÇÍÅÎÔÁ ÐÏÓÌÅ ÐÅÒÅÍÅÝÅÎÉÑ" #: elf/dl-reloc.c:331 msgid "cannot apply additional memory protection after relocation" -msgstr "kan inte applicera extra minnesskydd efter relokering" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÒÉÍÅÎÉÔØ ÄÏÐÏÌÎÉÔÅÌØÎÕÀ ÚÁÝÉÔÕ ÐÁÍÑÔÉ ÐÏÓÌÅ ÒÅÌÏËÁÃÉÉ" #: elf/dl-sym.c:98 msgid "RTLD_NEXT used in code not dynamically loaded" -msgstr "RTLD_NEXT används i kod som inte är dynamiskt laddad" +msgstr "RTLD_NEXT ÉÓÐÏÌØÚÏ×ÁÎÏ × ÎÅ ÄÉÎÁÍÉÞÅÓËÉ ÚÁÇÒÕÖÅÎÎÏÍ ËÏÄÅ" #: elf/dl-sysdep.c:495 msgid "cannot create capability list" -msgstr "kan inte skapa egenskapslista" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÓÐÉÓÏË ×ÏÚÍÏÖÎÏÓÔÅÊ" #: elf/dl-tls.c:829 msgid "cannot create TLS data structures" -msgstr "kan inte skapa datastrukturer för TLS" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ TLS" #: elf/dl-version.c:303 msgid "cannot allocate version reference table" -msgstr "kan inte allokera tabell för versionsreferenser" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ ÔÁÂÌÉÃÕ ÓÓÙÌÏË ÎÁ ×ÅÒÓÉÉ" #: elf/ldconfig.c:133 msgid "Print cache" -msgstr "Visa cache" +msgstr "îÁÐÅÞÁÔÁÔØ ËÜÛ" #: elf/ldconfig.c:134 msgid "Generate verbose messages" -msgstr "Använd utförligare meddelanden" +msgstr "çÅÎÅÒÉÒÏ×ÁÔØ ÐÏÄÒÏÂÎÙÅ ÓÏÏÂÝÅÎÉÑ" #: elf/ldconfig.c:135 msgid "Don't build cache" -msgstr "Bygg inte cache" +msgstr "îÅ ÓÔÒÏÉÔØ ËÜÛ" #: elf/ldconfig.c:136 msgid "Don't generate links" -msgstr "Generera inte länkar" +msgstr "îÅ ÇÅÎÅÒÉÒÏ×ÁÔØ ÓÓÙÌËÉ" #: elf/ldconfig.c:137 msgid "Change to and use ROOT as root directory" -msgstr "Byt till och använd ROT som rotkatalog" +msgstr "ðÅÒÅÊÔÉ × ROOT É ÉÓÐÏÌØÚÏ×ÁÔØ ÅÇÏ ËÁË ËÏÒÎÅ×ÏÊ ËÁÔÁÌÏÇ" #: elf/ldconfig.c:137 msgid "ROOT" -msgstr "ROT" +msgstr "" #: elf/ldconfig.c:138 msgid "CACHE" -msgstr "CACHE" +msgstr "" #: elf/ldconfig.c:138 msgid "Use CACHE as cache file" -msgstr "Använd CACHE som cache-fil" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ CACHE × ËÁÞÅÓÔ×Å ËÜÛ-ÆÁÊÌÁ" #: elf/ldconfig.c:139 msgid "CONF" -msgstr "CONF" +msgstr "" #: elf/ldconfig.c:139 msgid "Use CONF as configuration file" -msgstr "Använd CONF som konfigurationsfil" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ CONF × ËÁÞÅÓÔ×Å ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÇÏ ÆÁÊÌÁ" #: elf/ldconfig.c:140 msgid "Only process directories specified on the command line. Don't build cache." -msgstr "Behandla endast kataloger givna som argument. Bygg inte cache." +msgstr "ïÂÒÁÂÏÔÁÔØ ÔÏÌØËÏ ËÁÔÁÌÏÇÉ, ÕËÁÚÁÎÎÙÅ × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ. îÅ ÓÔÒÏÉÔØ ËÜÛ." #: elf/ldconfig.c:141 msgid "Manually link individual libraries." -msgstr "Länka enskilda bibliotek manuellt." +msgstr "÷ÒÕÞÎÕÀ ÓËÏÍÐÏÎÏ×ÁÔØ ÏÔÄÅÌØÎÙÅ ÂÉÂÌÉÏÔÅËÉ." #: elf/ldconfig.c:142 msgid "FORMAT" -msgstr "FORMAT" +msgstr "" #: elf/ldconfig.c:142 msgid "Format to use: new, old or compat (default)" -msgstr "Format att använda: \"new\", \"old\" eller \"compat\" (standardvärde)" +msgstr "éÓÐÏÌØÚÕÅÍÙÊ ÆÏÒÍÁÔ: new, old ÉÌÉ compat (ÐÏ ÕÍÏÌÞÁÎÉÀ)" #: elf/ldconfig.c:150 msgid "Configure Dynamic Linker Run Time Bindings." -msgstr "Konfigurera bindningar för den dynamiska länkaren." +msgstr "ëÏÎÆÉÇÕÒÉÒÕÅÔ Ó×ÑÚÉ ×ÒÅÍÅÎÉ ×ÙÐÏÌÎÅÎÉÑ ÄÌÑ ÄÉÎÁÍÉÞÅÓËÏÇÏ ËÏÍÐÏÎÏ×ÝÉËÁ." #: elf/ldconfig.c:308 #, c-format msgid "Path `%s' given more than once" -msgstr "Sökväg \"%s\" given mer än en gång" +msgstr "ðÕÔØ `%s' ÚÁÄÁÎ ÎÅÓËÏÌØËÏ ÒÁÚ" #: elf/ldconfig.c:348 #, c-format msgid "%s is not a known library type" -msgstr "%s är inte en känd bibliotekstyp" +msgstr "%s ÎÅ Ñ×ÌÑÅÔÓÑ ÉÚ×ÅÓÔÎÙÍ ÔÉÐÏÍ ÂÉÂÌÉÏÔÅËÉ" #: elf/ldconfig.c:373 #, c-format msgid "Can't stat %s" -msgstr "Kan inte ta status på %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ stat %s" #: elf/ldconfig.c:447 #, c-format msgid "Can't stat %s\n" -msgstr "Kan inte ta status på %s\n" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ stat %s\n" #: elf/ldconfig.c:457 #, c-format msgid "%s is not a symbolic link\n" -msgstr "%s är inte en symbolisk länk\n" +msgstr "%s ÎÅ Ñ×ÌÑÅÔÓÑ ÓÉÍ×ÏÌØÎÏÊ ÓÓÙÌËÏÊ\n" #: elf/ldconfig.c:476 #, c-format msgid "Can't unlink %s" -msgstr "Kan inte ta bort (unlink) %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÓÓÙÌËÕ %s" #: elf/ldconfig.c:482 #, c-format msgid "Can't link %s to %s" -msgstr "Kan inte länka %s till %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÓÓÙÌËÕ Ó %s ÎÁ %s" #: elf/ldconfig.c:488 msgid " (changed)\n" -msgstr " (ändrad)\n" +msgstr " (ÉÍÅÎÅÎÏ)\n" #: elf/ldconfig.c:490 msgid " (SKIPPED)\n" -msgstr " (HOPPAR ÖVER)\n" +msgstr " (ðòïðõýåîï)\n" #: elf/ldconfig.c:545 #, c-format msgid "Can't find %s" -msgstr "Kan inte hitta %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÎÁÊÔÉ %s" #: elf/ldconfig.c:561 #, c-format msgid "Can't lstat %s" -msgstr "Kan inte ta länkstatus på %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ lstat %s" #: elf/ldconfig.c:568 #, c-format msgid "Ignored file %s since it is not a regular file." -msgstr "Ignorerar fil %s eftersom den inte är en vanlig fil" +msgstr "æÁÊÌ %s ÉÇÎÏÒÉÒÏ×ÁÎ, ÐÏÓËÏÌØËÕ ÜÔÏ ÎÅ ÏÂÙÞÎÙÊ ÆÁÊÌ" #: elf/ldconfig.c:576 #, c-format msgid "No link created since soname could not be found for %s" -msgstr "Ingen länk skapad eftersom \"soname\" inte hittades för %s" +msgstr "óÓÙÌËÁ ÎÅ ÓÏÚÄÁÎÁ, ÐÏÓËÏÌØËÕ ÄÌÑ %s ÎÅ ÂÙÌÏ ÎÁÊÄÅÎÏ soname" #: elf/ldconfig.c:667 #, c-format msgid "Can't open directory %s" -msgstr "Kan inte öppna katalog %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ËÁÔÁÌÏÇ %s" #: elf/ldconfig.c:735 elf/ldconfig.c:782 #, c-format msgid "Cannot lstat %s" -msgstr "Kan inte ta status (lstat) på %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ lstat %s" #: elf/ldconfig.c:747 #, c-format msgid "Cannot stat %s" -msgstr "Kan inte ta status på %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ stat %s" #: elf/ldconfig.c:804 elf/readlib.c:90 #, c-format msgid "Input file %s not found.\n" -msgstr "Hittar inte infil %s.\n" +msgstr "÷ÈÏÄÎÏÊ ÆÁÊÌ %s ÎÅ ÎÁÊÄÅÎ.\n" #: elf/ldconfig.c:855 #, c-format msgid "libc5 library %s in wrong directory" -msgstr "libc5-bibliotek %s i fel katalog" +msgstr "libc5-ÂÉÂÌÉÏÔÅËÁ %s × ÎÅÐÒÁ×ÉÌØÎÏÍ ËÁÔÁÌÏÇÅ" #: elf/ldconfig.c:858 #, c-format msgid "libc6 library %s in wrong directory" -msgstr "libc6-bibliotek %s i fel katalog" +msgstr "libc6-ÂÉÂÌÉÏÔÅËÁ %s × ÎÅÐÒÁ×ÉÌØÎÏÍ ËÁÔÁÌÏÇÅ" #: elf/ldconfig.c:861 #, c-format msgid "libc4 library %s in wrong directory" -msgstr "libc4-bibliotek %s i fel katalog" +msgstr "libc4-ÂÉÂÌÉÏÔÅËÁ %s × ÎÅÐÒÁ×ÉÌØÎÏÍ ËÁÔÁÌÏÇÅ" #: elf/ldconfig.c:888 #, c-format msgid "libraries %s and %s in directory %s have same soname but different type." -msgstr "bibliotek %s och %s i katalog %s har samma \"soname\" men olika typ." +msgstr "ÂÉÂÌÉÏÔÅËÉ %s É %s × ËÁÔÁÌÏÇÅ %s ÉÍÅÀÔ ÏÄÉÎÁËÏ×ÙÊ soname, ÎÏ ÒÁÚÎÙÅ ÔÉÐÙ." #: elf/ldconfig.c:995 #, c-format msgid "Can't open configuration file %s" -msgstr "Kan inte öppna konfigurationsfil %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÆÁÊÌ %s" #: elf/ldconfig.c:1059 #, c-format msgid "%s:%u: bad syntax in hwcap line" -msgstr "%s:%u: ogiltig syntax på hwcap-raden" +msgstr "%s:%u: ÎÅÐÒÁ×ÉÌØÎÙÊ ÓÉÎÔÁËÓÉÓ × ÓÔÒÏËÅ hwcap" #: elf/ldconfig.c:1065 #, c-format msgid "%s:%u: hwcap index %lu above maximum %u" -msgstr "%s:%u: hwcap-index %lu är större än maximum %u" +msgstr "%s:%u: ÉÎÄÅËÓ hwcap %lu ÐÒÅ×ÙÛÁÅÔ ÍÁËÓÉÍÕÍ %u" #: elf/ldconfig.c:1072 elf/ldconfig.c:1080 #, c-format msgid "%s:%u: hwcap index %lu already defined as %s" -msgstr "%s:%u: hwcap-index %lu redan definierat som %s" +msgstr "%s:%u: ÉÎÄÅËÓ hwcap %lu ÕÖÅ ÏÐÒÅÄÅÌÅÎ ËÁË %s" #: elf/ldconfig.c:1083 #, c-format msgid "%s:%u: duplicate hwcap %lu %s" -msgstr "%s:%u: duplicerad hwcap %lu %s" +msgstr "%s:%u: ÐÏ×ÔÏÒÎÏÅ hwcap %lu %s" #: elf/ldconfig.c:1105 #, c-format msgid "need absolute file name for configuration file when using -r" -msgstr "behöver absolut filnamn för konfigurationsfil när -r används" +msgstr "ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ -r ÎÅÏÂÈÏÄÉÍÏ ÚÁÄÁ×ÁÔØ ÁÂÓÏÌÀÔÎÏÅ ÉÍÑ ÄÌÑ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÇÏ ÆÁÊÌÁ" #: elf/ldconfig.c:1112 locale/programs/xmalloc.c:69 malloc/obstack.c:434 #: malloc/obstack.c:436 posix/getconf.c:980 posix/getconf.c:1158 #, c-format msgid "memory exhausted" -msgstr "minne slut" +msgstr "ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ" #: elf/ldconfig.c:1142 #, c-format msgid "%s:%u: cannot read directory %s" -msgstr "%s:%u: kan inte läsa katalog %s" +msgstr "%s:%u: ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ ËÁÔÁÌÏÇ %s" #: elf/ldconfig.c:1182 #, c-format msgid "relative path `%s' used to build cache" -msgstr "relativ sökväg \"%s\" använd för att bygga cache" +msgstr "ÄÌÑ ÐÏÓÔÒÏÅÎÉÑ ËÜÛÁ ÉÓÐÏÌØÚÏ×ÁÎ ÏÔÎÏÓÉÔÅÌØÎÙÊ ÐÕÔØ `%s'" #: elf/ldconfig.c:1210 #, c-format msgid "Can't chdir to /" -msgstr "Kan inte byta katalog till /" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÅÒÅÊÔÉ × ËÁÔÁÌÏÇ /" #: elf/ldconfig.c:1252 #, c-format msgid "Can't open cache file directory %s\n" -msgstr "Kan inte läsa cache-filkatalog \"%s\"\n" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ËÁÔÁÌÏÇ ËÜÛ-ÆÁÊÌÁ %s\n" #: elf/ldd.bash.in:43 msgid "Written by %s and %s.\n" -msgstr "Skrivet av %s och %s.\n" +msgstr "á×ÔÏÒÙ ÐÒÏÇÒÁÍÍÙ -- %s É %s.\n" #: elf/ldd.bash.in:48 msgid "" @@ -939,362 +933,360 @@ msgid "" "For bug reporting instructions, please see:\n" "." msgstr "" -"Användning: ldd [OPTION]... FILE...\n" -" --help visa denna hjälptext och avsluta\n" -" --version visa versionsinformation och avsluta\n" -" -d, --data-relocs bearbeta datarelokeringar\n" -" -r, --function-relocs bearbeta data- och funktionsrelokeringar\n" -" -u, --unused skriv ut oanvända direkta beroenden\n" -" -v, --verbose skriv all information\n" -"För felrapporteringsinstruktioner, se:\n" -".\n" -"Rapportera fel eller synpunkter på översättningen till ." +"éÓÐÏÌØÚÏ×ÁÎÉÅ: ldd [ëìàþ]... æáêì...\n" +" --help ÎÁÐÅÞÁÔÁÔØ ÜÔÕ ÓÐÒÁ×ËÕ É ×ÙÊÔÉ\n" +" --version ÎÁÐÅÞÁÔÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ É ×ÙÊÔÉ\n" +" -d, --data-relocs ÏÂÒÁÂÏÔÁÔØ ÒÅÌÏËÁÃÉÉ ÄÁÎÎÙÈ\n" +" -r, --function-relocs ÏÂÒÁÂÏÔÁÔØ ÒÅÌÏËÁÃÉÉ ÄÁÎÎÙÈ É ÆÕÎËÃÉÊ\n" +" -u, --unused ÎÁÐÅÞÁÔÁÔØ ÎÅÉÓÐÏÌØÚÕÅÍÙÅ ÐÒÑÍÙÅ ÚÁ×ÉÓÉÍÏÓÔÉ\n" +" -v, --verbose ÎÁÐÅÞÁÔÁÔØ ×ÓÀ ÉÎÆÏÒÍÁÃÉÀ\n" +"éÎÓÔÒÕËÃÉÉ ÐÏ ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÁÈ ÓÍÏÔÒÉÔÅ ÎÁ\n" +"." #: elf/ldd.bash.in:80 msgid "ldd: option `$1' is ambiguous" -msgstr "ldd: flaggan \"$1\" är tvetydig" +msgstr "ldd: ËÌÀÞ `$1' ÎÅÏÄÎÏÚÎÁÞÅÎ" #: elf/ldd.bash.in:87 msgid "unrecognized option" -msgstr "okänd flagga" +msgstr "ÎÅÒÁÓÐÏÚÎÁÎÎÙÊ ËÌÀÞ" #: elf/ldd.bash.in:88 elf/ldd.bash.in:126 msgid "Try `ldd --help' for more information." -msgstr "Försök med \"ldd --help\" för mer information" +msgstr "ðÏÐÒÏÂÕÊÔÅ `ldd --help' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÇÏ ÏÐÉÓÁÎÉÑ." #: elf/ldd.bash.in:125 msgid "missing file arguments" -msgstr "filargument saknas" +msgstr "ÏÔÓÕÔÓÔ×ÕÀÔ ÁÒÇÕÍÅÎÔÙ, ÚÁÄÁÀÝÉÅ ÆÁÊÌÙ" #. 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 "Filen eller katalogen finns inte" +msgstr "îÅÔ ÔÁËÏÇÏ ÆÁÊÌÁ ÉÌÉ ËÁÔÁÌÏÇÁ" #: elf/ldd.bash.in:151 inet/rcmd.c:483 msgid "not regular file" -msgstr "inte en normal fil" +msgstr "ÎÅ ÏÂÙÞÎÙÊ ÆÁÊÌ" #: elf/ldd.bash.in:154 msgid "warning: you do not have execution permission for" -msgstr "varning: du har inte exekveringsrättighet för" +msgstr "ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ: Õ ×ÁÓ ÎÅÔ ÐÒÁ× ÎÁ ×ÙÐÏÌÎÅÎÉÅ" #: elf/ldd.bash.in:183 msgid "\tnot a dynamic executable" -msgstr "\tinte en dynamisk körbar binär" +msgstr "\tÎÅ Ñ×ÌÑÅÔÓÑ ÄÉÎÁÍÉÞÅÓËÉÍ ÉÓÐÏÌÎÑÅÍÙÍ ÆÁÊÌÏÍ" #: elf/ldd.bash.in:191 msgid "exited with unknown exit code" -msgstr "avslutade med okänd slutstatus" +msgstr "ÚÁ×ÅÒÛÅÎÏ Ó ÎÅÉÚ×ÅÓÔÎÙÍ ×ÙÈÏÄÎÙÍ ËÏÄÏÍ" #: elf/ldd.bash.in:196 msgid "error: you do not have read permission for" -msgstr "fel: du har inte läsrättigheter för" +msgstr "ÏÛÉÂËÁ: Õ ×ÁÓ ÎÅÔ ÒÁÚÒÅÛÅÎÉÑ ÎÁ ÞÔÅÎÉÅ" #: elf/readelflib.c:35 #, c-format msgid "file %s is truncated\n" -msgstr "fil %s är trunkerad\n" +msgstr "ÆÁÊÌ %s ÕÓÅÞÅÎ\n" #: elf/readelflib.c:67 #, c-format msgid "%s is a 32 bit ELF file.\n" -msgstr "%s är en 32-bitars ELF-fil.\n" +msgstr "%s Ñ×ÌÑÅÔÓÑ 32-ÂÉÔÎÙÍ ELF-ÆÁÊÌÏÍ.\n" #: elf/readelflib.c:69 #, c-format msgid "%s is a 64 bit ELF file.\n" -msgstr "%s är en 64-bitars ELF-fil.\n" +msgstr "%s Ñ×ÌÑÅÔÓÑ 64-ÂÉÔÎÙÍ ELF-ÆÁÊÌÏÍ.\n" #: elf/readelflib.c:71 #, c-format msgid "Unknown ELFCLASS in file %s.\n" -msgstr "Okänd ELFCLASS in fil %s.\n" +msgstr "îÅÉÚ×ÅÓÔÎÙÊ ELFCLASS × ÆÁÊÌÅ %s.\n" #: elf/readelflib.c:78 #, c-format msgid "%s is not a shared object file (Type: %d).\n" -msgstr "%s är inte en delad objektfil (typ: %d).\n" +msgstr "%s ÎÅ Ñ×ÌÑÅÔÓÑ ÒÁÚÄÅÌÑÅÍÙÍ ÏÂßÅËÔÎÙÍ ÆÁÊÌÏÍ (ôÉÐ: %d).\n" #: elf/readelflib.c:109 #, c-format msgid "more than one dynamic segment\n" -msgstr "fler än ett dynamiskt segment\n" +msgstr "ÂÏÌÅÅ ÏÄÎÏÇÏ ÄÉÎÁÍÉÞÅÓËÉÈ ÓÅÇÍÅÎÔÏ×\n" #: elf/readlib.c:96 #, c-format msgid "Cannot fstat file %s.\n" -msgstr "Kan inte ta status (fstat) på fil %s.\n" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ fstat ÄÌÑ ÆÁÊÌÁ %s.\n" #: elf/readlib.c:107 #, c-format msgid "File %s is empty, not checked." -msgstr "Fil %s är tom, inte kontrollerad." +msgstr "æÁÊÌ %s ÐÕÓÔ; ÎÅ ÂÙÌ ÐÒÏ×ÅÒÅÎ." #: elf/readlib.c:113 #, c-format msgid "File %s is too small, not checked." -msgstr "Fil %s är för liten, inte kontrollerad." +msgstr "æÁÊÌ %s ÓÌÉÛËÏÍ ÍÁÌ; ÎÅ ÂÙÌ ÐÒÏ×ÅÒÅÎ." #: elf/readlib.c:123 #, c-format msgid "Cannot mmap file %s.\n" -msgstr "Kan inte minnesmappa (mmap) fil %s.\n" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÏÔÏÂÒÁÚÉÔØ × ÐÁÍÑÔØ ÆÁÊÌ %s.\n" #: elf/readlib.c:161 #, c-format msgid "%s is not an ELF file - it has the wrong magic bytes at the start.\n" -msgstr "%s är inte en ELF-fil, den har inte rätt magiskt tal i början.\n" +msgstr "%s ÎÅ Ñ×ÌÑÅÔÓÑ ELF-ÆÁÊÌÏÍ -- Õ ÎÅÇÏ × ÎÁÞÁÌÅ ÎÅÐÒÁ×ÉÌØÎÙÅ ×ÏÌÛÅÂÎÙÅ ÂÁÊÔÙ.\n" #: elf/sprof.c:77 msgid "Output selection:" -msgstr "Val av utdata:" +msgstr "÷ÙÂÏÒ ÔÉÐÁ ×Ù×ÏÄÁ:" #: elf/sprof.c:79 msgid "print list of count paths and their number of use" -msgstr "skriv lista med räknade vägar och antal användningar" +msgstr "ÎÁÐÅÞÁÔÁÔØ ÓÐÉÓÏË ÐÕÔÅÊ ÓÞÅÔÞÉËÏ× É ÞÉÓÌÏ ÉÈ ÉÓÐÏÌØÚÏ×ÁÎÉÊ" #: elf/sprof.c:81 msgid "generate flat profile with counts and ticks" -msgstr "generera platt profil med antal och tider" +msgstr "ÇÅÎÅÒÉÒÏ×ÁÔØ ÐÌÏÓËÉÊ ÐÒÏÆÉÌØ ÓÏ ÓÞÅÔÞÉËÁÍÉ É ÍÅÔËÁÍÉ" #: elf/sprof.c:82 msgid "generate call graph" -msgstr "generera anropsgraf" +msgstr "ÇÅÎÅÒÉÒÏ×ÁÔØ ÇÒÁÆ ×ÙÚÏ×Ï×" #: elf/sprof.c:89 msgid "" "Read and display shared object profiling data. For bug reporting instructions, please see:\n" ".\n" msgstr "" -"Läs och visa profildata för delat objekt. För felrapporteringsinstruktioner, se:\n" +"óÞÉÔÙ×ÁÅÔ É ÏÔÏÂÒÁÖÁÅÔ ÄÁÎÎÙÅ ÐÒÏÆÉÌÉÒÏ×ÁÎÉÑ ÒÁÚÄÅÌÑÅÍÏÇÏ ÏÂßÅËÔÁ. éÎÓÔÒÕËÃÉÉ ÐÏ ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÁÈ ÓÍÏÔÒÉÔÅ ÎÁ\n" ".\n" -"Rapportera fel eller synpunkter på översättningen till .\n" #: elf/sprof.c:94 msgid "SHOBJ [PROFDATA]" -msgstr "SHOBJ [PROFDATA]" +msgstr "òáúä-ïâÿåëô [ðòïæ-äáîîùå]" #: elf/sprof.c:400 #, c-format msgid "failed to load shared object `%s'" -msgstr "misslyckades med att ladda delat objekt \"%s\"" +msgstr "ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÒÁÚÄÅÌÑÅÍÙÊ ÏÂßÅËÔ `%s'" #: elf/sprof.c:409 #, c-format msgid "cannot create internal descriptors" -msgstr "kan inte skapa interna deskriptorer" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ×ÎÕÔÒÅÎÎÉÅ ÄÅÓËÒÉÐÔÏÒÙ" #: elf/sprof.c:528 #, c-format msgid "Reopening shared object `%s' failed" -msgstr "Öppna delat object \"%s\" igen misslyckades" +msgstr "óÂÏÊ ÐÏ×ÔÏÒÎÏÇÏ ÏÔËÒÙÔÉÑ ÒÁÚÄÅÌÑÅÍÏÇÏ ÏÂßÅËÔÁ `%s'" #: elf/sprof.c:535 elf/sprof.c:629 #, c-format msgid "reading of section headers failed" -msgstr "läsning av sektionshuvud misslyckades" +msgstr "ÞÔÅÎÉÅ ÚÁÇÏÌÏ×ËÏ× ÓÅËÃÉÉ ÎÅÕÓÐÅÛÎÏ" #: elf/sprof.c:543 elf/sprof.c:637 #, c-format msgid "reading of section header string table failed" -msgstr "läsning av sektionshuvuds strängtabell misslyckades" +msgstr "ÞÔÅÎÉÅ ÓÔÒÏËÉ ÚÁÇÏÌÏ×ËÁ ÓÅËÃÉÉ ÎÅÕÓÐÅÛÎÏ" #: elf/sprof.c:569 #, c-format msgid "*** Cannot read debuginfo file name: %m\n" -msgstr "*** Kan inte läsa fil med felsökningsinformation: %m\n" +msgstr "*** îÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ Ó ÏÔÌÁÄÏÞÎÏÊ ÉÎÆÏÒÍÁÃÉÅÊ: %m\n" #: elf/sprof.c:589 #, c-format msgid "cannot determine file name" -msgstr "kan inte avgöra filnamn" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÐÒÅÄÅÌÉÔØ ÉÍÑ ÆÁÊÌÁ" #: elf/sprof.c:622 #, c-format msgid "reading of ELF header failed" -msgstr "läsning av ELF-huvud misslyckades" +msgstr "ÓÞÉÔÙ×ÁÎÉÅ ÚÁÇÏÌÏ×ËÁ ELF ÎÅÕÓÐÅÛÎÏ" #: elf/sprof.c:658 #, c-format msgid "*** The file `%s' is stripped: no detailed analysis possible\n" -msgstr "*** Filen \"%s\" är strippad: ingen detaljerad analys är möjlig\n" +msgstr "*** æÁÊÌ `%s' ÏÞÉÝÅÎ: ÐÏÄÒÏÂÎÙÊ ÁÎÁÌÉÚ ÎÅ×ÏÚÍÏÖÅÎ\n" #: elf/sprof.c:688 #, c-format msgid "failed to load symbol data" -msgstr "misslyckades att ladda symboldata" +msgstr "ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÄÁÎÎÙÅ Ï ÓÉÍ×ÏÌÁÈ" #: elf/sprof.c:755 #, c-format msgid "cannot load profiling data" -msgstr "kan inte läsa profildata" +msgstr "ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÐÒÏÆÉÌÉÒÏ×ÏÞÎÙÅ ÄÁÎÎÙÅ" #: elf/sprof.c:764 #, c-format msgid "while stat'ing profiling data file" -msgstr "när status togs på profildatafilen" +msgstr "ÐÒÉ ÏÐÅÒÁÃÉÉ stat ÎÁÄ ÆÁÊÌÏÍ Ó ÐÒÏÆÉÌÉÒÏ×ÏÞÎÙÍÉ ÄÁÎÎÙÍÉ" #: elf/sprof.c:772 #, c-format msgid "profiling data file `%s' does not match shared object `%s'" -msgstr "profildatafil \"%s\" stämmer inte för delat objekt \"%s\"" +msgstr "ÆÁÊÌ Ó ÐÒÏÆÉÌÉÒÏ×ÏÞÎÙÍÉ ÄÁÎÎÙÍÉ `%s' ÎÅ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÒÁÚÄÅÌÑÅÍÏÍÕ ÏÂßÅËÔÕ `%s'" #: elf/sprof.c:783 #, c-format msgid "failed to mmap the profiling data file" -msgstr "misslyckades att mappa (mmap) profildatafilen" +msgstr "ÎÅ ÕÄÁÌÏÓØ ÏÔÏÂÒÁÚÉÔØ × ÐÁÍÑÔØ ÆÁÊÌ Ó ÐÒÏÆÉÌÉÒÏ×ÏÞÎÙÍÉ ÄÁÎÎÙÍÉ" #: elf/sprof.c:791 #, c-format msgid "error while closing the profiling data file" -msgstr "fel vid stängning av profildatafilen" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÚÁËÒÙÔÉÉ ÆÁÊÌÁ Ó ÐÒÏÆÉÌÉÒÏ×ÏÞÎÙÍÉ ÄÁÎÎÙÍÉ" #: elf/sprof.c:800 elf/sprof.c:870 #, c-format msgid "cannot create internal descriptor" -msgstr "kan inte skapa intern deskriptor" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ×ÎÕÔÒÅÎÎÉÊ ÄÅÓËÒÉÐÔÏÒ" #: elf/sprof.c:846 #, c-format msgid "`%s' is no correct profile data file for `%s'" -msgstr "\"%s\" är inte en korrekt profildatafil för \"%s\"" +msgstr "`%s' ÎÅ Ñ×ÌÑÅÔÓÑ ×ÅÒÎÙÍ ÆÁÊÌÏÍ Ó ÐÒÏÆÉÌÉÒÏ×ÏÞÎÙÍÉ ÄÁÎÎÙÍÉ ÄÌÑ `%s'" #: elf/sprof.c:1027 elf/sprof.c:1085 #, c-format msgid "cannot allocate symbol data" -msgstr "kan inte allokera symboldata" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ ÄÁÎÎÙÅ ÓÉÍ×ÏÌÁ" #: iconv/iconv_charmap.c:175 iconv/iconv_prog.c:315 #, c-format msgid "error while closing input `%s'" -msgstr "fel vid stängning av indata \"%s\"" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÚÁËÒÙÔÉÉ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ `%s'" #: iconv/iconv_charmap.c:449 #, c-format msgid "illegal input sequence at position %Zd" -msgstr "otillåten indatasekvens vid position %Zd" +msgstr "ÎÅÄÏÐÕÓÔÉÍÁÑ ×ÈÏÄÎÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ × ÐÏÚÉÃÉÉ %Zd" #: iconv/iconv_charmap.c:468 iconv/iconv_prog.c:525 #, c-format msgid "incomplete character or shift sequence at end of buffer" -msgstr "ofullständigt tecken eller skift-sekvens i slutet på buffert" +msgstr "ÎÅÐÏÌÎÙÊ ÚÎÁË ÉÌÉ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÓÄ×ÉÇÁ × ËÏÎÃÅ ÂÕÆÅÒÁ" #: iconv/iconv_charmap.c:513 iconv/iconv_charmap.c:549 iconv/iconv_prog.c:568 #: iconv/iconv_prog.c:604 #, c-format msgid "error while reading the input" -msgstr "fel när indata lästes" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÞÔÅÎÉÉ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ" #: iconv/iconv_charmap.c:531 iconv/iconv_prog.c:586 #, c-format msgid "unable to allocate buffer for input" -msgstr "kan inte allokera buffert för indata" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÂÕÆÅÒ ÄÌÑ ××ÏÄÁ" #: iconv/iconv_prog.c:59 msgid "Input/Output format specification:" -msgstr "In/ut formatspecifikation:" +msgstr "óÐÅÃÉÆÉËÁÃÉÑ ÆÏÒÍÁÔÁ ××ÏÄÁ/×Ù×ÏÄÁ:" #: iconv/iconv_prog.c:60 msgid "encoding of original text" -msgstr "kodning av originaltexten" +msgstr "ËÏÄÉÒÏ×ËÁ ÏÒÉÇÉÎÁÌØÎÏÇÏ ÔÅËÓÔÁ" #: iconv/iconv_prog.c:61 msgid "encoding for output" -msgstr "kodning för resultatet" +msgstr "ËÏÄÉÒÏ×ËÁ ÄÌÑ ×Ù×ÏÄÁ" #: iconv/iconv_prog.c:62 msgid "Information:" -msgstr "Information:" +msgstr "éÎÆÏÒÍÁÃÉÑ:" #: iconv/iconv_prog.c:63 msgid "list all known coded character sets" -msgstr "visa alla kända teckenuppsättningar" +msgstr "ÐÅÒÅÞÉÓÌÉÔØ ×ÓÅ ÉÚ×ÅÓÔÎÙÅ ×ÓÔÒÏÅÎÎÙÅ ËÏÄÉÒÏ×ËÉ" #: iconv/iconv_prog.c:64 locale/programs/localedef.c:126 msgid "Output control:" -msgstr "Val av utdata:" +msgstr "õÓÐÒÁ×ÌÅÎÉÅ ×Ù×ÏÄÏÍ:" #: iconv/iconv_prog.c:65 msgid "omit invalid characters from output" -msgstr "visa inte ogiltiga tecken i utdata" +msgstr "ÐÒÏÐÕÓËÁÔØ ÎÁ ×Ù×ÏÄÅ ÎÅÄÏÐÕÓÔÉÍÙÅ ÚÎÁËÉ" #: iconv/iconv_prog.c:66 msgid "output file" -msgstr "resultatfil" +msgstr "×ÙÈÏÄÎÏÊ ÆÁÊÌ" #: iconv/iconv_prog.c:67 msgid "suppress warnings" -msgstr "utelämna varningar" +msgstr "ÎÅ ÐÅÞÁÔÁÔØ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ" #: iconv/iconv_prog.c:68 msgid "print progress information" -msgstr "skriv information om körning" +msgstr "ÐÅÞÁÔÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÈÏÄÅ ÒÁÂÏÔÙ" #: iconv/iconv_prog.c:73 msgid "Convert encoding of given files from one encoding to another." -msgstr "Konvertera kodning i angivna infiler från en kodning till en annan." +msgstr "ðÒÅÏÂÒÁÚÕÅÔ ÕËÁÚÁÎÎÙÅ ÆÁÊÌÙ ÉÚ ÏÄÎÏÊ ËÏÄÉÒÏ×ËÉ × ÄÒÕÇÕÀ." #: iconv/iconv_prog.c:77 msgid "[FILE...]" -msgstr "[FIL...]" +msgstr "[æáêì...]" #: iconv/iconv_prog.c:199 #, c-format msgid "cannot open output file" -msgstr "kan inte öppna utfil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ×ÙÈÏÄÎÏÊ ÆÁÊÌ" #: iconv/iconv_prog.c:241 #, c-format msgid "conversions from `%s' and to `%s' are not supported" -msgstr "konvertering från \"%s\" och till \"%s\" stöds ej" +msgstr "ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÉÚ `%s' É × `%s' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÔÓÑ" #: iconv/iconv_prog.c:246 #, c-format msgid "conversion from `%s' is not supported" -msgstr "konvertering från \"%s\" stöds ej" +msgstr "ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÉÚ `%s' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: iconv/iconv_prog.c:253 #, c-format msgid "conversion to `%s' is not supported" -msgstr "konvertering till \"%s\" stöds ej" +msgstr "ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ × `%s' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: iconv/iconv_prog.c:257 #, c-format msgid "conversion from `%s' to `%s' is not supported" -msgstr "konvertering från \"%s\" till \"%s\" stöds ej" +msgstr "ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÉÚ `%s' × `%s' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: iconv/iconv_prog.c:267 #, c-format msgid "failed to start conversion processing" -msgstr "misslyckades att starta konverteringsprocessen" +msgstr "ÎÅ ÕÄÁÌÏÓØ ÎÁÞÁÔØ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ" #: iconv/iconv_prog.c:361 #, c-format msgid "error while closing output file" -msgstr "fel vid stängning av utfilen" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÚÁËÒÙÔÉÉ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ" #: iconv/iconv_prog.c:470 iconv/iconv_prog.c:496 #, c-format msgid "conversion stopped due to problem in writing the output" -msgstr "konvertering avslutades på grund av problem med att skriva resultatet" +msgstr "ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÏÓÔÁÎÏ×ÌÅÎÏ ÉÚ-ÚÁ ÐÒÏÂÌÅÍÙ ÐÒÉ ÚÁÐÉÓÉ ×Ù×ÏÄÁ" #: iconv/iconv_prog.c:521 #, c-format msgid "illegal input sequence at position %ld" -msgstr "otillåten indatasekvens vid position %ld" +msgstr "ÎÅÄÏÐÕÓÔÉÍÁÑ ×ÈÏÄÎÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ × ÐÏÚÉÃÉÉ %ld" #: iconv/iconv_prog.c:529 #, c-format msgid "internal error (illegal descriptor)" -msgstr "internt fel (otillåten deskriptor)" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ (ÎÅ×ÅÒÎÙÊ ÄÅÓËÒÉÐÔÏÒ)" #: iconv/iconv_prog.c:532 #, c-format msgid "unknown iconv() error %d" -msgstr "okänt fel från iconv() %d" +msgstr "ÎÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ iconv() %d" #: iconv/iconv_prog.c:778 msgid "" @@ -1305,202 +1297,202 @@ msgid "" "\n" " " msgstr "" -"Följande lista innehåller alla teckenuppsättningar som är kända. Detta\n" -"betyder inte nödvändigtvis att alla kombinationer av dessa namn kan ges\n" -"som FRÅN och TILL argument. En teckenuppsättning kan ha flera olika namn\n" -"(alias).\n" +"óÌÅÄÕÀÝÉÊ ÓÐÉÓÏË ÓÏÄÅÒÖÉÔ ×ÓÅ ÉÚ×ÅÓÔÎÙÅ ×ÓÔÒÏÅÎÎÙÅ ËÏÄÉÒÏ×ËÉ. üÔÏ ÎÅ\n" +"ÏÂÑÚÁÔÅÌØÎÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÌÀÂÙÅ ËÏÍÂÉÎÁÃÉÉ ÄÁÎÎÙÈ\n" +"ÉÍÅÎ × ÐÁÒÁÍÅÔÒÁÈ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ FROM É TO. ïÄÎÁ É ÔÁ ÖÅ ËÏÄÉÒÏ×ËÁ\n" +"ÍÏÖÅÔ ÂÙÔØ ÐÅÒÅÞÉÓÌÅÎÁ ÐÏÄ ÎÅÓËÏÌØËÉÍÉ ÉÍÅÎÁÍÉ (ÐÓÅ×ÄÏÎÉÍÁÍÉ).\n" "\n" " " #: iconv/iconvconfig.c:109 msgid "Create fastloading iconv module configuration file." -msgstr "Skapa en snabbladdande modulkonfigurationsfil för iconv." +msgstr "óÏÚÄÁÅÔ ÂÙÓÔÒÏÚÁÇÒÕÖÁÅÍÙÊ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÆÁÊÌ ÍÏÄÕÌÑ iconv." #: iconv/iconvconfig.c:113 msgid "[DIR...]" -msgstr "[KATALOG...]" +msgstr "[ëáôáìïç...]" #: iconv/iconvconfig.c:126 msgid "Prefix used for all file accesses" -msgstr "Prefix att använda för alla filåtkomster" +msgstr "ðÒÅÆÉËÓ, ÉÓÐÏÌØÚÕÅÍÙÊ ÄÌÑ ÄÏÓÔÕÐÁ ËÏ ×ÓÅÍ ÆÁÊÌÁÍ" #: iconv/iconvconfig.c:127 msgid "Put output in FILE instead of installed location (--prefix does not apply to FILE)" -msgstr "Spara utdata i FIL istället för installationsplatsen (--prefix gäller inte för FIL)" +msgstr "úÁÐÉÓÁÔØ ×Ù×ÏÄ × æáêì, Á ÎÅ × ÍÅÓÔÏ ÕÓÔÁÎÏ×ËÉ (--prefix ÎÅ ÐÒÉÍÅÎÑÅÔÓÑ Ë æáêìõ)" #: iconv/iconvconfig.c:131 msgid "Do not search standard directories, only those on the command line" -msgstr "Sök inte i standardkatalogerna, bara i de som ges på kommandoraden" +msgstr "îÅ ÉÓËÁÔØ × ÓÔÁÎÄÁÒÔÎÙÈ ËÁÔÁÌÏÇÁÈ, Á ÔÏÌØËÏ × ÕËÁÚÁÎÎÙÈ × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ" #: iconv/iconvconfig.c:300 #, c-format msgid "Directory arguments required when using --nostdlib" -msgstr "Katalogargument krävs när --nostdlib används" +msgstr "ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ --nostdlib ÔÒÅÂÕÅÔÓÑ ÚÁÄÁ×ÁÔØ ÁÒÇÕÍÅÎÔÙ-ËÁÔÁÌÏÇÉ" #: iconv/iconvconfig.c:342 locale/programs/localedef.c:290 #, c-format msgid "no output file produced because warnings were issued" -msgstr "ingen utfil skapad på grund av varningar" +msgstr "×ÙÈÏÄÎÏÊ ÆÁÊÌ ÎÅ ÓÏÚÄÁÎ, ÐÏÓËÏÌØËÕ ÂÙÌÉ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ" #: iconv/iconvconfig.c:428 #, c-format msgid "while inserting in search tree" -msgstr "vid insättning i sökträd" +msgstr "ÐÒÉ ×ÓÔÁ×ËÅ × ÄÅÒÅ×Ï ÐÏÉÓËÁ" #: iconv/iconvconfig.c:1236 #, c-format msgid "cannot generate output file" -msgstr "kan inte generera utfil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÇÅÎÅÒÉÒÏ×ÁÔØ ×ÙÈÏÄÎÏÊ ÆÁÊÌ" #: inet/rcmd.c:157 msgid "rcmd: Cannot allocate memory\n" -msgstr "rcmd: Kan inte allokera minne\n" +msgstr "rcmd: îÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ\n" #: inet/rcmd.c:172 msgid "rcmd: socket: All ports in use\n" -msgstr "rcmd: uttag (socket): Alla portar används\n" +msgstr "rcmd: socket: ÷ÓÅ ÐÏÒÔÙ ÉÓÐÏÌØÚÕÀÔÓÑ\n" #: inet/rcmd.c:200 #, c-format msgid "connect to address %s: " -msgstr "anslut till adress %s: " +msgstr "ÓÏÅÄÉÎÅÎÉÅ Ó ÁÄÒÅÓÏÍ %s: " #: inet/rcmd.c:213 #, c-format msgid "Trying %s...\n" -msgstr "Provar %s...\n" +msgstr "ðÏÐÙÔËÁ %s...\n" #: inet/rcmd.c:249 #, c-format msgid "rcmd: write (setting up stderr): %m\n" -msgstr "rcmd: write: (sätter upp standard fel): %m\n" +msgstr "rcmd: write (ÎÁÓÔÒÏÊËÁ stderr): %m\n" #: inet/rcmd.c:265 #, c-format msgid "rcmd: poll (setting up stderr): %m\n" -msgstr "rcmd: poll (sätter upp standard fel): %m\n" +msgstr "rcmd: poll (ÎÁÓÔÒÏÊËÁ stderr): %m\n" #: inet/rcmd.c:268 msgid "poll: protocol failure in circuit setup\n" -msgstr "poll: protokollfel i förbindelseuppsättning\n" +msgstr "poll: ÓÂÏÊ ÐÒÏÔÏËÏÌÁ ÐÒÉ ÎÁÓÔÒÏÊËÅ ÃÅÐÉ\n" #: inet/rcmd.c:301 msgid "socket: protocol failure in circuit setup\n" -msgstr "uttag (socket): protokollfel i förbindelseuppsättning\n" +msgstr "socket: ÓÂÏÊ ÐÒÏÔÏËÏÌÁ ÐÒÉ ÎÁÓÔÒÏÊËÅ ÃÅÐÉ\n" #: inet/rcmd.c:325 #, c-format msgid "rcmd: %s: short read" -msgstr "rcmd: %s: läsning gav för lite data" +msgstr "rcmd: %s: ÎÅÐÏÌÎÏÅ ÞÔÅÎÉÅ" #: inet/rcmd.c:481 msgid "lstat failed" -msgstr "misslyckades ta status (lstat)" +msgstr "lstat ÎÅÕÓÐÅÛÎÁ" #: inet/rcmd.c:488 msgid "cannot open" -msgstr "kan inte öppna" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ" #: inet/rcmd.c:490 msgid "fstat failed" -msgstr "misslyckades ta status (fstat)" +msgstr "fstat ÎÅÕÓÐÅÛÎÁ" #: inet/rcmd.c:492 msgid "bad owner" -msgstr "olämplig ägare" +msgstr "ÎÅÐÒÁ×ÉÌØÎÙÊ ×ÌÁÄÅÌÅÃ" #: inet/rcmd.c:494 msgid "writeable by other than owner" -msgstr "skrivbar för andra än ägaren" +msgstr "ÍÏÖÅÔ ÚÁÐÉÓÙ×ÁÔØÓÑ ÎÅ ×ÌÁÄÅÌØÃÅÍ" #: inet/rcmd.c:496 msgid "hard linked somewhere" -msgstr "hårdlänkad någonstans" +msgstr "ÉÍÅÅÔÓÑ ÖÅÓÔËÁÑ ÓÓÙÌËÁ" #: inet/ruserpass.c:170 inet/ruserpass.c:193 msgid "out of memory" -msgstr "minnet slut" +msgstr "ÎÅÄÏÓÔÁÔÏÞÎÏ ÐÁÍÑÔÉ" #: inet/ruserpass.c:184 msgid "Error: .netrc file is readable by others." -msgstr "Fel: .netrc kan läsas av andra." +msgstr "ïÛÉÂËÁ: ÆÁÊÌ .netrc ÍÏÖÅÔ ÚÁÐÉÓÙ×ÁÔØÓÑ ÄÒÕÇÉÍÉ." #: inet/ruserpass.c:185 msgid "Remove password or make file unreadable by others." -msgstr "Ta bort lösenord eller gör filen oläsbar för andra" +msgstr "õÄÁÌÉÔÅ ÐÁÒÏÌØ ÉÌÉ ÓÄÅÌÁÊÔÅ ÆÁÊÌ ÎÅÞÉÔÁÅÍÙÍ ÄÒÕÇÉÍÉ." #: inet/ruserpass.c:277 #, c-format msgid "Unknown .netrc keyword %s" -msgstr "Okänt .netrc-nyckelord %s" +msgstr "îÅÉÚ×ÅÓÔÎÏÅ ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï .netrc %s" #: libidn/nfkc.c:464 msgid "Character out of range for UTF-8" -msgstr "Tecken utanför intervallet för UTF-8" +msgstr "úÎÁË ×ÎÅ ÄÉÁÐÁÚÏÎÁ ÄÌÑ UTF-8" #: locale/programs/charmap-dir.c:57 #, c-format msgid "cannot read character map directory `%s'" -msgstr "kan inte läsa teckenuppsättningskatalog \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ ËÁÔÁÌÏÇ ÏÔÏÂÒÁÖÅÎÉÊ ÚÎÁËÏ× `%s'" #: locale/programs/charmap.c:137 #, c-format msgid "character map file `%s' not found" -msgstr "teckenuppsättningsfil \"%s\" finns inte" +msgstr "ÆÁÊÌ ÏÔÏÂÒÁÖÅÎÉÊ ÚÎÁËÏ× `%s' ÎÅ ÎÁÊÄÅÎ" #: locale/programs/charmap.c:194 #, c-format msgid "default character map file `%s' not found" -msgstr "standardteckenuppsättningsfil \"%s\" inte hittad" +msgstr "ÐÒÉÍÅÎÑÅÍÙÊ ÐÏ ÕÍÏÌÞÁÎÉÀ ÆÁÊÌ ÏÔÏÂÒÁÖÅÎÉÊ ÚÎÁËÏ× `%s' ÎÅ ÎÁÊÄÅÎ" #: locale/programs/charmap.c:257 #, c-format msgid "character map `%s' is not ASCII compatible, locale not ISO C compliant\n" -msgstr "teckenuppsättning \"%s\" är inte ASCII-kompatibel, lokal är inte ISO C-kompatibel\n" +msgstr "ÏÔÏÂÒÁÖÅÎÉÅ ÚÎÁËÏ× `%s' ÎÅ ÓÏ×ÍÅÓÔÉÍÏ Ó ASCII, ÌÏËÁÌØ ÎÅ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÓÔÁÎÄÁÒÔÕ ISO C\n" #: locale/programs/charmap.c:336 #, c-format msgid "%s: must be greater than \n" -msgstr "%s: måste vara större än \n" +msgstr "%s: ÄÏÌÖÎÏ ÂÙÔØ ÂÏÌØÛÅ ÞÅÍ \n" #: locale/programs/charmap.c:356 locale/programs/charmap.c:373 #: locale/programs/repertoire.c:174 #, c-format msgid "syntax error in prolog: %s" -msgstr "syntaxfel i prolog: %s" +msgstr "ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ × ÐÒÏÌÏÇÅ: %s" #: locale/programs/charmap.c:357 msgid "invalid definition" -msgstr "ogiltig definition" +msgstr "ÎÅ×ÅÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ" #: locale/programs/charmap.c:374 locale/programs/locfile.c:125 #: locale/programs/locfile.c:152 locale/programs/repertoire.c:175 msgid "bad argument" -msgstr "dåligt argument" +msgstr "ÎÅÐÒÁ×ÉÌØÎÙÊ ÁÒÇÕÍÅÎÔ" #: locale/programs/charmap.c:402 #, c-format msgid "duplicate definition of <%s>" -msgstr "dubblerad definition av <%s>" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ÄÌÑ <%s>" #: locale/programs/charmap.c:409 #, c-format msgid "value for <%s> must be 1 or greater" -msgstr "värdet på <%s> måste vara 1 eller större" +msgstr "ÚÎÁÞÅÎÉÅ <%s> ÄÏÌÖÎÏ ÂÙÔØ 1 ÉÌÉ ÂÏÌØÛÅ" #: locale/programs/charmap.c:421 #, c-format msgid "value of <%s> must be greater or equal than the value of <%s>" -msgstr "värdet på <%s> måste vara större eller lika med värdet på <%s>" +msgstr "ÚÎÁÞÅÎÉÅ <%s> ÄÏÌÖÎÏ ÂÙÔØ ÂÏÌØÛÅ ÉÌÉ ÒÁ×ÎÏ ÚÎÁÞÅÎÉÀ <%s>" #: locale/programs/charmap.c:444 locale/programs/repertoire.c:183 #, c-format msgid "argument to <%s> must be a single character" -msgstr "argumentet till <%s> måste vara ett enskilt tecken" +msgstr "ÁÒÇÕÍÅÎÔ ÄÌÑ <%s> ÄÏÌÖÅÎ ÂÙÔØ ÏÄÎÉÍ ÚÎÁËÏÍ" #: locale/programs/charmap.c:470 msgid "character sets with locking states are not supported" -msgstr "teckenuppsättningar med låsta tillstånd stöds ej" +msgstr "ËÏÄÉÒÏ×ËÉ Ó ÂÌÏËÉÒÕÀÝÉÍÉ ÓÏÓÔÏÑÎÉÑÍÉ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÔÓÑ" #: locale/programs/charmap.c:497 locale/programs/charmap.c:551 #: locale/programs/charmap.c:583 locale/programs/charmap.c:677 @@ -1508,49 +1500,49 @@ msgstr "teckenuppsättningar med låsta tillstånd stöds ej" #: locale/programs/charmap.c:814 #, c-format msgid "syntax error in %s definition: %s" -msgstr "syntaxfel i definition av %s: %s" +msgstr "ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ × ÏÐÒÅÄÅÌÅÎÉÉ %s: %s" #: locale/programs/charmap.c:498 locale/programs/charmap.c:678 #: locale/programs/charmap.c:774 locale/programs/repertoire.c:230 msgid "no symbolic name given" -msgstr "inget symboliskt namn givet" +msgstr "ÎÅ ÚÁÄÁÎÏ ÓÉÍ×ÏÌØÎÏÅ ÉÍÑ" #: locale/programs/charmap.c:552 msgid "invalid encoding given" -msgstr "ogiltig kodning given" +msgstr "ÚÁÄÁÎÁ ÎÅ×ÅÒÎÁÑ ËÏÄÉÒÏ×ËÁ" #: locale/programs/charmap.c:561 msgid "too few bytes in character encoding" -msgstr "för få byte i teckenkodning" +msgstr "ÓÌÉÛËÏÍ ÍÁÌÏ ÂÁÊÔ × ËÏÄÉÒÏ×ËÅ ÚÎÁËÁ" #: locale/programs/charmap.c:563 msgid "too many bytes in character encoding" -msgstr "för många tecken i teckenkodning" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÂÁÊÔ × ËÏÄÉÒÏ×ËÅ ÚÎÁËÁ" #: locale/programs/charmap.c:585 locale/programs/charmap.c:733 #: locale/programs/charmap.c:816 locale/programs/repertoire.c:296 msgid "no symbolic name given for end of range" -msgstr "inget symboliskt namn givet för slutet av intervallet" +msgstr "ÎÅ ÚÁÄÁÎÏ ÓÉÍ×ÏÌØÎÏÅ ÉÍÑ ÄÌÑ ËÏÎÃÁ ÄÉÁÐÁÚÏÎÁ" #: locale/programs/charmap.c:609 locale/programs/locfile.c:818 #: locale/programs/repertoire.c:313 #, c-format msgid "`%1$s' definition does not end with `END %1$s'" -msgstr "definition av \"%1$s\" slutar inte med \"END %1$s\"" +msgstr "ÏÐÒÅÄÅÌÅÎÉÅ `%1$s' ÎÅ ÚÁËÁÎÞÉ×ÁÅÔÓÑ ÎÁ `END %1$s'" #: locale/programs/charmap.c:642 msgid "only WIDTH definitions are allowed to follow the CHARMAP definition" -msgstr "endast definition av \"WIDTH\" får följa definitionen av \"CHARMAP\"" +msgstr "ÐÏÓÌÅ ÏÐÒÅÄÅÌÅÎÉÑ CHARMAP ÍÏÇÕÔ ÓÌÅÄÏ×ÁÔØ ÔÏÌØËÏ ÏÐÒÅÄÅÌÅÎÉÑ WIDTH" #: locale/programs/charmap.c:650 locale/programs/charmap.c:713 #, c-format msgid "value for %s must be an integer" -msgstr "värdet på %s måste vara heltal" +msgstr "ÚÎÁÞÅÎÉÅ ÄÌÑ %s ÄÏÌÖÎÏ ÂÙÔØ ÃÅÌÙÍ ÞÉÓÌÏÍ" #: locale/programs/charmap.c:841 #, c-format msgid "%s: error in state machine" -msgstr "%s: fel i tillståndsmaskin" +msgstr "%s: ÏÛÉÂËÁ × Á×ÔÏÍÁÔÅ" #: locale/programs/charmap.c:849 locale/programs/ld-address.c:615 #: locale/programs/ld-collate.c:2650 locale/programs/ld-collate.c:3820 @@ -1563,41 +1555,39 @@ msgstr "%s: fel i tillståndsmaskin" #: locale/programs/locfile.c:825 locale/programs/repertoire.c:324 #, c-format msgid "%s: premature end of file" -msgstr "%s: för tidigt filslut" +msgstr "%s: ÐÒÅÖÄÅ×ÒÅÍÅÎÎÙÊ ËÏÎÅà ÆÁÊÌÁ" #: locale/programs/charmap.c:868 locale/programs/charmap.c:879 #, c-format msgid "unknown character `%s'" -msgstr "okänt tecken \"%s\"" +msgstr "ÎÅÉÚ×ÅÓÔÎÙÊ ÚÎÁË `%s'" #: locale/programs/charmap.c:887 #, c-format msgid "number of bytes for byte sequence of beginning and end of range not the same: %d vs %d" -msgstr "" -"antal byte för bytesekvens angivet i början respektive slutet av intervallet\n" -"skiljer sig: %d respektive %d" +msgstr "ÞÉÓÌÏ ÂÁÊÔ ÄÌÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÂÁÊÔ ÎÁÞÁÌÁ É ËÏÎÃÁ ÄÉÁÐÁÚÏÎÁ ÎÅ ÓÏ×ÐÁÄÁÀÔ: %d É %d" #: locale/programs/charmap.c:992 locale/programs/ld-collate.c:2933 #: locale/programs/repertoire.c:419 msgid "invalid names for character range" -msgstr "ogiltiga namn för teckenintervall" +msgstr "ÎÅÄÏÐÕÓÔÉÍÙÅ ÉÍÅÎÁ ÄÌÑ ÄÉÁÐÁÚÏÎÁ ÚÎÁËÏ×" #: locale/programs/charmap.c:1004 locale/programs/repertoire.c:431 msgid "hexadecimal range format should use only capital characters" -msgstr "hexadecimalt intervallformat bör endast använda versaler" +msgstr "× ÛÅÓÔÎÁÄÃÁÔÉÒÉÞÎÏÍ ÆÏÒÍÁÔÅ ÄÉÁÐÁÚÏÎÁ ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÔÏÌØËÏ ÚÁÇÌÁ×ÎÙÅ ÂÕË×Ù" #: locale/programs/charmap.c:1022 #, c-format msgid "<%s> and <%s> are illegal names for range" -msgstr "<%s> och <%s> är otillåtna namn för intervall" +msgstr "<%s> É <%s> -- ÎÅÄÏÐÕÓÔÉÍÙÅ ÉÍÅÎÁ ÄÌÑ ÄÉÁÐÁÚÏÎÁ" #: locale/programs/charmap.c:1028 msgid "upper limit in range is not higher then lower limit" -msgstr "övre gräns i intervall är inte större än undre gräns" +msgstr "×ÅÒÈÎÑÑ ÇÒÁÎÉÃÁ ÄÉÁÐÁÚÏÎÁ ÎÅ ÂÏÌØÛÅ ÎÉÖÎÅÊ ÇÒÁÎÉÃÙ" #: locale/programs/charmap.c:1086 msgid "resulting bytes for range not representable." -msgstr "resulterande byte för intervall är inte representerbara." +msgstr "ÒÅÚÕÌØÔÉÒÕÀÝÉÅ ÂÁÊÔÙ ÄÌÑ ÄÉÁÐÁÚÏÎÁ ÎÅ×ÏÚÍÏÖÎÏ ÍÁÛÉÎÎÏ ÐÒÅÄÓÔÁ×ÉÔØ." #: locale/programs/ld-address.c:132 locale/programs/ld-collate.c:1532 #: locale/programs/ld-ctype.c:419 locale/programs/ld-identification.c:132 @@ -1607,7 +1597,7 @@ msgstr "resulterande byte för intervall är inte representerbara." #: locale/programs/ld-telephone.c:93 locale/programs/ld-time.c:158 #, c-format msgid "No definition for %s category found" -msgstr "Hittade ingen definition för kategori %s" +msgstr "îÅ ÎÁÊÄÅÎÏ ÏÐÒÅÄÅÌÅÎÉÑ ÄÌÑ ËÁÔÅÇÏÒÉÉ %s" #: locale/programs/ld-address.c:143 locale/programs/ld-address.c:181 #: locale/programs/ld-address.c:199 locale/programs/ld-address.c:228 @@ -1623,45 +1613,45 @@ msgstr "Hittade ingen definition för kategori %s" #: locale/programs/ld-time.c:195 #, c-format msgid "%s: field `%s' not defined" -msgstr "%s: fält \"%s\" är inte definierat" +msgstr "%s: ÐÏÌÅ `%s' ÎÅ ÏÐÒÅÄÅÌÅÎÏ" #: locale/programs/ld-address.c:155 locale/programs/ld-address.c:207 #: locale/programs/ld-address.c:237 locale/programs/ld-address.c:275 #: locale/programs/ld-name.c:116 locale/programs/ld-telephone.c:116 #, c-format msgid "%s: field `%s' must not be empty" -msgstr "%s: fält \"%s\" kan inte vara tomt" +msgstr "%s: ÐÏÌÅ `%s' ÄÏÌÖÎÏ ÂÙÔØ ÎÅÐÕÓÔÙÍ" #: locale/programs/ld-address.c:167 #, c-format msgid "%s: invalid escape `%%%c' sequence in field `%s'" -msgstr "%s: ogiltig kontrollsekvens \"%%%c\" i fält \"%s\" " +msgstr "%s: ÎÅ×ÅÒÎÁÑ ÕÐÒÁ×ÌÑÀÝÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ `%%%c' × ÐÏÌÅ `%s'" #: locale/programs/ld-address.c:218 #, c-format msgid "%s: terminology language code `%s' not defined" -msgstr "%s: terminologilandskod \"%s\" inte definierad" +msgstr "" #: locale/programs/ld-address.c:243 #, c-format msgid "%s: field `%s' must not be defined" -msgstr "%s: fält \"%s\" får inte definieras" +msgstr "%s: ÐÏÌÅ `%s' ÎÅ ÄÏÌÖÎÏ ÂÙÔØ ÏÐÒÅÄÅÌÅÎÏ" #: locale/programs/ld-address.c:257 locale/programs/ld-address.c:286 #, c-format msgid "%s: language abbreviation `%s' not defined" -msgstr "%s: språkförkortning \"%s\" inte definierad" +msgstr "%s: ÓÏËÒÁÝÅÎÎÏÅ ÉÍÑ ÑÚÙËÁ `%s' ÎÅ ÏÐÒÅÄÅÌÅÎÏ" #: locale/programs/ld-address.c:264 locale/programs/ld-address.c:292 #: locale/programs/ld-address.c:326 locale/programs/ld-address.c:338 #, c-format msgid "%s: `%s' value does not match `%s' value" -msgstr "%s: värdet på \"%s\" stämmer inte med värdet på \"%s\"" +msgstr "%s: ÚÎÁÞÅÎÉÅ `%s' ÎÅ ÓÏ×ÐÁÄÁÅÔ ÓÏ ÚÎÁÞÅÎÉÅÍ `%s'" #: locale/programs/ld-address.c:311 #, c-format msgid "%s: numeric country code `%d' not valid" -msgstr "%s: numerisk landkod \"%d\" är inte giltig" +msgstr "%s: ÎÅ×ÅÒÎÙÊ ÞÉÓÌÏ×ÏÊ ËÏÄ ÓÔÒÁÎÙ `%d'" #: locale/programs/ld-address.c:507 locale/programs/ld-address.c:544 #: locale/programs/ld-address.c:582 locale/programs/ld-ctype.c:2603 @@ -1674,7 +1664,7 @@ msgstr "%s: numerisk landkod \"%d\" är inte giltig" #: locale/programs/ld-time.c:1167 #, c-format msgid "%s: field `%s' declared more than once" -msgstr "%s: fält \"%s\" är deklarerad mer än en gång" +msgstr "%s: ÐÏÌÅ `%s' ÏÂßÑ×ÌÅÎÏ ÎÅÓËÏÌØËÏ ÒÁÚ" #: locale/programs/ld-address.c:511 locale/programs/ld-address.c:549 #: locale/programs/ld-identification.c:367 locale/programs/ld-messages.c:310 @@ -1684,7 +1674,7 @@ msgstr "%s: fält \"%s\" är deklarerad mer än en gång" #: locale/programs/ld-time.c:1088 locale/programs/ld-time.c:1130 #, c-format msgid "%s: unknown character in field `%s'" -msgstr "%s: okänt tecken i fält \"%s\"" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ÚÎÁË × ÐÏÌÅ `%s'" #: locale/programs/ld-address.c:596 locale/programs/ld-collate.c:3802 #: locale/programs/ld-ctype.c:2976 locale/programs/ld-identification.c:448 @@ -1694,7 +1684,7 @@ msgstr "%s: okänt tecken i fält \"%s\"" #: locale/programs/ld-telephone.c:310 locale/programs/ld-time.c:1218 #, c-format msgid "%s: incomplete `END' line" -msgstr "%s: ofullständig \"END\"-rad" +msgstr "%s: ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ÓÔÒÏËÁ `END'" #: locale/programs/ld-address.c:599 locale/programs/ld-collate.c:2653 #: locale/programs/ld-collate.c:3804 locale/programs/ld-ctype.c:2227 @@ -1705,7 +1695,7 @@ msgstr "%s: ofullständig \"END\"-rad" #: locale/programs/ld-telephone.c:312 locale/programs/ld-time.c:1220 #, c-format msgid "%1$s: definition does not end with `END %1$s'" -msgstr "%1$s: definition slutar inte med \"END %1$s\"" +msgstr "%1$s: ÏÐÒÅÄÅÌÅÎÉÅ ÎÅ ÚÁËÁÎÞÉ×ÁÅÔÓÑ ÎÁ `END %1$s'" #: locale/programs/ld-address.c:606 locale/programs/ld-collate.c:521 #: locale/programs/ld-collate.c:573 locale/programs/ld-collate.c:869 @@ -1719,417 +1709,417 @@ msgstr "%1$s: definition slutar inte med \"END %1$s\"" #: locale/programs/ld-telephone.c:319 locale/programs/ld-time.c:1227 #, c-format msgid "%s: syntax error" -msgstr "%s: syntaxfel" +msgstr "%s: ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ" #: locale/programs/ld-collate.c:396 #, c-format msgid "`%.*s' already defined in charmap" -msgstr "\"%.*s\" redan definerad i teckenuppsättning" +msgstr "`%.*s' ÕÖÅ ÏÐÒÅÄÅÌÅÎ × ÏÔÏÂÒÁÖÅÎÉÉ ÚÎÁËÏ×" #: locale/programs/ld-collate.c:405 #, c-format msgid "`%.*s' already defined in repertoire" -msgstr "\"%.*s\" redan definierad i repertoar" +msgstr "`%.*s' ÕÖÅ ÏÐÒÅÄÅÌÅÎÏ × ÒÅÐÅÒÔÕÁÒÅ" #: locale/programs/ld-collate.c:412 #, c-format msgid "`%.*s' already defined as collating symbol" -msgstr "\"%.*s\" redan definierad som ett kollationssymbol" +msgstr "`%.*s' ÕÖÅ ÏÐÒÅÄÅÌÅÎÏ ËÁË ÓÉÍ×ÏÌ ÓÏÒÔÉÒÏ×ËÉ" #: locale/programs/ld-collate.c:419 #, c-format msgid "`%.*s' already defined as collating element" -msgstr "\"%.*s\" redan definierad som ett kollationselement" +msgstr "`%.*s' ÕÖÅ ÏÐÒÅÄÅÌÅÎÏ ËÁË ÜÌÅÍÅÎÔ ÓÏÒÔÉÒÏ×ËÉ" #: locale/programs/ld-collate.c:450 locale/programs/ld-collate.c:476 #, c-format msgid "%s: `forward' and `backward' are mutually excluding each other" -msgstr "%s: sorteringsordning \"forward\" och \"backward\" är ömsesidigt uteslutande" +msgstr "%s: `forward' É `backward' ×ÚÁÉÍÎÏ ÉÓËÌÀÞÁÀÔÓÑ" #: locale/programs/ld-collate.c:460 locale/programs/ld-collate.c:486 #: locale/programs/ld-collate.c:502 #, c-format msgid "%s: `%s' mentioned more than once in definition of weight %d" -msgstr "%s: \"%s\" är nämnd fler än en gång i definitionen av vikt %d" +msgstr "%s: `%s' ×ÓÔÒÅÞÁÅÔÓÑ ÂÏÌÅÅ ÏÄÎÏÇÏ ÒÁÚÁ × ÏÐÒÅÄÅÌÅÎÉÉ ×ÅÓÁ %d" #: locale/programs/ld-collate.c:558 #, c-format msgid "%s: too many rules; first entry only had %d" -msgstr "%s: för många regler, första delen hade bara %d" +msgstr "%s: ÓÌÉÛËÏÍ ÍÎÏÇÏ ÐÒÁ×ÉÌ; × ÐÅÒ×ÏÍ ×ÈÏÖÄÅÎÉÉ ÂÙÌÏ ÔÏÌØËÏ %d" #: locale/programs/ld-collate.c:594 #, c-format msgid "%s: not enough sorting rules" -msgstr "%s: inte tillräckligt med sorteringsregler" +msgstr "%s: ÎÅÄÏÓÔÁÔÏÞÎÏ ÐÒÁ×ÉÌ ÓÏÒÔÉÒÏ×ËÉ" #: locale/programs/ld-collate.c:759 #, c-format msgid "%s: empty weight string not allowed" -msgstr "%s: tomt viktnamn är inte tillåtet" +msgstr "%s: ÐÕÓÔÁÑ ÓÔÒÏËÁ ×ÅÓÁ ÎÅÄÏÐÕÓÔÉÍÁ" #: locale/programs/ld-collate.c:854 #, c-format msgid "%s: weights must use the same ellipsis symbol as the name" -msgstr "%s: vikter måste använda samma intervallsymbol som namn" +msgstr "%s: ×ÅÓÁ ÄÏÌÖÎÙ ÉÓÐÏÌØÚÏ×ÁÔØ ÔÁËÏÊ ÖÅ ÓÉÍ×ÏÌ ÜÌÌÉÐÓÉÓÁ, ËÁË ÉÍÑ" #: locale/programs/ld-collate.c:910 #, c-format msgid "%s: too many values" -msgstr "%s: för många värden" +msgstr "%s: ÓÌÉÛËÏÍ ÍÎÏÇÏ ÚÎÁÞÅÎÉÊ" #: locale/programs/ld-collate.c:1029 locale/programs/ld-collate.c:1204 #, c-format msgid "order for `%.*s' already defined at %s:%Zu" -msgstr "ordningsföljd för \"%.*s\" redan definierad vid %s:%Zu" +msgstr "ÐÏÒÑÄÏË ÄÌÑ `%.*s' ÕÖÅ ÏÐÒÅÄÅÌÅÎ × %s:%Zu" #: locale/programs/ld-collate.c:1079 #, c-format msgid "%s: the start and the end symbol of a range must stand for characters" -msgstr "%s: start- och slut-symbol i ett intervall måste representera tecken" +msgstr "%s: ÎÁÞÁÌØÎÙÊ É ËÏÎÅÞÎÙÊ ÓÉÍ×ÏÌÙ ÄÉÁÐÁÚÏÎÁ ÄÏÌÖÎÙ ÏÂÏÚÎÁÞÁÔØ ÚÎÁËÉ" #: locale/programs/ld-collate.c:1106 #, c-format msgid "%s: byte sequences of first and last character must have the same length" -msgstr "%s: bytesekvens för första och sista tecknet måste ha samma längd" +msgstr "%s: ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÂÁÊÔ ÄÌÑ ÐÅÒ×ÏÇÏ É ÐÏÓÌÅÄÎÅÇÏ ÚÎÁËÁ ÄÏÌÖÎÙ ÂÙÔØ ÏÄÉÎÁËÏ×ÏÊ ÄÌÉÎÙ" #: locale/programs/ld-collate.c:1148 #, c-format msgid "%s: byte sequence of first character of sequence is not lower than that of the last character" -msgstr "%s: bytesekvens för första tecknet är inte mindre än den för sista tecknet" +msgstr "%s: ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÂÁÊÔ ÄÌÑ ÐÅÒ×ÏÇÏ ÚÎÁËÁ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÎÅ ÍÅÎØÛÅ ÞÅÍ ÄÌÑ ÐÏÓÌÅÄÎÅÇÏ" #: locale/programs/ld-collate.c:1273 #, c-format msgid "%s: symbolic range ellipsis must not directly follow `order_start'" -msgstr "%s: symboliskt intervall kan inte vara omedelbart efter \"order_start\"" +msgstr "%s: ÜÌÌÉÐÓÉÓ ÓÉÍ×ÏÌØÎÏÇÏ ÄÉÁÐÁÚÏÎÁ ÎÅ ÍÏÖÅÔ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ ÓÌÅÄÏ×ÁÔØ ÐÏÓÌÅ `order_start'" #: locale/programs/ld-collate.c:1277 #, c-format msgid "%s: symbolic range ellipsis must not be directly followed by `order_end'" -msgstr "%s: symboliskt intervall kan inte omedelbart följas av \"order_end\"" +msgstr "%s: ÐÏÓÌÅ ÜÌÌÉÐÓÉÓÁ ÓÉÍ×ÏÌØÎÏÇÏ ÄÉÁÐÁÚÏÎÁ ÎÅ ÍÏÖÅÔ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ ÓÌÅÄÏ×ÁÔØ `order_end'" #: locale/programs/ld-collate.c:1297 locale/programs/ld-ctype.c:1475 #, c-format msgid "`%s' and `%.*s' are not valid names for symbolic range" -msgstr "\"%s\" och \"%.*s\" är otillåtna namn för symboliskt intervall" +msgstr "`%s' É `%.*s' ÎÅ Ñ×ÌÑÀÔÓÑ ×ÅÒÎÙÍÉ ÉÍÅÎÁÍÉ ÓÉÍ×ÏÌØÎÏÇÏ ÄÉÁÐÏÚÏÎÁ" #: locale/programs/ld-collate.c:1346 locale/programs/ld-collate.c:3739 #, c-format msgid "%s: order for `%.*s' already defined at %s:%Zu" -msgstr "%s: ordningsföljd för \"%.*s\" redan definierad i %s:%Zu" +msgstr "%s: ÐÏÒÑÄÏË ÄÌÑ `%.*s' ÕÖÅ ÏÐÒÅÄÅÌÅÎ × %s:%Zu" #: locale/programs/ld-collate.c:1355 #, c-format msgid "%s: `%s' must be a character" -msgstr "%s: \"%s\" måste vara ett enskilt tecken" +msgstr "%s: `%s' ÄÏÌÖÎÏ ÂÙÔØ ÚÎÁËÏÍ" #: locale/programs/ld-collate.c:1548 #, c-format msgid "%s: `position' must be used for a specific level in all sections or none" -msgstr "%s: \"position\" måste användas för en given nivå i alla sektioner eller inte alls" +msgstr "%s: `position' ÄÏÌÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÏÄÎÏÇÏ ËÏÎËÒÅÔÎÏÇÏ ÕÒÏ×ÎÑ ÌÉÂÏ ×Ï ×ÓÅÈ ÓÅËÃÉÑÈ, ÌÉÂÏ ÎÉ × ÏÄÎÏÊ" #: locale/programs/ld-collate.c:1573 #, c-format msgid "symbol `%s' not defined" -msgstr "symbol \"%s\" inte definierad" +msgstr "ÓÉÍ×ÏÌ `%s' ÎÅ ÏÐÒÅÄÅÌÅÎ" #: locale/programs/ld-collate.c:1649 locale/programs/ld-collate.c:1755 #, c-format msgid "symbol `%s' has the same encoding as" -msgstr "symbol \"%s\" har samma värde som" +msgstr "ÓÉÍ×ÏÌ `%s' ÉÍÅÅÔ ÔÁËÕÀ ÖÅ ËÏÄÉÒÏ×ËÕ ËÁË" #: locale/programs/ld-collate.c:1653 locale/programs/ld-collate.c:1759 #, c-format msgid "symbol `%s'" -msgstr "symbol \"%s\"" +msgstr "ÓÉÍ×ÏÌ `%s'" #: locale/programs/ld-collate.c:1801 #, c-format msgid "no definition of `UNDEFINED'" -msgstr "ingen definition av \"UNDEFINED\"" +msgstr "ÎÅÔ ÏÐÒÅÄÅÌÅÎÉÑ ÄÌÑ `UNDEFINED'" #: locale/programs/ld-collate.c:1830 #, c-format msgid "too many errors; giving up" -msgstr "för många fel, ger upp" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÏÛÉÂÏË; ËÏÎÅÃ" #: locale/programs/ld-collate.c:2738 #, c-format msgid "%s: duplicate definition of `%s'" -msgstr "%s: dubbla definitioner av \"%s\"" +msgstr "%s: ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ `%s'" #: locale/programs/ld-collate.c:2774 #, c-format msgid "%s: duplicate declaration of section `%s'" -msgstr "%s: dubbla deklarationer för sektion \"%s\"" +msgstr "%s: ÐÏ×ÔÏÒÎÏÅ ÏÂßÑ×ÌÅÎÉÅ ÓÅËÃÉÉ `%s'" #: locale/programs/ld-collate.c:2913 #, c-format msgid "%s: unknown character in collating symbol name" -msgstr "%s: okänt tecken i namn för kollationssymbol" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ÚÎÁË × ÉÍÅÎÉ ÓÉÍ×ÏÌÁ ÓÏÒÔÉÒÏ×ËÉ" #: locale/programs/ld-collate.c:3045 #, c-format msgid "%s: unknown character in equivalent definition name" -msgstr "%s: okänt tecken i namnet i ekvivalensdefinitionen" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ÚÎÁË × ÉÍÅÎÉ ÏÐÒÅÄÅÌÅÎÉÑ ÜË×É×ÁÌÅÎÔÎÏÓÔÉ" #: locale/programs/ld-collate.c:3058 #, c-format msgid "%s: unknown character in equivalent definition value" -msgstr "%s: okänt tecken i värdet i ekvivalensdefinitionen" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ÚÎÁË × ÚÎÁÞÅÎÉÉ ÏÐÒÅÄÅÌÅÎÁÑ ÜË×É×ÁÌÅÎÔÎÏÓÔÉ" #: locale/programs/ld-collate.c:3068 #, c-format msgid "%s: unknown symbol `%s' in equivalent definition" -msgstr "%s: okänd symbol \"%s\" i ekvivalensdefinition" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ÓÉÍ×ÏÌ `%s' × ÏÐÒÅÄÅÌÅÎÉÉ ÜË×É×ÁÌÅÎÔÎÏÓÔÉ" #: locale/programs/ld-collate.c:3077 msgid "error while adding equivalent collating symbol" -msgstr "fel när ekvivalent kollationssymbol lades till" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÄÏÂÁ×ÌÅÎÉÉ ÜË×É×ÁÌÅÎÔÎÏÇÏ ÓÉÍ×ÏÌÁ ÓÏÒÔÉÒÏ×ËÉ" #: locale/programs/ld-collate.c:3107 #, c-format msgid "duplicate definition of script `%s'" -msgstr "dubblerad definition för skript \"%s\"" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ÓÉÓÔÅÍÙ ÐÉÓØÍÁ `%s'" #: locale/programs/ld-collate.c:3155 #, c-format msgid "%s: unknown section name `%s'" -msgstr "%s: okänt sektionsnamn \"%s\"" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÏÅ ÉÍÑ ÓÅËÃÉÉ `%s'" #: locale/programs/ld-collate.c:3183 #, c-format msgid "%s: multiple order definitions for section `%s'" -msgstr "%s: dubbla definitioner av ordningsföljd i sektion \"%s\"" +msgstr "%s: ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ÐÏÒÑÄËÁ ÄÌÑ ÓÅËÃÉÉ `%s'" #: locale/programs/ld-collate.c:3208 #, c-format msgid "%s: invalid number of sorting rules" -msgstr "%s: ogiltigt antal sorteringsregler" +msgstr "%s: ÎÅ×ÅÒÎÏÅ ÞÉÓÌÏ ÐÒÁ×ÉÌ ÓÏÒÔÉÒÏ×ËÉ" #: locale/programs/ld-collate.c:3235 #, c-format msgid "%s: multiple order definitions for unnamed section" -msgstr "%s: flera definitioner av ordningsföljd i namnlös sektion" +msgstr "%s: ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ÐÏÒÑÄËÁ ÄÌÑ ÂÅÚÙÍÑÎÎÏÊ ÓÅËÃÉÉ" #: locale/programs/ld-collate.c:3289 locale/programs/ld-collate.c:3417 #: locale/programs/ld-collate.c:3780 #, c-format msgid "%s: missing `order_end' keyword" -msgstr "%s: nyckelord \"order_end\" saknas" +msgstr "%s: ÐÒÏÐÕÝÅÎÏ ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï `order_end'" #: locale/programs/ld-collate.c:3350 #, c-format msgid "%s: order for collating symbol %.*s not yet defined" -msgstr "%s: ordningsföljd för kollationssymbol %.*s är inte definierad ännu" +msgstr "%s: ÐÏÒÑÄÏË ÄÌÑ ÓÉÍ×ÏÌÁ ÓÏÒÔÉÒÏ×ËÉ %.*s ÅÝÅ ÎÅ ÏÐÒÅÄÅÌÅÎ" #: locale/programs/ld-collate.c:3368 #, c-format msgid "%s: order for collating element %.*s not yet defined" -msgstr "%s: ordningsföljd för kollationselement %.*s är inte definierad ännu" +msgstr "%s: ÐÏÒÑÄÏË ÄÌÑ ÜÌÅÍÅÎÔÁ ÓÏÒÔÉÒÏ×ËÉ %.*s ÅÝÅ ÎÅ ÏÐÒÅÄÅÌÅÎ" #: locale/programs/ld-collate.c:3379 #, c-format msgid "%s: cannot reorder after %.*s: symbol not known" -msgstr "%s: kan inte byta ordning efter %.*s: okänd symbol" +msgstr "%s: ÎÅ×ÏÚÍÏÖÎÏ ÐÏÍÅÎÑÔØ ÐÏÒÑÄÏË ÐÏÓÌÅ %.*s: ÓÉÍ×ÏÌ ÎÅÉÚ×ÅÓÔÅÎ" #: locale/programs/ld-collate.c:3431 locale/programs/ld-collate.c:3792 #, c-format msgid "%s: missing `reorder-end' keyword" -msgstr "%s: nyckelord \"reorder-end\" saknas" +msgstr "%s: ÐÒÏÐÕÝÅÎÏ ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï `reorder-end'" #: locale/programs/ld-collate.c:3465 locale/programs/ld-collate.c:3664 #, c-format msgid "%s: section `%.*s' not known" -msgstr "%s: sektion \"%.*s\" okänd" +msgstr "%s: ÓÅËÃÉÑ `%.*s' ÎÅÉÚ×ÅÓÔÎÁ" #: locale/programs/ld-collate.c:3530 #, c-format msgid "%s: bad symbol <%.*s>" -msgstr "%s: ogiltig symbol: <%.*s>" +msgstr "%s: ÎÅÐÒÁ×ÉÌØÎÙÊ ÓÉÍ×ÏÌ <%.*s>" #: locale/programs/ld-collate.c:3727 #, c-format msgid "%s: cannot have `%s' as end of ellipsis range" -msgstr "%s: kan inte ha \"%s\" som ändpunkt på ellips" +msgstr "%s: `%s' ÎÅ ÍÏÖÅÔ ÂÙÔØ ËÏÎÃÏÍ ÄÉÁÐÁÚÏÎÁ Ó ÜÌÌÉÐÓÉÓÏÍ" #: locale/programs/ld-collate.c:3776 #, c-format msgid "%s: empty category description not allowed" -msgstr "%s: tom kategoribeskrivning är inte tillåtet" +msgstr "%s: ÐÕÓÔÙÅ ÏÐÉÓÁÎÉÑ ËÁÔÅÇÏÒÉÊ ÎÅÄÏÐÕÓÔÉÍÙ" #: locale/programs/ld-collate.c:3795 #, c-format msgid "%s: missing `reorder-sections-end' keyword" -msgstr "%s: nyckelord \"reorder-sections-end\" saknas" +msgstr "%s: ÐÒÏÐÕÝÅÎÏ ËÌÀÞÅ×ÏÅ ÓÌÏ×Ï `reorder-sections-end'" #: locale/programs/ld-ctype.c:438 #, c-format msgid "No character set name specified in charmap" -msgstr "Inget namn definierat i teckenuppsättning" +msgstr "÷ ÏÔÏÂÒÁÖÅÎÉÉ ÚÎÁËÏ× ÎÅ ÕËÁÚÁÎÏ ÉÍÑ ÎÁÂÏÒÁ ÚÎÁËÏ×" #: locale/programs/ld-ctype.c:467 #, c-format msgid "character L'\\u%0*x' in class `%s' must be in class `%s'" -msgstr "tecken L\"\\u%0*x\" i klass \"%s\" måste vara i klass \"%s\"" +msgstr "ÚÎÁË L'\\u%0*x' × ËÌÁÓÓÅ `%s' ÄÏÌÖÅÎ ÂÙÔØ × ËÌÁÓÓÅ `%s'" #: locale/programs/ld-ctype.c:482 #, c-format msgid "character L'\\u%0*x' in class `%s' must not be in class `%s'" -msgstr "tecken L\"\\u%0*x\" i klass \"%s\" får inte vara i klass \"%s\"" +msgstr "ÚÎÁË L'\\u%0*x' × ËÌÁÓÓÅ `%s' ÎÅ ÄÏÌÖÅÎ ÂÙÔØ × ËÌÁÓÓÅ `%s'" #: locale/programs/ld-ctype.c:496 locale/programs/ld-ctype.c:554 #, c-format msgid "internal error in %s, line %u" -msgstr "internt fel i %s, rad %u" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ × %s, ÓÔÒÏËÁ %u" #: locale/programs/ld-ctype.c:525 #, c-format msgid "character '%s' in class `%s' must be in class `%s'" -msgstr "tecken \"%s\" i klass \"%s\" måste vara i klass \"%s\"" +msgstr "ÚÎÁË '%s' × ËÌÁÓÓÅ `%s' ÄÏÌÖÅÎ ÂÙÔØ × ËÌÁÓÓÅ `%s'" #: locale/programs/ld-ctype.c:541 #, c-format msgid "character '%s' in class `%s' must not be in class `%s'" -msgstr "tecken \"%s\" i klass \"%s\" får inte vara i klass \"%s\"" +msgstr "ÚÎÁË '%s' × ËÌÁÓÓÅ `%s' ÎÅ ÄÏÌÖÅÎ ÂÙÔØ × ËÌÁÓÓÅ `%s'" #: locale/programs/ld-ctype.c:571 locale/programs/ld-ctype.c:609 #, c-format msgid " character not in class `%s'" -msgstr "-tecknet är inte i klass \"%s\"" +msgstr "ÚÎÁË ÎÅ × ËÌÁÓÓÅ `%s'" #: locale/programs/ld-ctype.c:583 locale/programs/ld-ctype.c:620 #, c-format msgid " character must not be in class `%s'" -msgstr "-tecknet får inte vara i klass \"%s\"" +msgstr "ÚÎÁË ÎÅ ÄÏÌÖÅÎ ÂÙÔØ × ËÌÁÓÓÅ `%s'" #: locale/programs/ld-ctype.c:598 #, c-format msgid "character not defined in character map" -msgstr "tecken inte definierat i teckenuppsättning" +msgstr "ÚÎÁË ÎÅ ÏÐÒÅÄÅÌÅÎ × ÏÔÏÂÒÁÖÅÎÉÉ ÚÎÁËÏ×" #: locale/programs/ld-ctype.c:712 #, c-format msgid "`digit' category has not entries in groups of ten" -msgstr "\"digit\"-kategori har inte poster i grupper av tio" +msgstr "×ÈÏÖÄÅÎÉÑ ËÁÔÅÇÏÒÉÉ `digit' ÎÅ ÇÒÕÐÐÉÒÕÀÔÓÑ ÐÏ ÄÅÓÑÔØ" #: locale/programs/ld-ctype.c:761 #, c-format msgid "no input digits defined and none of the standard names in the charmap" -msgstr "inga siffror för indata definierade och inga standardnamn finns i teckenuppsättningen" +msgstr "" #: locale/programs/ld-ctype.c:826 #, c-format msgid "not all characters used in `outdigit' are available in the charmap" -msgstr "alla tecken i \"outdigit\" är inte tillgängliga i teckenuppsättningen" +msgstr "" #: locale/programs/ld-ctype.c:843 #, c-format msgid "not all characters used in `outdigit' are available in the repertoire" -msgstr "alla tecken i \"outdigit\" är inte tillgängliga i repertoaren" +msgstr "ÎÅ ×ÓÅ ÚÎÁËÉ, ÉÓÐÏÌØÚÏ×ÁÎÎÙÅ × `outdigit', ÄÏÓÔÕÐÎÙ × ÄÁÎÎÏÍ ÒÅÐÅÒÔÕÁÒÅ" #: locale/programs/ld-ctype.c:1243 #, c-format msgid "character class `%s' already defined" -msgstr "teckenklass \"%s\" redan definierad" +msgstr "ËÌÁÓÓ ÚÎÁËÏ× `%s' ÕÖÅ ÏÐÒÅÄÅÌÅÎ" #: locale/programs/ld-ctype.c:1249 #, c-format msgid "implementation limit: no more than %Zd character classes allowed" -msgstr "implementationsbegränsning: inte fler än %Zd teckenklasser tillåtna" +msgstr "ÏÇÒÁÎÉÞÅÎÉÅ ÒÅÁÌÉÚÁÃÉÉ: ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÎÅ ÂÏÌÅÅ %Zd ËÌÁÓÓÏ× ÚÎÁËÏ×" #: locale/programs/ld-ctype.c:1275 #, c-format msgid "character map `%s' already defined" -msgstr "teckenuppsättning \"%s\" redan definierad" +msgstr "ÏÔÏÂÒÁÖÅÎÉÅ ÚÎÁËÏ× `%s' ÕÖÅ ÏÐÒÅÄÅÌÅÎÏ" #: locale/programs/ld-ctype.c:1281 #, c-format msgid "implementation limit: no more than %d character maps allowed" -msgstr "implementationsbegränsning: inte fler än %d teckenuppsättningar tillåtet" +msgstr "ÏÇÒÁÎÉÞÅÎÉÅ ÒÅÁÌÉÚÁÃÉÉ: ÄÏÐÕÓËÁÅÔÓÑ ÎÅ ÂÏÌÅÅ %d ÏÔÏÂÒÁÖÅÎÉÊ ÚÎÁËÏ×" #: locale/programs/ld-ctype.c:1546 locale/programs/ld-ctype.c:1671 #: locale/programs/ld-ctype.c:1777 locale/programs/ld-ctype.c:2466 #: locale/programs/ld-ctype.c:3462 #, c-format msgid "%s: field `%s' does not contain exactly ten entries" -msgstr "%s: fält \"%s\" innehåller inte exakt tio poster" +msgstr "%s: ÐÏÌÅ `%s' ÎÅ ÓÏÄÅÒÖÉÔ ÒÏ×ÎÏ ÄÅÓÑÔØ ×ÈÏÖÄÅÎÉÊ" #: locale/programs/ld-ctype.c:1574 locale/programs/ld-ctype.c:2145 #, c-format msgid "to-value of range is smaller than from-value " -msgstr "tillvärdet i intervallet är mindre än frånvärdet " +msgstr "×ÅÒÈÎÅÅ ÚÎÁÞÅÎÉÅ ÄÉÁÐÁÚÏÎÁ ÍÅÎØÛÅ ÞÅÍ ÎÉÖÎÅÅ ÚÎÁÞÅÎÉÅ " #: locale/programs/ld-ctype.c:1701 msgid "start and end character sequence of range must have the same length" -msgstr "start- och slutteckensekvens för intervall måste ha samma längd" +msgstr "ÎÁÞÁÌØÎÁÑ É ËÏÎÅÞÎÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÉ ÚÎÁËÏ× ÄÉÁÐÁÚÏÎÁ ÄÏÌÖÎÙ ÂÙÔØ ÏÄÉÎÁËÏ×ÏÊ ÄÌÉÎÙ" #: locale/programs/ld-ctype.c:1708 msgid "to-value character sequence is smaller than from-value sequence" -msgstr "tillvärdets teckensekvens är mindre än frånvärdets sekvens" +msgstr "ËÏÎÅÞÎÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÚÎÁËÏ× ÄÉÁÐÁÚÏÎÁ ÍÅÎØÛÅ ÞÅÍ ÎÁÞÁÌØÎÁÑ" #: locale/programs/ld-ctype.c:2065 locale/programs/ld-ctype.c:2116 msgid "premature end of `translit_ignore' definition" -msgstr "för tidigt slut på definition för \"translit_ignore\"" +msgstr "ÐÒÅÖÄÅ×ÒÅÍÅÎÎÙÊ ËÏÎÅà ÏÐÒÅÄÅÌÅÎÉÑ `translit_ignore'" #: locale/programs/ld-ctype.c:2071 locale/programs/ld-ctype.c:2122 #: locale/programs/ld-ctype.c:2164 msgid "syntax error" -msgstr "syntaxfel" +msgstr "ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ" #: locale/programs/ld-ctype.c:2298 #, c-format msgid "%s: syntax error in definition of new character class" -msgstr "%s: syntaxfel i definition av ny teckenklass" +msgstr "%s: ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ × ÏÐÒÅÄÅÌÅÎÉÉ ÎÏ×ÏÇÏ ËÌÁÓÓÁ ÚÎÁËÏ×" #: locale/programs/ld-ctype.c:2313 #, c-format msgid "%s: syntax error in definition of new character map" -msgstr "%s: syntaxfel i definition av ny teckenuppsättning" +msgstr "%s: ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ × ÏÐÒÅÄÅÌÅÎÉÉ ÎÏ×ÏÇÏ ÏÔÏÂÒÁÖÅÎÉÑ ÚÎÁËÏ×" #: locale/programs/ld-ctype.c:2488 msgid "ellipsis range must be marked by two operands of same type" -msgstr "intervall måste markeras med två operander av samma typ" +msgstr "ÄÉÁÐÁÚÏÎ Ó ÜÌÌÉÐÓÉÓÏÍ ÄÏÌÖÅÎ ÂÙÔØ ÐÏÍÅÞÅÎ Ä×ÕÍÑ ÏÐÅÒÁÎÄÁÍÉ ÏÄÎÏÇÏ ÔÉÐÁ" #: locale/programs/ld-ctype.c:2497 msgid "with symbolic name range values the absolute ellipsis `...' must not be used" -msgstr "med symboliska namn som intervallvärden kan inte absoluta intervallet \"...\" användas" +msgstr "Ó ÓÉÍ×ÏÌØÎÙÍÉ ÉÍÅÎÁÍÉ ÚÎÁÞÅÎÉÊ ÄÉÁÐÁÚÏÎÁ ÎÅÌØÚÑ ÉÓÐÏÌØÚÏ×ÁÔØ ÁÂÓÏÌÀÔÎÙÊ ÜÌÌÉÐÓÉÓ `...'" #: locale/programs/ld-ctype.c:2512 msgid "with UCS range values one must use the hexadecimal symbolic ellipsis `..'" -msgstr "med UCS som intervallvärden måste man använda symboliska hexadecimala intervallet \"..\"" +msgstr "Ó UCS-ÚÎÁÞÅÎÉÑÍÉ ÄÉÁÐÁÚÏÎÁ ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÛÅÓÔÎÁÄÃÁÔÉÒÉÞÎÙÊ ÓÉÍ×ÏÌØÎÙÊ ÜÌÌÉÐÓÉÓ `..'" #: locale/programs/ld-ctype.c:2526 msgid "with character code range values one must use the absolute ellipsis `...'" -msgstr "med teckenkoder som intervallvärden måste man använda absoluta intervallet \"...\"" +msgstr "ÓÏ ÚÎÁËÏ×ÙÍÉ ËÏÄÁÍÉ ÚÎÁÞÅÎÉÊ ÄÉÁÐÁÚÏÎÁ ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÁÂÓÏÌÀÔÎÙÊ ÜÌÌÉÐÓÉÓ `...'" #: locale/programs/ld-ctype.c:2677 #, c-format msgid "duplicated definition for mapping `%s'" -msgstr "dubblerad definition för mappning \"%s\"" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ÏÔÏÂÒÁÖÅÎÉÑ `%s'" #: locale/programs/ld-ctype.c:2763 locale/programs/ld-ctype.c:2907 #, c-format msgid "%s: `translit_start' section does not end with `translit_end'" -msgstr "%s: sektion \"translit_start\" avslutas inte med \"translit_end\"" +msgstr "%s: ÓÅËÃÉÑ `translit_start' ÎÅ ÚÁËÁÎÞÉ×ÁÅÔÓÑ ÎÁ `translit_end'" #: locale/programs/ld-ctype.c:2858 #, c-format msgid "%s: duplicate `default_missing' definition" -msgstr "%s: dubbla definitioner av \"default_missing\"" +msgstr "%s: ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ `default_missing'" #: locale/programs/ld-ctype.c:2863 msgid "previous definition was here" -msgstr "föregående definition var här" +msgstr "ÐÒÅÄÙÄÕÝÅÅ ÏÐÒÅÄÅÌÅÎÉÅ ÂÙÌÏ ÚÄÅÓØ" #: locale/programs/ld-ctype.c:2885 #, c-format msgid "%s: no representable `default_missing' definition found" -msgstr "%s: ingen representerbar definition av \"default_missing\" hittades" +msgstr "%s: ÎÅ ÎÁÊÄÅÎÏ ÐÒÅÄÓÔÁ×ÉÍÏÇÏ ÏÐÒÅÄÅÌÅÎÉÑ `default_missing'" #: locale/programs/ld-ctype.c:3038 #, c-format msgid "%s: character `%s' not defined in charmap while needed as default value" -msgstr "%s: tecken \"%s\" inte definierat i teckenuppsättningen men behövs som standardvärde" +msgstr "%s: ÚÎÁË `%s' ÎÅ ÏÐÒÅÄÅÌÅÎ × ÏÔÏÂÒÁÖÅÎÉÉ ÚÎÁËÏ×, ÏÄÎÁËÏ ÏÎ ÎÅÏÂÈÏÄÉÍ ËÁË ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ" #: locale/programs/ld-ctype.c:3043 locale/programs/ld-ctype.c:3127 #: locale/programs/ld-ctype.c:3147 locale/programs/ld-ctype.c:3168 @@ -2138,7 +2128,7 @@ msgstr "%s: tecken \"%s\" inte definierat i teckenuppsättningen men behövs som #: locale/programs/ld-ctype.c:3292 locale/programs/ld-ctype.c:3359 #, c-format msgid "%s: character `%s' in charmap not representable with one byte" -msgstr "%s: tecken \"%s\" i teckenuppsättning kan inte representeras med en byte" +msgstr "%s: ÚÎÁË `%s' × ÏÔÏÂÒÁÖÅÎÉÉ ÚÎÁËÏ× ÎÅÐÒÅÄÓÔÁ×ÉÍ ÏÄÎÉÍ ÂÁÊÔÏÍ" #: locale/programs/ld-ctype.c:3122 locale/programs/ld-ctype.c:3142 #: locale/programs/ld-ctype.c:3184 locale/programs/ld-ctype.c:3205 @@ -2147,386 +2137,385 @@ msgstr "%s: tecken \"%s\" i teckenuppsättning kan inte representeras med en byt #: locale/programs/ld-ctype.c:3396 locale/programs/ld-ctype.c:3421 #, c-format msgid "%s: character `%s' not defined while needed as default value" -msgstr "%s: tecken \"%s\" inte definierat men behövs som standardvärde" +msgstr "%s: ÚÎÁË `%s' ÎÅ ÏÐÒÅÄÅÌÅÎ, ÈÏÔÑ ÏÎ ÎÕÖÅÎ ËÁË ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ" #: locale/programs/ld-ctype.c:3163 #, c-format msgid "character `%s' not defined while needed as default value" -msgstr "tecken \"%s\" inte definierat men behövs som standardvärde" +msgstr "ÚÎÁË `%s' ÎÅ ÏÐÒÅÄÅÌÅÎ, ÈÏÔÑ ÏÎ ÎÕÖÅÎ ËÁË ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ" #: locale/programs/ld-ctype.c:3403 locale/programs/ld-ctype.c:3428 #, c-format msgid "%s: character `%s' needed as default value not representable with one byte" -msgstr "%s: tecken \"%s\" som behövs som standardvärde kan inte representeras med en byte" +msgstr "%s: ÚÎÁË `%s' ÎÕÖÅÎ ËÁË ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÎÏ ÅÇÏ ÎÅÌØÚÑ ÐÒÅÄÓÔÁ×ÉÔØ ÏÄÎÉÍ ÂÁÊÔÏÍ" #: locale/programs/ld-ctype.c:3483 #, c-format msgid "no output digits defined and none of the standard names in the charmap" -msgstr "inga siffror för utdata definierade och inga standardnamn finns i teckenuppsättningen" +msgstr "" #: locale/programs/ld-ctype.c:3774 #, c-format msgid "%s: transliteration data from locale `%s' not available" -msgstr "%s: transkriberingsdata för lokal \"%s\" är inte tillgänglig" +msgstr "%s: ÎÅÔ ÄÁÎÎÙÈ ÄÌÑ ÔÒÁÎÓÌÉÔÅÒÁÃÉÉ ÉÚ ÌÏËÁÌÉ `%s'" #: locale/programs/ld-ctype.c:3875 #, c-format msgid "%s: table for class \"%s\": %lu bytes\n" -msgstr "%s: tabell för klass \"%s\": %lu byte\n" +msgstr "%s: ÔÁÂÌÉÃÁ ÄÌÑ ËÌÁÓÓÁ \"%s\": %lu ÂÁÊÔ\n" #: locale/programs/ld-ctype.c:3944 #, c-format msgid "%s: table for map \"%s\": %lu bytes\n" -msgstr "%s: tabell för \"%s\": %lu byte\n" +msgstr "%s: ÔÁÂÌÉÃÁ ÄÌÑ ÏÔÏÂÒÁÖÅÎÉÑ \"%s\": %lu ÂÁÊÔ\n" #: locale/programs/ld-ctype.c:4077 #, c-format msgid "%s: table for width: %lu bytes\n" -msgstr "%s: tabell för teckenstorlek: %lu byte\n" +msgstr "%s: ÔÁÂÌÉÃÁ ÄÌÑ ÛÉÒÉÎÙ: %lu ÂÁÊÔ\n" #: locale/programs/ld-identification.c:169 #, c-format msgid "%s: no identification for category `%s'" -msgstr "%s: ingen idenitifikation för kategori \"%s\"" +msgstr "%s: ÎÅÔ ÉÄÅÎÔÉÆÉËÁÃÉÉ ÄÌÑ ËÁÔÅÇÏÒÉÉ `%s'" #: locale/programs/ld-identification.c:434 #, c-format msgid "%s: duplicate category version definition" -msgstr "%s: dubbla definitioner av kategori" +msgstr "%s: ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ×ÅÒÓÉÉ ËÁÔÅÇÏÒÉÉ" #: locale/programs/ld-measurement.c:112 #, c-format msgid "%s: invalid value for field `%s'" -msgstr "%s: ogiltigt värde för fält \"%s\"" +msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÚÎÁÞÅÎÉÅ ÐÏÌÑ `%s'" #: locale/programs/ld-messages.c:113 locale/programs/ld-messages.c:147 #, c-format msgid "%s: field `%s' undefined" -msgstr "%s: fält \"%s\" är odefinierat" +msgstr "%s: ÐÏÌÅ `%s' ÎÅ ÏÐÒÅÄÅÌÅÎÏ" #: locale/programs/ld-messages.c:120 locale/programs/ld-messages.c:154 #, c-format msgid "%s: value for field `%s' must not be an empty string" -msgstr "%s: värde på fält \"%s\" får inte vara en tom sträng" +msgstr "%s: ÚÎÁÞÅÎÉÅ ÐÏÌÑ `%s' ÎÅ ÄÏÌÖÎÏ ÂÙÔØ ÐÕÓÔÏÊ ÓÔÒÏËÏÊ" #: locale/programs/ld-messages.c:136 locale/programs/ld-messages.c:170 #, c-format msgid "%s: no correct regular expression for field `%s': %s" -msgstr "%s: felaktigt reguljärt uttryck för fält \"%s\": %s" +msgstr "%s: ÎÅÔ ÐÒÁ×ÉÌØÎÏÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ ÄÌÑ ÐÏÌÑ `%s': %s" #: locale/programs/ld-monetary.c:222 #, c-format msgid "%s: value of field `int_curr_symbol' has wrong length" -msgstr "%s: värdet på fält \"int_curr_symbol\" har fel längd" +msgstr "%s: ÚÎÁÞÅÎÉÅ ÐÏÌÑ `int_curr_symbol' ÉÍÅÅÔ ÎÅÐÒÁ×ÉÌØÎÕÀ ÄÌÉÎÕ" #: locale/programs/ld-monetary.c:235 #, c-format msgid "%s: value of field `int_curr_symbol' does not correspond to a valid name in ISO 4217" -msgstr "%s: värdet på fält \"int_curr_symbol\" stämmer inte med giltiga namn i ISO 4217" +msgstr "%s: ÚÎÁÞÅÎÉÅ ÐÏÌÑ `int_curr_symbol' ÎÅ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÎÉ ÏÄÎÏÍÕ ×ÅÒÎÏÍÕ ÉÍÅÎÉ ÉÚ ISO 4217" #: locale/programs/ld-monetary.c:254 locale/programs/ld-numeric.c:117 #, c-format msgid "%s: value for field `%s' must not be the empty string" -msgstr "%s: värde på fält \"%s\" får inte vara tom sträng" +msgstr "%s: ÚÎÁÞÅÎÉÅ ÐÏÌÑ `%s' ÎÅ ÄÏÌÖÎÏ ÂÙÔØ ÐÕÓÔÏÊ ÓÔÒÏËÏÊ" #: locale/programs/ld-monetary.c:282 locale/programs/ld-monetary.c:312 #, c-format msgid "%s: value for field `%s' must be in range %d...%d" -msgstr "%s: värden på fält \"%s\" måste vara i intervallet %d...%d" +msgstr "%s: ÚÎÁÞÅÎÉÅ ÐÏÌÑ `%s' ÄÏÌÖÎÏ ÂÙÔØ × ÄÉÁÐÁÚÏÎÅ %d...%d" #: locale/programs/ld-monetary.c:744 locale/programs/ld-numeric.c:273 #, c-format msgid "%s: value for field `%s' must be a single character" -msgstr "%s: värdet för fält \"%s\" måste vara ett enskilt tecken" +msgstr "%s: ÚÎÁÞÅÎÉÅ ÐÏÌÑ `%s' ÄÏÌÖÎÏ ÂÙÔØ ÏÄÎÉÍ ÚÎÁËÏÍ" #: locale/programs/ld-monetary.c:841 locale/programs/ld-numeric.c:317 #, c-format msgid "%s: `-1' must be last entry in `%s' field" -msgstr "%s: \"-1\" måste vara sista post i fält \"%s\"" +msgstr "%s: `-1' ÄÏÌÖÎÏ ÂÙÔØ ÐÏÓÌÅÄÎÉÍ ×ÈÏÖÄÅÎÉÅ × ÐÏÌÅ `%s'" #: locale/programs/ld-monetary.c:863 locale/programs/ld-numeric.c:334 #, c-format msgid "%s: values for field `%s' must be smaller than 127" -msgstr "%s: värden på fält \"%s\" måste vara mindre än 127" +msgstr "%s: ÚÎÁÞÅÎÉÑ ÐÏÌÑ `%s' ÄÏÌÖÎÙ ÂÙÔØ ÍÅÎØÛÅ 127" #: locale/programs/ld-monetary.c:906 msgid "conversion rate value cannot be zero" -msgstr "omvandlingsvärde kan inte vara noll" +msgstr "ÚÎÁÞÅÎÉÅ ÏÂÍÅÎÎÏÇÏ ËÕÒÓÁ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÎÕÌÅÍ" #: locale/programs/ld-name.c:128 locale/programs/ld-telephone.c:125 #: locale/programs/ld-telephone.c:148 #, c-format msgid "%s: invalid escape sequence in field `%s'" -msgstr "%s: ogiltig kontrollsekvens i fält \"%s\"" +msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÁÑ ÕÐÒÁ×ÌÑÀÝÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ × ÐÏÌÅ `%s'" #: locale/programs/ld-time.c:246 #, c-format msgid "%s: direction flag in string %Zd in `era' field is not '+' nor '-'" -msgstr "%s: riktningsflagga i sträng %Zd i \"era\"-fält är varken \"+\" eller \"-\"" +msgstr "%s: ÆÌÁÇ ÎÁÐÒÁ×ÌÅÎÉÑ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era' ÎÅ '+' É ÎÅ '-'" #: locale/programs/ld-time.c:257 #, c-format msgid "%s: direction flag in string %Zd in `era' field is not a single character" -msgstr "%s: riktningsflagga i sträng %Zd i \"era\"-fält är inte ett enskilt tecken" +msgstr "%s: ÆÌÁÇ ÎÁÐÒÁ×ÌÅÎÉÑ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era' ÎÅ Ñ×ÌÑÅÔÓÑ ÏÄÎÉÍ ÚÎÁËÏÍ" #: locale/programs/ld-time.c:270 #, c-format msgid "%s: invalid number for offset in string %Zd in `era' field" -msgstr "%s: ogiltigt tal för tilläggsvärde i sträng %Zd i \"era\"-fält" +msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÏÅ ÞÉÓÌÏ ÄÌÑ ÓÍÅÝÅÎÉÑ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:278 #, c-format msgid "%s: garbage at end of offset value in string %Zd in `era' field" -msgstr "%s: skräp i slutet av tilläggsvärde i sträng %Zd i \"era\"-fält" +msgstr "%s: ÍÕÓÏÒ × ËÏÎÃÅ ÚÎÁÞÅÎÉÑ ÓÍÅÝÅÎÉÑ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:329 #, c-format msgid "%s: invalid starting date in string %Zd in `era' field" -msgstr "%s: ogiltigt startdatum i sträng %Zd i \"era\"-fält" +msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÁÑ ÎÁÞÁÌØÎÁÑ ÄÁÔÁ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:338 #, c-format msgid "%s: garbage at end of starting date in string %Zd in `era' field " -msgstr "%s: skräp i slutet av startdatum i sträng %Zd i \"era\"-fält" +msgstr "%s: ÍÕÓÏÒ × ËÏÎÃÅ ÎÁÞÁÌØÎÏÊ ÄÁÔÙ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:357 #, c-format msgid "%s: starting date is invalid in string %Zd in `era' field" -msgstr "%s: startdatum är ogiltigt i sträng %Zd i \"era\"-fält" +msgstr "%s: ÎÅ×ÅÒÎÁÑ ÎÁÞÁÌØÎÁÑ ÄÁÔÁ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:406 #, c-format msgid "%s: invalid stopping date in string %Zd in `era' field" -msgstr "%s: ogiltigt slutdatum i sträng %Zd i \"era\"-fält" +msgstr "%s: ÎÅ×ÅÒÎÁÑ ËÏÎÅÞÎÁÑ ÄÁÔÁ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:415 #, c-format msgid "%s: garbage at end of stopping date in string %Zd in `era' field" -msgstr "%s: skräp i slutet av slutdatum i sträng %Zd i \"era\"-fält" +msgstr "%s: ÍÕÓÏÒ × ËÏÎÃÅ ËÏÎÅÞÎÏÊ ÄÁÔÙ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:434 #, c-format msgid "%s: stopping date is invalid in string %Zd in `era' field" -msgstr "%s: slutdatum är ogiltigt i sträng %Zd i \"era\"-fält" +msgstr "%s: ÎÅ×ÅÒÎÁÑ ËÏÎÅÞÎÁÑ ÄÁÔÁ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:443 #, c-format msgid "%s: missing era name in string %Zd in `era' field" -msgstr "%s: eranamn i sträng %Zd i \"era\"-fält saknas" +msgstr "%s: ÐÒÏÐÕÝÅÎÏ ÉÍÑ ÜÒÙ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:455 #, c-format msgid "%s: missing era format in string %Zd in `era' field" -msgstr "%s: eraformat i sträng %Zd i \"era\"-fält saknas" +msgstr "%s: ÐÒÏÐÕÝÅÎ ÆÏÒÍÁÔ ÜÒÙ × ÓÔÒÏËÅ %Zd × ÐÏÌÅ `era'" #: locale/programs/ld-time.c:496 #, c-format msgid "%s: third operand for value of field `%s' must not be larger than %d" -msgstr "%s: tredje operanden för värdet av fält \"%s\" kan inte vara större än %d" +msgstr "%s: ÔÒÅÔÉÊ ÏÐÅÒÁÎÄ ÄÌÑ ÚÎÁÞÅÎÉÑ ÐÏÌÑ `%s' ÎÅ ÄÏÌÖÅÎ ÂÙÔØ ÂÏÌØÛÅ %d" #: locale/programs/ld-time.c:504 locale/programs/ld-time.c:512 #, c-format msgid "%s: values of field `%s' must not be larger than %d" -msgstr "%s: värden på fält \"%s\" får inte vara större än %d" +msgstr "%s: ÚÎÁÞÅÎÉÑ ÐÏÌÑ `%s' ÎÅ ÄÏÌÖÎÙ ÂÙÔØ ÂÏÌØÛÅ %d" #: locale/programs/ld-time.c:520 #, c-format msgid "%s: values for field `%s' must not be larger than %d" -msgstr "%s: värden på fält \"%s\" får inte vara större än %d" +msgstr "%s: ÚÎÁÞÅÎÉÑ ÄÌÑ ÐÏÌÑ `%s' ÎÅ ÄÏÌÖÎÙ ÂÙÔØ ÂÏÌØÛÅ %d" #: locale/programs/ld-time.c:1003 #, c-format msgid "%s: too few values for field `%s'" -msgstr "%s: för få värden för fält \"%s\"" +msgstr "%s: ÓÌÉÛËÏÍ ÍÁÌÏ ÚÎÁÞÅÎÉÊ ÄÌÑ ÐÏÌÑ `%s'" #: locale/programs/ld-time.c:1048 msgid "extra trailing semicolon" -msgstr "extra avslutande semikolon" +msgstr "ÌÉÛÎÅÅ Ä×ÏÅÔÏÞÉÅ × ËÏÎÃÅ" #: locale/programs/ld-time.c:1051 #, c-format msgid "%s: too many values for field `%s'" -msgstr "%s: för många värden för fält \"%s\"" +msgstr "%s: ÓÌÉÛËÏÍ ÍÎÏÇÏ ÚÎÁÞÅÎÉÊ ÄÌÑ ÐÏÌÑ `%s'" #: locale/programs/linereader.c:129 msgid "trailing garbage at end of line" -msgstr "avslutande skräp vid radslutet" +msgstr "ÍÕÓÏÒ × ËÏÎÃÅ ÓÔÒÏËÉ" #: locale/programs/linereader.c:297 msgid "garbage at end of number" -msgstr "skräp i slutet av nummer" +msgstr "ÍÕÓÏÒ × ËÏÎÃÅ ÞÉÓÌÁ" #: locale/programs/linereader.c:409 msgid "garbage at end of character code specification" -msgstr "skräp i slutet av teckenkodsspecifikation" +msgstr "ÍÕÓÏÒ × ËÏÎÃÅ ÓÐÅÃÉÆÉËÁÃÉÉ ËÏÄÁ ÚÎÁËÁ" #: locale/programs/linereader.c:495 msgid "unterminated symbolic name" -msgstr "oavslutat symboliskt namn" +msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÏÅ ÓÉÍ×ÏÌØÎÏÅ ÉÍÑ" #: locale/programs/linereader.c:622 msgid "illegal escape sequence at end of string" -msgstr "otillåten teckensekvens vid strängslut" +msgstr "ÎÅ×ÅÒÎÁÑ ÕÐÒÁ×ÌÑÀÝÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ × ËÏÎÃÅ ÓÔÒÏËÉ" #: locale/programs/linereader.c:626 locale/programs/linereader.c:854 msgid "unterminated string" -msgstr "oavslutad sträng" +msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ÓÔÒÏËÁ" #: locale/programs/linereader.c:668 msgid "non-symbolic character value should not be used" -msgstr "icke-symboliskt teckenvärde bör inte användas" +msgstr "ÎÅ ÓÔÏÉÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅÓÉÍ×ÏÌØÎÏÅ ÚÎÁËÏ×ÏÅ ÚÎÁÞÅÎÉÅ" #: locale/programs/linereader.c:815 #, c-format msgid "symbol `%.*s' not in charmap" -msgstr "symbol \"%.*s\" finns inte i teckenuppsättning" +msgstr "ÓÉÍ×ÏÌ `%.*s' ÏÔÓÕÔÓÔ×ÕÅÔ × ÏÔÏÂÒÁÖÅÎÉÉ ÚÎÁËÏ×" #: locale/programs/linereader.c:836 #, c-format msgid "symbol `%.*s' not in repertoire map" -msgstr "symbol \"%.*s\" finns inte i repertoartabell" +msgstr "ÓÉÍ×ÏÌ `%.*s' ÏÔÓÕÔÓÔ×ÕÅÔ × ÏÔÏÂÒÁÖÅÎÉÉ ÒÅÐÅÒÔÕÁÒÁ" #: locale/programs/locale.c:73 msgid "System information:" -msgstr "Systeminformation:" +msgstr "éÎÆÏÒÍÁÃÉÑ Ï ÓÉÓÔÅÍÅ:" #: locale/programs/locale.c:75 msgid "Write names of available locales" -msgstr "Skriv namn på tillgängliga lokaler" +msgstr "îÁÐÉÓÁÔØ ÉÍÅÎÁ ÄÏÓÔÕÐÎÙÈ ÌÏËÁÌÅÊ" #: locale/programs/locale.c:77 msgid "Write names of available charmaps" -msgstr "Skriv namn på tillgängliga teckenuppsättningar" +msgstr "ðÅÞÁÔÁÅÔ ÉÍÅÎÁ ÄÏÓÔÕÐÎÙÈ ÏÔÏÂÒÁÖÅÎÉÊ ÚÎÁËÏ×" #: locale/programs/locale.c:78 msgid "Modify output format:" -msgstr "Ändra utdataformat:" +msgstr "éÚÍÅÎÅÎÉÅ ×ÙÈÏÄÎÏÇÏ ÆÏÒÍÁÔÁ:" #: locale/programs/locale.c:79 msgid "Write names of selected categories" -msgstr "Skriv namn på valda kategorier" +msgstr "îÁÐÉÓÁÔØ ÉÍÅÎÁ ×ÙÂÒÁÎÎÙÈ ËÁÔÅÇÏÒÉÊ" #: locale/programs/locale.c:80 msgid "Write names of selected keywords" -msgstr "Skriv namn på valda nyckelord" +msgstr "îÁÐÉÓÁÔØ ÉÍÅÎÁ ×ÙÂÒÁÎÎÙÈ ËÌÀÞÅ×ÙÈ ÓÌÏ×" #: locale/programs/locale.c:81 msgid "Print more information" -msgstr "Skriv mer information" +msgstr "îÁÐÅÞÁÔÁÔØ ÂÏÌØÛÅ ÉÎÆÏÒÍÁÃÉÉ" #: locale/programs/locale.c:86 msgid "" "Get locale-specific information. For bug reporting instructions, please see:\n" ".\n" msgstr "" -"Hämta lokalspecifik information. För felrapporteringsinstruktioner, se:\n" +"÷ÙÄÁÅÔ ÉÎÆÏÒÍÁÃÉÀ, ÏÔÎÏÓÑÝÕÀÓÑ Ë ÌÏËÁÌÉ. éÎÓÔÒÕËÃÉÉ ÐÏ ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÁÈ ÓÍÏÔÒÉÔÅ ÎÁ\n" ".\n" -"Rapportera fel eller synpunkter på översättningen till .\n" #: locale/programs/locale.c:91 msgid "" "NAME\n" "[-a|-m]" msgstr "" -"NAMN\n" +"éíñ\n" "[-a|-m]" #: locale/programs/locale.c:192 #, c-format msgid "Cannot set LC_CTYPE to default locale" -msgstr "Kan inte sätta LC_CTYPE till standardlokalen" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ LC_CTYPE × ÌÏËÁÌØ ÐÏ ÕÍÏÌÞÁÎÉÀ." #: locale/programs/locale.c:194 #, c-format msgid "Cannot set LC_MESSAGES to default locale" -msgstr "Kan inte sätta LC_MESSAGES till standardlokalen" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ LC_MESSAGES × ÌÏËÁÌØ ÐÏ ÕÍÏÌÞÁÎÉÀ." #: locale/programs/locale.c:207 #, c-format msgid "Cannot set LC_COLLATE to default locale" -msgstr "Kan inte sätta LC_COLLATE till standardlokalen" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ LC_COLLATE × ÌÏËÁÌØ ÐÏ ÕÍÏÌÞÁÎÉÀ." #: locale/programs/locale.c:223 #, c-format msgid "Cannot set LC_ALL to default locale" -msgstr "Kan inte sätta LC_ALL till standardlokalen" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ LC_ALL × ÌÏËÁÌØ ÐÏ ÕÍÏÌÞÁÎÉÀ." #: locale/programs/locale.c:499 #, c-format msgid "while preparing output" -msgstr "när utdata förbereddes" +msgstr "ÐÒÉ ÐÏÄÇÏÔÏ×ËÅ ×Ù×ÏÄÁ" #: locale/programs/localedef.c:119 msgid "Input Files:" -msgstr "Infiler:" +msgstr "÷ÈÏÄÎÙÅ ÆÁÊÌÙ:" #: locale/programs/localedef.c:121 msgid "Symbolic character names defined in FILE" -msgstr "Symboliska teckennamn definierade i FILE" +msgstr "óÉÍ×ÏÌØÎÙÅ ÉÍÅÎÁ ÚÎÁËÏ× ÏÂßÑ×ÌÅÎÙ × æáêìå" #: locale/programs/localedef.c:122 msgid "Source definitions are found in FILE" -msgstr "Källdefinitioner finns i FILE" +msgstr "éÓÈÏÄÎÙÅ ÏÐÒÅÄÅÌÅÎÉÑ ÎÁÈÏÄÑÔÓÑ × æáêìå" #: locale/programs/localedef.c:124 msgid "FILE contains mapping from symbolic names to UCS4 values" -msgstr "FIL innehåller avbildning från symboliska namn till UCS4-värden" +msgstr "æáêì ÓÏÄÅÒÖÉÔ ÏÔÏÂÒÁÖÅÎÉÑ ÉÚ ÓÉÍ×ÏÌØÎÙÈ ÉÍÅÎ × ÚÎÁÞÅÎÉÑ UCS4" #: locale/programs/localedef.c:128 msgid "Create output even if warning messages were issued" -msgstr "Skapa utfil även om varningsmeddelanden genererades" +msgstr "óÏÚÄÁ×ÁÔØ ×Ù×ÏÄ, ÄÁÖÅ ÅÓÌÉ ÂÙÌÉ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ" #: locale/programs/localedef.c:129 msgid "Create old-style tables" -msgstr "Skapa tabeller i gammal stil" +msgstr "óÏÚÄÁ×ÁÔØ ÔÁÂÌÉÃÙ × ÓÔÁÒÏÍ ÓÔÉÌÅ" #: locale/programs/localedef.c:130 msgid "Optional output file prefix" -msgstr "Valfri utfilsprefix" +msgstr "îÅÏÂÑÚÁÔÅÌØÎÙÊ ÐÒÅÆÉËÓ ÄÌÑ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×" #: locale/programs/localedef.c:131 msgid "Be strictly POSIX conform" -msgstr "Var strikt POSIX-konform" +msgstr "óÔÒÏÇÏ ÓÌÅÄÏ×ÁÔØ ÓÔÁÎÄÁÒÔÕ POSIX" #: locale/programs/localedef.c:133 msgid "Suppress warnings and information messages" -msgstr "Undertryck varningar och informationsmeddelanden" +msgstr "îÅ ×Ù×ÏÄÉÔØ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ É ÉÎÆÏÒÍÁÃÉÏÎÎÙÅ ÓÏÏÂÝÅÎÉÑ" #: locale/programs/localedef.c:134 msgid "Print more messages" -msgstr "Skriv mer meddelanden" +msgstr "ðÅÞÁÔÁÔØ ÂÏÌØÛÅ ÓÏÏÂÝÅÎÉÊ" #: locale/programs/localedef.c:135 msgid "Archive control:" -msgstr "Arkivkontroll:" +msgstr "õÐÒÁ×ÌÅÎÉÅ ÁÒÈÉ×ÏÍ:" #: locale/programs/localedef.c:137 msgid "Don't add new data to archive" -msgstr "Lägg inte till nya data till arkivet" +msgstr "îÅ ÄÏÂÁ×ÌÑÔØ × ÁÒÈÉ× ÎÏ×ÙÅ ÄÁÎÎÙÅ" #: locale/programs/localedef.c:139 msgid "Add locales named by parameters to archive" -msgstr "Lägg till lokaler namngivna av parametrar till arkivet" +msgstr "äÏÂÁ×ÉÔØ × ÁÒÈÉ× ÌÏËÁÌÉ, ÕËÁÚÁÎÎÙÅ × ÐÁÒÁÍÅÔÒÁÈ" #: locale/programs/localedef.c:140 msgid "Replace existing archive content" -msgstr "Ersätt befintligt arkivinnehåll" +msgstr "úÁÍÅÎÉÔØ ÓÕÝÅÓÔ×ÕÀÝÅÅ ÓÏÄÅÒÖÉÍÏÅ ÁÒÈÉ×Á" #: locale/programs/localedef.c:142 msgid "Remove locales named by parameters from archive" -msgstr "Ta bort lokaler namngivna av parametrar från arkivet" +msgstr "õÄÁÌÉÔØ ÉÚ ÁÒÈÉ×Á ÌÏËÁÌÉ, ÕËÁÚÁÎÎÙÅ × ÐÁÒÁÍÅÔÒÁÈ" #: locale/programs/localedef.c:143 msgid "List content of archive" -msgstr "Visa innehållet i arkivet" +msgstr "ðÅÒÅÞÉÓÌÉÔØ ÓÏÄÅÒÖÉÍÏÅ ÁÒÈÉ×Á" #: locale/programs/localedef.c:145 msgid "locale.alias file to consult when making archive" -msgstr "locale.alias-fil som ska användas när arkivet skapas" +msgstr "ÆÁÊÌ locale.alias, Ë ËÏÔÏÒÏÍÕ ÓÌÅÄÕÅÔ ÏÂÒÁÝÁÔØÓÑ ÐÒÉ ÓÏÚÄÁÎÉÉ ÁÒÈÉ×Á" #: locale/programs/localedef.c:150 msgid "Compile locale specification" -msgstr "Kompilera lokalspecifikation" +msgstr "ëÏÍÐÉÌÉÒÕÅÔ ÓÐÅÃÉÆÉËÁÃÉÀ ÌÏËÁÌÉ" #: locale/programs/localedef.c:153 msgid "" @@ -2534,30 +2523,30 @@ msgid "" "[--add-to-archive|--delete-from-archive] FILE...\n" "--list-archive [FILE]" msgstr "" -"NAMN\n" -"[--add-to-archive|--delete-from-archive] FIL...\n" -"--list-archive [FIL]" +"éíñ\n" +"[--add-to-archive|--delete-from-archive] æáêì...\n" +"--list-archive [æáêì]" #: locale/programs/localedef.c:231 #, c-format msgid "cannot create directory for output files" -msgstr "kan inte skapa katalog för utfiler" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ ÄÌÑ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×" #: locale/programs/localedef.c:242 #, c-format msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'" -msgstr "FATALT: systemet definierar inte \"_POSIX2_LOCALEDEF\"" +msgstr "æáôáìøîáñ ïûéâëá: ÓÉÓÔÅÍÁ ÎÅ ÏÐÒÅÄÅÌÑÅÔ `_POSIX2_LOCALEDEF'" #: locale/programs/localedef.c:256 locale/programs/localedef.c:272 #: locale/programs/localedef.c:598 locale/programs/localedef.c:618 #, c-format msgid "cannot open locale definition file `%s'" -msgstr "kan inte öppna lokaldefinitionsfil \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÆÁÊÌ Ó ÏÐÒÅÄÅÌÅÎÉÅÍ ÌÏËÁÌÉ `%s'" #: locale/programs/localedef.c:284 #, c-format msgid "cannot write output files to `%s'" -msgstr "kan inte skriva utfiler till \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ ×ÙÈÏÄÎÙÅ ÆÁÊÌÙ × `%s'" #: locale/programs/localedef.c:365 #, c-format @@ -2567,218 +2556,218 @@ msgid "" " locale path : %s\n" "%s" msgstr "" -"Systemets kataloger för teckentabeller: %s\n" -" repertoartabeller: %s\n" -" lokal-sökväg : %s\n" +"óÉÓÔÅÍÎÙÅ ËÁÔÁÌÏÇÉ ÄÌÑ ÏÔÏÂÒÁÖÅÎÉÊ ÚÎÁËÏ×: %s\n" +" ÏÔÏÂÒÁÖÅÎÉÊ ÒÅÐÅÒÔÕÁÒÏ×: %s\n" +" ÐÕÔØ ÌÏËÁÌÉ : %s\n" "%s" #: locale/programs/localedef.c:566 #, c-format msgid "circular dependencies between locale definitions" -msgstr "cirkulärt beroende mellan lokaldefinitioner" +msgstr "ÃÉËÌÉÞÅÓËÉÅ ÚÁ×ÉÓÉÍÏÓÔÉ ÍÅÖÄÕ ÏÐÒÅÄÅÌÅÎÉÑÍÉ ÌÏËÁÌÅÊ" #: locale/programs/localedef.c:572 #, c-format msgid "cannot add already read locale `%s' a second time" -msgstr "kan inte lägga till en redan inläst lokal \"%s\" en andra gång" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÄÏÂÁ×ÉÔØ ÕÖÅ ÓÞÉÔÁÎÎÕÀ ÌÏËÁÌØ `%s' ×ÔÏÒÏÊ ÒÁÚ" #: locale/programs/locarchive.c:87 locale/programs/locarchive.c:256 #, c-format msgid "cannot create temporary file" -msgstr "kan inte skapa temporärfil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ×ÒÅÍÅÎÎÙÊ ÆÁÊÌ" #: locale/programs/locarchive.c:116 locale/programs/locarchive.c:302 #, c-format msgid "cannot initialize archive file" -msgstr "kan inte initiera arkivfil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÁÒÈÉ×ÎÙÊ ÆÁÊÌ" #: locale/programs/locarchive.c:123 locale/programs/locarchive.c:309 #, c-format msgid "cannot resize archive file" -msgstr "kan inte byta storlek på arkivfil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÉÚÍÅÎÉÔØ ÒÁÚÍÅÒ ÁÒÈÉ×ÎÏÇÏ ÆÁÊÌÁ" #: locale/programs/locarchive.c:132 locale/programs/locarchive.c:318 #: locale/programs/locarchive.c:506 #, c-format msgid "cannot map archive header" -msgstr "kan inte läsa arkivhuvud med mmap" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔÏÂÒÁÚÉÔØ × ÐÁÍÑÔØ ÚÁÇÏÌÏ×ÏË ÁÒÈÉ×Á" #: locale/programs/locarchive.c:154 #, c-format msgid "failed to create new locale archive" -msgstr "misslyckades med att skapa nytt lokalarkiv" +msgstr "ÎÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ÎÏ×ÙÊ ÁÒÈÉ× ÌÏËÁÌÉ" #: locale/programs/locarchive.c:166 #, c-format msgid "cannot change mode of new locale archive" -msgstr "kan inte ändra åtkomstläge på nytt lokalarkiv" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÉÚÍÅÎÉÔØ ÐÒÁ×Á ÄÏÓÔÕÐÁ ÄÌÑ ÎÏ×ÏÇÏ ÁÒÈÉ×ÎÏÇÏ ÆÁÊÌÁ" #: locale/programs/locarchive.c:250 #, c-format msgid "cannot map locale archive file" -msgstr "kan inte öppna lokalarkivfil med mmap" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔÏÂÒÁÚÉÔØ × ÐÁÍÑÔØ ÁÒÈÉ×ÎÙÊ ÆÁÊÌ ÌÏËÁÌÉ" #: locale/programs/locarchive.c:326 #, c-format msgid "cannot lock new archive" -msgstr "kan inte låsa nytt arkiv" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÂÌÏËÉÒÏ×ÁÔØ ÎÏ×ÙÊ ÁÒÈÉ×" #: locale/programs/locarchive.c:375 #, c-format msgid "cannot extend locale archive file" -msgstr "kan inte utöka lokalarkivfil" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÒÁÓÛÉÒÉÔØ ÁÒÈÉ×ÎÙÊ ÆÁÊÌ ÌÏËÁÌÉ" #: locale/programs/locarchive.c:384 #, c-format msgid "cannot change mode of resized locale archive" -msgstr "kan inte ändra åtkomstläge på storleksändrat lokalarkiv" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÉÚÍÅÎÉÔØ ÐÒÁ×Á ÄÏÓÔÕÐÁ ÁÒÈÉ×Á ÌÏËÁÌÉ ÐÏÓÌÅ ÉÚÍÅÎÅÎÉÑ ÒÁÚÍÅÒÁ" #: locale/programs/locarchive.c:392 #, c-format msgid "cannot rename new archive" -msgstr "kan inte byta namn på nytt arkiv" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÎÏ×ÙÊ ÁÒÈÉ×" #: locale/programs/locarchive.c:445 #, c-format msgid "cannot open locale archive \"%s\"" -msgstr "kan inte öppna lokalarkiv \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÁÒÈÉ× ÌÏËÁÌÉ \"%s\"" #: locale/programs/locarchive.c:450 #, c-format msgid "cannot stat locale archive \"%s\"" -msgstr "kan inte ta status på lokalarkiv \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ stat ÄÌÑ ÁÒÈÉ×Á ÌÏËÁÌÉ \"%s\"" #: locale/programs/locarchive.c:469 #, c-format msgid "cannot lock locale archive \"%s\"" -msgstr "kan inte låsa lokalarkiv \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÂÌÏËÉÒÏ×ÁÔØ ÁÒÈÉ× ÌÏËÁÌÉ \"%s\"" #: locale/programs/locarchive.c:492 #, c-format msgid "cannot read archive header" -msgstr "kan inte läsa arkivhuvud" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÞÉÔÁÔØ ÚÁÇÏÌÏ×ÏË ÁÒÈÉ×Á" #: locale/programs/locarchive.c:552 #, c-format msgid "locale '%s' already exists" -msgstr "lokal \"%s\" finns redan" +msgstr "ÌÏËÁÌØ '%s' ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ" #: locale/programs/locarchive.c:783 locale/programs/locarchive.c:798 #: locale/programs/locarchive.c:810 locale/programs/locarchive.c:822 #: locale/programs/locfile.c:343 #, c-format msgid "cannot add to locale archive" -msgstr "kan inte lägga till till lokalarkiv" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÄÏÂÁ×ÉÔØ Ë ÁÒÈÉ×Õ ÌÏËÁÌÉ" #: locale/programs/locarchive.c:977 #, c-format msgid "locale alias file `%s' not found" -msgstr "fil \"%s\" för lokalalias hittas inte" +msgstr "ÆÁÊÌ ÐÓÅ×ÄÏÎÉÍÏ× ÌÏËÁÌÅÊ `%s' ÎÅ ÎÁÊÄÅÎ" #: locale/programs/locarchive.c:1121 #, c-format msgid "Adding %s\n" -msgstr "Lägger till %s\n" +msgstr "äÏÂÁ×ÌÅÎÉÅ %s\n" #: locale/programs/locarchive.c:1127 #, c-format msgid "stat of \"%s\" failed: %s: ignored" -msgstr "ta status på \"%s\" misslyckades: %s: ignorerad" +msgstr "ÏÐÅÒÁÃÉÑ stat ÄÌÑ \"%s\" ÎÅÕÓÐÅÛÎÁ: %s: ÉÇÎÏÒÉÒÏ×ÁÎÏ" #: locale/programs/locarchive.c:1133 #, c-format msgid "\"%s\" is no directory; ignored" -msgstr "\"%s\" är inte en katalog, ignorerad" +msgstr "\"%s\" ÎÅ Ñ×ÌÑÅÔÓÑ ËÁÔÁÌÏÇÏÍ; ÉÇÎÏÒÉÒÏ×ÁÎÏ" #: locale/programs/locarchive.c:1140 #, c-format msgid "cannot open directory \"%s\": %s: ignored" -msgstr "kan inte öppna katalog \"%s\": %s: ignorerad" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ËÁÔÁÌÏÇ \"%s\": %s: ÉÇÎÏÒÉÒÏ×ÁÎÏ" #: locale/programs/locarchive.c:1212 #, c-format msgid "incomplete set of locale files in \"%s\"" -msgstr "ofullständig uppsättning av lokalfiler i \"%s\"" +msgstr "ÎÅÐÏÌÎÙÊ ÎÁÂÏÒ ÆÁÊÌÏ× ÌÏËÁÌÉ × \"%s\"" #: locale/programs/locarchive.c:1276 #, c-format msgid "cannot read all files in \"%s\": ignored" -msgstr "kan inte läsa alla filer i \"%s\": ignorerad" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ ×ÓÅ ÆÁÊÌÙ × \"%s\": ÉÇÎÏÒÉÒÏ×ÁÎÏ" #: locale/programs/locarchive.c:1346 #, c-format msgid "locale \"%s\" not in archive" -msgstr "lokal \"%s\" finns inte i arkivet" +msgstr "ÌÏËÁÌØ \"%s\" ÏÔÓÕÔÓÔ×ÕÅÔ × ÁÒÈÉ×Å" #: locale/programs/locfile.c:131 #, c-format msgid "argument to `%s' must be a single character" -msgstr "argumentet till \"%s\" måste vara ett enskilt tecken" +msgstr "ÁÒÇÕÍÅÎÔ ÄÌÑ `%s' ÄÏÌÖÅÎ ÂÙÔØ ÏÄÎÉÍ ÚÎÁËÏÍ" #: locale/programs/locfile.c:251 msgid "syntax error: not inside a locale definition section" -msgstr "syntaxfel: inte inne i en lokaldefinition" +msgstr "ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ: ×ÎÅ ÓÅËÃÉÉ ÏÐÒÅÄÅÌÅÎÉÑ ÌÏËÁÌÉ" #: locale/programs/locfile.c:625 #, c-format msgid "cannot open output file `%s' for category `%s'" -msgstr "kan inte öppna utfil \"%s\" för kategori \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ×ÙÈÏÄÎÏÊ ÆÁÊÌ `%s' ÄÌÑ ËÁÔÅÇÏÒÉÉ `%s'" #: locale/programs/locfile.c:649 #, c-format msgid "failure while writing data for category `%s'" -msgstr "misslyckades skriva data för kategori \"%s\"" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÚÁÐÉÓÉ ÄÁÎÎÙÈ ÄÌÑ ËÁÔÅÇÏÒÉÉ`%s'" #: locale/programs/locfile.c:745 #, c-format msgid "cannot create output file `%s' for category `%s'" -msgstr "kan inte skapa utfil \"%s\" för kategori \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ×ÙÈÏÄÎÏÊ ÆÁÊÌ `%s' ÄÌÑ ËÁÔÅÇÏÒÉÉ `%s'" #: locale/programs/locfile.c:781 msgid "expect string argument for `copy'" -msgstr "förväntar strängargument för \"copy\"" +msgstr "ÄÌÑ `copy' ÏÖÉÄÁÅÔÓÑ ÁÒÇÕÍÅÎÔ-ÓÔÒÏËÁ" #: locale/programs/locfile.c:785 msgid "locale name should consist only of portable characters" -msgstr "lokalnamn får endast bestå av portabla tecken" +msgstr "ÉÍÑ ÌÏËÁÌÉ ÄÏÌÖÎÏ ÓÏÓÔÏÑÔØ ÔÏÌØËÏ ÉÚ ÐÅÒÅÎÏÓÉÍÙÈ ÚÎÁËÏ×" #: locale/programs/locfile.c:804 msgid "no other keyword shall be specified when `copy' is used" -msgstr "inget annat nyckelord får anges när \"copy\" används" +msgstr "ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ `copy' ÎÅÌØÚÑ ÚÁÄÁ×ÁÔØ ÄÒÕÇÉÅ ËÌÀÞÅ×ÙÅ ÓÌÏ×Á" #: locale/programs/repertoire.c:229 locale/programs/repertoire.c:270 #: locale/programs/repertoire.c:295 #, c-format msgid "syntax error in repertoire map definition: %s" -msgstr "syntaxfel i repertoartabellsdefinition: %s" +msgstr "ÓÉÎÔÁËÓÉÞÅÓËÁÑ ÏÛÉÂËÁ × ÏÐÒÅÄÅÌÅÎÉÉ ÏÔÏÂÒÁÖÅÎÉÑ ÒÅÐÅÒÔÕÁÒÁ: %s" #: locale/programs/repertoire.c:271 msgid "no or value given" -msgstr "inget eller värde angivet" +msgstr "ÎÅ ÚÁÄÁÎÏ ÚÎÁÞÅÎÉÅ ÉÌÉ " #: locale/programs/repertoire.c:331 #, c-format msgid "cannot save new repertoire map" -msgstr "kan inte spara ny repertoartabell" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÈÒÁÎÉÔØ ÎÏ×ÏÅ ÏÔÏÂÒÁÖÅÎÉÅ ÒÅÐÅÒÔÕÁÒÁ" #: locale/programs/repertoire.c:342 #, c-format msgid "repertoire map file `%s' not found" -msgstr "hittar inte repertoartabell \"%s\"" +msgstr "ÆÁÊÌ ÏÔÏÂÒÁÖÅÎÉÑ ÒÅÐÅÒÔÕÁÒÁ `%s' ÎÅ ÎÁÊÄÅÎ" #: locale/programs/repertoire.c:449 #, c-format msgid "<%s> and <%s> are invalid names for range" -msgstr "<%s> och <%s> är ogiltiga namn för intervall" +msgstr "<%s> É <%s> ÎÅ Ñ×ÌÑÀÔÓÑ ÄÏÐÕÓÔÉÍÙÍÉ ÉÍÅÎÁÍÉ ÄÉÁÐÁÚÏÎÁ" #: locale/programs/repertoire.c:456 msgid "upper limit in range is not smaller then lower limit" -msgstr "övre gräns i intervall är inte mindre än undre gräns" +msgstr "×ÅÒÈÎÑÑ ÇÒÁÎÉÃÁ ÄÉÁÐÁÚÏÎÁ ÎÅ ÍÅÎØÛÅ ÎÉÖÎÅÊ" #: 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 "Sätt ägare, grupp och åtkomsträttigheter på slavpseudoterminalen som motsvaras av mästerpseudoterminalen given av filidentifierare \"%d\". Detta är hjälpprogrammet för funktionen \"grantpt\". Det är inte tänkt att köras direkt från kommandoraden.\n" +msgstr "õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÌÁÄÅÌØÃÁ, ÇÒÕÐÐÕ É ÐÒÁ×Á ÄÏÓÔÕÐÁ ÄÌÑ ÐÏÄÞÉÎÅÎÎÏÇÏ ÐÓÅ×ÄÏÔÅÒÍÉÎÁÌÁ, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÏÓÎÏ×ÎÏÍÕ ÐÓÅ×ÄÏÔÅÒÍÉÎÁÌÕ, ÐÅÒÅÄÁÎÎÏÇÏ ÐÏ ÄÅÓËÒÉÐÔÏÒÕ ÆÁÊÌÁ `%d'. üÔÏ ×ÓÐÏÍÏÇÁÔÅÌØÎÁÑ ÐÒÏÇÒÁÍÍÁ ÄÌÑ ÆÕÎËÃÉÉ `grantpt'. ïÎÁ ÎÅ ÐÒÅÄÎÁÚÎÁÞÅÎÁ ÄÌÑ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏÇÏ ÚÁÐÕÓËÁ ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ.\n" #: login/programs/pt_chown.c:84 #, c-format @@ -2787,47 +2776,47 @@ msgid "" "\n" "%s" msgstr "" -"Ägaren sätts till nuvarande användare, gruppen sätts till \"%s\" och åtkomsträttigheter sätts till \"%o\".\n" +"÷ÌÁÄÅÌÅà ÕÓÔÁÎÁ×ÌÅÎ × ÔÅËÕÝÅÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÇÒÕÐÐÁ ÕÓÔÁÎÁ×ÌÅÎÁ × `%s', ÐÒÁ×Á ÄÏÓÔÕÐÁ ÕÓÔÁÎÁ×ÌÅÎÙ × `%o'.\n" "\n" "%s" #: login/programs/pt_chown.c:161 #, c-format msgid "too many arguments" -msgstr "för många argument" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÁÒÇÕÍÅÎÔÏ×" #: login/programs/pt_chown.c:169 #, c-format msgid "needs to be installed setuid `root'" -msgstr "behöver installeras \"setuid root\"" +msgstr "ÎÅÏÂÈÏÄÉÍÏ ÕÓÔÁÎÏ×ÉÔØ Ó setuid `root'" #: malloc/mcheck.c:324 msgid "memory is consistent, library is buggy\n" -msgstr "minnet är konsistent, biblioteket är felaktigt\n" +msgstr "ÐÁÍÑÔØ × ÈÏÒÏÛÅÍ ÓÏÓÔÏÑÎÉÉ, ÏÛÉÂËÉ × ÂÉÂÌÉÏÔÅËÅ\n" #: malloc/mcheck.c:327 msgid "memory clobbered before allocated block\n" -msgstr "minnet förstört före allokerat block\n" +msgstr "ÐÁÍÑÔØ ÚÁÔÅÒÔÁ ÐÅÒÅÄ ×ÙÄÅÌÅÎÎÙÍ ÂÌÏËÏÍ\n" #: malloc/mcheck.c:330 msgid "memory clobbered past end of allocated block\n" -msgstr "minnet förstört efter slutet på allokerat block\n" +msgstr "ÐÁÍÑÔØ ÚÁÔÅÒÔÁ ÐÏÓÌÅ ËÏÎÃÁ ×ÙÄÅÌÅÎÎÏÇÏ ÂÌÏËÁ\n" #: malloc/mcheck.c:333 msgid "block freed twice\n" -msgstr "block frigjort två gånger\n" +msgstr "ÂÌÏË ÏÓ×ÏÂÏÖÄÅÎ Ä×ÁÖÄÙ\n" #: malloc/mcheck.c:336 msgid "bogus mcheck_status, library is buggy\n" -msgstr "felaktig mcheck_status, biblioteket är felaktigt\n" +msgstr "ÎÅÁÄÅË×ÁÔÎÙÊ mcheck_status, × ÂÉÂÌÉÏÔÅËÅ ÏÛÉÂËÉ\n" #: malloc/memusage.sh:27 msgid "Try `memusage --help' for more information." -msgstr "Försök med \"memusage --help\" för mer information" +msgstr "ðÏÐÒÏÂÕÊÔÅ `memusage --help' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÇÏ ÏÐÉÓÁÎÉÑ." #: malloc/memusage.sh:33 msgid "memusage: option `$1' requires an argument" -msgstr "memusage: flaggan \"$1\" behöver ett argument" +msgstr "memusage: ËÌÀÞ `$1' ÔÒÅÂÕÅÔ ÁÒÇÕÍÅÎÔ" #: malloc/memusage.sh:39 msgid "" @@ -2859,34 +2848,34 @@ msgid "" "For bug reporting instructions, please see:\n" "." msgstr "" -"UsageAnvändning: memusage [FLAGGA]... PROGRAM [PROGRAMFLAGGA]...\n" -"Spåra minnesanvändning för PROGRAM.\n" +"éÓÐÏÌØÚÏ×ÁÎÉÅ: memusage [ëìàþ]... ðòïçòáííá [ëìàþ-ðòïçòáííù]...\n" +"ðÒÏÆÉÌÉÒÕÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÐÁÍÑÔÉ ðòïçòáííïê.\n" "\n" -" -n,--progname=NAMN Namn på program att spåra\n" -" -p,--png=FIL Generera PNG-grafik och spara dem i FIL\n" -" -d,--data=FIL Generera binärdata och spara det i FIL\n" -" -u,--unbuffered Buffra inte utdata\n" -" -b,--buffer=ANTAL Samla ANTAL poster innan de skrivs ut\n" -" --no-timer Samla inte extra information med hjälp av tidur\n" -" -m,--mmap Spåra även mmap och dess vänner\n" +" -n,--progname=éíñ éÍÑ ÐÒÏÇÒÁÍÍÎÏÇÏ ÆÁÊÌÁ ÄÌÑ ÐÒÏÆÉÌÉÒÏ×ËÉ\n" +" -p,--png=æáêì óÏÚÄÁÔØ PNG-ÇÒÁÆÉË É ÚÁÐÉÓÁÔØ ÅÇÏ × æáêì\n" +" -d,--data=æáêì óÏÚÄÁÔØ ÂÉÎÁÒÎÙÊ ÆÁÊÌ ÄÁÎÎÙÈ É ÚÁÐÉÓÁÔØ ÅÇÏ æáêì\n" +" -u,--unbuffered îÅ ÂÕÆÅÒÉÒÏ×ÁÔØ ×Ù×ÏÄ\n" +" -b,--buffer=þéóìï óÏÂÒÁÔØ ÚÁÄÁÎÎÏÅ þéóìï ×ÈÏÖÄÅÎÉÊ ÐÅÒÅÄ ÚÁÐÉÓØÀ\n" +" --no-timer îÅ ÓÏÂÉÒÁÔØ ÄÏÐÏÌÎÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ ÐÏ ÔÁÊÍÅÒÕ\n" +" -m,--mmap ôÒÁÓÓÉÒÏ×ÁÔØ ÔÁËÖÅ mmap É ÅÅ ÄÒÕÚÅÊ\n" "\n" -" -?,--help Visa denna hjälptext och avsluta\n" -" --usage Visa en kort hjälptext\n" -" -V,--version Visa versionsinformation och avluta\n" +" -?,--help îÁÐÅÞÁÔÁÔØ ÜÔÕ ÓÐÒÁ×ËÕ É ×ÙÊÔÉ\n" +" --usage ðÏËÁÚÁÔØ ËÒÁÔËÕÀ ÓÐÒÁ×ËÕ Ï ÉÓÐÏÌØÚÏ×ÁÎÉÉ\n" +" -V,--version îÁÐÅÞÁÔÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ É ×ÙÊÔÉ\n" "\n" -" Följande flaggor gäller bara när grafik genereras:\n" -" -t,--time-based Gör grafen linjär i tiden\n" -" -T,--total Generera även en graf över totalt minnesutnyttjande\n" -" --title=STRÄNG Använd STRÄNG som titel för grafen.\n" -" -x,--x-size=ANTAL Gör grafiken ANTAL pixlar bred\n" -" -y,--y-size=ANTAL Gör grafiken ANTAL pixlar hög\n" +" óÌÅÄÕÀÝÉÅ ËÌÀÞÉ ÐÒÉÍÅÎÉÍÙ ÔÏÌØËÏ ÐÒÉ ÇÅÎÅÒÉÒÏ×ÁÎÉÉ ÇÒÁÆÉÞÅÓËÏÇÏ ×Ù×ÏÄÁ:\n" +" -t,--time-based óÄÅÌÁÔØ ÌÉÎÅÊÎÙÊ ÐÏ ×ÒÅÍÅÎÉ ÇÒÁÆÉË\n" +" -T,--total îÁÞÅÒÔÉÔØ ÔÁËÖÅ ÉÔÏÇÏ×ÙÊ ÇÒÁÆÉË ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÐÁÍÑÔÉ\n" +" --title=óôòïëá éÓÐÏÌØÚÏ×ÁÔØ óôòïëõ × ËÁÞÅÓÔ×Å ÚÁÇÏÌÏ×ËÁ ÇÒÁÆÉËÁ\n" +" -x,--x-size=þéóìï óÄÅÌÁÔØ ÇÒÁÆÉË ×ÙÓÏÔÏÊ × ÚÁÄÁÎÎÏÅ þéóìï ÐÉËÓÅÌÏ×\n" +" -y,--y-size=þéóìï óÄÅÌÁÔØ ÇÒÁÆÉË ÛÉÒÉÎÏÊ × ÚÁÄÁÎÎÏÅ þéóìï ÐÉËÓÅÌÏ×\n" "\n" -"Obligatoriska argument för långa flaggor är obligatoriska även för\n" -"motsvarande korta.\n" "\n" -"För felrapporteringsinstruktioner, se:\n" -".\n" -"Rapportera fel eller synpunkter på översättningen till ." +"áÒÇÕÍÅÎÔÙ, ÏÂÑÚÁÔÅÌØÎÙÅ ÄÌÑ ÄÌÉÎÎÙÈ ËÌÀÞÅÊ, ÏÂÑÚÁÔÅÌØÎÙ É ÄÌÑ\n" +"ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ËÏÒÏÔËÉÈ.\n" +"\n" +"éÎÓÔÒÕËÃÉÉ ÐÏ ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÁÈ ÓÍÏÔÒÉÔÅ ÎÁ\n" +"." #: malloc/memusage.sh:90 msgid "" @@ -2895,377 +2884,377 @@ msgid "" " [--title=STRING] [--x-size=SIZE] [--y-size=SIZE]\n" " PROGRAM [PROGRAMOPTION]..." msgstr "" -"Syntax: memusage [--data=FIL] [--progname=NAMN] [--png=FIL] [--unbuffered]\n" -" [--buffer=ANTAL] [--no-timer] [--time-based] [--total]\n" -" [--title=STRÄNG] [--x-size=ANTAL] [--y-size=ANTAL]\n" -" PROGRAM [PROGRAMFLAGGA]..." +"óÉÎÔÁËÓÉÓ: memusage [--data=æáêì] [--progname=éíñ] [--png=æáêì] [--unbuffered]\n" +" [--buffer=þéóìï] [--no-timer] [--time-based] [--total]\n" +" [--title=óôòïëá] [--x-size=þéóìï] [--y-size=þéóìï]\n" +" ðòïçòáííá [ëìàþ-ðòïçòáííù]..." #: malloc/memusage.sh:182 msgid "memusage: option `${1##*=}' is ambiguous" -msgstr "memusage: flaggan \"${1##*=}\" är tvetydig" +msgstr "memusage: ËÌÀÞ `${1##*=}' ÎÅÏÄÎÏÚÎÁÞÅÎ" #: malloc/memusage.sh:191 msgid "memusage: unrecognized option `$1'" -msgstr "memusage: okänd flagga \"$1\"" +msgstr "memusage: ÎÅÒÁÓÐÏÚÎÁÎÎÙÊ ËÌÀÞ `$1'" #: malloc/memusage.sh:204 msgid "No program name given" -msgstr "Inget programnamn givet" +msgstr "îÅ ÚÁÄÁÎÏ ÉÍÑ ÐÒÏÇÒÁÍÍÙ" #: malloc/memusagestat.c:53 msgid "Name output file" -msgstr "Namnresultatfil" +msgstr "éÍÑ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ" #: malloc/memusagestat.c:54 msgid "Title string used in output graphic" -msgstr "Titelsträng att använda i resultatgrafiken" +msgstr "úÁÇÏÌÏ×ÏË ÄÌÑ ×ÙÈÏÄÎÏÇÏ ÇÒÁÆÉËÁ" #: malloc/memusagestat.c:55 msgid "Generate output linear to time (default is linear to number of function calls)" -msgstr "Generera utdata linjär i tiden (standardvärde är linjär mot anta funktionsanrop)" +msgstr "çÅÎÅÒÉÒÏ×ÁÔØ ×Ù×ÏÄ ÌÉÎÅÊÎÏ ÏÔÎÏÓÉÔÅÌØÎÏ ×ÒÅÍÅÎÉ (ÐÏ ÕÍÏÌÞÁÎÉÀ ÌÉÎÅÊÎÏ ÏÔÎÏÓÉÔÅÌØÎÏ ÞÉÓÌÕ ×ÙÚÏ×Ï× ÆÕÎËÃÉÊ)" #: malloc/memusagestat.c:57 msgid "Also draw graph for total memory consumption" -msgstr "Visa också en graf av totala minnesåtgången" +msgstr "ðÏÓÔÒÏÉÔØ ÔÁËÖÅ ÇÒÁÆÉË ÉÔÏÇÏ×ÏÇÏ ÐÏÔÒÅÂÌÅÎÉÑ ÐÁÍÑÔÉ" #: malloc/memusagestat.c:58 msgid "make output graphic VALUE pixel wide" -msgstr "gör resultatgrafiken VALUE pixlar bred" +msgstr "ÒÉÓÏ×ÁÔØ ÇÒÁÆÉË ÛÉÒÉÎÏÊ × VALUE ÐÉËÓÅÌÏ×" #: malloc/memusagestat.c:59 msgid "make output graphic VALUE pixel high" -msgstr "gör resultatgrafiken VALUE pixlar hög" +msgstr "ÒÉÓÏ×ÁÔØ ÇÒÁÆÉË ×ÙÓÏÔÏÊ × VALUE ÐÉËÓÅÌÏ×" #: malloc/memusagestat.c:64 msgid "Generate graphic from memory profiling data" -msgstr "Generera grafik från data från minnesprofilering" +msgstr "óÇÅÎÅÒÉÒÏ×ÁÔØ ÇÒÁÆÉË ÐÏ ÄÁÎÎÙÍ ÐÒÏÆÉÌÉÒÏ×ÁÎÉÑ ÐÁÍÑÔÉ" #: malloc/memusagestat.c:67 msgid "DATAFILE [OUTFILE]" -msgstr "DATAFIL [UTFIL]" +msgstr "æáêì-äáîîùè [÷ùèïäîïê-æáêì]" #: misc/error.c:118 timezone/zic.c:396 msgid "Unknown system error" -msgstr "Okänt systemfel" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÓÉÓÔÅÍÎÁÑ ÏÛÉÂËÁ" #: nis/nis_callback.c:189 msgid "unable to free arguments" -msgstr "kan inte avallokera argument" +msgstr "ÎÅ ÕÄÁÌÏÓØ ×ÙÓ×ÏÂÏÄÉÔØ ÚÁÎÑÔÕÀ ÁÒÇÕÍÅÎÔÁÍÉ ÐÁÍÑÔØ" #: 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 "Lyckat" +msgstr "ðÏÂÅÄÁ" #: nis/nis_error.h:2 msgid "Probable success" -msgstr "Troligtvis lyckat" +msgstr "÷ÅÒÏÑÔÎÙÊ ÕÓÐÅÈ" #: nis/nis_error.h:3 msgid "Not found" -msgstr "Inte funnet" +msgstr "îÅ ÎÁÊÄÅÎÏ" #: nis/nis_error.h:4 msgid "Probably not found" -msgstr "Förmodligen inte funnen" +msgstr "÷ÅÒÏÑÔÎÏ, ÎÅ ÎÁÊÄÅÎÏ" #: nis/nis_error.h:5 msgid "Cache expired" -msgstr "Cache gick ur tiden" +msgstr "÷ÒÅÍÑ ÖÉÚÎÉ ËÜÛÁ ÉÓÔÅËÌÏ " #: nis/nis_error.h:6 msgid "NIS+ servers unreachable" -msgstr "NIS+ servers kan inte nås" +msgstr "óÌÕÖÂÙ NIS+ ÎÅÄÏÓÔÉÖÉÍÙ" #: nis/nis_error.h:7 msgid "Unknown object" -msgstr "Okänt objekt" +msgstr "îÅÉÚ×ÅÓÔÎÙÊ ÏÂßÅËÔ" #: nis/nis_error.h:8 msgid "Server busy, try again" -msgstr "Server upptagen, försök igen" +msgstr "óÅÒ×ÅÒ ÚÁÎÑÔ, ÐÏÐÒÏÂÕÊÔÅ ÅÝÅ ÒÁÚ" #: nis/nis_error.h:9 msgid "Generic system error" -msgstr "Generiskt systemfel" +msgstr "ïÂÝÁÑ ÏÛÉÂËÁ ÓÉÓÔÅÍÙ" #: nis/nis_error.h:10 msgid "First/next chain broken" -msgstr "Första/Nästa-kedja bruten" +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 msgid "Permission denied" -msgstr "Åtkomst nekas" +msgstr "ïÔËÁÚÁÎÏ × ÄÏÓÔÕÐÅ" #: nis/nis_error.h:12 msgid "Not owner" -msgstr "Inte ägare" +msgstr "îÅ ×ÌÁÄÅÌÅÃ" #: nis/nis_error.h:13 msgid "Name not served by this server" -msgstr "Namn hanteras inte av denna server" +msgstr "éÍÑ ÎÅ ÏÂÓÌÕÖÉ×ÁÅÔÓÑ ÄÁÎÎÙÍ ÓÅÒ×ÅÒÏÍ" #: nis/nis_error.h:14 msgid "Server out of memory" -msgstr "Server har slut på minne" +msgstr "ðÁÍÑÔØ ÎÁ ÓÅÒ×ÅÒÅ ÉÓÞÅÒÐÁÎÁ" #: nis/nis_error.h:15 msgid "Object with same name exists" -msgstr "Objekt med samma namn existerar" +msgstr "óÕÝÅÓÔ×ÕÅÔ ÏÂßÅËÔ Ó ÔÁËÉÍ ÖÅ ÉÍÅÎÅÍ" #: nis/nis_error.h:16 msgid "Not master server for this domain" -msgstr "Ingen huvudserver för denna domän" +msgstr "üÔÏ ÎÅ ÍÁÓÔÅÒ-ÓÅÒ×ÅÒ ÄÌÑ ÄÁÎÎÏÇÏ ÄÏÍÅÎÁ" #: nis/nis_error.h:17 msgid "Invalid object for operation" -msgstr "Ogiltigt objekt för operationen" +msgstr "îÅÄÏÐÕÓÔÉÍÙÊ ÄÌÑ ÄÁÎÎÏÊ ÏÐÅÒÁÃÉÉ ÏÂßÅËÔ" #: nis/nis_error.h:18 msgid "Malformed name, or illegal name" -msgstr "Felaktigt namn eller otillåtet namn" +msgstr "îÅÐÒÁ×ÉÌØÎÏ ÕËÁÚÁÎÎÏÅ ÉÌÉ ÎÅÄÏÐÕÓÔÉÍÏÅ ÉÍÑ" #: nis/nis_error.h:19 msgid "Unable to create callback" -msgstr "Kan inte skapa återanrop" +msgstr "" #: nis/nis_error.h:20 msgid "Results sent to callback proc" -msgstr "Resultat är skickade till återanropsprocessen" +msgstr "" #: nis/nis_error.h:21 msgid "Not found, no such name" -msgstr "Inte hittad, inget sådant namn" +msgstr "îÅ ÎÁÊÄÅÎÏ, ÎÅÔ ÔÁËÏÇÏ ÉÍÅÎÉ" #: nis/nis_error.h:22 msgid "Name/entry isn't unique" -msgstr "Namn/post är inte unik" +msgstr "éÍÑ/ÚÁÐÉÓØ ÎÅ ÕÎÉËÁÌØÎÏ" #: nis/nis_error.h:23 msgid "Modification failed" -msgstr "Ändring misslyckades" +msgstr "íÏÄÉÆÉËÁÃÉÑ ÎÅ ÕÄÁÌÁÓØ" #: nis/nis_error.h:24 msgid "Database for table does not exist" -msgstr "Databas för tabell existerar inte" +msgstr "âÁÚÁ ÄÁÎÎÙÈ ÄÌÑ ÔÁÂÌÉÃÙ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ" #: nis/nis_error.h:25 msgid "Entry/table type mismatch" -msgstr "Post/tabell-typer är inkompatibila" +msgstr "îÅÓÏÏÔ×ÅÔÓÔ×ÉÅ ÔÉÐÏ× ÚÁÐÉÓÉ/ÔÁÂÌÉÃÙ" #: nis/nis_error.h:26 msgid "Link points to illegal name" -msgstr "Länk pekar på ett otillåtet namn" +msgstr "óÓÙÌËÁ ÕËÁÚÙ×ÁÅÔ ÎÁ ÎÅÄÏÐÕÓÔÉÍÏÅ ÉÍÑ" #: nis/nis_error.h:27 msgid "Partial success" -msgstr "Delvis lyckat" +msgstr "þÁÓÔÉÞÎÙÊ ÕÓÐÅÈ" #: nis/nis_error.h:28 msgid "Too many attributes" -msgstr "För många attribut" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÁÔÒÉÂÕÔÏ×" #: nis/nis_error.h:29 msgid "Error in RPC subsystem" -msgstr "Fel i RPC-delsystem" +msgstr "ïÛÉÂËÁ × ÐÏÄÓÉÓÔÅÍÅ RPC" #: nis/nis_error.h:30 msgid "Missing or malformed attribute" -msgstr "Saknat eller felaktigt attribut" +msgstr "ðÒÏÐÕÝÅÎÎÙÊ ÉÌÉ ÎÅÐÒÁ×ÉÌØÎÏ ÕËÁÚÁÎÎÙÊ ÁÔÒÉÂÕÔ" #: nis/nis_error.h:31 msgid "Named object is not searchable" -msgstr "Namngivet objekt är inte sökbart" +msgstr "éÍÅÎÏ×ÁÎÎÙÊ ÏÂßÅËÔ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÐÏÉÓË" #: nis/nis_error.h:32 msgid "Error while talking to callback proc" -msgstr "Fel vid kommunikation till återanropsprocess" +msgstr "" #: nis/nis_error.h:33 msgid "Non NIS+ namespace encountered" -msgstr "Icke-NIS+ namnrymd påträffad" +msgstr "ïÂÎÁÒÕÖÅÎÏ ÎÅ-NIS+ ÐÒÏÓÔÒÁÎÓÔ×Ï ÉÍÅÎ" #: nis/nis_error.h:34 msgid "Illegal object type for operation" -msgstr "Otillåten objekttyp för operationen" +msgstr "îÅ ÄÏÐÕÓÔÉÍÙÊ ÄÌÑ ÏÐÅÒÁÃÉÉ ÔÉÐ ÏÂßÅËÔÁ" #: nis/nis_error.h:35 msgid "Passed object is not the same object on server" -msgstr "Skickat objekt är inte samma objekt hos servern" +msgstr "ðÅÒÅÄÁÎÎÙÊ ÏÂßÅËÔ ÎÅ ÔÏÇÏ ÖÅ ÔÉÐÁ, ÞÔÏ ÏÂßÅËÔ ÎÁ ÓÅÒ×ÅÒÅ" #: nis/nis_error.h:36 msgid "Modify operation failed" -msgstr "Ändringsoperation misslyckades" +msgstr "ïÐÅÒÁÃÉÑ ÍÏÄÉÆÉËÁÃÉÉ ÎÅÕÓÐÅÛÎÁ" #: nis/nis_error.h:37 msgid "Query illegal for named table" -msgstr "Fråga otillåten för namngiven tabell" +msgstr "îÅÄÏÐÕÓÔÉÍÙÊ ÚÁÐÒÏÓ ÄÌÑ ÉÍÅÎÏ×ÁÎÎÏÊ ÔÁÂÌÉÃÙ" #: nis/nis_error.h:38 msgid "Attempt to remove a non-empty table" -msgstr "Försök att ta bort en tabell som inte är tom" +msgstr "ðÏÐÙÔËÁ ÕÄÁÌÉÔØ ÎÅÐÕÓÔÕÀ ÔÁÂÌÉÃÕ" #: nis/nis_error.h:39 msgid "Error in accessing NIS+ cold start file. Is NIS+ installed?" -msgstr "Fel vid läsande av NIS+ kallstartsfil. Är NIS+ installerad?" +msgstr "ïÛÉÂËÁ ÏÂÒÁÝÅÎÉÑ Ë ÆÁÊÌÕ ÈÏÌÏÄÎÏÇÏ ÚÁÐÕÓËÁ NIS+. õÓÔÁÎÏ×ÌÅÎ ÌÉ NIS+?" #: nis/nis_error.h:40 msgid "Full resync required for directory" -msgstr "Fullständig resynkronisering krävs för katalog" +msgstr "äÌÑ ËÁÔÁÌÏÇÁ ÔÒÅÂÕÅÔÓÑ ÐÏÌÎÁÑ ÒÅÓÉÎÈÒÏÎÉÚÁÃÉÑ" #: nis/nis_error.h:41 msgid "NIS+ operation failed" -msgstr "NIS+ operation misslyckades" +msgstr "ïÐÅÒÁÃÉÑ NIS+ ÎÅÕÓÐÅÛÎÁ" #: nis/nis_error.h:42 msgid "NIS+ service is unavailable or not installed" -msgstr "NIS+-tjänst är otillgänglig eller inte installerad" +msgstr "óÌÕÖÂÁ NIS+ ÎÅÄÏÓÔÕÐÎÁ ÉÌÉ ÎÅ ÕÓÔÁÎÏ×ÌÅÎÁ" #: nis/nis_error.h:43 msgid "Yes, 42 is the meaning of life" -msgstr "Ja, meningen med livet är 42" +msgstr "äÁ, 42 -- ÜÔÏ ÓÍÙÓÌ ÖÉÚÎÉ" #: nis/nis_error.h:44 msgid "Unable to authenticate NIS+ server" -msgstr "Kan inte bevisa äkthet hos NIS+ server" +msgstr "îÅ ÕÄÁÌÏÓØ ÁÕÔÅÎÆÉÃÉÒÏ×ÁÔØ ÓÅÒ×ÅÒ NIS+" #: nis/nis_error.h:45 msgid "Unable to authenticate NIS+ client" -msgstr "Kan inte bevisa äkthet hos NIS+ klient" +msgstr "îÅ ÕÄÁÌÏÓØ ÁÕÔÅÎÆÉÃÉÒÏ×ÁÔØ ËÌÉÅÎÔ NIS+" #: nis/nis_error.h:46 msgid "No file space on server" -msgstr "Inget filutrymme hos servern" +msgstr "îÁ ÓÅÒ×ÅÒÅ ÎÅÔ ÄÉÓËÏ×ÏÇÏ ÐÒÏÓÔÒÁÎÓÔ×Á" #: nis/nis_error.h:47 msgid "Unable to create process on server" -msgstr "Kan inte skapa process hos server" +msgstr "îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ÐÒÏÃÅÓÓ ÎÁ ÓÅÒ×ÅÒÅ" #: nis/nis_error.h:48 msgid "Master server busy, full dump rescheduled." -msgstr "Huvudserver är upptagen, full dump omskedulerad." +msgstr "íÁÓÔÅÒ-ÓÅÒ×ÅÒ ÚÁÎÑÔ, ÚÁÐÌÁÎÉÒÏ×ÁÎ ÐÏÌÎÙÊ ÄÁÍÐ." #: nis/nis_local_names.c:122 #, c-format msgid "LOCAL entry for UID %d in directory %s not unique\n" -msgstr "LOCAL-post för UID %d i katalog %s är inte unik\n" +msgstr "úÁÐÉÓØ LOCAL ÄÌÑ UID %d × ËÁÔÁÌÏÇÅ %s ÎÅ ÕÎÉËÁÌØÎÁ\n" #: nis/nis_print.c:51 msgid "UNKNOWN" -msgstr "OKÄND" +msgstr "îåéú÷åóôîï" #: nis/nis_print.c:109 msgid "BOGUS OBJECT\n" -msgstr "SKENOBJEKT\n" +msgstr "îåáäåë÷áôîùê ïâÿåëô\n" #: nis/nis_print.c:112 msgid "NO OBJECT\n" -msgstr "INGET OBJEKT\n" +msgstr "îåô ïâÿåëôá\n" #: nis/nis_print.c:115 msgid "DIRECTORY\n" -msgstr "KATALOG\n" +msgstr "ëáôáìïç\n" #: nis/nis_print.c:118 msgid "GROUP\n" -msgstr "GRUPP\n" +msgstr "çòõððá\n" #: nis/nis_print.c:121 msgid "TABLE\n" -msgstr "TABELL\n" +msgstr "ôáâìéãá\n" #: nis/nis_print.c:124 msgid "ENTRY\n" -msgstr "POST\n" +msgstr "úáðéóø\n" #: nis/nis_print.c:127 msgid "LINK\n" -msgstr "LÄNK\n" +msgstr "óóùìëá\n" #: nis/nis_print.c:130 msgid "PRIVATE\n" -msgstr "PRIVAT\n" +msgstr "ðòé÷áôîïå\n" #: nis/nis_print.c:133 msgid "(Unknown object)\n" -msgstr "(Okänt objekt)\n" +msgstr "(îÅÉÚ×ÅÓÔÎÙÊ ÏÂßÅËÔ)\n" #: nis/nis_print.c:167 #, c-format msgid "Name : `%s'\n" -msgstr "Namn: \"%s\"\n" +msgstr "éÍÑ : `%s'\n" #: nis/nis_print.c:168 #, c-format msgid "Type : %s\n" -msgstr "Typ: %s\n" +msgstr "ôÉÐ : %s\n" #: nis/nis_print.c:173 msgid "Master Server :\n" -msgstr "Huvudserver:\n" +msgstr "íÁÓÔÅÒ-ÓÅÒ×ÅÒ :\n" #: nis/nis_print.c:175 msgid "Replicate :\n" -msgstr "Replikerad:\n" +msgstr "òÅÐÌÉËÁ :\n" #: nis/nis_print.c:176 #, c-format msgid "\tName : %s\n" -msgstr "\tNamn : %s\n" +msgstr "\téÍÑ : %s\n" #: nis/nis_print.c:177 msgid "\tPublic Key : " -msgstr "\tPublik nyckel: " +msgstr "\tðÕÂÌÉÞÎÙÊ ËÌÀÞ : " #: nis/nis_print.c:181 msgid "None.\n" -msgstr "Ingen.\n" +msgstr "îÅÔ.\n" #: nis/nis_print.c:184 #, c-format msgid "Diffie-Hellmann (%d bits)\n" -msgstr "Diffie-Hellmann (%d bitar)\n" +msgstr "äÉÆÆÉ-èÅÌÍÁÎ (%d ÂÉÔ)\n" #: nis/nis_print.c:189 #, c-format msgid "RSA (%d bits)\n" -msgstr "RSA (%d bitar)\n" +msgstr "RSA (%d ÂÉÔ)\n" #: nis/nis_print.c:192 msgid "Kerberos.\n" -msgstr "Kerberos.\n" +msgstr "ëÅÒÂÅÒÏÓ.\n" #: nis/nis_print.c:195 #, c-format msgid "Unknown (type = %d, bits = %d)\n" -msgstr "Okänd (typ = %d, bitar = %d)\n" +msgstr "îÅÉÚ×ÅÓÔÎÏ (ÔÉÐ = %d, ÂÉÔÙ = %d)\n" #: nis/nis_print.c:206 #, c-format msgid "\tUniversal addresses (%u)\n" -msgstr "\tUniversella adresser (%u)\n" +msgstr "\tõÎÉ×ÅÒÓÁÌØÎÙÅ ÁÄÒÅÓÁ (%u)\n" #: nis/nis_print.c:228 msgid "Time to live : " -msgstr "Livslängd: " +msgstr "÷ÒÅÍÑ ÖÉÚÎÉ : " #: nis/nis_print.c:230 msgid "Default Access rights :\n" -msgstr "Standard åtkomsträttigheter:\n" +msgstr "ðÒÁ×Á ÄÏÓÔÕÐÁ ÐÏ ÕÍÏÌÞÁÎÉÀ :\n" #: nis/nis_print.c:239 #, c-format msgid "\tType : %s\n" -msgstr "\tTyp : %s\n" +msgstr "\tôÉÐ : %s\n" #: nis/nis_print.c:240 msgid "\tAccess rights: " -msgstr "\tRättigheter : " +msgstr "\tðÒÁ×Á ÄÏÓÔÕÐÁ: " #: nis/nis_print.c:254 msgid "Group Flags :" -msgstr "Gruppflaggor: " +msgstr "æÌÁÇÉ ÇÒÕÐÐÙ :" #: nis/nis_print.c:257 msgid "" @@ -3273,95 +3262,96 @@ msgid "" "Group Members :\n" msgstr "" "\n" -"Gruppmedlemmar:\n" +"þÌÅÎÙ ÇÒÕÐÐÙ :\n" #: nis/nis_print.c:269 #, c-format msgid "Table Type : %s\n" -msgstr "Tabelltyp : %s\n" +msgstr "ôÉÐ ÔÁÂÌÉÃÙ : %s\n" #: nis/nis_print.c:270 #, c-format msgid "Number of Columns : %d\n" -msgstr "Antal kolumner : %d\n" +msgstr "þÉÓÌÏ ÓÔÏÌÂÃÏ× : %d\n" #: nis/nis_print.c:271 #, c-format msgid "Character Separator : %c\n" -msgstr "Teckenseparator : %c\n" +msgstr "úÎÁË-ÒÁÚÄÅÌÉÔÅÌØ : %c\n" #: nis/nis_print.c:272 #, c-format msgid "Search Path : %s\n" -msgstr "Sökväg : %s\n" +msgstr "ðÕÔØ ÐÏÉÓËÁ : %s\n" #: nis/nis_print.c:273 msgid "Columns :\n" -msgstr "Kolumner :\n" +msgstr "óÔÏÌÂÃÙ :\n" #: nis/nis_print.c:276 #, c-format msgid "\t[%d]\tName : %s\n" -msgstr "\t[%d]\tNamn : %s\n" +msgstr "\t[%d]\téÍÑ : %s\n" #: nis/nis_print.c:278 msgid "\t\tAttributes : " -msgstr "\t\tAttribut : " +msgstr "\t\táÔÒÉÂÕÔÙ : " #: nis/nis_print.c:280 msgid "\t\tAccess Rights : " -msgstr "\t\tRättigheter : " +msgstr "\t\tðÒÁ×Á ÄÏÓÔÕÐÁ : " #: nis/nis_print.c:290 msgid "Linked Object Type : " -msgstr "Länkad objekttyp: " +msgstr "ôÉÐ ÏÂßÅËÔÁ ÐÏ ÓÓÙÌËÅ : " #: nis/nis_print.c:292 #, c-format msgid "Linked to : %s\n" -msgstr "Länkad till: %s\n" +msgstr "óÓÙÌËÁ ÎÁ : %s\n" #: nis/nis_print.c:302 #, c-format msgid "\tEntry data of type %s\n" -msgstr "\tPostdata av typ %s\n" +msgstr "\täÁÎÎÙÅ ÚÁÐÉÓÉ ÔÉÐÁ %s\n" #: nis/nis_print.c:305 #, c-format msgid "\t[%u] - [%u bytes] " -msgstr "\t[%u] - [%u byte] " +msgstr "\t[%u] - [%u ÂÁÊÔ] " #: nis/nis_print.c:308 msgid "Encrypted data\n" -msgstr "Krypterat data\n" +msgstr "úÁÛÉÆÒÏ×ÁÎÎÙÅ ÄÁÎÎÙÅ\n" #: nis/nis_print.c:310 msgid "Binary data\n" -msgstr "Binärdata\n" +msgstr "âÉÎÁÒÎÙÅ ÄÁÎÎÙÅ\n" #: nis/nis_print.c:326 #, c-format msgid "Object Name : %s\n" -msgstr "Objektnamn : %s\n" +msgstr "éÍÑ ÏÂßÅËÔÁ : %s\n" #: nis/nis_print.c:327 #, c-format msgid "Directory : %s\n" -msgstr "Katalog : %s\n" +msgstr "ëÁÔÁÌÏÇ : %s\n" #: nis/nis_print.c:328 #, c-format msgid "Owner : %s\n" -msgstr "Ägare : %s\n" +msgstr "÷ÌÁÄÅÌÅà : %s\n" #: nis/nis_print.c:329 #, c-format msgid "Group : %s\n" -msgstr "Grupp : %s\n" +msgstr "çÒÕÐÐÁ : %s\n" +# ??? ÚÄÅÓØ, ÎÉÖÅ É ×ÙÛÅ -- ÒÁÓÓÔÁ×ÉÔØ ÐÒÏÂÅÌÙ ËÁË ÎÁÄÏ #: nis/nis_print.c:330 msgid "Access Rights : " -msgstr "Rättigheter : " +msgstr "ðÒÁ×Á ÄÏÓÔÕÐÁ : " #: nis/nis_print.c:332 #, c-format @@ -3370,101 +3360,102 @@ msgid "" "Time to Live : " msgstr "" "\n" -"Livslängd : " +"÷ÒÅÍÑ ÖÉÚÎÉ : " #: nis/nis_print.c:335 #, c-format msgid "Creation Time : %s" -msgstr "Skapad : %s" +msgstr "÷ÒÅÍÑ ÓÏÚÄÁÎÉÑ : %s" #: nis/nis_print.c:337 #, c-format msgid "Mod. Time : %s" -msgstr "Ändr. tid : %s" +msgstr "÷ÒÅÍÑ ÍÏÄÉÆÉËÁÃÉÉ : %s" #: nis/nis_print.c:338 msgid "Object Type : " -msgstr "Objekttyp : " +msgstr "ôÉÐ ÏÂßÅËÔÁ : " #: nis/nis_print.c:358 #, c-format msgid " Data Length = %u\n" -msgstr " Datalängd = %u\n" +msgstr " äÌÉÎÁ ÄÁÎÎÙÈ = %u\n" #: nis/nis_print.c:372 #, c-format msgid "Status : %s\n" -msgstr "Status : %s\n" +msgstr "óÔÁÔÕÓ : %s\n" #: nis/nis_print.c:373 #, c-format msgid "Number of objects : %u\n" -msgstr "Antal objekt : %u\n" +msgstr "þÉÓÌÏ ÏÂßÅËÔÏ× : %u\n" #: nis/nis_print.c:377 #, c-format msgid "Object #%d:\n" -msgstr "Objekt #%d:\n" +msgstr "ïÂßÅËÔ #%d:\n" #: nis/nis_print_group_entry.c:117 #, c-format msgid "Group entry for \"%s.%s\" group:\n" -msgstr "Grupppost för \"%s.%s\" grupp:\n" +msgstr "úÁÐÉÓØ ÇÒÕÐÐÙ ÄÌÑ ÇÒÕÐÐÙ \"%s.%s\":\n" #: nis/nis_print_group_entry.c:125 msgid " Explicit members:\n" -msgstr " Explicita medlemmar:\n" +msgstr " ñ×ÎÙÅ ÞÌÅÎÙ:\n" #: nis/nis_print_group_entry.c:130 msgid " No explicit members\n" -msgstr " Inga explicita medlemmar\n" +msgstr " îÅÔ Ñ×ÎÙÈ ÞÌÅÎÏ×\n" #: nis/nis_print_group_entry.c:133 msgid " Implicit members:\n" -msgstr " Implicita medlemmar:\n" +msgstr " îÅÑ×ÎÙÅ ÞÌÅÎÙ:\n" #: nis/nis_print_group_entry.c:138 msgid " No implicit members\n" -msgstr " Inga implicita medlemmar\n" +msgstr " îÅÔ ÎÅÑ×ÎÙÈ ÞÌÅÎÏ×\n" #: nis/nis_print_group_entry.c:141 msgid " Recursive members:\n" -msgstr " Rekursiva medlemmar:\n" +msgstr " òÅËÕÒÓÉ×ÎÙÅ ÞÌÅÎÙ:\n" #: nis/nis_print_group_entry.c:146 msgid " No recursive members\n" -msgstr " Inga rekursiva medlemmar\n" +msgstr " îÅÔ ÒÅËÕÒÓÉ×ÎÙÈ ÞÌÅÎÏ×\n" #: nis/nis_print_group_entry.c:149 nis/nis_print_group_entry.c:165 msgid " Explicit nonmembers:\n" -msgstr " Explicit icke-medlemmar:\n" +msgstr " ñ×ÎÙÅ ÎÅ-ÞÌÅÎÙ:\n" #: nis/nis_print_group_entry.c:154 msgid " No explicit nonmembers\n" -msgstr " Inga explicita icke-medlemmar\n" +msgstr " îÅÔ Ñ×ÎÙÈ ÎÅ-ÞÌÅÎÏ×\n" #: nis/nis_print_group_entry.c:157 msgid " Implicit nonmembers:\n" -msgstr " Implicita icke-medlemmar:\n" +msgstr " îÅÑ×ÎÙÅ ÎÅ-ÞÌÅÎÙ:\n" #: nis/nis_print_group_entry.c:162 msgid " No implicit nonmembers\n" -msgstr " Inga implicita icke-medlemmar\n" +msgstr " îÅÔ ÎÅÑ×ÎÙÈ ÎÅ-ÞÌÅÎÏ×\n" #: nis/nis_print_group_entry.c:170 msgid " No recursive nonmembers\n" -msgstr " Inga rekursiva icke-medlemmar\n" +msgstr " îÅÔ ÒÅËÕÒÓÉ×ÎÙÈ ÎÅ-ÞÌÅÎÏ×\n" +# ??? #: 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 "DES-post för nätnamn %s är inte unikt\n" +msgstr "úÁÐÉÓØ DES ÄÌÑ netname %s ÎÅ ÕÎÉËÁÌØÎÁ\n" #: nis/nss_nisplus/nisplus-publickey.c:220 #, c-format msgid "netname2user: missing group id list in `%s'." -msgstr "netname2user: gruppid-lista saknas i \"%s\"." +msgstr "netname2user: ÐÒÏÐÕÝÅÎ ÓÐÉÓÏË ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÇÒÕÐÐ × `%s'." #: nis/nss_nisplus/nisplus-publickey.c:302 #: nis/nss_nisplus/nisplus-publickey.c:308 @@ -3472,521 +3463,521 @@ msgstr "netname2user: gruppid-lista saknas i \"%s\"." #: nis/nss_nisplus/nisplus-publickey.c:382 #, c-format msgid "netname2user: (nis+ lookup): %s\n" -msgstr "netname2user: (nis+ uppslagning) %s\n" +msgstr "netname2user: (ÐÏÉÓË × nis+): %s\n" #: nis/nss_nisplus/nisplus-publickey.c:321 #, c-format msgid "netname2user: DES entry for %s in directory %s not unique" -msgstr "netname2user: DES-post för %s i katalog %s är inte unik" +msgstr "netname2user: ÚÁÐÉÓØ DES ÄÌÑ %s × ËÁÔÁÌÏÇÅ %s ÎÅ ÕÎÉËÁÌØÎÁ" #: nis/nss_nisplus/nisplus-publickey.c:339 #, c-format msgid "netname2user: principal name `%s' too long" -msgstr "netname2user: principalnamn \"%s\" för långt" +msgstr "netname2user: ÉÍÑ ÐÒÉÎÃÉÐÁÌÁ `%s' ÓÌÉÛËÏÍ ×ÅÌÉËÏ" #: nis/nss_nisplus/nisplus-publickey.c:395 #, c-format msgid "netname2user: LOCAL entry for %s in directory %s not unique" -msgstr "netname2user: LOCAL-post för %s i katalog %s är inte unik" +msgstr "netname2user: ÚÁÐÉÓØ LOCAL ÄÌÑ %s × ËÁÔÁÌÏÇÅ %s ÎÅ ÕÎÉËÁÌØÎÁ" #: nis/nss_nisplus/nisplus-publickey.c:402 msgid "netname2user: should not have uid 0" -msgstr "netname2user: borde inte ha uid 0" +msgstr "netname2user: ÎÅ ÄÏÌÖÅÎ ÉÍÅÔØ ÎÕÌÅ×ÏÊ uid" #: nis/ypclnt.c:825 msgid "Request arguments bad" -msgstr "Argument för förfrågan felaktiga" +msgstr "îÅÐÒÁ×ÉÌØÎÙÅ ÁÒÇÕÍÅÎÔÙ ÚÁÐÒÏÓÁ" #: nis/ypclnt.c:828 msgid "RPC failure on NIS operation" -msgstr "RPC-fel vid NIS-operation" +msgstr "óÂÏÊ RPC ÐÒÉ ÏÐÅÒÁÃÉÉ NIS" #: nis/ypclnt.c:831 msgid "Can't bind to server which serves this domain" -msgstr "Kan inte ansluta till servern som betjänar denna domän" +msgstr "îÅ ÕÄÁÅÔÓÑ ÓÏÅÄÉÎÉÔØÓÑ Ó ÓÅÒ×ÅÒÏÍ, ÏÂÓÌÕÖÉ×ÁÀÝÉÍ ÜÔÏÔ ÄÏÍÅÎ" #: nis/ypclnt.c:834 msgid "No such map in server's domain" -msgstr "Ingen sådan tabell i serverns domän" +msgstr "îÅÔ ÔÁËÏÇÏ ÏÔÏÂÒÁÖÅÎÉÑ × ÄÏÍÅÎÅ ÓÅÒ×ÅÒÁ" #: nis/ypclnt.c:837 msgid "No such key in map" -msgstr "Ingen sådan nyckel i tabellen" +msgstr "îÅÔ ÔÁËÏÇÏ ËÌÀÞÁ × ÏÔÏÂÒÁÖÅÎÉÉ" #: nis/ypclnt.c:840 msgid "Internal NIS error" -msgstr "Internt NIS-fel" +msgstr "÷ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ NIS" #: nis/ypclnt.c:843 msgid "Local resource allocation failure" -msgstr "Allokeringsfel för lokal resurs" +msgstr "óÂÏÊ ÐÒÉ ×ÙÄÅÌÅÎÉÉ ÌÏËÁÌØÎÏÇÏ ÒÅÓÕÒÓÁ" #: nis/ypclnt.c:846 msgid "No more records in map database" -msgstr "Inga fler poster i tabelldatabasen" +msgstr "âÏÌØÛÅ ÎÅÔ ÚÁÐÉÓÅÊ × ÂÁÚÅ ÄÁÎÎÙÈ ÏÔÏÂÒÁÖÅÎÉÊ" #: nis/ypclnt.c:849 msgid "Can't communicate with portmapper" -msgstr "Kan inte kommunicera med portmapper" +msgstr "îÅ×ÏÚÍÏÖÎÏ Ó×ÑÚÁÔØÓÑ Ó ÏÔÏÂÒÁÖÁÔÅÌÅÍ ÐÏÒÔÏ×" #: nis/ypclnt.c:852 msgid "Can't communicate with ypbind" -msgstr "Kan inte kommunicera med ypbind" +msgstr "îÅ×ÏÚÍÏÖÎÏ Ó×ÑÚÁÔØÓÑ Ó ypbind" #: nis/ypclnt.c:855 msgid "Can't communicate with ypserv" -msgstr "Kan inte kommunicera med ypserv" +msgstr "îÅ×ÏÚÍÏÖÎÏ Ó×ÑÚÁÔØÓÑ Ó ypserv" #: nis/ypclnt.c:858 msgid "Local domain name not set" -msgstr "Lokalt domännamn inte satt" +msgstr "ìÏËÁÌØÎÏÅ ÉÍÑ ÄÏÍÅÎÁ ÎÅ ÕÓÔÁÎÏ×ÌÅÎÏ" #: nis/ypclnt.c:861 msgid "NIS map database is bad" -msgstr "NIS tabelldatabas är felaktig" +msgstr "îÅÐÒÁ×ÉÌØÎÁÑ ÂÁÚÁ ÄÁÎÎÙÈ ÏÔÏÂÒÁÖÅÎÉÊ NIS" #: nis/ypclnt.c:864 msgid "NIS client/server version mismatch - can't supply service" -msgstr "NIS versionsskillnad klient/server - kan inte betjäna" +msgstr "îÅÓÏÏÔ×ÅÔÓÔ×ÉÅ ×ÅÒÓÉÊ ËÌÉÅÎÔÁ/ÓÅÒ×ÅÒÁ NIS -- ÎÅ×ÏÚÍÏÖÎÏ ÐÒÅÄÏÓÔÁ×ÉÔØ ÓÌÕÖÂÕ" #: nis/ypclnt.c:870 msgid "Database is busy" -msgstr "Databasen är upptagen" +msgstr "âÁÚÁ ÄÁÎÎÙÈ ÚÁÎÑÔÁ" #: nis/ypclnt.c:873 msgid "Unknown NIS error code" -msgstr "Okänd NIS-felkod" +msgstr "îÅÉÚ×ÅÓÔÎÙÊ ËÏÄ ÏÛÉÂËÉ NIS" #: nis/ypclnt.c:913 msgid "Internal ypbind error" -msgstr "Internt ypbind-fel" +msgstr "÷ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ ypbind" #: nis/ypclnt.c:916 msgid "Domain not bound" -msgstr "Domän inte bunden" +msgstr "äÏÍÅÎ ÎÅ ÎÁÊÄÅÎ" #: nis/ypclnt.c:919 msgid "System resource allocation failure" -msgstr "Allokeringsfel för systemresurs" +msgstr "óÂÏÊ ×ÙÄÅÌÅÎÉÑ ÓÉÓÔÅÍÎÏÇÏ ÒÅÓÕÒÓÁ" #: nis/ypclnt.c:922 msgid "Unknown ypbind error" -msgstr "Okänt ypbind-fel" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ ypbind" #: nis/ypclnt.c:963 msgid "yp_update: cannot convert host to netname\n" -msgstr "yp_update: kan inte omvandla värd till nätnamn\n" +msgstr "yp_update: ÎÅ×ÏÚÍÏÖÎÏ ÐÒÅÏÂÒÁÚÏ×ÁÔØ ÈÏÓÔ × netname\n" #: nis/ypclnt.c:981 msgid "yp_update: cannot get server address\n" -msgstr "yp_update: kan inte hämta serveradress\n" +msgstr "yp_update: ÎÅ×ÏÚÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÁÄÒÅÓ ÓÅÒ×ÅÒÁ\n" #: nscd/aicache.c:76 nscd/hstcache.c:461 #, c-format msgid "Haven't found \"%s\" in hosts cache!" -msgstr "Hittar inte \"%s\" i värdcache!" +msgstr "îÅ ÎÁÊÄÅÎÏ \"%s\" × ËÜÛÅ ÈÏÓÔÏ×!" #: nscd/aicache.c:78 nscd/hstcache.c:463 #, c-format msgid "Reloading \"%s\" in hosts cache!" -msgstr "Omladdar \"%s\" i värdcache!" +msgstr "ðÅÒÅÚÁÇÒÕÚËÁ \"%s\" × ËÜÛÅ ÈÏÓÔÏ×!" #: nscd/cache.c:126 #, c-format msgid "add new entry \"%s\" of type %s for %s to cache%s" -msgstr "lägg till ny post \"%s\" av typen %s för %s till cache%s" +msgstr "ÄÏÂÁ×ÉÔØ ÎÏ×ÕÀ ÚÁÐÉÓØ \"%s\" ÔÉÐÁ %s ÄÌÑ %s × ËÜÛ%s" #: nscd/cache.c:233 nscd/connections.c:750 #, c-format msgid "cannot stat() file `%s': %s" -msgstr "kan inte ta status på fil \"%s\": %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ stat() ÄÌÑ ÆÁÊÌÁ `%s': %s" #: nscd/cache.c:262 #, c-format msgid "pruning %s cache; time %ld" -msgstr "beskär %s cache; tid %ld" +msgstr "" #: nscd/cache.c:289 #, c-format msgid "considering %s entry \"%s\", timeout %" -msgstr "överväger %s post \"%s\", tidsgräns %" +msgstr "" #: nscd/connections.c:469 nscd/connections.c:481 nscd/connections.c:493 #: nscd/connections.c:512 #, c-format msgid "invalid persistent database file \"%s\": %s" -msgstr "ogiltig persistent databasfil \"%s\": %s" +msgstr "ÎÅ×ÅÒÎÙÊ ÆÁÊÌ Ó ÐÏÓÔÏÑÎÎÏÊ ÂÁÚÏÊ ÄÁÎÎÙÈ \"%s\": %s" #: nscd/connections.c:483 msgid "header size does not match" -msgstr "huvudstorlek stämmer inte" +msgstr "ÒÁÚÍÅÒ ÚÁÇÏÌÏ×ËÁ ÎÅ ÓÏ×ÐÁÄÁÅÔ" #: nscd/connections.c:495 msgid "file size does not match" -msgstr "filstorlek stämmer inte" +msgstr "ÎÅ ÓÏ×ÐÁÄÁÅÔ ÒÁÚÍÅÒ ÆÁÊÌÁ" #: nscd/connections.c:514 msgid "verification failed" -msgstr "verifikation misslyckades" +msgstr "×ÅÒÉÆÉËÁÃÉÑ ÎÅ ÕÄÁÌÁÓØ" #: nscd/connections.c:528 #, c-format msgid "suggested size of table for database %s larger than the persistent database's table" -msgstr "föreslagen storlek på tabellen för databas %s är större än den persistenta databasens tabell" +msgstr "ÐÒÅÄÌÁÇÁÅÍÙÊ ÒÁÚÍÅÒ ÔÁÂÌÉÃÙ ÄÌÑ ÂÁÚÙ ÄÁÎÎÙÈ %s ÂÏÌØÛÅ ÞÅÍ ÔÁÂÌÉÃÁ Õ ÐÏÓÔÏÑÎÎÏÊ ÂÁÚÙ ÄÁÎÎÙÈ" #: nscd/connections.c:538 nscd/connections.c:619 #, c-format msgid "cannot create read-only descriptor for \"%s\"; no mmap" -msgstr "kan inte skapa läsbar filidentifierare för \"%s\", ingen mmap" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÄÅÓËÒÉÐÔÏÒ ÔÏÌØËÏ ÄÌÑ ÞÔÅÎÉÑ ÄÌÑ \"%s\"; ÏÔÓÕÔÓÔ×ÕÅÔ mmap" #: nscd/connections.c:598 #, c-format msgid "database for %s corrupted or simultaneously used; remove %s manually if necessary and restart" -msgstr "databas för %s korrupt eller använd av flera samtidigt; ta bort %s manuellt om det behövs och starta om" +msgstr "ÂÁÚÁ ÄÁÎÎÙÈ ÄÌÑ %s ÐÏ×ÒÅÖÄÅÎÁ ÉÌÉ ÐÁÒÁÌÌÅÌØÎÏ ÉÓÐÏÌØÚÕÅÔÓÑ; ÕÄÁÌÉÔÅ %s ×ÒÕÞÎÕÀ, ÅÓÌÉ ÎÅÏÂÈÏÄÉÍÏ, É ÐÅÒÅÚÁÐÕÓÔÉÔÅ" #: nscd/connections.c:605 #, c-format msgid "cannot create %s; no persistent database used" -msgstr "kan inte skapa %s; ingen persistent databas används" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ %s; ÐÏÓÔÏÑÎÎÙÅ ÂÁÚÙ ÄÁÎÎÙÈ ÎÅ ÉÓÐÏÌØÚÏ×ÁÎÙ" #: nscd/connections.c:608 #, c-format msgid "cannot create %s; no sharing possible" -msgstr "kan inte skapa %s; ingen delning möjlig" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ %s; ÒÁÚÄÅÌÅÎÉÅ ÎÅ×ÏÚÍÏÖÎÏ" #: nscd/connections.c:679 #, c-format msgid "cannot write to database file %s: %s" -msgstr "kan inte skriva till databasfil %s: %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ × ÆÁÊÌ ÂÁÚÙ ÄÁÎÎÙÈ %s: %s " #: nscd/connections.c:713 #, c-format msgid "cannot set socket to close on exec: %s; disabling paranoia mode" -msgstr "kan inte sätta uttag (socket) att stängas vid programstart: %s; kopplar ur paranoialäge" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ ÚÁËÒÙÔÉÅ ÓÏËÅÔÁ ÐÒÉ exec: %s; ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ÙËÌÀÞÅÎ" #: nscd/connections.c:763 #, c-format msgid "cannot open socket: %s" -msgstr "kan inte öppna uttag (socket): %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÓÏËÅÔ: %s" #: nscd/connections.c:780 #, c-format msgid "cannot change socket to nonblocking mode: %s" -msgstr "kan inte ändra uttag (socket) till icke-blockerande: %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÅÒÅ×ÅÓÔÉ ÓÏËÅÔ × ÎÅÂÌÏËÉÒÕÀÝÉÊ ÒÅÖÉÍ: %s" #: nscd/connections.c:788 #, c-format msgid "cannot set socket to close on exec: %s" -msgstr "kan inte sätta uttag (socket) att stängas vid programstart: %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÄÅÌÁÔØ ÓÏËÅÔ ÚÁËÒÙ×ÁÀÝÉÍÓÑ ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ exec: %s" #: nscd/connections.c:799 #, c-format msgid "cannot enable socket to accept connections: %s" -msgstr "kan inte få uttag (socket) att acceptera förbindelser: %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÄÅÌÁÔØ ÓÏËÅÔ ÐÒÉÎÉÍÁÀÝÉÍ ÓÏÅÄÉÎÅÎÉÑ: %s" #: nscd/connections.c:892 #, c-format msgid "provide access to FD %d, for %s" -msgstr "ge åtkomst till FD %d, för %s" +msgstr "" #: nscd/connections.c:904 #, c-format msgid "cannot handle old request version %d; current version is %d" -msgstr "Kan inte hantera äldre förfrågansversion %d, nuvarande version är %d" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÂÒÁÂÏÔÁÔØ ÚÁÐÒÏÓ ÓÔÁÒÏÊ ×ÅÒÓÉÉ %d; ÔÅËÕÝÁÑ ×ÅÒÓÉÑ %d" #: nscd/connections.c:954 nscd/connections.c:1007 #, c-format msgid "cannot write result: %s" -msgstr "kan inte skriva resultat: %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ ÒÅÚÕÌØÔÁÔ: %s" #: nscd/connections.c:1082 #, c-format msgid "error getting caller's id: %s" -msgstr "kunde inte hämta anropandes identitet: %s" +msgstr "ÏÛÉÂËÁ ÐÒÉ ÐÏÌÕÞÅÎÉÉ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ×ÙÚÙ×ÁÀÝÅÊ ÓÔÏÒÏÎÙ: %s" #: nscd/connections.c:1140 nscd/connections.c:1154 #, c-format msgid "cannot open /proc/self/cmdline: %s; disabling paranoia mode" -msgstr "kan inte öppna /proc/slef/cmdline: %s, kopplar ur paranoialäge" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ /proc/self/cmdline: %s; ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ÙËÌÀÞÅÎ" #: nscd/connections.c:1194 #, c-format msgid "cannot change to old UID: %s; disabling paranoia mode" -msgstr "kan inte byta till föregående UID: %s; kopplar ur paranoialäge" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÍÅÎÉÔØ UID ÎÁ ÐÒÅÖÎÉÊ: %s; ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ÙËÌÀÞÅÎ" #: nscd/connections.c:1204 #, c-format msgid "cannot change to old GID: %s; disabling paranoia mode" -msgstr "kan inte byta till föregående GID: %s; kopplar ur paranoialäge" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÍÅÎÉÔØ GID ÎÁ ÐÒÅÖÎÉÊ: %s; ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ÙËÌÀÞÅÎ" #: nscd/connections.c:1217 #, c-format msgid "cannot change to old working directory: %s; disabling paranoia mode" -msgstr "kan inte byta till föregående arbetskatalog: %s; kopplar ur paranoialäge" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÅÒÎÕÔØÓÑ × ÐÒÅÖÎÉÊ ÒÁÂÏÞÉÊ ËÁÔÁÌÏÇ: %s; ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ÙËÌÀÞÅÎ" #: nscd/connections.c:1245 #, c-format msgid "re-exec failed: %s; disabling paranoia mode" -msgstr "återstart misslyckades: %s; kopplar ur paranoialäge" +msgstr "ÐÏ×ÔÏÒÎÙÊ exec ÎÅÕÓÐÅÛÅÎ: %s; ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ÙËÌÀÞÅÎ" #: nscd/connections.c:1254 #, c-format msgid "cannot change current working directory to \"/\": %s" -msgstr "kan inte byta aktuell katalog to \"/\": %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÍÅÎÉÔØ ÒÁÂÏÞÉÊ ËÁÔÁÌÏÇ ÎÁ \"/\": %s" #: nscd/connections.c:1372 #, c-format msgid "short read while reading request: %s" -msgstr "fattas data vid läsning av begäran: %s" +msgstr "ÎÅÐÏÌÎÙÊ ÓÞÉÔÁÎÎÙÊ ÂÌÏË ÐÒÉ ÞÔÅÎÉÉ ÚÁÐÒÏÓÁ: %s" #: nscd/connections.c:1404 #, c-format msgid "key length in request too long: %d" -msgstr "nyckellängd i begäran för lång: %d" +msgstr "ÄÌÉÎÁ ËÌÀÞÁ × ÚÁÐÒÏÓÅ ÓÌÉÛËÏÍ ×ÅÌÉËÁ: %d" #: nscd/connections.c:1417 #, c-format msgid "short read while reading request key: %s" -msgstr "fattas data vid läsning av begäransnyckel: %s" +msgstr "ÎÅÐÏÌÎÙÊ ÓÞÉÔÁÎÎÙÊ ÂÌÏË ÐÒÉ ÞÔÅÎÉÉ ËÌÀÞÁ ÚÁÐÒÏÓÁ: %s" #: nscd/connections.c:1426 #, c-format msgid "handle_request: request received (Version = %d) from PID %ld" -msgstr "handle_request: begäran mottagen (Version = %d) från PID %ld" +msgstr "handle_request: ÐÏÌÕÞÅÎ ÚÁÐÒÏÓ (×ÅÒÓÉÑ = %d) ÏÔ PID %ld" #: nscd/connections.c:1431 #, c-format msgid "handle_request: request received (Version = %d)" -msgstr "handle_request: begäran mottagen (Version = %d)" +msgstr "handle_request: ÐÏÌÕÞÅÎ ÚÁÐÒÏÓ (×ÅÒÓÉÑ = %d)" #: nscd/connections.c:1792 #, c-format msgid "could only start %d threads; terminating" -msgstr "kunde bara starta %d trådar; avslutar" +msgstr "ÕÄÁÌÏÓØ ÚÁÐÕÓÔÉÔØ ÔÏÌØËÏ %d ÔÒÅÄÏ×; ÏÓÔÁÎÏ×" #: nscd/connections.c:1840 nscd/connections.c:1841 nscd/connections.c:1858 #: nscd/connections.c:1867 nscd/connections.c:1885 nscd/connections.c:1896 #: nscd/connections.c:1907 #, c-format msgid "Failed to run nscd as user '%s'" -msgstr "Misslyckades att köra nscd som användare \"%s\"" +msgstr "îÅ ÕÄÁÌÏÓØ ÚÁÐÕÓÔÉÔØ nscd ÏÔ ÉÍÅÎÉ ÐÏÌØÚÏ×ÁÔÅÌÑ '%s'" #: nscd/connections.c:1859 #, c-format msgid "initial getgrouplist failed" -msgstr "första getgrouplist misslyckades" +msgstr "ÐÅÒ×ÏÎÁÞÁÌØÎÁÑ getgrouplist ÎÅÕÓÐÅÛÎÁ" #: nscd/connections.c:1868 #, c-format msgid "getgrouplist failed" -msgstr "getgrouplist misslyckades" +msgstr "getgrouplist ÎÅÕÓÐÅÛÎÁ" #: nscd/connections.c:1886 #, c-format msgid "setgroups failed" -msgstr "setgroups misslyckades" +msgstr "setgroups ÎÅÕÓÐÅÛÎÁ" #: nscd/grpcache.c:400 nscd/hstcache.c:411 nscd/initgrcache.c:411 #: nscd/pwdcache.c:395 #, c-format msgid "short write in %s: %s" -msgstr "ofullständig skrivning i %s: %s" +msgstr "ÎÅÐÏÌÎÁÑ ÚÁÐÉÓØ × %s: %s" #: nscd/grpcache.c:443 nscd/initgrcache.c:77 #, c-format msgid "Haven't found \"%s\" in group cache!" -msgstr "Hittar inte \"%s\" i gruppcache!" +msgstr "îÅ ÎÁÊÄÅÎÏ \"%s\" × ËÜÛÅ ÇÒÕÐÐ!" #: nscd/grpcache.c:445 nscd/initgrcache.c:79 #, c-format msgid "Reloading \"%s\" in group cache!" -msgstr "Omladdar \"%s\" i gruppcache!" +msgstr "ðÅÒÅÚÁÇÒÕÚËÁ \"%s\" × ËÜÛÅ ÇÒÕÐÐ!" #: nscd/grpcache.c:536 #, c-format msgid "Invalid numeric gid \"%s\"!" -msgstr "Ogiltigt numeriskt gruppid (gid) \"%s\"!" +msgstr "îÅ×ÅÒÎÙÊ ÞÉÓÌÏ×ÏÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÇÒÕÐÐÙ \"%s\"!" #: nscd/mem.c:382 #, c-format msgid "freed %zu bytes in %s cache" -msgstr "frigorde %zu byte i %s cache" +msgstr "ÏÓ×ÏÂÏÖÄÅÎÏ %zu ÂÁÊÔ × ËÜÛÅ %s" #: nscd/mem.c:511 #, c-format msgid "no more memory for database '%s'" -msgstr "inget mer minne för databas \"%s\"" +msgstr "ÎÅÄÏÓÔÁÔÏÞÎÏ ÐÁÍÑÔÉ ÄÌÑ ÂÁÚÙ ÄÁÎÎÙÈ '%s'" #: nscd/nscd.c:97 msgid "Read configuration data from NAME" -msgstr "Läs konfigurationsdata från NAMN" +msgstr "þÉÔÁÔØ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÄÁÎÎÙÅ ÉÚ æáêìá" #: nscd/nscd.c:99 msgid "Do not fork and display messages on the current tty" -msgstr "Skapa inte barnprocess, visa meddelanden på nuvarande tty" +msgstr "îÅ ÐÏÒÏÖÄÁÔØ ÄÏÞÅÒÎÉÊ ÐÒÏÃÅÓÓ, ÐÅÞÁÔÁÔØ ÓÏÏÂÝÅÎÉÑ ÎÁ ÔÅËÕÝÉÊ ÔÅÒÍÉÎÁÌ" #: nscd/nscd.c:100 msgid "NUMBER" -msgstr "ANTAL" +msgstr "þéóìï" #: nscd/nscd.c:100 msgid "Start NUMBER threads" -msgstr "Starta ANTAL trådar" +msgstr "úÁÐÕÓÔÉÔØ ÕËÁÚÁÎÎÏÅ þéóìï ÎÉÔÅÊ" #: nscd/nscd.c:101 msgid "Shut the server down" -msgstr "Avsluta servern" +msgstr "÷ÙËÌÀÞÉÔØ ÓÅÒ×ÅÒ" #: nscd/nscd.c:102 msgid "Print current configuration statistic" -msgstr "Skriv ut nuvarande konfigurationsstatistik" +msgstr "îÁÐÅÞÁÔÁÔØ ÓÔÁÔÉÓÔÉËÕ ÐÏ ÔÅËÕÝÅÊ ËÏÎÆÉÇÕÒÁÃÉÉ" #: nscd/nscd.c:103 msgid "TABLE" -msgstr "TABELL" +msgstr "ôáâìéãá" #: nscd/nscd.c:104 msgid "Invalidate the specified cache" -msgstr "Invalidera den angivna cachen" +msgstr "ïÂßÑ×ÉÔØ ÕËÁÚÁÎÎÙÊ ËÜÛ ÎÅÄÅÊÓÔ×ÉÔÅÌØÎÙÍ" #: nscd/nscd.c:105 msgid "TABLE,yes" -msgstr "TABELL,yes" +msgstr "ôáâìéãá,yes" #: nscd/nscd.c:106 msgid "Use separate cache for each user" -msgstr "Använd separat cache för varje användare" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÏÔÄÅÌØÎÙÊ ËÜÛ ÄÌÑ ËÁÖÄÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ" #: nscd/nscd.c:111 msgid "Name Service Cache Daemon." -msgstr "Namntjänst cache-demon" +msgstr "äÅÍÏÎ ËÜÛÁ ÓÌÕÖÂÙ ÉÍÅÎ." #: nscd/nscd.c:143 nss/getent.c:858 nss/makedb.c:123 #, c-format msgid "wrong number of arguments" -msgstr "fel antal argument" +msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÞÉÓÌÏ ÁÒÇÕÍÅÎÔÏ×" #: nscd/nscd.c:153 #, c-format msgid "failure while reading configuration file; this is fatal" -msgstr "kan inte läsa konfigurationsdata, detta är fatalt" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ; ÜÔÏ ÆÁÔÁÌØÎÙÊ ÓÂÏÊ" #: nscd/nscd.c:162 #, c-format msgid "already running" -msgstr "kör redan" +msgstr "ÕÖÅ ÚÁÐÕÝÅÎ" #: nscd/nscd.c:177 nscd/nscd.c:232 #, c-format msgid "cannot fork" -msgstr "kan inte skapa barnprocess" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÏÒÏÄÉÔØ ÄÏÞÅÒÎÉÊ ÐÒÏÃÅÓÓ" #: nscd/nscd.c:240 #, c-format msgid "cannot change current working directory to \"/\"" -msgstr "kan inte byta aktuell katalog till \"/\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÍÅÎÉÔØ ÒÁÂÏÞÉÊ ËÁÔÁÌÏÇ ÎÁ \"/\"" #: nscd/nscd.c:248 msgid "Could not create log file" -msgstr "Kunde inte skapa loggfil" +msgstr "îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ÆÁÊÌ ÐÒÏÔÏËÏÌÁ" #: nscd/nscd.c:301 nscd/nscd.c:326 nscd/nscd_stat.c:172 #, c-format msgid "Only root is allowed to use this option!" -msgstr "Bara root har tillåtelse att använda denna operation!" +msgstr "ôÏÌØËÏ ÓÕÐÅÒÐÏÌØÚÏ×ÁÔÅÌØ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÜÔÏÔ ËÌÀÞ!" #: nscd/nscd.c:359 nscd/nscd_stat.c:191 #, c-format msgid "write incomplete" -msgstr "ofullständing skrivning" +msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ÚÁÐÉÓØ" #: nscd/nscd.c:370 #, c-format msgid "cannot read invalidate ACK" -msgstr "kan inte läsa ogiltigförklarings-ACK" +msgstr "" #: nscd/nscd.c:376 #, c-format msgid "invalidation failed" -msgstr "ogiltigförklaring misslyckades" +msgstr "" #: nscd/nscd.c:386 #, c-format msgid "secure services not implemented anymore" -msgstr "säkra tjänster är inte implementerade längre" +msgstr "" #: nscd/nscd_conf.c:55 #, c-format msgid "database %s is not supported\n" -msgstr "databas \"%s\" stöds ej\n" +msgstr "ÂÁÚÁ ÄÁÎÎÙÈ %s ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ\n" #: nscd/nscd_conf.c:106 #, c-format msgid "Parse error: %s" -msgstr "Parsfel: %s" +msgstr "ïÛÉÂËÁ ÒÁÚÂÏÒÁ: %s" #: nscd/nscd_conf.c:191 #, c-format msgid "Must specify user name for server-user option" -msgstr "Användarnamn krävs för \"server-user\"-flaggan" +msgstr "îÕÖÎÏ ÕËÁÚÁÔØ ÉÍÑ ÐÏÌØÚÏ×ÁÔÅÌÑ ÄÌÑ ËÌÀÞÁ server-user" #: nscd/nscd_conf.c:198 #, c-format msgid "Must specify user name for stat-user option" -msgstr "Användarnamn krävs för \"stat-user\"-flaggan" +msgstr "îÕÖÎÏ ÕËÁÚÁÔØ ÉÍÑ ÐÏÌØÚÏ×ÁÔÅÌÑ ÄÌÑ ËÌÀÞÁ stat-user" #: nscd/nscd_conf.c:242 #, c-format msgid "invalid value for 'reload-count': %u" -msgstr "ogiltigt värde för \"reload-count\": %u" +msgstr "ÎÅÄÏÐÕÓÔÉÍÏÅ ÚÎÁÞÅÎÉÅ ÄÌÑ 'reload-count': %u" #: nscd/nscd_conf.c:257 #, c-format msgid "Must specify value for restart-interval option" -msgstr "Måste ge värde för \"restart-interval\"-flaggan" +msgstr "îÕÖÎÏ ÕËÁÚÁÔØ ÚÎÁÞÅÎÉÅ ÄÌÑ ËÌÀÞÁ restart-interval" #: nscd/nscd_conf.c:271 #, c-format msgid "Unknown option: %s %s %s" -msgstr "Okänd flagga: %s %s %s" +msgstr "îÅÉÚ×ÅÓÔÎÙÊ ËÌÀÞ: %s %s %s" #: nscd/nscd_conf.c:284 #, c-format msgid "cannot get current working directory: %s; disabling paranoia mode" -msgstr "kan inte hämta aktuell katalog: %s; kopplar ut paranoialäge" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÔÅËÕÝÉÊ ÒÁÂÏÞÉÊ ËÁÔÁÌÏÇ: %s; ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ÙËÌÀÞÅÎ" #: nscd/nscd_conf.c:304 #, c-format msgid "maximum file size for %s database too small" -msgstr "maximal filstorlek för \"%s\"-databasen är för liten" +msgstr "ÍÁËÓÉÍÁÌØÎÙÊ ÒÁÚÍÅÒ ÆÁÊÌÁ ÄÌÑ ÂÁÚÙ ÄÁÎÎÙÈ %s ÓÌÉÛËÏÍ ÍÁÌ" #: nscd/nscd_stat.c:141 #, c-format msgid "cannot write statistics: %s" -msgstr "kan inte skriva statistik: %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÐÉÓÁÔØ ÓÔÁÔÉÓÔÉËÕ: %s" #: nscd/nscd_stat.c:156 msgid "yes" -msgstr "ja" +msgstr "ÄÁ" #: nscd/nscd_stat.c:157 msgid "no" -msgstr "nej" +msgstr "ÎÅÔ" #: nscd/nscd_stat.c:168 #, c-format msgid "Only root or %s is allowed to use this option!" -msgstr "Bara root eller %s har tillåtelse att använda denna operation!" +msgstr "ôÏÌØËÏ ÓÕÐÅÒÐÏÌØÚÏ×ÁÔÅÌØ ÉÌÉ %s ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÜÔÏÔ ËÌÀÞ!" #: nscd/nscd_stat.c:179 #, c-format msgid "nscd not running!\n" -msgstr "nscd kör inte!\n" +msgstr "nscd ÎÅ ÚÁÐÕÝÅÎ!\n" #: nscd/nscd_stat.c:203 #, c-format msgid "cannot read statistics data" -msgstr "kan inte läsa statistikdata" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÞÉÔÁÔØ ÓÔÁÔÉÓÔÉÞÅÓËÉÅ ÄÁÎÎÙÅ" #: nscd/nscd_stat.c:206 #, c-format @@ -3995,29 +3986,29 @@ msgid "" "\n" "%15d server debug level\n" msgstr "" -"nscd konfiguration:\n" +"ëÏÎÆÉÇÕÒÁÃÉÑ nscd:\n" "\n" -"%15d servers felsökningsläge\n" +"%15d ÕÒÏ×ÅÎØ ÏÔÌÁÄËÉ ÓÅÒ×ÅÒÁ\n" #: nscd/nscd_stat.c:230 #, c-format msgid "%3ud %2uh %2um %2lus server runtime\n" -msgstr "%3ud %2uh %2um %2lus servers körtid\n" +msgstr "%3ud %2uh %2um %2lus ×ÒÅÍÑ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ\n" #: nscd/nscd_stat.c:233 #, c-format msgid " %2uh %2um %2lus server runtime\n" -msgstr " %2uh %2um %2lus servers körtid\n" +msgstr " %2uh %2um %2lus ×ÒÅÍÑ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ\n" #: nscd/nscd_stat.c:235 #, c-format msgid " %2um %2lus server runtime\n" -msgstr " %2um %2lus servers körtid\n" +msgstr " %2um %2lus ×ÒÅÍÑ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ\n" #: nscd/nscd_stat.c:237 #, c-format msgid " %2lus server runtime\n" -msgstr " %2lus servers körtid\n" +msgstr " %2lus ×ÒÅÍÑ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ\n" #: nscd/nscd_stat.c:239 #, c-format @@ -4028,11 +4019,11 @@ msgid "" "%15s paranoia mode enabled\n" "%15lu restart internal\n" msgstr "" -"%15d nuvarande antal trådar\n" -"%15d maximalt antal trådar\n" -"%15lu antal gånger en klient behövde vänta\n" -"%15s paranoialäge påslagen\n" -"%15lu omstart internt\n" +"%15d ÔÅËÕÝÅÅ ËÏÌÉÞÅÓÔ×Ï ÔÒÅÄÏ×\n" +"%15d ÍÁËÓÉÍÁÌØÎÏÅ ÞÉÓÌÏ ÔÒÅÄÏ×\n" +"%15lu ÞÉÓÌÏ ÓÌÕÞÁÅ×, ËÏÇÄÁ ËÌÉÅÎÔÁÍ ÐÒÉÛÌÏÓØ ÖÄÁÔØ\n" +"%15s ÐÁÒÁÎÏÉÄÁÌØÎÙÊ ÒÅÖÉÍ ×ËÌÀÞÅÎ\n" +"%15lu ×ÎÕÔÒÅÎÎÉÊ ÐÅÒÅÚÁÐÕÓË\n" #: nscd/nscd_stat.c:273 #, c-format @@ -4062,118 +4053,118 @@ msgid "" "%15s check /etc/%s for changes\n" msgstr "" "\n" -"%s cache:\n" +"ëÜÛ %s:\n" "\n" -"%15s cache är påslagen\n" -"%15s cache är persistent\n" -"%15s cache är delad\n" -"%15zu föreslagen storlek\n" -"%15zu total datapoolstorlek\n" -"%15zu använd datapoolstorlek\n" -"%15lu livslängd i sekunder för positiva poster\n" -"%15lu livslängd i sekunder för negativa poster\n" -"%15 cache-träffar för positiva poster\n" -"%15 cache-träffar för negativa poster\n" -"%15 cache-missar för positiva poster\n" -"%15 cache-missar för negativa poster\n" -"%15lu%% cache träffprocent\n" -"%15zu nuvarande antal värden i cache\n" -"%15zu maximalt antal värden i cache\n" -"%15zu maximal kedjelängd som söks\n" -"%15 antal väntan på läslås\n" -"%15 antal väntan på skrivlås\n" -"%15 antal misslyckade minnesallokeringar\n" -"%15s kontrollera /etc/%s för ändringar\n" +"%15s ËÜÛ ÚÁÄÅÊÓÔ×Ï×ÁÎ\n" +"%15s ËÜÛ ÐÏÓÔÏÑÎÎÙÊ\n" +"%15s ËÜÛ ÒÁÚÄÅÌÑÅÍÙÊ\n" +"%15Zu ÐÒÅÄÌÁÇÁÅÍÙÊ ÒÁÚÍÅÒ\n" +"%15zu ÏÂÝÉÊ ÏÂßÅÍ ÐÕÌÁ ÄÁÎÎÙÈ\n" +"%15zu ÉÓÐÏÌØÚÏ×ÁÎÎÙÊ ÏÂßÅÍ ÐÕÌÁ ÄÁÎÎÙÈ\n" +"%15lu ÓÅËÕÎÄÙ ÖÉÚÎÉ ÄÌÑ ÐÏÌÏÖÉÔÅÌØÎÙÈ ÚÁÐÉÓÅÊ\n" +"%15lu ÓÅËÕÎÄÙ ÖÉÚÎÉ ÄÌÑ ÏÔÒÉÃÁÔÅÌØÎÙÈ ÚÁÐÉÓÅÊ\n" +"%15 ÐÏÐÁÄÁÎÉÑ ÎÁ ÐÏÌÏÖÉÔÅÌØÎÙÅ ÚÁÐÉÓÉ\n" +"%15 ÐÏÐÁÄÁÎÉÑ ÎÁ ÏÔÒÉÃÁÔÅÌØÎÙÅ ÚÁÐÉÓÉ\n" +"%15 ÐÒÏÍÁÈÉ ÎÁ ÐÏÌÏÖÉÔÅÌØÎÙÅ ÚÁÐÉÓÉ\n" +"%15 ÐÒÏÍÁÈÉ ÎÁ ÏÔÒÉÃÁÔÅÌØÎÙÅ ÚÁÐÉÓÉ\n" +"%15lu%% ÞÁÓÔÏÔÁ ÐÏÐÁÄÁÎÉÑ ÎÁ ËÜÛ\n" +"%15zu ÔÅËÕÝÅÅ ÞÉÓÌÏ ËÜÛÉÒÏ×ÁÎÎÙÈ ÚÎÁÞÅÎÉÊ\n" +"%15zu ÍÁËÓÉÍÁÌØÎÏÅ ÞÉÓÌÏ ËÜÛÉÒÏ×ÁÎÎÙÈ ÚÎÁÞÅÎÉÊ\n" +"%15zu ÍÁËÓÉÍÁÌØÎÁÑ ÄÌÉÎÁ ÃÅÐÏÞËÉ ÐÏÉÓËÁ\n" +"%15 ÞÉÓÌÏ ÚÁÄÅÒÖÅË ÎÁ rdlock\n" +"%15 ÞÉÓÌÏ ÚÁÄÅÒÖÅË ÎÁ wrlock\n" +"%15 ÞÉÓÌÏ ÏÛÉÂÏË ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ\n" +"%15s ÏÔÓÌÅÖÉ×ÁÀÔÓÑ ÌÉ ÉÚÍÅÎÅÎÉÑ /etc/%s \n" #: nscd/pwdcache.c:438 #, c-format msgid "Haven't found \"%s\" in password cache!" -msgstr "Hittar inte \"%s\" i lösenordscache!" +msgstr "îÅ ÎÁÊÄÅÎÏ \"%s\" × ËÜÛÅ ÐÁÒÏÌÅÊ!" #: nscd/pwdcache.c:440 #, c-format msgid "Reloading \"%s\" in password cache!" -msgstr "Omladdar \"%s\" i lösenordscache!" +msgstr "ðÅÒÅÚÁÇÒÕÚËÁ \"%s\" × ËÜÛÅ ÐÁÒÏÌÅÊ!" #: nscd/pwdcache.c:532 #, c-format msgid "Invalid numeric uid \"%s\"!" -msgstr "Ogiltigt numeriskt användarid (uid) \"%s\"!" +msgstr "îÅ×ÅÒÎÙÊ ÞÉÓÌÏ×ÏÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ \"%s\"!" #: nscd/selinux.c:151 #, c-format msgid "Failed opening connection to the audit subsystem: %m" -msgstr "Misslyckades med att öppna en förbindelse till undersystemet för granskning (audit): %m" +msgstr "îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ÓÏÅÄÉÎÅÎÉÅ Ó ÐÏÄÓÉÓÔÅÍÏÊ ÁÕÄÉÔÁ: %m" #: nscd/selinux.c:172 msgid "Failed to set keep-capabilities" -msgstr "Misslyckades med att sätta \"keep\"-kapabiliteter" +msgstr "" #: nscd/selinux.c:173 nscd/selinux.c:232 #, c-format msgid "prctl(KEEPCAPS) failed" -msgstr "prctl(KEEPCAPS) misslyckades" +msgstr "prctl(KEEPCAPS) ÎÅÕÓÐÅÛÎÁ" #: nscd/selinux.c:187 msgid "Failed to initialize drop of capabilities" -msgstr "Misslyckades med att initiera borttagning av kapabiliteter" +msgstr "" #: nscd/selinux.c:188 #, c-format msgid "cap_init failed" -msgstr "cap_init misslyckades" +msgstr "cap_init ÎÅÕÓÐÅÛÎÁ" #: nscd/selinux.c:205 msgid "Failed to drop capabilities\n" -msgstr "Misslyckades med att ta bort kapabiliteter\n" +msgstr "" #: nscd/selinux.c:206 nscd/selinux.c:223 #, c-format msgid "cap_set_proc failed" -msgstr "cap_set_proc misslyckades" +msgstr "cap_set_proc ÎÅÕÓÐÅÛÎÁ" #: nscd/selinux.c:222 msgid "Failed to drop capabilities" -msgstr "Misslyckades med att ta bort kapabiliteter" +msgstr "" #: nscd/selinux.c:231 msgid "Failed to unset keep-capabilities" -msgstr "Misslyckades med att ta bort \"keep\"-kapabiliteter" +msgstr "" #: nscd/selinux.c:247 msgid "Failed to determine if kernel supports SELinux" -msgstr "Misslyckades med att ta reda på om kärnan stödjer SELinux" +msgstr "îÅ ÕÄÁÌÏÓØ ÏÐÒÅÄÅÌÉÔØ, ÐÏÄÄÅÒÖÉ×ÁÅÔ ÌÉ ÑÄÒÏ SELinux" #: nscd/selinux.c:262 #, c-format msgid "Failed to start AVC thread" -msgstr "Misslyckades med att starta AVC-tråd" +msgstr "îÅ ÕÄÁÌÏÓØ ÚÁÐÕÓÔÉÔØ ÔÒÅÄ AVC" #: nscd/selinux.c:284 #, c-format msgid "Failed to create AVC lock" -msgstr "Misslyckade med att skapa AVC-lås" +msgstr "îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ÂÌÏËÉÒÏ×ËÕ" #: nscd/selinux.c:324 #, c-format msgid "Failed to start AVC" -msgstr "Misslyckades med att starta AVC" +msgstr "îÅ ÕÄÁÌÏÓØ ÚÁÐÕÓÔÉÔØ AVC" #: nscd/selinux.c:326 msgid "Access Vector Cache (AVC) started" -msgstr "Access Vector Cache (AVC) startad" +msgstr "Access Vector Cache (AVC) ÚÁÐÕÝÅÎ" #: nscd/selinux.c:347 msgid "Error getting context of socket peer" -msgstr "Kunde inte hämta kontext för uttagsparter (socket peer)" +msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ ËÏÎÔÅËÓÔÁ ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ ÓÏËÅÔÁ" #: nscd/selinux.c:352 msgid "Error getting context of nscd" -msgstr "Kunde inte hämta kontext för nscd" +msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ ËÏÎÔÅËÓÔÁ nscd" #: nscd/selinux.c:358 msgid "Error getting sid from context" -msgstr "Kunde inte hämta \"sid\" från kontext" +msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ sid ÉÚ ËÏÎÔÅËÓÔÁ" #: nscd/selinux.c:390 #, c-format @@ -4191,68 +4182,67 @@ msgid "" "%15u CAV misses\n" msgstr "" "\n" -"SELinux AVC Statistik:\n" +"óÔÁÔÉÓÔÉËÁ AVC SELinux:\n" "\n" -"%15u postsökingar\n" -"%15u postträffar\n" -"%15u postmissar\n" -"%15u bortkastade poster\n" -"%15u CAV-sökningar\n" -"%15u CAV-träffar\n" -"%15u CAV-sonderingar\n" -"%15u CAV-missar\n" +"%15u ÐÏÉÓËÏ× ÚÁÐÉÓÅÊ\n" +"%15u ÐÏÐÁÄÁÎÉÊ\n" +"%15u ÐÒÏÍÁÈÏ×\n" +"%15u ÓÂÒÏÓÏ× ÚÁÐÉÓÅÊ\n" +"%15u ÐÏÉÓËÏ× CAV\n" +"%15u ÐÏÐÁÄÁÎÉÊ CAV\n" +"%15u ÐÒÏ×ÅÒÏË CAV\n" +"%15u ÐÒÏÍÁÈÏ× CAV\n" #: nss/getent.c:52 msgid "database [key ...]" -msgstr "databas [nyckel ...]" +msgstr "ÂÁÚÁ-ÄÁÎÎÙÈ [ËÌÀÞ ...]" #: nss/getent.c:57 msgid "Service configuration to be used" -msgstr "Tjänstekonfiguration som ska användas" +msgstr "éÓÐÏÌØÚÕÅÍÁÑ ËÏÎÆÉÇÕÒÁÃÉÑ ÓÌÕÖÂÙ" #: nss/getent.c:62 msgid "" "Get entries from administrative database. For bug reporting instructions, please see:\n" ".\n" msgstr "" -"Hämta poster från den administrativa databasen För felrapporteringsinstruktioner, se:\n" +"ðÏÌÕÞÁÅÔ ÚÁÐÉÓÉ ÉÚ ÁÄÍÉÎÉÓÔÒÁÔÉ×ÎÏÊ ÂÁÚÙ ÄÁÎÎÙÈ. éÎÓÔÒÕËÃÉÉ ÐÏ ÓÏÏÂÝÅÎÉÀ Ï ÏÛÉÂËÁÈ ÓÍÏÔÒÉÔÅ ÎÁ:\n" ".\n" -"Rapportera fel eller synpunkter på översättningen till .\n" #: nss/getent.c:145 nss/getent.c:394 #, c-format msgid "Enumeration not supported on %s\n" -msgstr "Uppräkning stöds inte på %s\n" +msgstr "ðÅÒÅÞÉÓÌÅÎÉÅ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÄÌÑ %s\n" #: nss/getent.c:782 #, c-format msgid "Unknown database name" -msgstr "Okänt databasnamn" +msgstr "îÅÉÚ×ÅÓÔÎÏÅ ÉÍÑ ÂÁÚÙ ÄÁÎÎÙÈ" #: nss/getent.c:808 msgid "Supported databases:\n" -msgstr "Databaser som stöds:\n" +msgstr "ðÏÄÄÅÒÖÉ×ÁÅÍÙÅ ÂÁÚÙ ÄÁÎÎÙÈ:\n" #: nss/getent.c:868 #, c-format msgid "Unknown database: %s\n" -msgstr "Okänd databas: %s\n" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÂÁÚÁ ÄÁÎÎÙÈ: %s\n" #: nss/makedb.c:60 msgid "Convert key to lower case" -msgstr "Konvertera nyckel till gemener" +msgstr "ðÒÅÏÂÒÁÚÏ×ÁÔØ ËÌÀÞ × ÎÉÖÎÉÊ ÒÅÇÉÓÔÒ" #: nss/makedb.c:63 msgid "Do not print messages while building database" -msgstr "Skriv inte meddelanden medans databasen byggs" +msgstr "îÅ ÐÅÞÁÔÁÔØ ÓÏÏÂÝÅÎÉÊ ÐÒÉ ÐÏÓÔÒÏÅÎÉÉ ÂÁÚÙ ÄÁÎÎÙÈ" #: nss/makedb.c:65 msgid "Print content of database file, one entry a line" -msgstr "Skriv ut innehållet i databasen, en post per rad" +msgstr "îÁÐÅÞÁÔÁÔØ ÓÏÄÅÒÖÉÍÏÅ ÆÁÊÌÁ ÂÁÚÙ ÄÁÎÎÙÈ, ÐÏ ÏÄÎÏÊ ÚÁÐÉÓÉ × ÓÔÒÏËÕ" #: nss/makedb.c:70 msgid "Create simple DB database from textual input." -msgstr "Skapa en enkel databas från textuell indata" +msgstr "ðÏÓÔÒÏÉÔØ ÐÒÏÓÔÕÀ ÂÁÚÕ ÄÁÎÎÙÈ DB ÉÚ ÔÅËÓÔÏ×ÏÇÏ ××ÏÄÁ." #: nss/makedb.c:73 msgid "" @@ -4260,832 +4250,833 @@ msgid "" "-o OUTPUT-FILE INPUT-FILE\n" "-u INPUT-FILE" msgstr "" -"INFIL UTFIL\n" -"-o UTFIL INFIL\n" -"-u INFIL" +"÷èïäîïê-æáêì ÷ùèïäîïê-æáêì\n" +"-o ÷ùèïäîïê-æáêì ÷èïäîïê-æáêì\n" +"-u ÷èïäîïê-æáêì" #: nss/makedb.c:142 #, c-format msgid "No usable database library found." -msgstr "Inget användbart databasbibliotek hittades" +msgstr "îÅ ÎÁÊÄÅÎÏ ÐÏÄÈÏÄÑÝÅÊ ÂÉÂÌÉÏÔÅËÉ." #: nss/makedb.c:149 #, c-format msgid "cannot open database file `%s': %s" -msgstr "kan inte öppna databasfil \"%s\": %s" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ ÆÁÊÌ ÂÁÚÙ ÄÁÎÎÙÈ `%s': %s" #: nss/makedb.c:151 msgid "incorrectly formatted file" -msgstr "inkorrekt formaterad fil" +msgstr "ÎÅÐÒÁ×ÉÌØÎÏ ÏÔÆÏÒÍÁÔÉÒÏ×ÁÎÎÙÊ ÆÁÊÌ" #: nss/makedb.c:331 msgid "duplicate key" -msgstr "duplicerad nyckel" +msgstr "ÄÕÂÌÉÒÏ×ÁÎÎÙÊ ËÌÀÞ" #: nss/makedb.c:337 #, c-format msgid "while writing database file" -msgstr "när databasfilen skrevs" +msgstr "ÐÒÉ ÚÁÐÉÓÉ ÆÁÊÌÁ ÂÁÚÙ ÄÁÎÎÙÈ" #: nss/makedb.c:348 #, c-format msgid "problems while reading `%s'" -msgstr "problem när \"%s\" lästes" +msgstr "ÐÒÏÂÌÅÍÙ ÐÒÉ ÞÔÅÎÉÉ `%s'" #: nss/makedb.c:368 nss/makedb.c:385 #, c-format msgid "while reading database" -msgstr "när databasen lästes" +msgstr "ÐÒÉ ÞÔÅÎÉÉ ÂÁÚÙ ÄÁÎÎÙÈ" #: posix/getconf.c:940 #, c-format msgid "Usage: %s [-v specification] variable_name [pathname]\n" -msgstr "Användning: %s [-v specifikation] variabelnamn [sökväg]\n" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [-v ÓÐÅÃÉÆÉËÁÃÉÑ] ÉÍÑ-ÐÅÒÅÍÅÎÎÏÊ [ÐÕÔØ]\n" #: posix/getconf.c:943 #, c-format msgid " %s -a [pathname]\n" -msgstr " %s -a [sökväg]\n" +msgstr " %s -a [ÐÕÔØ]\n" #: posix/getconf.c:1062 #, c-format msgid "unknown specification \"%s\"" -msgstr "okänd specifikation \"%s\"" +msgstr "ÎÅÉÚ×ÅÓÔÎÁÑ ÓÐÅÃÉÆÉËÁÃÉÑ \"%s\"" #: posix/getconf.c:1090 #, c-format msgid "Couldn't execute %s" -msgstr "Kunde inte exekvera %s" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ %s" #: posix/getconf.c:1130 posix/getconf.c:1146 msgid "undefined" -msgstr "odefinierad" +msgstr "ÎÅ ÏÐÒÅÄÅÌÅÎÏ" #: posix/getconf.c:1168 #, c-format msgid "Unrecognized variable `%s'" -msgstr "Okänd variabel \"%s\"" +msgstr "îÅÒÁÓÐÏÚÎÁÎÎÁÑ ÐÅÒÅÍÅÎÎÁÑ `%s'" #: posix/getopt.c:571 posix/getopt.c:587 #, c-format msgid "%s: option `%s' is ambiguous\n" -msgstr "%s: flaggan \"%s\" är tvetydig\n" +msgstr "%s: ËÌÀÞ `%s' ÎÅÏÄÎÏÚÎÁÞÅÎ\n" #: posix/getopt.c:620 posix/getopt.c:624 #, c-format msgid "%s: option `--%s' doesn't allow an argument\n" -msgstr "%s: flaggan \"--%s\" tar inget argument\n" +msgstr "%s: ËÌÀÞ `--%s' ÎÅÌØÚÑ ÉÓÐÏÌØÚÏ×ÁÔØ Ó ÁÒÇÕÍÅÎÔÏÍ\n" #: posix/getopt.c:633 posix/getopt.c:638 #, c-format msgid "%s: option `%c%s' doesn't allow an argument\n" -msgstr "%s: flaggan \"%c%s\" tar inget argument\n" +msgstr "%s: ËÌÀÞ `%c%s' ÎÅÌØÚÑ ÉÓÐÏÌØÚÏ×ÁÔØ Ó ÁÒÇÕÍÅÎÔÏÍ\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 "%s: flaggan \"%s\" behöver ett argument\n" +msgstr "%s: ËÌÀÞ `%s' ÔÒÅÂÕÅÔ ÁÒÇÕÍÅÎÔ\n" #: posix/getopt.c:738 posix/getopt.c:741 #, c-format msgid "%s: unrecognized option `--%s'\n" -msgstr "%s: okänd flagga \"--%s\"\n" +msgstr "%s: ÎÅÒÁÓÐÏÚÎÁÎÎÙÊ ËÌÀÞ `--%s'\n" #: posix/getopt.c:749 posix/getopt.c:752 #, c-format msgid "%s: unrecognized option `%c%s'\n" -msgstr "%s: okänd flagga \"%c%s\"\n" +msgstr "%s: ÎÅÒÁÓÐÏÚÎÁÎÎÙÊ ËÌÀÞ `%c%s'\n" #: posix/getopt.c:804 posix/getopt.c:807 #, c-format msgid "%s: illegal option -- %c\n" -msgstr "%s: otillåten flagga -- %c\n" +msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÙÊ ËÌÀÞ -- %c\n" #: posix/getopt.c:813 posix/getopt.c:816 #, c-format msgid "%s: invalid option -- %c\n" -msgstr "%s: ogiltig flagga -- %c\n" +msgstr "%s: ÎÅ×ÅÒÎÙÊ ËÌÀÞ -- %c\n" #: 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: flaggan behöver ett argument -- %c\n" +msgstr "%s: ËÌÀÞ ÔÒÅÂÕÅÔ ÁÒÇÕÍÅÎÔ -- %c\n" #: posix/getopt.c:937 posix/getopt.c:953 #, c-format msgid "%s: option `-W %s' is ambiguous\n" -msgstr "%s: flaggan \"-W %s\" är tvetydig\n" +msgstr "%s: ËÌÀÞ `-W %s' ÎÅÏÄÎÏÚÎÁÞÅÎ\n" #: posix/getopt.c:977 posix/getopt.c:995 #, c-format msgid "%s: option `-W %s' doesn't allow an argument\n" -msgstr "%s: flaggan \"-W %s\" tar inget argument\n" +msgstr "%s: ËÌÀÞ `-W %s' ÎÅÌØÚÑ ÉÓÐÏÌØÚÏ×ÁÔØ Ó ÁÒÇÕÍÅÎÔÏÍ\n" #: posix/regcomp.c:135 msgid "No match" -msgstr "Ingen träff" +msgstr "îÅÔ ÓÏ×ÐÁÄÅÎÉÑ" #: posix/regcomp.c:138 msgid "Invalid regular expression" -msgstr "Ogiltigt reguljärt uttryck" +msgstr "îÅ×ÅÒÎÏÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ" #: posix/regcomp.c:141 msgid "Invalid collation character" -msgstr "Ogiltigt kollationeringstecken" +msgstr "îÅ×ÅÒÎÙÊ ÚÎÁË ÓÏÒÔÉÒÏ×ËÉ" #: posix/regcomp.c:144 msgid "Invalid character class name" -msgstr "Ogiltigt teckenklassnamn" +msgstr "îÅ×ÅÒÎÏÅ ÉÍÑ ËÌÁÓÓÁ ÚÎÁËÏ×" #: posix/regcomp.c:147 msgid "Trailing backslash" -msgstr "Avslutande omvänt snedstreck" +msgstr "ïÂÒÁÔÎÁÑ ËÏÓÁÑ ÞÅÒÔÁ × ËÏÎÃÅ" #: posix/regcomp.c:150 msgid "Invalid back reference" -msgstr "Ogiltig bakåtreferens" +msgstr "îÅ×ÅÒÎÁÑ ÓÓÙÌËÁ ÎÁÚÁÄ" #: posix/regcomp.c:153 msgid "Unmatched [ or [^" -msgstr "Obalanserade [ eller [^" +msgstr "îÅÐÁÒÎÁÑ [ ÉÌÉ [^" #: posix/regcomp.c:156 msgid "Unmatched ( or \\(" -msgstr "Obalanserade ( eller \\(" +msgstr "îÅÐÁÒÎÁÑ ( ÉÌÉ \\(" #: posix/regcomp.c:159 msgid "Unmatched \\{" -msgstr "Obalanserad \\{" +msgstr "îÅÐÁÒÎÁÑ \\{" #: posix/regcomp.c:162 msgid "Invalid content of \\{\\}" -msgstr "Ogiltigt innehåll i \\{\\}" +msgstr "îÅ×ÅÒÎÏÅ ÓÏÄÅÒÖÉÍÏÅ × \\{\\}" #: posix/regcomp.c:165 msgid "Invalid range end" -msgstr "Ogiltigt intervallslut" +msgstr "îÅ×ÅÒÎÙÊ ËÏÎÅà ÄÉÁÐÁÚÏÎÁ" #: posix/regcomp.c:168 msgid "Memory exhausted" -msgstr "Minnet slut" +msgstr "ðÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ" #: posix/regcomp.c:171 msgid "Invalid preceding regular expression" -msgstr "Ogiltigt föregående reguljärt uttryck" +msgstr "îÅ×ÅÒÎÏÅ ÐÒÅÄÛÅÓÔ×ÕÀÝÅÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ" #: posix/regcomp.c:174 msgid "Premature end of regular expression" -msgstr "För tidigt slut på reguljärt uttryck" +msgstr "ðÒÅÖÄÅ×ÒÅÍÅÎÎÙÊ ËÏÎÅà ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ" #: posix/regcomp.c:177 msgid "Regular expression too big" -msgstr "Reguljärt uttryck för stort" +msgstr "òÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ ÓÌÉÛËÏÍ ×ÅÌÉËÏ" #: posix/regcomp.c:180 msgid "Unmatched ) or \\)" -msgstr "Obalanserade ) eller \\)" +msgstr "îÅÐÁÒÎÁÑ ) ÉÌÉ \\)" #: posix/regcomp.c:660 msgid "No previous regular expression" -msgstr "Inget föregående reguljärt uttryck" +msgstr "îÅÔ ÐÒÅÄÛÅÓÔ×ÕÀÝÅÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ" #: posix/wordexp.c:1798 msgid "parameter null or not set" -msgstr "parameter är tom eller inte satt" +msgstr "ÐÁÒÁÍÅÔÒ ÐÕÓÔ ÉÌÉ ÎÅ ÚÁÄÁÎ" #: resolv/herror.c:68 msgid "Resolver Error 0 (no error)" -msgstr "Resolver-fel 0 (inget fel)" +msgstr "ïÛÉÂËÁ ÒÅÓÏÌ×ÅÒÁ 0 (ÎÅÔ ÏÛÉÂËÉ)" #: resolv/herror.c:69 msgid "Unknown host" -msgstr "Okänd värd" +msgstr "îÅÉÚ×ÅÓÔÎÙÊ ÈÏÓÔ" #: resolv/herror.c:70 msgid "Host name lookup failure" -msgstr "Uppslagning av värdnamn misslyckades" +msgstr "óÂÏÊ ÐÏÉÓËÁ ÉÍÅÎÉ ÈÏÓÔÁ" #: resolv/herror.c:71 msgid "Unknown server error" -msgstr "Okänt fel hos server" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ ÓÅÒ×ÅÒÁ" #: resolv/herror.c:72 msgid "No address associated with name" -msgstr "Ingen adress associerad med namnet" +msgstr "ó ÉÍÅÎÅÍ ÎÅ Ó×ÑÚÁÎÏ ÎÉ ÏÄÎÏÇÏ ÁÄÒÅÓÁ" #: resolv/herror.c:107 msgid "Resolver internal error" -msgstr "Internt fel i namnlösare (resolver)" +msgstr "÷ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ ÒÅÓÏÌ×ÅÒÁ" #: resolv/herror.c:110 msgid "Unknown resolver error" -msgstr "Okänt fel hos namnlösare (resolver)" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ ÒÅÓÏÌ×ÅÒÁ" #: resolv/res_hconf.c:124 #, c-format msgid "%s: line %d: cannot specify more than %d trim domains" -msgstr "%s: rad %d: kan inte ange fler än %d filterdomäner" +msgstr "" #: resolv/res_hconf.c:145 #, c-format msgid "%s: line %d: list delimiter not followed by domain" -msgstr "%s: rad %d: listavskiljare följs inte av domän" +msgstr "%s: ÓÔÒÏËÁ %d: ÐÏÓÌÅ ÒÁÚÄÅÌÉÔÅÌÑ ÓÐÉÓËÁ ÎÅ ÓÔÏÉÔ ÄÏÍÅÎ" #: resolv/res_hconf.c:204 #, c-format msgid "%s: line %d: expected `on' or `off', found `%s'\n" -msgstr "%s: rad %d: förväntade \"on\" eller \"off\", hittade \"%s\"\n" +msgstr "%s: ÓÔÒÏËÁ %d: ÏÖÉÄÁÅÔÓÑ `on' ÉÌÉ `off', ÎÁÊÄÅÎÏ `%s'\n" #: resolv/res_hconf.c:247 #, c-format msgid "%s: line %d: bad command `%s'\n" -msgstr "%s: rad %d: okänt kommando \"%s\"\n" +msgstr "%s: ÓÔÒÏËÁ %d: ÎÅÐÒÁ×ÉÌØÎÁÑ ËÏÍÁÎÄÁ `%s'\n" #: resolv/res_hconf.c:282 #, c-format msgid "%s: line %d: ignoring trailing garbage `%s'\n" -msgstr "%s: rad %d: ignorerar avslutande skräp \"%s\"\n" +msgstr "%s: ÓÔÒÏËÁ %d: ÉÇÎÏÒÉÒÏ×ÁÎ ÍÕÓÏÒ × ËÏÎÃÅ `%s'\n" #: stdio-common/psignal.c:51 #, c-format msgid "%s%sUnknown signal %d\n" -msgstr "%s%sOkänd signal %d\n" +msgstr "%s%sîÅÉÚ×ÅÓÔÎÙÊ ÓÉÇÎÁÌ %d\n" #: stdio-common/psignal.c:52 msgid "Unknown signal" -msgstr "Okänd signal" +msgstr "îÅÉÚ×ÅÓÔÎÙÊ ÓÉÇÎÁÌ" #: string/_strerror.c:45 sysdeps/mach/_strerror.c:87 msgid "Unknown error " -msgstr "Okänt fel " +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ " #: string/strerror.c:43 msgid "Unknown error" -msgstr "Okänt fel" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ" #: string/strsignal.c:65 #, c-format msgid "Real-time signal %d" -msgstr "Realtidssignal %d" +msgstr "óÉÇÎÁÌ ÒÅÁÌØÎÏÇÏ ×ÒÅÍÅÎÉ %d" #: string/strsignal.c:69 #, c-format msgid "Unknown signal %d" -msgstr "Okänd signal %d" +msgstr "îÅÉÚ×ÅÓÔÎÙÊ ÓÉÇÎÁÌ %d" #: sunrpc/auth_unix.c:114 msgid "authunix_create: out of memory\n" -msgstr "authunix_create: minnet slut\n" +msgstr "authunix_create: ÎÅÄÏÓÔÁÔÏÞÎÏ ÐÁÍÑÔÉ\n" #: sunrpc/auth_unix.c:350 msgid "auth_none.c - Fatal marshalling problem" -msgstr "auth_none.c - Fatalt kodningsproblem" +msgstr "auth_none.c -- æÁÔÁÌØÎÁÑ ÏÛÉÂËÁ ÍÁÒÛÁÌÌÉÎÇÁ" #: sunrpc/clnt_perr.c:118 sunrpc/clnt_perr.c:139 #, c-format msgid "; low version = %lu, high version = %lu" -msgstr "; undre version = %lu, övre version = %lu" +msgstr "; ÎÉÖÎÑÑ ×ÅÒÓÉÑ = %lu, ×ÅÒÈÎÑÑ ×ÅÒÓÉÑ = %lu" #: sunrpc/clnt_perr.c:125 msgid "; why = " -msgstr "; varför = " +msgstr "; ÐÒÉÞÉÎÁ = " #: sunrpc/clnt_perr.c:132 #, c-format msgid "(unknown authentication error - %d)" -msgstr "(okänt fel vid äkthetskontroll - %d)" +msgstr "(ÎÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ ÁÕÔÅÎÆÉËÁÃÉÉ -- %d)" #: sunrpc/clnt_perr.c:172 msgid "RPC: Success" -msgstr "RPC: Lyckat" +msgstr "RPC: õÓÐÅÈ" #: sunrpc/clnt_perr.c:175 msgid "RPC: Can't encode arguments" -msgstr "RPC: Kan inte koda argumentet" +msgstr "RPC: îÅ×ÏÚÍÏÖÎÏ ÚÁËÏÄÉÒÏ×ÁÔØ ÁÒÇÕÍÅÎÔÙ" #: sunrpc/clnt_perr.c:179 msgid "RPC: Can't decode result" -msgstr "RPC: Kan inte avkoda resultatet" +msgstr "RPC: îÅ×ÏÚÍÏÖÎÏ ÒÁÓËÏÄÉÒÏ×ÁÔØ ÒÅÚÕÌØÔÁÔ" #: sunrpc/clnt_perr.c:183 msgid "RPC: Unable to send" -msgstr "RPC: Kan inte skicka" +msgstr "RPC: îÅ ÕÄÁÌÏÓØ ÐÏÓÌÁÔØ" #: sunrpc/clnt_perr.c:187 msgid "RPC: Unable to receive" -msgstr "RPC: Kan inte ta emot" +msgstr "RPC: îÅ ÕÄÁÌÏÓØ ÐÏÌÕÞÉÔØ" #: sunrpc/clnt_perr.c:191 msgid "RPC: Timed out" -msgstr "RPC: Tiden löpte ut" +msgstr "RPC: ÷ÒÅÍÑ ÏÖÉÄÁÎÉÑ ÉÓÔÅËÌÏ" #: sunrpc/clnt_perr.c:195 msgid "RPC: Incompatible versions of RPC" -msgstr "RPC: Inkompatibla versioner av RPC" +msgstr "RPC: îÅÓÏ×ÍÅÓÔÉÍÙÅ ×ÅÒÓÉÉ RPC" #: sunrpc/clnt_perr.c:199 msgid "RPC: Authentication error" -msgstr "RPC: Fel vid äkthetskontroll" +msgstr "RPC: ïÛÉÂËÁ ÁÕÔÅÎÆÉËÁÃÉÉ" #: sunrpc/clnt_perr.c:203 msgid "RPC: Program unavailable" -msgstr "RPC: Programmet otillgängligt" +msgstr "RPC: ðÒÏÇÒÁÍÍÁ ÎÅÄÏÓÔÕÐÎÁ" #: sunrpc/clnt_perr.c:207 msgid "RPC: Program/version mismatch" -msgstr "RPC: Program/version-inkompatibilitet" +msgstr "RPC: îÅÓÏ×ÐÁÄÅÎÉÅ ÐÒÏÇÒÁÍÍÙ/×ÅÒÓÉÉ" #: sunrpc/clnt_perr.c:211 msgid "RPC: Procedure unavailable" -msgstr "RPC: Procedur inte tillgänglig" +msgstr "RPC: ðÒÏÃÅÄÕÒÁ ÎÅÄÏÓÔÕÐÎÁ" #: sunrpc/clnt_perr.c:215 msgid "RPC: Server can't decode arguments" -msgstr "RPC: Server kan inte avkoda argumenten" +msgstr "RPC: óÅÒ×ÅÒ ÎÅ ÍÏÖÅÔ ÒÁÓËÏÄÉÒÏ×ÁÔØ ÁÒÇÕÍÅÎÔÙ" #: sunrpc/clnt_perr.c:219 msgid "RPC: Remote system error" -msgstr "RPC: Fjärrsystemsfel" +msgstr "RPC: ïÛÉÂËÁ ÕÄÁÌÅÎÎÏÊ ÓÉÓÔÅÍÙ" #: sunrpc/clnt_perr.c:223 msgid "RPC: Unknown host" -msgstr "RPC: Okänd värdmaskin" +msgstr "RPC: îÅÉÚ×ÅÓÔÎÙÊ ÈÏÓÔ" #: sunrpc/clnt_perr.c:227 msgid "RPC: Unknown protocol" -msgstr "RPC: Okänt protokoll" +msgstr "RPC: îÅÉÚ×ÅÓÔÎÙÊ ÐÒÏÔÏËÏÌ" #: sunrpc/clnt_perr.c:231 msgid "RPC: Port mapper failure" -msgstr "RPC: Fel i portöversättare" +msgstr "RPC: óÂÏÊ ÏÔÏÂÒÁÖÁÔÅÌÑ ÐÏÒÔÏ×" #: sunrpc/clnt_perr.c:235 msgid "RPC: Program not registered" -msgstr "RPC: Programmet inte registrerat" +msgstr "RPC: ðÒÏÇÒÁÍÍÁ ÎÅ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÎÁ" #: sunrpc/clnt_perr.c:239 msgid "RPC: Failed (unspecified error)" -msgstr "RPC: Misslyckades (ospecificerat fel)" +msgstr "RPC: óÂÏÊ (ÏÛÉÂËÁ ÎÅ ÕËÁÚÁÎÁ)" #: sunrpc/clnt_perr.c:280 msgid "RPC: (unknown error code)" -msgstr "RPC: (okänd felkod)" +msgstr "RPC: (ÎÅÉÚ×ÅÓÔÎÙÊ ËÏÄ ÏÛÉÂËÉ)" #: sunrpc/clnt_perr.c:342 msgid "Authentication OK" -msgstr "Äkthetskontroll OK" +msgstr "áÕÔÅÎÆÉËÁÃÉÑ ÕÓÐÅÛÎÁ" #: sunrpc/clnt_perr.c:345 msgid "Invalid client credential" -msgstr "Ogiltiga klientreferenser" +msgstr "îÅ×ÅÒÎÙÊ ÒÅË×ÉÚÉÔ ËÌÉÅÎÔÁ" #: sunrpc/clnt_perr.c:349 msgid "Server rejected credential" -msgstr "Server förkastade kreditiv" +msgstr "óÅÒ×ÅÒ ÏÔ×ÅÒÇ ÒÅË×ÉÚÉÔ" #: sunrpc/clnt_perr.c:353 msgid "Invalid client verifier" -msgstr "Ogiltig klientverifierare" +msgstr "" #: sunrpc/clnt_perr.c:357 msgid "Server rejected verifier" -msgstr "Server förkastade verifierare" +msgstr "" #: sunrpc/clnt_perr.c:361 msgid "Client credential too weak" -msgstr "Klientens referenser är för svaga" +msgstr "òÅË×ÉÚÉÔ ËÌÉÅÎÔÁ ÓÌÉÛËÏÍ ÓÌÁÂ" #: sunrpc/clnt_perr.c:365 msgid "Invalid server verifier" -msgstr "Ogiltig serververifierare" +msgstr "" #: sunrpc/clnt_perr.c:369 msgid "Failed (unspecified error)" -msgstr "Misslyckades (ospecificerat fel)" +msgstr "óÂÏÊ (ÏÛÉÂËÁ ÎÅ ÕËÁÚÁÎÁ)" #: sunrpc/clnt_raw.c:117 msgid "clnt_raw.c - Fatal header serialization error." -msgstr "clnt_raw.c - Fatalt fel vid serialisering" +msgstr "clnt_raw.c -- æÁÔÁÌØÎÁÑ ÏÛÉÂËÁ ÓÅÒÉÁÌÉÚÁÃÉÉ ÚÁÇÏÌÏ×ËÁ." #: sunrpc/clnt_tcp.c:131 msgid "clnttcp_create: out of memory\n" -msgstr "clnttcp_create: minnet slut\n" +msgstr "clnttcp_create: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/clnt_udp.c:139 msgid "clntudp_create: out of memory\n" -msgstr "clntudp_create: minnet slut\n" +msgstr "clntudp_create: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/clnt_unix.c:128 msgid "clntunix_create: out of memory\n" -msgstr "clntunix_create: minnet slut\n" +msgstr "clntunix_create: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/pm_getmaps.c:83 msgid "pmap_getmaps rpc problem" -msgstr "pmap_getmaps rpc problem" +msgstr "ÐÒÏÂÌÅÍÁ pmap_getmaps rpc" #: sunrpc/pmap_clnt.c:129 msgid "Cannot register service" -msgstr "Kan inte registrera tjänst" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÔØ ÓÌÕÖÂÕ" #: sunrpc/pmap_rmt.c:248 msgid "Cannot create socket for broadcast rpc" -msgstr "Kan inte skapa uttag (socket) för utsändnings-rpc" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÓÏËÅÔ ÄÌÑ ÛÉÒÏËÏ×ÅÝÁÔÅÌØÎÏÇÏ rpc" #: sunrpc/pmap_rmt.c:255 msgid "Cannot set socket option SO_BROADCAST" -msgstr "Kan inte sätta uttagsflaggan (socket option) SO_BROADCAST" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ ×ÏÚÍÏÖÎÏÓÔØ ÓÏËÅÔÁ SO_BROADCAST" #: sunrpc/pmap_rmt.c:307 msgid "Cannot send broadcast packet" -msgstr "Kan inte skicka utsändningspaket" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÏÓÌÁÔØ ÛÉÒÏËÏ×ÅÝÁÔÅÌØÎÙÊ ÐÁËÅÔ" #: sunrpc/pmap_rmt.c:332 msgid "Broadcast poll problem" -msgstr "Problem med poll vid utsändning" +msgstr "ðÒÏÂÌÅÍÁ Ó ÛÉÒÏËÏ×ÅÝÁÔÅÌØÎÙÍ ÏÐÒÏÓÏÍ" #: sunrpc/pmap_rmt.c:345 msgid "Cannot receive reply to broadcast" -msgstr "Kan inte ta emot svar på utsändning" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÏÔ×ÅÔ ÎÁ ÛÉÒÏËÏ×ÅÝÁÔÅÌØÎÏÅ ÓÏÏÂÝÅÎÉÅ" #: sunrpc/rpc_main.c:286 #, c-format msgid "%s: output would overwrite %s\n" -msgstr "%s: utdata skulle skriva över %s\n" +msgstr "%s: ×Ù×ÏÄ ÐÅÒÅÚÁÐÉÓÁÌ ÂÙ %s\n" #: sunrpc/rpc_main.c:293 #, c-format msgid "%s: unable to open %s: %m\n" -msgstr "%s: kan inte öppna %s: %m\n" +msgstr "%s: ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ %s: %m\n" #: sunrpc/rpc_main.c:305 #, c-format msgid "%s: while writing output %s: %m" -msgstr "%s: när resultatet %s skrevs: %m" +msgstr "%s: ×Ï ×ÒÅÍÑ ÚÁÐÉÓÉ ×Ù×ÏÄÁ %s: %m" #: sunrpc/rpc_main.c:340 #, c-format msgid "cannot find C preprocessor: %s \n" -msgstr "kan inte hitta C preprocessor: %s \n" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÎÁÊÔÉ ÐÒÅÐÒÏÃÅÓÓÏÒ óÉ: %s \n" #: sunrpc/rpc_main.c:348 msgid "cannot find any C preprocessor (cpp)\n" -msgstr "kan inte hitta någon C preprocessor (cpp)\n" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÎÁÊÔÉ ÎÉËÁËÏÇÏ ÐÒÅÐÒÏÃÅÓÓÏÒÁ óÉ (cpp)\n" #: sunrpc/rpc_main.c:417 #, c-format msgid "%s: C preprocessor failed with signal %d\n" -msgstr "%s: C preprocessorn avslutades med signal %d\n" +msgstr "%s: ÐÒÅÐÒÏÃÅÓÓÏÒ óÉ ÚÁ×ÅÒÛÉÌÓÑ ÎÅÕÓÐÅÛÎÏ Ó ÓÉÇÎÁÌÏÍ %d\n" #: sunrpc/rpc_main.c:420 #, c-format msgid "%s: C preprocessor failed with exit code %d\n" -msgstr "%s: C preprocessorn avslutades med slutstatus %d\n" +msgstr "%s: ÐÒÅÐÒÏÃÅÓÓÏÒ óÉ ÚÁ×ÅÒÛÉÌÓÑ ÎÅÕÓÐÅÛÎÏ Ó ×ÙÈÏÄÎÙÍ ËÏÄÏÍ %d\n" #: sunrpc/rpc_main.c:460 #, c-format msgid "illegal nettype :`%s'\n" -msgstr "otillåten nättyp: \"%s\"\n" +msgstr "ÎÅ×ÅÒÎÙÊ nettype :`%s'\n" #: sunrpc/rpc_main.c:1122 #, c-format msgid "rpcgen: too many defines\n" -msgstr "rpcgen: för många \"define\"\n" +msgstr "rpcgen: ÓÌÉÛËÏÍ ÍÎÏÇÏ ÏÐÒÅÄÅÌÅÎÉÊ\n" #: sunrpc/rpc_main.c:1134 #, c-format msgid "rpcgen: arglist coding error\n" -msgstr "rpcgen: arglist kodningsfel\n" +msgstr "rpcgen: ÏÛÉÂËÁ ËÏÄÉÒÏ×ÁÎÉÑ ÓÐÉÓËÁ ÁÒÇÕÍÅÎÔÏ×\n" #. 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 "fil \"%s\" finns redan och kan bli överskriven\n" +msgstr "ÆÁÊÌ `%s' ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ É ÍÏÖÅÔ ÂÙÔØ ÐÅÒÅÚÁÐÉÓÁÎ\n" #: sunrpc/rpc_main.c:1212 #, c-format msgid "Cannot specify more than one input file!\n" -msgstr "Kan inte ange mer än en infil!\n" +msgstr "îÅÌØÚÑ ÚÁÄÁ×ÁÔØ ÂÏÌÅÅ ÏÄÎÏÇÏ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ!\n" #: sunrpc/rpc_main.c:1382 msgid "This implementation doesn't support newstyle or MT-safe code!\n" -msgstr "Denna implementation stödjer inte \"newstyle\" eller trådsäker kod!\n" +msgstr "" #: sunrpc/rpc_main.c:1391 #, c-format msgid "Cannot use netid flag with inetd flag!\n" -msgstr "Kan inte ange netid-flaggan tillsammans med inetd-flaggan!\n" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÆÌÁÇ netid Ó ÆÌÁÇÏÍ inetd!\n" #: sunrpc/rpc_main.c:1403 msgid "Cannot use netid flag without TIRPC!\n" -msgstr "Kan inte ange netid-flaggan utan TIRPC!\n" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÆÌÁÇ netid ÂÅÚ TIRPC!\n" #: sunrpc/rpc_main.c:1410 msgid "Cannot use table flags with newstyle!\n" -msgstr "Kan inte ange tabellflaggor med ny stil\n" +msgstr "" #: sunrpc/rpc_main.c:1429 #, c-format msgid "\"infile\" is required for template generation flags.\n" -msgstr "\"infil\" är obligatorisk för mallgenereringsflaggor.\n" +msgstr "ôÒÅÂÕÅÔÓÑ ÚÁÄÁÔØ \"×ÈÏÄÎÏÊ-ÆÁÊÌ\" ÄÌÑ ÆÌÁÇÏ× ÇÅÎÅÒÉÒÏ×ÁÎÉÑ ÛÁÂÌÏÎÁ.\n" #: sunrpc/rpc_main.c:1434 #, c-format msgid "Cannot have more than one file generation flag!\n" -msgstr "Kan inte ha mer än en filgenereringsflagga!\n" +msgstr "îÅÌØÚÑ ÚÁÄÁ×ÁÔØ ÂÏÌÅÅ ÏÄÎÏÇÏ ÆÌÁÇÁ ÇÅÎÅÒÉÒÏ×ÁÎÉÑ ÆÁÊÌÁ!\n" #: sunrpc/rpc_main.c:1443 #, c-format msgid "usage: %s infile\n" -msgstr "användning: %s infil\n" +msgstr "ÉÓÐÏÌØÚÏ×ÁÎÉÅ: %s ×ÈÏÄÎÏÊ-ÆÁÊÌ\n" #: sunrpc/rpc_main.c:1444 #, c-format msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n" -msgstr "\t%s [-abkCLNTM][-Dnamn[=värde]] [-i storlek] [-I [-K sekunder]] [-Y sökväg] infil\n" +msgstr "\t%s [-abkCLNTM][-Dname[=ÚÎÁÞÅÎÉÅ]] [-i ÒÁÚÍÅÒ] [-I [-K ÓÅËÕÎÄÙ]] [-Y ÐÕÔØ] ×ÈÏÄÎÏÊ-ÆÁÊÌ\n" #: sunrpc/rpc_main.c:1446 #, c-format msgid "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]\n" -msgstr "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o utfil] [infil]\n" +msgstr "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o ×ÙÈÏÄÎÏÊ-ÆÁÊÌ] [×ÈÏÄÎÏÊ-ÆÁÊÌ]\n" +# ??? #: sunrpc/rpc_main.c:1448 #, c-format msgid "\t%s [-s nettype]* [-o outfile] [infile]\n" -msgstr "\t%s [-s nättyp]* [-o utfil] [infil]\n" +msgstr "\t%s [-s nettype]* [-o ×ÙÈÏÄÎÏÊ-ÆÁÊÌ] [×ÈÏÄÎÏÊ-ÆÁÊÌ]\n" #: sunrpc/rpc_main.c:1449 #, c-format msgid "\t%s [-n netid]* [-o outfile] [infile]\n" -msgstr "\t%s [-n nätid]* [-o utfil] [infil]\n" +msgstr "\t%s [-n netid]* [-o ×ÙÈÏÄÎÏÊ-ÆÁÊÌ] [×ÈÏÄÎÏÊ-ÆÁÊÌ]\n" #: sunrpc/rpc_scan.c:114 msgid "constant or identifier expected" -msgstr "konstant eller identifierare förväntad" +msgstr "ÏÖÉÄÁÅÔÓÑ ËÏÎÓÔÁÎÔÁ ÉÌÉ ÉÄÅÎÔÉÆÉËÁÔÏÒ" #: sunrpc/rpc_scan.c:310 msgid "illegal character in file: " -msgstr "otillåtet tecken i fil: " +msgstr "ÎÅ×ÅÒÎÙÊ ÚÎÁË × ÆÁÊÌÅ: " #: sunrpc/rpc_scan.c:349 sunrpc/rpc_scan.c:375 msgid "unterminated string constant" -msgstr "oavslutad strängkonstant" +msgstr "ÎÅÚÁ×ÅÒÛÅÎÎÁÑ ÓÔÒÏËÏ×ÁÑ ËÏÎÓÔÁÎÔÁ" #: sunrpc/rpc_scan.c:381 msgid "empty char string" -msgstr "tom teckensträng" +msgstr "ÐÕÓÔÁÑ ÓÔÒÏËÁ" #: sunrpc/rpc_scan.c:523 sunrpc/rpc_scan.c:533 msgid "preprocessor error" -msgstr "preprocessorfel" +msgstr "ÏÛÉÂËÁ ÐÒÅÐÒÏÃÅÓÓÏÒÁ" #: sunrpc/rpcinfo.c:237 sunrpc/rpcinfo.c:383 #, c-format msgid "program %lu is not available\n" -msgstr "program %lu är inte tillgängligt\n" +msgstr "ÐÒÏÇÒÁÍÍÁ %lu ÎÅÄÏÓÔÕÐÎÁ\n" #: 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 "program %lu version %lu är inte tillgängligt\n" +msgstr "ÐÒÏÇÒÁÍÍÁ %lu ×ÅÒÓÉÉ %lu ÎÅÄÏÓÔÕÐÎÁ\n" #: sunrpc/rpcinfo.c:515 #, c-format msgid "program %lu version %lu ready and waiting\n" -msgstr "program %lu version %lu redo och väntar\n" +msgstr "ÐÒÏÇÒÁÍÍÁ %lu ×ÅÒÓÉÉ %lu ÇÏÔÏ×Á É ÖÄÅÔ\n" #: sunrpc/rpcinfo.c:556 sunrpc/rpcinfo.c:563 msgid "rpcinfo: can't contact portmapper" -msgstr "rpcinfo: kan inte kontakta portmapper" +msgstr "rpcinfo: ÎÅ×ÏÚÍÏÖÎÏ Ó×ÑÚÁÔØÓÑ Ó ÏÔÏÂÒÁÖÁÔÅÌÅÍ ÐÏÒÔÏ×" #: sunrpc/rpcinfo.c:570 msgid "No remote programs registered.\n" -msgstr "Inga fjärrprogram registrerade.\n" +msgstr "îÅÔ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÎÎÙÈ ÕÄÁÌÅÎÎÙÈ ÐÒÏÇÒÁÍÍ.\n" #: sunrpc/rpcinfo.c:574 msgid " program vers proto port\n" -msgstr " program vers proto port\n" +msgstr " ÐÒÏÇ-ÍÁ ×ÅÒÓ ÐÒÏÔÏ ÐÏÒÔ\n" #: sunrpc/rpcinfo.c:613 msgid "(unknown)" -msgstr "(okänt)" +msgstr "(ÎÅÉÚ×ÅÓÔÎÏ)" #: sunrpc/rpcinfo.c:637 #, c-format msgid "rpcinfo: broadcast failed: %s\n" -msgstr "rpcinfo: utsändning misslyckades: %s\n" +msgstr "rpcinfo: ÛÉÒÏËÏ×ÅÝÁÔÅÌØÎÏÅ ÓÏÏÂÝÅÎÉÅ ÎÅÕÓÐÅÛÎÏ: %s\n" #: sunrpc/rpcinfo.c:658 msgid "Sorry. You are not root\n" -msgstr "Tyvärr, du är inte root\n" +msgstr "éÚ×ÉÎÉÔÅ, ×Ù ÎÅ ÓÕÐÅÒÐÏÌØÚÏ×ÁÔÅÌØ.\n" #: sunrpc/rpcinfo.c:665 #, c-format msgid "rpcinfo: Could not delete registration for prog %s version %s\n" -msgstr "rpcinfo: Kunde inte ta bort registrering av prog %s version %s\n" +msgstr "rpcinfo: îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÒÅÇÉÓÔÒÁÃÉÀ ÐÒÏÇÒÁÍÍÙ %s ×ÅÒÓÉÉ %s\n" #: sunrpc/rpcinfo.c:674 msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n" -msgstr "Användning: rpcinfo [ -n portnr ] -u värd prognr [ versnr ]\n" +msgstr "Usage: rpcinfo [ -n ÎÏÍÅÒ-ÐÏÒÔÁ ] -u ÈÏÓÔ ÎÏÍÅÒ-ÐÒÏÇÒÁÍÍÙ [ ÎÏÍÅÒ-×ÅÒÓÉÉ ]\n" #: sunrpc/rpcinfo.c:676 msgid " rpcinfo [ -n portnum ] -t host prognum [ versnum ]\n" -msgstr " rpcinfo [ -n portnr ] -t värd prognr [ versnr ]\n" +msgstr " rpcinfo [ -n ÎÏÍÅÒ-ÐÏÒÔÁ ] -t ÈÏÓÔ ÎÏÍÅÒ-ÐÒÏÇÒÁÍÍÙ [ ÎÏÍÅÒ-×ÅÒÓÉÉ ]\n" #: sunrpc/rpcinfo.c:678 msgid " rpcinfo -p [ host ]\n" -msgstr " rpcinfo -p [ värd ]\n" +msgstr " rpcinfo -p [ ÈÏÓÔ ]\n" #: sunrpc/rpcinfo.c:679 msgid " rpcinfo -b prognum versnum\n" -msgstr " rpcinfo -b prognr versnr\n" +msgstr " rpcinfo -b ÎÏÍÅÒ-ÐÒÏÇÒÁÍÍÙ ÎÏÍÅÒ-×ÅÒÓÉÉ\n" #: sunrpc/rpcinfo.c:680 msgid " rpcinfo -d prognum versnum\n" -msgstr " rpcinfo -d prognr versnr\n" +msgstr " rpcinfo -d ÎÏÍÅÒ-ÐÒÏÇÒÁÍÍÙ ÎÏÍÅÒ-×ÅÒÓÉÉ\n" #: sunrpc/rpcinfo.c:695 #, c-format msgid "rpcinfo: %s is unknown service\n" -msgstr "rpcinfo: %s är en okänd tjänst\n" +msgstr "rpcinfo: ÓÌÕÖÂÁ %s ÎÅÉÚ×ÅÓÔÎÁ\n" #: sunrpc/rpcinfo.c:732 #, c-format msgid "rpcinfo: %s is unknown host\n" -msgstr "rpcinfo: %s är en okänd värd\n" +msgstr "rpcinfo: ÈÏÓÔ %s ÎÅÉÚ×ÅÓÔÅÎ\n" #: sunrpc/svc_run.c:76 msgid "svc_run: - poll failed" -msgstr "svc_run: - poll misslyckades" +msgstr "svc_run: -- ÏÐÒÏÓ ÎÅÕÓÐÅÛÅÎ" #: sunrpc/svc_simple.c:87 #, c-format msgid "can't reassign procedure number %ld\n" -msgstr "kan inte ändra procedurnummer %ld\n" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÐÅÒÅÎÁÚÎÁÞÉÔØ ÎÏÍÅÒ ÐÒÏÃÅÄÕÒÙ %ld\n" #: sunrpc/svc_simple.c:97 msgid "couldn't create an rpc server\n" -msgstr "kunde inte skapa en rpc-server\n" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ÓÅÒ×ÅÒ rpc\n" #: sunrpc/svc_simple.c:105 #, c-format msgid "couldn't register prog %ld vers %ld\n" -msgstr "kunde inte registrera prog %ld vers %ld\n" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÔØ ÐÒÏÇÒÁÍÍÕ %ld ×ÅÒÓÉÉ %ld\n" #: sunrpc/svc_simple.c:113 msgid "registerrpc: out of memory\n" -msgstr "registerrpc: minnet slut\n" +msgstr "registerrpc: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/svc_simple.c:173 #, c-format msgid "trouble replying to prog %d\n" -msgstr "problem att svara till prog %d\n" +msgstr "ÐÒÏÂÌÅÍÙ ÐÒÉ ÏÔÐÒÁ×ËÅ ÏÔ×ÅÔÁ ÐÒÏÇÒÁÍÍÅ %d\n" #: sunrpc/svc_simple.c:182 #, c-format msgid "never registered prog %d\n" -msgstr "aldrig registrerat prog %d\n" +msgstr "ÎÉ ÒÁÚÕ ÎÅ ÒÅÇÉÓÔÒÉÒÏ×ÁÎÎÁÑ ÐÒÏÇÒÁÍÍÁ %d\n" #: sunrpc/svc_tcp.c:155 msgid "svc_tcp.c - tcp socket creation problem" -msgstr "svc_tcp.c - problem att skapa tcp-uttag (socket)" +msgstr "svc_tcp.c -- ÐÒÏÂÌÅÍÁ ÐÒÉ ÓÏÚÄÁÎÉÉ tcp-ÓÏËÅÔÁ" #: sunrpc/svc_tcp.c:170 msgid "svc_tcp.c - cannot getsockname or listen" -msgstr "svc_tcp.c - kan inte anropa getsockname eller listen" +msgstr "svc_tcp.c -- ÎÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ getsockname ÉÌÉ listen" #: sunrpc/svc_tcp.c:179 msgid "svctcp_create: out of memory\n" -msgstr "svctcp_create: minnet slut\n" +msgstr "svctcp_create: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/svc_tcp.c:218 msgid "svc_tcp: makefd_xprt: out of memory\n" -msgstr "svc_tcp: makefd_xprt: minnet slut\n" +msgstr "svc_tcp: makefd_xprt: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/svc_udp.c:128 msgid "svcudp_create: socket creation problem" -msgstr "svcudp_create: problem att skapa uttag (socket)" +msgstr "svcudp_create: ÐÒÏÂÌÅÍÁ ÐÒÉ ÓÏÚÄÁÎÉÉ ÓÏËÅÔÁ" #: sunrpc/svc_udp.c:142 msgid "svcudp_create - cannot getsockname" -msgstr "svcudp_create - kan inte anropa getsockname" +msgstr "svcudp_create -- ÎÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ getsockname" #: sunrpc/svc_udp.c:152 msgid "svcudp_create: out of memory\n" -msgstr "svcudb_create: minnet slut\n" +msgstr "svcudp_create: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/svc_udp.c:174 msgid "svcudp_create: xp_pad is too small for IP_PKTINFO\n" -msgstr "svcudp_create: xp_pad är för liten för IP_PKTINFO\n" +msgstr "svcudp_create: xp_pad ÓÌÉÛËÏÍ ÍÁÌÏ ÄÌÑ IP_PKTINFO\n" #: sunrpc/svc_udp.c:474 msgid "enablecache: cache already enabled" -msgstr "enablecache: cache redan påslagen" +msgstr "enablecache: ËÜÛ ÕÖÅ ÚÁÄÅÊÓÔ×Ï×ÁÎ" #: sunrpc/svc_udp.c:480 msgid "enablecache: could not allocate cache" -msgstr "enablecache: kunde inte allokera cache" +msgstr "enablecache: ÎÅ ÕÄÁÌÏÓØ ×ÙÄÅÌÉÔØ ÍÅÓÔÏ ÐÏÄ ËÜÛ" #: sunrpc/svc_udp.c:489 msgid "enablecache: could not allocate cache data" -msgstr "enablecache: kunde inte allokera cache-data" +msgstr "enablecache: ÎÅ ÕÄÁÌÏÓØ ×ÙÄÅÌÉÔØ ÍÅÓÔÏ ÐÏÄ ÄÁÎÎÙÅ ËÜÛÁ" #: sunrpc/svc_udp.c:497 msgid "enablecache: could not allocate cache fifo" -msgstr "enablecache: kunde inte allokera cache-fifo" +msgstr "enablecache: ÎÅ ÕÄÁÌÏÓØ ×ÙÄÅÌÉÔØ ÍÅÓÔÏ ÐÏÄ ÏÞÅÒÅÄØ ËÜÛÁ" #: sunrpc/svc_udp.c:532 msgid "cache_set: victim not found" -msgstr "cache_set: offer hittades inte" +msgstr "cache_set: ÖÅÒÔ×Á ÎÅ ÎÁÊÄÅÎÁ" #: sunrpc/svc_udp.c:543 msgid "cache_set: victim alloc failed" -msgstr "cache_set: offerallokering misslyckades" +msgstr "cache_set: ÓÂÏÊ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ ÄÌÑ ÖÅÒÔ×Ù" #: sunrpc/svc_udp.c:550 msgid "cache_set: could not allocate new rpc_buffer" -msgstr "cache_set: kunde inte allokera ny rpc-buffert" +msgstr "cache_set: ÎÅ ÕÄÁÌÏÓØ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ ÐÏÄ ÎÏ×ÙÊ rpc_buffer" #: sunrpc/svc_unix.c:150 msgid "svc_unix.c - AF_UNIX socket creation problem" -msgstr "svc_unix.c - problem att skapa AF_UNIX uttag (socket)" +msgstr "svc_unix.c -- ÐÒÏÂÌÅÍÁ ÐÒÉ ÓÏÚÄÁÎÉÉ AF_UNIX-ÓÏËÅÔÁ" #: sunrpc/svc_unix.c:166 msgid "svc_unix.c - cannot getsockname or listen" -msgstr "svc_unix.c - kan inte anropa getsockname eller listen" +msgstr "svc_unix.c -- ÎÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ getsockname ÉÌÉ listen" #: sunrpc/svc_unix.c:176 msgid "svcunix_create: out of memory\n" -msgstr "svcunix_create: minnet slut\n" +msgstr "svcunix_create: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/svc_unix.c:215 msgid "svc_unix: makefd_xprt: out of memory\n" -msgstr "svc_unix: makefd_xprt: minnet slut\n" +msgstr "svc_unix: makefd_xprt: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/xdr.c:566 msgid "xdr_bytes: out of memory\n" -msgstr "xdr_bytes: minnet slut\n" +msgstr "xdr_bytes: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/xdr.c:718 msgid "xdr_string: out of memory\n" -msgstr "xdr_string: minnet slut\n" +msgstr "xdr_string: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/xdr_array.c:106 msgid "xdr_array: out of memory\n" -msgstr "xdr_array: minnet slut\n" +msgstr "xdr_array: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/xdr_rec.c:156 msgid "xdrrec_create: out of memory\n" -msgstr "xdrrec_create: minnet slut\n" +msgstr "xdrrec_create: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sunrpc/xdr_ref.c:86 msgid "xdr_reference: out of memory\n" -msgstr "xdr_reference: minnet slut\n" +msgstr "xdr_reference: ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ\n" #: sysdeps/generic/siglist.h:29 sysdeps/unix/siglist.c:27 msgid "Hangup" -msgstr "Avringd" +msgstr "ïÂÒÙ× ÔÅÒÍÉÎÁÌØÎÏÊ ÌÉÎÉÉ" #: sysdeps/generic/siglist.h:30 sysdeps/unix/siglist.c:28 msgid "Interrupt" -msgstr "Avbruten (SIGINT)" +msgstr "ðÒÅÒÙ×ÁÎÉÅ" #: sysdeps/generic/siglist.h:31 sysdeps/unix/siglist.c:29 msgid "Quit" -msgstr "Lämnad" +msgstr "÷ÙÈÏÄ" #: sysdeps/generic/siglist.h:32 sysdeps/unix/siglist.c:30 msgid "Illegal instruction" -msgstr "Otillåten instruktion" +msgstr "îÅÄÏÐÕÓÔÉÍÁÑ ÉÎÓÔÒÕËÃÉÑ" #: sysdeps/generic/siglist.h:33 sysdeps/unix/siglist.c:31 msgid "Trace/breakpoint trap" -msgstr "Spårningsfälla" +msgstr "ìÏ×ÕÛËÁ ÔÒÁÓÓÉÒÏ×ËÉ/ÏÓÔÁÎÏ×Á" #: sysdeps/generic/siglist.h:34 msgid "Aborted" -msgstr "Avbruten (SIGABRT)" +msgstr "á×ÁÒÉÊÎÙÊ ÏÓÔÁÎÏ×" #: sysdeps/generic/siglist.h:35 sysdeps/unix/siglist.c:34 msgid "Floating point exception" -msgstr "Aritmetiskt fel" +msgstr "éÓËÌÀÞÅÎÉÅ × ÏÐÅÒÁÃÉÉ Ó ÐÌÁ×ÁÀÝÅÊ ÔÏÞËÏÊ" #: sysdeps/generic/siglist.h:36 sysdeps/unix/siglist.c:35 msgid "Killed" -msgstr "Dödad" +msgstr "õÂÉÔÏ" #: sysdeps/generic/siglist.h:37 sysdeps/unix/siglist.c:36 msgid "Bus error" -msgstr "Bussfel" +msgstr "ïÛÉÂËÁ ÛÉÎÙ" #: sysdeps/generic/siglist.h:38 sysdeps/unix/siglist.c:37 msgid "Segmentation fault" -msgstr "Segmenteringsfel" +msgstr "ïÛÉÂËÁ ÓÅÇÍÅÎÔÉÒÏ×ÁÎÉÑ" #. 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 @@ -5095,110 +5086,110 @@ msgstr "Segmenteringsfel" #: sysdeps/generic/siglist.h:39 sysdeps/gnu/errlist.c:359 #: sysdeps/unix/siglist.c:39 msgid "Broken pipe" -msgstr "Brutet rör" +msgstr "ïÂÒÙ× ËÁÎÁÌÁ" #: sysdeps/generic/siglist.h:40 sysdeps/unix/siglist.c:40 msgid "Alarm clock" -msgstr "Alarmklocka" +msgstr "óÉÇÎÁÌ ÔÁÊÍÅÒÁ" #: sysdeps/generic/siglist.h:41 sysdeps/unix/siglist.c:41 msgid "Terminated" -msgstr "Avslutad" +msgstr "úÁ×ÅÒÛÅÎÏ" #: sysdeps/generic/siglist.h:42 sysdeps/unix/siglist.c:42 msgid "Urgent I/O condition" -msgstr "Akut I/O-tillstånd" +msgstr "óÉÔÕÁÃÉÑ ÓÒÏÞÎÏÇÏ ××ÏÄÁ/×Ù×ÏÄÁ" #: sysdeps/generic/siglist.h:43 sysdeps/unix/siglist.c:43 msgid "Stopped (signal)" -msgstr "Stoppad (signal)" +msgstr "ïÓÔÁÎÏ×ÌÅÎÏ (ÓÉÇÎÁÌ)" #: sysdeps/generic/siglist.h:44 sysdeps/unix/siglist.c:44 msgid "Stopped" -msgstr "Stoppad" +msgstr "ïÓÔÁÎÏ×ÌÅÎÏ" #: sysdeps/generic/siglist.h:45 sysdeps/unix/siglist.c:45 msgid "Continued" -msgstr "Återupptagen" +msgstr "ðÒÏÄÏÌÖÅÎÏ" #: sysdeps/generic/siglist.h:46 sysdeps/unix/siglist.c:46 msgid "Child exited" -msgstr "Barnprocess avslutad" +msgstr "äÏÞÅÒÎÉÊ ÐÒÏÃÅÓÓ ÚÁ×ÅÒÛÉÌÓÑ" #: sysdeps/generic/siglist.h:47 sysdeps/unix/siglist.c:47 msgid "Stopped (tty input)" -msgstr "Stoppad (terminalläsning)" +msgstr "ïÓÔÁÎÏ×ÌÅÎÏ (××ÏÄ Ó ÔÅÒÍÉÎÁÌÁ)" #: sysdeps/generic/siglist.h:48 sysdeps/unix/siglist.c:48 msgid "Stopped (tty output)" -msgstr "Stoppad (terminalskrivning)" +msgstr "ïÓÔÁÎÏ×ÌÅÎÏ (×Ù×ÏÄ ÎÁ ÔÅÒÍÉÎÁÌ)" #: sysdeps/generic/siglist.h:49 sysdeps/unix/siglist.c:49 msgid "I/O possible" -msgstr "I/O möjligt" +msgstr "÷ÏÚÍÏÖÅÎ ××ÏÄ/×Ù×ÏÄ" #: sysdeps/generic/siglist.h:50 sysdeps/unix/siglist.c:50 msgid "CPU time limit exceeded" -msgstr "Begränsning av CPU-tid överskriden" +msgstr "ðÒÅ×ÙÛÅÎ ÌÉÍÉÔ ÐÒÏÃÅÓÓÏÒÎÏÇÏ ×ÒÅÍÅÎÉ" #: sysdeps/generic/siglist.h:51 sysdeps/unix/siglist.c:51 msgid "File size limit exceeded" -msgstr "Begränsning av filstorlek överskriden" +msgstr "ðÒÅ×ÙÛÅÎ ÌÉÍÉÔ ÒÁÚÍÅÒÁ ÆÁÊÌÁ" #: sysdeps/generic/siglist.h:52 sysdeps/unix/siglist.c:52 msgid "Virtual timer expired" -msgstr "Alarmklocka - virtuell tid" +msgstr "÷ÉÒÔÕÁÌØÎÙÊ ÔÁÊÍÅÒ ÉÓÔÅË" #: sysdeps/generic/siglist.h:53 sysdeps/unix/siglist.c:53 msgid "Profiling timer expired" -msgstr "Profileringsklocka" +msgstr "ðÒÏÆÉÌÉÒÏ×ÏÞÎÙÊ ÔÁÊÍÅÒ ÉÓÔÅË" #: sysdeps/generic/siglist.h:54 sysdeps/unix/siglist.c:54 msgid "Window changed" -msgstr "Ändrat fönster" +msgstr "ïËÎÏ ÉÚÍÅÎÉÌÏÓØ" #: sysdeps/generic/siglist.h:55 sysdeps/unix/siglist.c:56 msgid "User defined signal 1" -msgstr "Användarsignal 1" +msgstr "ïÐÒÅÄÅÌÑÅÍÙÊ ÐÏÌØÚÏ×ÁÔÅÌÅÍ ÓÉÇÎÁÌ 1" #: sysdeps/generic/siglist.h:56 sysdeps/unix/siglist.c:57 msgid "User defined signal 2" -msgstr "Användarsignal 2" +msgstr "ïÐÒÅÄÅÌÑÅÍÙÊ ÐÏÌØÚÏ×ÁÔÅÌÅÍ ÓÉÇÎÁÌ 2" #: sysdeps/generic/siglist.h:60 sysdeps/unix/siglist.c:33 msgid "EMT trap" -msgstr "Emulatorfälla" +msgstr "ìÏ×ÕÛËÁ EMT" #: sysdeps/generic/siglist.h:63 sysdeps/unix/siglist.c:38 msgid "Bad system call" -msgstr "Felaktigt systemanrop" +msgstr "îÅ×ÅÒÎÙÊ ÓÉÓÔÅÍÎÙÊ ×ÙÚÏ×" #: sysdeps/generic/siglist.h:66 msgid "Stack fault" -msgstr "Stackfel" +msgstr "ïÛÉÂËÁ ÓÔÅËÁ" #: sysdeps/generic/siglist.h:69 msgid "Information request" -msgstr "Informationsbegäran" +msgstr "úÁÐÒÏÓ ÉÎÆÏÒÍÁÃÉÉ" #: sysdeps/generic/siglist.h:71 msgid "Power failure" -msgstr "Strömavbrott" +msgstr "óÂÏÊ ÐÉÔÁÎÉÑ" #: sysdeps/generic/siglist.h:74 sysdeps/unix/siglist.c:55 msgid "Resource lost" -msgstr "Förlorad resurs" +msgstr "ðÏÔÅÒÑ ÒÅÓÕÒÓÁ" #. 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 "Operationen inte tillåten" +msgstr "ïÐÅÒÁÃÉÑ ÎÅ ÐÏÚ×ÏÌÑÅÔÓÑ" #. TRANS No process matches the specified process ID. #: sysdeps/gnu/errlist.c:45 msgid "No such process" -msgstr "Processen finns inte" +msgstr "îÅÔ ÔÁËÏÇÏ ÐÒÏÃÅÓÓÁ" #. TRANS Interrupted function call; an asynchronous signal occurred and prevented #. TRANS completion of the call. When this happens, you should try the call @@ -5209,12 +5200,12 @@ msgstr "Processen finns inte" #. TRANS Primitives}. #: sysdeps/gnu/errlist.c:60 msgid "Interrupted system call" -msgstr "Avbrutet systemanrop" +msgstr "ðÒÅÒ×ÁÎ ÓÉÓÔÅÍÎÙÊ ×ÙÚÏ×" #. TRANS Input/output error; usually used for physical read or write errors. #: sysdeps/gnu/errlist.c:69 msgid "Input/output error" -msgstr "In/ut-fel" +msgstr "ïÛÉÂËÁ ××ÏÄÁ/×Ù×ÏÄÁ" #. 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. @@ -5223,7 +5214,7 @@ msgstr "In/ut-fel" #. TRANS computer. #: sysdeps/gnu/errlist.c:82 msgid "No such device or address" -msgstr "Enheten eller adressen finns inte" +msgstr "îÅÔ ÔÁËÏÇÏ ÕÓÔÒÏÊÓÔ×Á ÉÌÉ ÁÄÒÅÓÁ" #. 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 @@ -5231,27 +5222,27 @@ msgstr "Enheten eller adressen finns inte" #. TRANS GNU system. #: sysdeps/gnu/errlist.c:94 msgid "Argument list too long" -msgstr "Argumentlistan för lång" +msgstr "óÌÉÛËÏÍ ÄÌÉÎÎÙÊ ÓÐÉÓÏË ÁÒÇÕÍÅÎÔÏ×" #. 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 msgid "Exec format error" -msgstr "Formatfel på körbar fil" +msgstr "ïÛÉÂËÁ ÆÏÒÍÁÔÁ ×ÙÐÏÌÎÑÅÍÏÇÏ ÆÁÊÌÁ" #. 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 msgid "Bad file descriptor" -msgstr "Felaktig filidentifierare" +msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ÄÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ" #. 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 msgid "No child processes" -msgstr "Inga barnprocesser" +msgstr "îÅÔ ÄÏÞÅÒÎÉÈ ÐÒÏÃÅÓÓÏ×" #. TRANS Deadlock avoided; allocating a system resource would have resulted in a #. TRANS deadlock situation. The system does not guarantee that it will notice @@ -5259,69 +5250,69 @@ msgstr "Inga barnprocesser" #. TRANS noticed; it might just hang. @xref{File Locks}, for an example. #: sysdeps/gnu/errlist.c:138 msgid "Resource deadlock avoided" -msgstr "Resursdödläge undveks" +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 "Kan inte allokera minne" +msgstr "îÅ×ÏÚÍÏÖÎÏ ×ÙÄÅÌÉÔØ ÐÁÍÑÔØ" #. 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 "Felaktig adress" +msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ÁÄÒÅÓ" #. 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 "Blockspecialfil krävs" +msgstr "ôÒÅÂÕÅÔÓÑ ÂÌÏÞÎÏÅ ÕÓÔÒÏÊÓÔ×Ï" #. 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 "Enhet eller resurs upptagen" +msgstr "õÓÔÒÏÊÓÔ×Ï ÉÌÉ ÒÅÓÕÒÓ ÚÁÎÑÔÏ" #. 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 "Filen existerar" +msgstr "æÁÊÌ ÓÕÝÅÓÔ×ÕÅÔ" #. 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 msgid "Invalid cross-device link" -msgstr "Ogiltig länk över skilda enheter" +msgstr "îÅ×ÅÒÎÁÑ ÓÓÙÌËÁ ÍÅÖÄÕ ÕÓÔÒÏÊÓÔ×ÁÍÉ" #. 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 "Enheten finns inte" +msgstr "îÅÔ ÔÁËÏÇÏ ÕÓÔÒÏÊÓÔ×Á" #. TRANS A file that isn't a directory was specified when a directory is required. #: sysdeps/gnu/errlist.c:229 msgid "Not a directory" -msgstr "Inte en katalog" +msgstr "üÔÏ ÎÅ ËÁÔÁÌÏÇ" #. 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 msgid "Is a directory" -msgstr "Är en katalog" +msgstr "üÔÏ ËÁÔÁÌÏÇ" #. 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 msgid "Invalid argument" -msgstr "Ogiltigt argument" +msgstr "îÅÄÏÐÕÓÔÉÍÙÊ ÁÒÇÕÍÅÎÔ" #. TRANS The current process has too many files open and can't open any more. #. TRANS Duplicate descriptors do count toward this limit. @@ -5332,20 +5323,20 @@ msgstr "Ogiltigt argument" #. TRANS @pxref{Limits on Resources}. #: sysdeps/gnu/errlist.c:264 msgid "Too many open files" -msgstr "För många öppna filer" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÏÔËÒÙÔÙÈ ÆÁÊÌÏ×" #. 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 "För många öppna filer i systemet" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÏÔËÒÙÔÙÈ ÆÁÊÌÏ× × ÓÉÓÔÅÍÅ" #. TRANS Inappropriate I/O control operation, such as trying to set terminal #. TRANS modes on an ordinary file. #: sysdeps/gnu/errlist.c:285 msgid "Inappropriate ioctl for device" -msgstr "Olämplig \"ioctl\" för enhet" +msgstr "îÅÐÒÉÍÅÎÉÍÙÊ Ë ÄÁÎÎÏÍÕ ÕÓÔÒÏÊÓÔ×Õ ioctl" #. 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 @@ -5354,47 +5345,47 @@ msgstr "Olämplig \"ioctl\" för enhet" #. 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 "Kodfil upptagen" +msgstr "ôÅËÓÔÏ×ÙÊ ÆÁÊÌ ÚÁÎÑÔ" #. TRANS File too big; the size of a file would be larger than allowed by the system. #: sysdeps/gnu/errlist.c:307 msgid "File too large" -msgstr "Fil för stor" +msgstr "æÁÊÌ ÓÌÉÛËÏÍ ×ÅÌÉË" #. 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 "Enheten är full" +msgstr "îÁ ÕÓÔÒÏÊÓÔ×Å ËÏÎÞÉÌÏÓØ ÍÅÓÔÏ" #. TRANS Invalid seek operation (such as on a pipe). #: sysdeps/gnu/errlist.c:326 msgid "Illegal seek" -msgstr "Otillåten sökning" +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 "Filsystemet endast läsbart" +msgstr "æÁÊÌÏ×ÁÑ ÓÉÓÔÅÍÁ ÄÏÓÔÕÐÎÁ ÔÏÌØËÏ ÄÌÑ ÞÔÅÎÉÑ" #. 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 "För många länkar" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÓÓÙÌÏË" #. 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 "Numeriskt argument är utanför området" +msgstr "þÉÓÌÏ×ÏÊ ÁÒÇÕÍÅÎÔ ×ÎÅ ÏÂÌÁÓÔÉ ÏÐÒÅÄÅÌÅÎÉÑ" #. 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 "Numeriskt resultat är utanför giltigt område" +msgstr "þÉÓÌÏ×ÏÊ ÒÅÚÕÌØÔÁÔ ×ÎÅ ÐÒÅÄÓÔÁ×ÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ" #. TRANS Resource temporarily unavailable; the call might work if you try again #. TRANS later. The macro @code{EWOULDBLOCK} is another name for @code{EAGAIN}; @@ -5427,7 +5418,7 @@ msgstr "Numeriskt resultat är utanför giltigt område" #. TRANS @end itemize #: sysdeps/gnu/errlist.c:416 msgid "Resource temporarily unavailable" -msgstr "Resursen tillfälligt otillgänglig" +msgstr "òÅÓÕÒÓ ×ÒÅÍÅÎÎÏ ÎÅÄÏÓÔÕÐÅÎ" #. 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. @@ -5436,7 +5427,7 @@ msgstr "Resursen tillfälligt otillgänglig" #. TRANS separate error code. #: sysdeps/gnu/errlist.c:429 msgid "Operation would block" -msgstr "Operationen skulle blockera" +msgstr "ïÐÅÒÁÃÉÑ ÐÒÉ×ÅÄÅÔ Ë ÂÌÏËÉÒÏ×ËÅ" #. TRANS An operation that cannot complete immediately was initiated on an object #. TRANS that has non-blocking mode selected. Some functions that must always @@ -5448,47 +5439,47 @@ msgstr "Operationen skulle blockera" #. TRANS has completed; @pxref{Waiting for I/O}. #: sysdeps/gnu/errlist.c:445 msgid "Operation now in progress" -msgstr "Operationen pågår nu" +msgstr "ïÐÅÒÁÃÉÑ ×ÙÐÏÌÎÑÅÔÓÑ × ÄÁÎÎÙÊ ÍÏÍÅÎÔ" #. 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 "Operationen pågår redan" +msgstr "ïÐÅÒÁÃÉÑ ÕÖÅ ×ÙÐÏÌÎÑÅÔÓÑ" #. 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 "Uttagsoperation på icke-uttag (socket)" +msgstr "ïÐÅÒÁÃÉÑ ÄÌÑ ÓÏËÅÔÁ ÐÒÉÍÅÎÅÎÁ Ë ÎÅ-ÓÏËÅÔÕ" #. 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 "Meddelandet för långt" +msgstr "óÏÏÂÝÅÎÉÅ ÓÌÉÛËÏÍ ÄÌÉÎÎÏÅ" #. TRANS The socket type does not support the requested communications protocol. #: sysdeps/gnu/errlist.c:483 msgid "Protocol wrong type for socket" -msgstr "Fel protokolltyp för uttag (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 msgid "Protocol not available" -msgstr "Protokollet inte tillgängligt" +msgstr "ðÒÏÔÏËÏÌ ÎÅÄÏÓÔÕÐÅÎ" #. 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 "Protokollet stöds ej" +msgstr "ðÒÏÔÏËÏÌ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #. TRANS The socket type is not supported. #: sysdeps/gnu/errlist.c:513 msgid "Socket type not supported" -msgstr "Uttagstyp (socket) stöds ej" +msgstr "îÅÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ ÔÉÐ ÓÏËÅÔÁ" #. 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 @@ -5498,71 +5489,71 @@ msgstr "Uttagstyp (socket) stöds ej" #. TRANS nothing to do for that call. #: sysdeps/gnu/errlist.c:527 msgid "Operation not supported" -msgstr "Operationen stöds ej" +msgstr "îÅÐÏÄÄÅÒÖÉ×ÁÅÍÁÑ ÏÐÅÒÁÃÉÑ" #. TRANS The socket communications protocol family you requested is not supported. #: sysdeps/gnu/errlist.c:536 msgid "Protocol family not supported" -msgstr "Protokollfamiljen stöds ej" +msgstr "îÅÐÏÄÄÅÒÖÉ×ÁÅÍÏÅ ÓÅÍÅÊÓÔ×Ï ÐÒÏÔÏËÏÌÏ×" #. 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 "Adressfamiljen stöds inte av protokollet" +msgstr "óÅÍÅÊÓÔ×Ï ÁÄÒÅÓÏ× ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÐÒÏÔÏËÏÌÏÍ" #. TRANS The requested socket address is already in use. @xref{Socket Addresses}. #: sysdeps/gnu/errlist.c:555 msgid "Address already in use" -msgstr "Adressen upptagen" +msgstr "áÄÒÅÓ ÕÖÅ ÉÓÐÏÌØÚÕÅÔÓÑ" #. 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 "Kan inte tilldela begärd adress" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÎÁÚÎÁÞÉÔØ ÚÁÐÒÏÛÅÎÎÙÊ ÁÄÒÅÓ" #. TRANS A socket operation failed because the network was down. #: sysdeps/gnu/errlist.c:575 msgid "Network is down" -msgstr "Nätverket är nere" +msgstr "óÅÔØ ÎÅ ÒÁÂÏÔÁÅÔ" #. 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 "Nätverket kan inte nås" +msgstr "óÅÔØ ÎÅÄÏÓÔÕÐÎÁ" #. TRANS A network connection was reset because the remote host crashed. #: sysdeps/gnu/errlist.c:594 msgid "Network dropped connection on reset" -msgstr "Nätverket tog bort förbindelsen vid omstart" +msgstr "óÅÔÅ×ÏÅ ÓÏÅÄÉÎÅÎÉÅ ÂÙÌÏ ÓÂÒÏÛÅÎÏ" #. TRANS A network connection was aborted locally. #: sysdeps/gnu/errlist.c:603 msgid "Software caused connection abort" -msgstr "Mjukvara orsakade förbindelsebrott" +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 "Förbindelse borttagen av partnern" +msgstr "óÏÅÄÉÎÅÎÉÅ ÓÂÒÏÛÅÎÏ ÄÒÕÇÏÊ ÓÔÏÒÏÎÏÊ" #. 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 "Ingen buffertplats tillgänglig" +msgstr "îÅÄÏÓÔÁÔÏÞÎÏ ÂÕÆÅÒÎÏÇÏ ÐÒÏÓÔÒÁÎÓÔ×Á" #. 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 "Transportslutpunkten är redan förbunden" +msgstr "ëÏÎÅÞÎÁÑ ÔÏÞËÁ ÐÅÒÅÄÁÞÉ ÕÖÅ ÐÏÄÓÏÅÄÉÎÅÎÁ" #. 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 @@ -5570,83 +5561,83 @@ msgstr "Transportslutpunkten är redan förbunden" #. TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead. #: sysdeps/gnu/errlist.c:647 msgid "Transport endpoint is not connected" -msgstr "Transportslutpunkten är inte förbunden" +msgstr "ëÏÎÅÞÎÁÑ ÔÏÞËÁ ÐÅÒÅÄÁÞÉ ÎÅ ÐÏÄÓÏÅÄÉÎÅÎÁ" #. 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 "Destination krävs" +msgstr "ôÒÅÂÕÅÔÓÑ ÕËÁÚÁÔØ ÁÄÒÅÓ ÎÁÚÎÁÞÅÎÉÑ" #. TRANS The socket has already been shut down. #: sysdeps/gnu/errlist.c:667 msgid "Cannot send after transport endpoint shutdown" -msgstr "Kan inte skicka efter att transportslutpunkten stängts" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÏÓÌÁÔØ ÄÁÎÎÙÅ ÐÏÓÌÅ ×ÙËÌÀÞÅÎÉÑ ËÏÎÅÞÎÏÊ ÔÏÞËÉ ÐÅÒÅÄÁÞÉ" #. TRANS ??? #: sysdeps/gnu/errlist.c:676 msgid "Too many references: cannot splice" -msgstr "För många referenser: kan inte skarva" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÓÓÙÌÏË: ÎÅ×ÏÚÍÏÖÎÏ ÏÂßÅÄÉÎÉÔØ" #. 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 "Förbindelsen dog ut (timeout)" +msgstr "÷ÒÅÍÑ ÏÖÉÄÁÎÉÑ ÓÏÅÄÉÎÅÎÉÑ ÉÓÔÅËÌÏ" #. 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 "Förbindelse vägras" +msgstr "÷ ÓÏÅÄÉÎÅÎÉÉ ÏÔËÁÚÁÎÏ" #. 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 "För många nivåer av symboliska länkar" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÕÒÏ×ÎÅÊ ÓÉÍ×ÏÌØÎÙÈ ÓÓÙÌÏË" #. 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 "Filnamn för långt" +msgstr "óÌÉÛËÏÍ ÄÌÉÎÎÏÅ ÉÍÑ ÆÁÊÌÁ" #. TRANS The remote host for a requested network connection is down. #: sysdeps/gnu/errlist.c:726 msgid "Host is down" -msgstr "Värddator är nere" +msgstr "èÏÓÔ ×ÙËÌÀÞÅÎ" #. TRANS The remote host for a requested network connection is not reachable. #: sysdeps/gnu/errlist.c:735 msgid "No route to host" -msgstr "Ingen väg till värd" +msgstr "îÅÔ ÐÕÔÉ ÄÏ ÈÏÓÔÁ" #. 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 "Katalog inte tom" +msgstr "ëÁÔÁÌÏÇ ÎÅ ÐÕÓÔ" #. 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 "För många processer" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÐÒÏÃÅÓÓÏ×" #. 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 "För många användare" +msgstr "óÌÉÛËÏÍ ÍÎÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÅÊ" #. TRANS The user's disk quota was exceeded. #: sysdeps/gnu/errlist.c:775 msgid "Disk quota exceeded" -msgstr "Diskkvot överskriden" +msgstr "ðÒÅ×ÙÛÅÎÁ ÄÉÓËÏ×ÁÑ Ë×ÏÔÁ" #. 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. @@ -5654,7 +5645,7 @@ msgstr "Diskkvot överskriden" #. TRANS the NFS file system on the local host. #: sysdeps/gnu/errlist.c:787 msgid "Stale NFS file handle" -msgstr "Förlegat NFS-filhandtag" +msgstr "õÓÔÁÒÅ×ÛÉÊ ÈÜÎÄÌ ÆÁÊÌÁ NFS" #. TRANS An attempt was made to NFS-mount a remote file system with a file name that #. TRANS already specifies an NFS-mounted file. @@ -5662,32 +5653,32 @@ msgstr "Förlegat NFS-filhandtag" #. TRANS properly on the GNU system, making this error code impossible.) #: sysdeps/gnu/errlist.c:799 msgid "Object is remote" -msgstr "Är ett fjärrobjekt" +msgstr "üÔÏ ÕÄÁÌÅÎÎÙÊ ÏÂßÅËÔ" #. TRANS ??? #: sysdeps/gnu/errlist.c:808 msgid "RPC struct is bad" -msgstr "RPC-struktur dålig" +msgstr " RPC ÎÅÐÒÁ×ÉÌØÎÁÑ ÓÔÒÕËÔÕÒÁ" #. TRANS ??? #: sysdeps/gnu/errlist.c:817 msgid "RPC version wrong" -msgstr "RPC-version fel" +msgstr "RPC ÎÅÐÒÁ×ÉÌØÎÁÑ ×ÅÒÓÉÑ" #. TRANS ??? #: sysdeps/gnu/errlist.c:826 msgid "RPC program not available" -msgstr "RPC-programmet inte tillgängligt" +msgstr "RPC ÐÒÏÇÒÁÍÍÁ ÎÅÄÏÓÔÕÐÎÁ" #. TRANS ??? #: sysdeps/gnu/errlist.c:835 msgid "RPC program version wrong" -msgstr "RPC-programversion fel" +msgstr "RPC ÎÅÐÒÁ×ÉÌØÎÁÑ ×ÅÒÓÉÑ ÐÒÏÇÒÁÍÍÙ" #. TRANS ??? #: sysdeps/gnu/errlist.c:844 msgid "RPC bad procedure for program" -msgstr "RPC dålig procedur för program" +msgstr "RPC ÎÅÐÒÁ×ÉÌØÎÁÑ ÐÒÏÃÅÄÕÒÁ ÄÌÑ ÐÒÏÇÒÁÍÍÙ" #. 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 @@ -5695,7 +5686,7 @@ msgstr "RPC dålig procedur för program" #. TRANS operating system. #: sysdeps/gnu/errlist.c:856 msgid "No locks available" -msgstr "Inga lås tillgängliga" +msgstr "îÅÔ ÄÏÓÔÕÐÎÙÈ ÂÌÏËÉÒÏ×ÏË" #. TRANS Inappropriate file type or format. The file was the wrong type for the #. TRANS operation, or a data file had the wrong format. @@ -5704,17 +5695,17 @@ msgstr "Inga lås tillgängliga" #. TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}. #: sysdeps/gnu/errlist.c:869 msgid "Inappropriate file type or format" -msgstr "Filtyp eller format olämplig" +msgstr "îÅÐÏÄÈÏÄÑÝÉÊ ÔÉÐ ÉÌÉ ÆÏÒÍÁÔ ÆÁÊÌÁ" #. TRANS ??? #: sysdeps/gnu/errlist.c:878 msgid "Authentication error" -msgstr "Äkthetskontroll misslyckades" +msgstr "ïÛÉÂËÁ ÁÕÔÅÎÆÉËÁÃÉÉ" #. TRANS ??? #: sysdeps/gnu/errlist.c:887 msgid "Need authenticator" -msgstr "Behöver äkthetsintygare" +msgstr "îÅÏÂÈÏÄÉÍ ÁÕÔÅÎÆÉËÁÔÏÒ" #. 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 @@ -5723,7 +5714,7 @@ msgstr "Behöver äkthetsintygare" #. TRANS install a new version of the C library or the operating system. #: sysdeps/gnu/errlist.c:900 msgid "Function not implemented" -msgstr "Funktion inte implementerad" +msgstr "æÕÎËÃÉÑ ÎÅ ÒÅÁÌÉÚÏ×ÁÎÁ" #. TRANS Not supported. A function returns this error when certain parameter #. TRANS values are valid, but the functionality they request is not available. @@ -5739,13 +5730,13 @@ msgstr "Funktion inte implementerad" #. TRANS it returns @code{ENOSYS} instead. #: sysdeps/gnu/errlist.c:920 msgid "Not supported" -msgstr "Stöds ej" +msgstr "îÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #. 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 "Ogiltig eller inte komplett flerbyte- eller brett tecken" +msgstr "îÅ×ÅÒÎÙÊ ÉÌÉ ÎÅÐÏÌÎÙÊ ÍÕÌØÔÉÂÁÊÔÎÙÊ ÉÌÉ ÛÉÒÏËÉÊ ÚÎÁË" #. 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 @@ -5755,14 +5746,14 @@ msgstr "Ogiltig eller inte komplett flerbyte- eller brett tecken" #. TRANS for information on process groups and these signals. #: sysdeps/gnu/errlist.c:944 msgid "Inappropriate operation for background process" -msgstr "Operation för bakgrundsprocess olämplig" +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 "Översättaren dog" +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. @@ -5774,61 +5765,61 @@ msgstr "?" #. TRANS You did @strong{what}? #: sysdeps/gnu/errlist.c:975 msgid "You really blew it this time" -msgstr "Du strulade till det den här gången" +msgstr "îÁ ÜÔÏÔ ÒÁÚ ×Ù ×ÓÅÈ ÏÐÒÏËÉÎÕÌÉ" #. TRANS Go home and have a glass of warm, dairy-fresh milk. #: sysdeps/gnu/errlist.c:984 msgid "Computer bought the farm" -msgstr "Datorn packade ihop" +msgstr "ëÏÍÐØÀÔÅÒ ËÕÐÉÌ ÆÅÒÍÕ" #. TRANS This error code has no purpose. #: sysdeps/gnu/errlist.c:993 msgid "Gratuitous error" -msgstr "Omotiverat fel" +msgstr "âÅÚ×ÏÚÍÅÚÄÎÁÑ ÏÛÉÂËÁ" #: sysdeps/gnu/errlist.c:1001 msgid "Bad message" -msgstr "Felaktigt meddelande" +msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÓÏÏÂÝÅÎÉÅ" #: sysdeps/gnu/errlist.c:1009 msgid "Identifier removed" -msgstr "Identifierare borttagen" +msgstr "éÄÅÎÔÉÆÉËÁÔÏÒ ÂÙÌ ÕÄÁÌÅÎ" #: sysdeps/gnu/errlist.c:1017 msgid "Multihop attempted" -msgstr "Flerhopp försöktes" +msgstr "" #: sysdeps/gnu/errlist.c:1025 msgid "No data available" -msgstr "Inga data tillgängliga" +msgstr "îÅÔ ÄÏÓÔÕÐÎÙÈ ÄÁÎÎÙÈ" #: sysdeps/gnu/errlist.c:1033 msgid "Link has been severed" -msgstr "Länken har brutits" +msgstr "óÏÅÄÉÎÅÎÅÎÉÅ ÂÙÌÏ ÒÁÚÏÒ×ÁÎÏ" #: sysdeps/gnu/errlist.c:1041 msgid "No message of desired type" -msgstr "Inget meddelande av önskad typ" +msgstr "îÅÔ ÓÏÏÂÝÅÎÉÑ ÖÅÌÁÅÍÏÇÏ ÔÉÐÁ" #: sysdeps/gnu/errlist.c:1049 msgid "Out of streams resources" -msgstr "Stream-resurserna är slut" +msgstr "îÅÄÏÓÔÁÔÏÞÎÏ ÐÏÔÏËÏ×ÙÈ ÒÅÓÕÒÓÏ×" #: sysdeps/gnu/errlist.c:1057 msgid "Device not a stream" -msgstr "Enheten är inte en stream" +msgstr "õÓÔÒÏÊÓÔ×Ï ÎÅ Ñ×ÌÑÅÔÓÑ ÐÏÔÏËÏÍ" #: sysdeps/gnu/errlist.c:1065 msgid "Value too large for defined data type" -msgstr "Värdet för stort för definierad datatyp" +msgstr "úÎÁÞÅÎÉÅ ÓÌÉÛËÏÍ ×ÅÌÉËÏ ÄÌÑ ÔÁËÏÇÏ ÔÉÐÁ ÄÁÎÎÙÈ" #: sysdeps/gnu/errlist.c:1073 msgid "Protocol error" -msgstr "Protokollfel" +msgstr "ïÛÉÂËÁ ÐÒÏÔÏËÏÌÁ" #: sysdeps/gnu/errlist.c:1081 msgid "Timer expired" -msgstr "Klockan ringde" +msgstr "ôÁÊÍÅÒ ÉÓÔÅË" #. TRANS Operation canceled; an asynchronous operation was canceled before it #. TRANS completed. @xref{Asynchronous I/O}. When you call @code{aio_cancel}, @@ -5836,346 +5827,346 @@ msgstr "Klockan ringde" #. TRANS error; @pxref{Cancel AIO Operations}. #: sysdeps/gnu/errlist.c:1093 msgid "Operation canceled" -msgstr "Operationen avbruten" +msgstr "ïÐÅÒÁÃÉÑ ÏÔÍÅÎÅÎÁ" #: sysdeps/gnu/errlist.c:1101 msgid "Interrupted system call should be restarted" -msgstr "Avbrutet systemanrop borde omstartas" +msgstr "ðÒÅÒ×ÁÎÙÊ ÓÉÓÔÅÍÎÙÊ ×ÙÚÏ× ÓÌÅÄÕÅÔ ÐÅÒÅÚÁÐÕÓÔÉÔØ" #: sysdeps/gnu/errlist.c:1109 msgid "Channel number out of range" -msgstr "Kanalnummer utanför giltigt intervall" +msgstr "îÏÍÅÒ ËÁÎÁÌÁ ×ÎÅ ÄÉÁÐÁÚÏÎÁ" #: sysdeps/gnu/errlist.c:1117 msgid "Level 2 not synchronized" -msgstr "Nivå 2 inte synkroniserad" +msgstr "õÒÏ×ÅÎØ 2 ÎÅ ÓÉÎÈÒÏÎÉÚÉÒÏ×ÁÎ" #: sysdeps/gnu/errlist.c:1125 msgid "Level 3 halted" -msgstr "Nivå 3 stannad" +msgstr "õÒÏ×ÅÎØ 3 ÏÓÔÁÎÏ×ÌÅÎ" #: sysdeps/gnu/errlist.c:1133 msgid "Level 3 reset" -msgstr "Nivå 3 omstartad" +msgstr "õÒÏ×ÅÎØ 3 ÓÂÒÏÛÅÎ" #: sysdeps/gnu/errlist.c:1141 msgid "Link number out of range" -msgstr "Länkantal utanför giltigt område" +msgstr "þÉÓÌÏ ÓÓÙÌÏË ×ÎÅ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ" #: sysdeps/gnu/errlist.c:1149 msgid "Protocol driver not attached" -msgstr "Styrprogram för protokoll inte anslutet" +msgstr "äÒÁÊ×ÅÒ ÐÒÏÔÏËÏÌÁ ÎÅ ÐÏÄÓÏÅÄÉÎÅÎ" #: sysdeps/gnu/errlist.c:1157 msgid "No CSI structure available" -msgstr "Inga CSI-strukturer tillgängliga" +msgstr "îÅÔ ÄÏÓÔÕÐÎÏÊ CSI-ÓÔÒÕËÔÕÒÙ" #: sysdeps/gnu/errlist.c:1165 msgid "Level 2 halted" -msgstr "Nivå 2 stannad" +msgstr "õÒÏ×ÅÎØ 2 ÏÓÔÁÎÏ×ÌÅÎ" #: sysdeps/gnu/errlist.c:1173 msgid "Invalid exchange" -msgstr "Ogiltig växel" +msgstr "" #: sysdeps/gnu/errlist.c:1181 msgid "Invalid request descriptor" -msgstr "Ogiltig frågedeskriptor" +msgstr "îÅ×ÅÒÎÙÊ ÄÅÓËÒÉÐÔÏÒ ÚÁÐÒÏÓÁ" #: sysdeps/gnu/errlist.c:1189 msgid "Exchange full" -msgstr "Växeln full" +msgstr "" #: sysdeps/gnu/errlist.c:1197 msgid "No anode" -msgstr "Ingen anod" +msgstr "" #: sysdeps/gnu/errlist.c:1205 msgid "Invalid request code" -msgstr "Ogiltig åtkomstkod" +msgstr "îÅ×ÅÒÎÙÊ ËÏÄ ÚÁÐÒÏÓÁ" #: sysdeps/gnu/errlist.c:1213 msgid "Invalid slot" -msgstr "Ogiltig plats" +msgstr "" #: sysdeps/gnu/errlist.c:1221 msgid "File locking deadlock error" -msgstr "Fillåsning gav dödläge" +msgstr "ïÛÉÂËÁ: ÔÕÐÉË ÐÒÉ ÂÌÏËÉÒÏ×ËÅ ÆÁÊÌÁ" #: sysdeps/gnu/errlist.c:1229 msgid "Bad font file format" -msgstr "Felaktigt format på typsnittsfil" +msgstr "îÅ×ÅÒÎÙÊ ÆÏÒÍÁÔ ÆÁÊÌÁ ÓÏ ÛÒÉÆÔÏÍ" #: sysdeps/gnu/errlist.c:1237 msgid "Machine is not on the network" -msgstr "Maskinen finns inte på nätverket" +msgstr "íÁÛÉÎÁ ÎÅ × ÓÅÔÉ" #: sysdeps/gnu/errlist.c:1245 msgid "Package not installed" -msgstr "Paketet är inte installerat" +msgstr "ðÁËÅÔ ÎÅ ÕÓÔÁÎÏ×ÌÅÎ" #: sysdeps/gnu/errlist.c:1253 msgid "Advertise error" -msgstr "Annonseringsfel" +msgstr "" #: sysdeps/gnu/errlist.c:1261 msgid "Srmount error" -msgstr "Srmount-fel" +msgstr "ïÛÉÂËÁ Srmount" #: sysdeps/gnu/errlist.c:1269 msgid "Communication error on send" -msgstr "Kommunikationsfel vid sändning" +msgstr "ïÛÉÂËÁ Ó×ÑÚÉ ÐÒÉ ÏÔÐÒÁ×ËÅ" #: sysdeps/gnu/errlist.c:1277 msgid "RFS specific error" -msgstr "RFS-specifikt fel" +msgstr "óÐÅÃÉÆÉÞÎÁÑ ÄÌÑ RFS ÏÛÉÂËÁ" #: sysdeps/gnu/errlist.c:1285 msgid "Name not unique on network" -msgstr "Namnet inte unikt i nätverket" +msgstr "éÍÑ ÎÅ ÕÎÉËÁÌØÎÏ × ÓÅÔÉ" #: sysdeps/gnu/errlist.c:1293 msgid "File descriptor in bad state" -msgstr "Filidentifierare i felaktigt tillstånd" +msgstr "äÅÓËÒÉÐÔÏÒ ÆÁÊÌÁ × ÐÌÏÈÏÍ ÓÏÓÔÏÑÎÉÉ" #: sysdeps/gnu/errlist.c:1301 msgid "Remote address changed" -msgstr "Fjärradress ändrades" +msgstr "õÄÁÌÅÎÎÙÊ ÁÄÒÅÓ ÂÙÌ ÉÚÍÅÎÅÎ" #: sysdeps/gnu/errlist.c:1309 msgid "Can not access a needed shared library" -msgstr "Kan inte komma åt ett nödvändigt delat bibliotek" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÄÏÓÔÕÐ Ë ÎÕÖÎÏÊ ÒÁÚÄÅÌÑÅÍÏÊ ÂÉÂÌÉÏÔÅËÅ" #: sysdeps/gnu/errlist.c:1317 msgid "Accessing a corrupted shared library" -msgstr "Öppnar ett korrupt delat bibliotek" +msgstr "ïÂÒÁÝÅÎÉÅ Ë ÐÏ×ÒÅÖÄÅÎÎÏÊ ÒÁÚÄÅÌÑÅÍÏÊ ÂÉÂÌÉÏÔÅËÅ" #: sysdeps/gnu/errlist.c:1325 msgid ".lib section in a.out corrupted" -msgstr ".lib-sektion i a.out korrupt" +msgstr "óÅËÃÉÑ .lib × a.out ÐÏ×ÒÅÖÄÅÎÁ" #: sysdeps/gnu/errlist.c:1333 msgid "Attempting to link in too many shared libraries" -msgstr "Försöker att länka in för många delade bibliotek" +msgstr "ðÏÐÙÔËÁ ÐÏÄËÌÀÞÉÔØ ÓÌÉÛËÏÍ ÍÎÏÇÏ ÒÁÚÄÅÌÑÅÍÙÊ ÂÉÂÌÉÏÔÅË" #: sysdeps/gnu/errlist.c:1341 msgid "Cannot exec a shared library directly" -msgstr "Kan inte köra ett delat bibliotek direkt" +msgstr "îÅ×ÏÚÍÏÖÎÏ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ ×ÙÐÏÌÎÉÔØ ÒÁÚÄÅÌÑÅÍÕÀ ÂÉÂÌÉÏÔÅËÕ" #: sysdeps/gnu/errlist.c:1349 msgid "Streams pipe error" -msgstr "Streams-rörfel" +msgstr "" #: sysdeps/gnu/errlist.c:1357 msgid "Structure needs cleaning" -msgstr "Strukturen behöver städas" +msgstr "óÔÒÕËÔÕÒÕ ÎÅÏÂÈÏÄÉÍÏ ÐÏÞÉÓÔÉÔØ" #: sysdeps/gnu/errlist.c:1365 msgid "Not a XENIX named type file" -msgstr "Inte en XENIX-namngiven fil" +msgstr "" #: sysdeps/gnu/errlist.c:1373 msgid "No XENIX semaphores available" -msgstr "Inga XENIX-semaforer tillgängliga" +msgstr "óÅÍÁÆÏÒÙ XENIX ÎÅÄÏÓÔÕÐÎÙ" #: sysdeps/gnu/errlist.c:1381 msgid "Is a named type file" -msgstr "Är av typ namnfil" +msgstr "" #: sysdeps/gnu/errlist.c:1389 msgid "Remote I/O error" -msgstr "I/O-fel på fjärrmaskin" +msgstr "ïÛÉÂËÁ ÕÄÁÌÅÎÎÏÇÏ ××ÏÄÁ/×Ù×ÏÄÁ" #: sysdeps/gnu/errlist.c:1397 msgid "No medium found" -msgstr "Inget medium funnet" +msgstr "îÏÓÉÔÅÌØ ÎÅ ÎÁÊÄÅÎ" #: sysdeps/gnu/errlist.c:1405 msgid "Wrong medium type" -msgstr "Fel typ på mediet" +msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ÔÉÐ ÎÏÓÉÔÅÌÑ" #: sysdeps/gnu/errlist.c:1413 msgid "Required key not available" -msgstr "Obligatorisk nyckel inte tillgänglig" +msgstr "ôÒÅÂÕÅÍÙÊ ËÌÀÞ ÎÅÄÏÓÔÕÐÅÎ" #: sysdeps/gnu/errlist.c:1421 msgid "Key has expired" -msgstr "Nyckeln har gått ut" +msgstr "÷ÒÅÍÑ ÖÉÚÎÉ ËÌÀÞÁ ÉÓÔÅËÌÏ" #: sysdeps/gnu/errlist.c:1429 msgid "Key has been revoked" -msgstr "Nyckeln har återkallats" +msgstr "ëÌÀÞ ÂÙÌ ÏÔÏÚ×ÁÎ" #: sysdeps/gnu/errlist.c:1437 msgid "Key was rejected by service" -msgstr "Nyckeln accepterades inte av tjänsten" +msgstr "ëÌÀÞ ÂÙÌ ÏÔ×ÅÒÇÎÕÔ ÓÌÕÖÂÏÊ" #: sysdeps/gnu/errlist.c:1445 msgid "Owner died" -msgstr "Ägaren dog" +msgstr "÷ÌÁÄÅÌÅà ÕÍÅÒ" #: sysdeps/gnu/errlist.c:1453 msgid "State not recoverable" -msgstr "Tillståndet kan inte återskapas" +msgstr "óÏÓÔÏÑÎÉÅ ÎÅÌØÚÑ ×ÏÓÓÔÁÎÏ×ÉÔØ" #: sysdeps/mach/_strerror.c:57 msgid "Error in unknown error system: " -msgstr "Fel i okänt felsystem: " +msgstr "ïÛÉÂËÁ × ÎÅÉÚ×ÅÓÔÎÏÊ ÓÉÓÔÅÍÅ ÏÛÉÂÏË: " #: sysdeps/posix/gai_strerror-strs.h:1 msgid "Address family for hostname not supported" -msgstr "Adressfamilj för värdnamn stöds ej" +msgstr "óÅÍÅÊÓÔ×Ï ÁÄÒÅÓÏ× ÎÅ ÐÏÄÄÅÒÖÉ×ÁÔÓÑ ÄÌÑ ÄÁÎÎÏÇÏ ÉÍÅÎÉ ÈÏÓÔÁ" #: sysdeps/posix/gai_strerror-strs.h:2 msgid "Temporary failure in name resolution" -msgstr "Namnuppslagning misslyckades temporärt" +msgstr "÷ÒÅÍÅÎÎÙÊ ÓÂÏÊ × ÒÁÚÒÅÛÅÎÉÉ ÉÍÅÎ" #: sysdeps/posix/gai_strerror-strs.h:3 msgid "Bad value for ai_flags" -msgstr "Otillåtet värde för ai_flags" +msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÚÎÁÞÅÎÉÅ ÄÌÑ ai_flags" #: sysdeps/posix/gai_strerror-strs.h:4 msgid "Non-recoverable failure in name resolution" -msgstr "Oreparerbart fel i namnuppslagning" +msgstr "îÅÉÓÐÒÁ×ÉÍÁÑ ÏÛÉÂËÁ × ÒÁÚÒÅÛÅÎÉÉ ÉÍÅÎ" #: sysdeps/posix/gai_strerror-strs.h:5 msgid "ai_family not supported" -msgstr "ai_family stöds ej" +msgstr "ai_family ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: sysdeps/posix/gai_strerror-strs.h:6 msgid "Memory allocation failure" -msgstr "Minnesallokeringsfel" +msgstr "ïÛÉÂËÁ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ" #: sysdeps/posix/gai_strerror-strs.h:7 msgid "No address associated with hostname" -msgstr "Ingen adress associerad med värdnamn" +msgstr "ó ÉÍÅÎÅÍ ÈÏÓÔÁ ÎÅ Ó×ÑÚÁÎÏ ÎÉ ÏÄÎÏÇÏ ÁÄÒÅÓÁ" #: sysdeps/posix/gai_strerror-strs.h:8 msgid "Name or service not known" -msgstr "Namn eller tjänst okänd" +msgstr "éÍÑ ÉÌÉ ÓÌÕÖÂÁ ÎÅ ÉÚ×ÅÓÔÎÙ" #: sysdeps/posix/gai_strerror-strs.h:9 msgid "Servname not supported for ai_socktype" -msgstr "Servname stöds inte för ai_socktype" +msgstr "Servname ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÄÌÑ ai_socktype" #: sysdeps/posix/gai_strerror-strs.h:10 msgid "ai_socktype not supported" -msgstr "ai_socktype stöds ej" +msgstr "ai_socktype ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" #: sysdeps/posix/gai_strerror-strs.h:11 msgid "System error" -msgstr "Systemfel" +msgstr "óÉÓÔÅÍÎÁÑ ÏÛÉÂËÁ" #: sysdeps/posix/gai_strerror-strs.h:12 msgid "Processing request in progress" -msgstr "Behandling av begäran pågår" +msgstr "ïÂÒÁÂÏÔËÁ ÚÁÐÒÏÓÁ ÐÒÏÄÏÌÖÁÅÔÓÑ" #: sysdeps/posix/gai_strerror-strs.h:13 msgid "Request canceled" -msgstr "Begäran avbruten" +msgstr "úÁÐÒÏÓ ÏÔÍÅÎÅÎ" #: sysdeps/posix/gai_strerror-strs.h:14 msgid "Request not canceled" -msgstr "Begäran inte avbruten" +msgstr "úÁÐÒÏÓ ÎÅ ÏÔÍÅÎÅÎ" #: sysdeps/posix/gai_strerror-strs.h:15 msgid "All requests done" -msgstr "Alla begäran utförda" +msgstr "÷ÓÅ ÚÁÐÒÏÓÙ ×ÙÐÏÌÎÅÎÙ" #: sysdeps/posix/gai_strerror-strs.h:16 msgid "Interrupted by a signal" -msgstr "Avbruten av en signal" +msgstr "ðÒÅÒ×ÁÎÏ ÐÏ ÓÉÇÎÁÌÕ" #: sysdeps/posix/gai_strerror-strs.h:17 msgid "Parameter string not correctly encoded" -msgstr "Parametersträng felaktigt kodad" +msgstr "îÅÐÒÁ×ÉÌØÎÏ ÚÁËÏÄÉÒÏ×ÁÎÁ ÓÔÒÏËÁ ÐÁÒÁÍÅÔÒÁ" #: sysdeps/unix/siglist.c:26 msgid "Signal 0" -msgstr "Signal 0" +msgstr "óÉÇÎÁÌ 0" #: sysdeps/unix/siglist.c:32 msgid "IOT trap" -msgstr "IOT-fälla" +msgstr "ìÏ×ÕÛËÁ IOT" #: sysdeps/unix/sysv/linux/i386/readelflib.c:49 #, c-format msgid "%s is for unknown machine %d.\n" -msgstr "%s är för en okänd maskin %d.\n" +msgstr "%s ÐÒÅÄÎÁÚÎÁÞÅÎ ÄÌÑ ÎÅÉÚ×ÅÓÔÎÏÊ ÍÁÛÉÎÙ %d.\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 "makecontext: kan inte hantera mer än 8 argument\n" +msgstr "makecontext: ÎÅÔ ×ÏÚÍÏÖÎÏÓÔÉ ÏÂÒÁÂÏÔÁÔØ ÂÏÌÅÅ ×ÏÓØÍÉ ÁÒÇÕÍÅÎÔÏ×\n" #: sysdeps/unix/sysv/linux/lddlibc4.c:64 #, c-format msgid "cannot open `%s'" -msgstr "kan inte öppna \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ `%s'" #: sysdeps/unix/sysv/linux/lddlibc4.c:68 #, c-format msgid "cannot read header from `%s'" -msgstr "kan inte läsa huvud från \"%s\"" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÞÉÔÁÔØ ÚÁÇÏÌÏ×ÏË ÉÚ `%s'" #: timezone/zdump.c:215 msgid "lacks alphabetic at start" -msgstr "saknar alfabetiskt tecken i början" +msgstr "×ÎÁÞÁÌÅ ÎÅÔ ÂÕË×Ù" #: timezone/zdump.c:217 msgid "has fewer than 3 alphabetics" -msgstr "har färre än 3 alfabetiska tecken" +msgstr "ÓÏÄÅÒÖÉÔ ÍÅÎÅÅ 3 ÂÕË×" #: timezone/zdump.c:219 msgid "has more than 6 alphabetics" -msgstr "har fler än 6 alfabetiska tecken" +msgstr "ÓÏÄÅÒÖÉÔ ÂÏÌÅÅ 6 ÂÕË×" #: timezone/zdump.c:227 msgid "differs from POSIX standard" -msgstr "skiljer sig från POSIX-standard" +msgstr "ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÓÔÁÎÄÁÒÔÁ POSIX" #: timezone/zdump.c:233 #, c-format msgid "%s: warning: zone \"%s\" abbreviation \"%s\" %s\n" -msgstr "%s: varning: zon \"%s\" förkortning \"%s\": %s\n" +msgstr "%s: ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ: ÚÏÎÁ \"%s\" ÓÏËÒÁÝÅÎÉÅ \"%s\" %s\n" #: timezone/zdump.c:284 #, c-format msgid "%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n" -msgstr "%s: användning är %s [ --version ] [ -v ] [ -c [startår,}slutår ] zonnamn ...\n" +msgstr "%s: ÉÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ --version ] [ -v ] [ -c [ÐÅÒ×ÙÊ-ÇÏÄ,]ÐÏÓÌÅÄÎÉÊ-ÇÏÄ ] ÉÍÑ-ÚÏÎÙ ...\n" #: timezone/zdump.c:301 #, c-format msgid "%s: wild -c argument %s\n" -msgstr "%s: flaggan -c har okänt argument %s\n" +msgstr "" #: timezone/zdump.c:392 msgid "Error writing to standard output" -msgstr "Fel vid skrivning till standard ut" +msgstr "ïÛÉÂËÁ ÚÁÐÉÓÉ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ" #: timezone/zdump.c:415 #, c-format msgid "%s: use of -v on system with floating time_t other than float or double\n" -msgstr "%s: använder -v på ett system där time_t är ett annat flyttal än \"float\" eller \"double\"\n" +msgstr "%s: ÉÓÐÏÌØÚÏ×ÁÎÉÅ -v ÎÁ ÓÉÓÔÅÍÅ, ÇÄÅ time_t ÉÍÅÅÔ ÔÉÐ Ó ÐÌÁ×ÁÀÝÅÊ ÚÁÐÑÔÏÊ, ÏÔÌÉÞÎÙÊ ÏÔ float ÉÌÉ double\n" #: timezone/zic.c:371 #, c-format msgid "%s: Memory exhausted: %s\n" -msgstr "%s: Minnet slut: %s\n" +msgstr "%s: ðÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ: %s\n" #: timezone/zic.c:430 #, c-format msgid "\"%s\", line %d: %s" -msgstr "\"%s\", rad %d: %s" +msgstr "\"%s\", ÓÔÒÏËÁ %d: %s" #: timezone/zic.c:433 #, c-format msgid " (rule from \"%s\", line %d)" -msgstr " (regel från \"%s\", rad %d)" +msgstr " (ÐÒÁ×ÉÌÏ ÉÚ \"%s\", ÓÔÒÏËÁ %d)" #: timezone/zic.c:445 msgid "warning: " -msgstr "varning: " +msgstr "ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ: " #: timezone/zic.c:455 #, c-format @@ -6183,338 +6174,338 @@ msgid "" "%s: usage is %s [ --version ] [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n" "\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n" msgstr "" -"%s: användning är %s [ --version ] [ -s ] [ -v ] [ -l lokaltid ] [ -p posixregler ] \\\n" -"\t[ -d katalog ] [ -L skottsekunder ] [ -y årkontrollprogram ] [ filnamn ... ]\n" +"%s: ÉÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ --version ] [ -s ] [ -v ] [ -l ÍÅÓÔÎÏÅ-×ÒÅÍÑ ] [ -p ÐÒÁ×ÉÌÁ-posix ] \\\n" +"\t[ -d ËÁÔÁÌÏÇ ] [ -L ×ÉÓÏËÏÓÎÙÅ-ÓÅËÕÎÄÙ ] [ -y yearistype ] [ ÉÍÑ-ÆÁÊÌÁ ... ]\n" #: timezone/zic.c:503 #, c-format msgid "%s: More than one -d option specified\n" -msgstr "%s: Flaggan -d given mer än en gång\n" +msgstr "%s: úÁÄÁÎÏ ÂÏÌÅÅ ÏÄÎÏÇÏ ËÌÀÞÁ -d\n" #: timezone/zic.c:513 #, c-format msgid "%s: More than one -l option specified\n" -msgstr "%s: Flaggan -l given mer än en gång\n" +msgstr "%s: úÁÄÁÎÏ ÂÏÌÅÅ ÏÄÎÏÇÏ ËÌÀÞÁ -l\n" #: timezone/zic.c:523 #, c-format msgid "%s: More than one -p option specified\n" -msgstr "%s: Flaggan -p given mer än en gång\n" +msgstr "%s: úÁÄÁÎÏ ÂÏÌÅÅ ÏÄÎÏÇÏ ËÌÀÞÁ -p\n" #: timezone/zic.c:533 #, c-format msgid "%s: More than one -y option specified\n" -msgstr "%s: Flaggan -y given mer än en gång\n" +msgstr "%s: úÁÄÁÎÏ ÂÏÌÅÅ ÏÄÎÏÇÏ ËÌÀÞÁ -y\n" #: timezone/zic.c:543 #, c-format msgid "%s: More than one -L option specified\n" -msgstr "%s: Flaggan -L given mer än en gång\n" +msgstr "%s: úÁÄÁÎÏ ÂÏÌÅÅ ÏÄÎÏÇÏ ËÌÀÞÁ -L\n" #: timezone/zic.c:592 msgid "link to link" -msgstr "länk till länk" +msgstr "ÓÓÙÌËÁ ÎÁ ÓÓÙÌËÕ" #: timezone/zic.c:657 msgid "hard link failed, symbolic link used" -msgstr "hård länk misslyckades, använder symbolisk länk" +msgstr "ÎÅ ÕÄÁÌÏÓØ ÓÄÅÌÁÔØ ÖÅÓÔËÕÀ ÓÓÙÌËÕ, ÉÓÐÏÌØÚÕÅÔÓÑ ÓÉÍ×ÏÌØÎÁÑ" #: timezone/zic.c:665 #, c-format msgid "%s: Can't link from %s to %s: %s\n" -msgstr "%s: Kan inte länka från %s till %s: %s\n" +msgstr "%s: îÅ×ÏÚÍÏÖÎÏ ÓÄÅÌÁÔØ ÓÓÙÌËÕ Ó %s ÎÁ %s: %s\n" #: timezone/zic.c:774 timezone/zic.c:776 msgid "same rule name in multiple files" -msgstr "samma regel i flera filer" +msgstr "ÏÄÉÎÁËÏ×ÏÅ ÉÍÑ ÐÒÁ×ÉÌÁ × ÎÅÓËÏÌØËÉÈ ÆÁÊÌÁÈ" #: timezone/zic.c:817 msgid "unruly zone" -msgstr "besvärlig zon" +msgstr "ÎÅ ÐÏÄÞÉÎÑÀÝÁÑÓÑ ÐÒÁ×ÉÌÁÍ ÚÏÎÁ" #: timezone/zic.c:824 #, c-format msgid "%s in ruleless zone" -msgstr "%s i zon utan regler" +msgstr "%s × ÚÏÎÅ ÂÅÚ ÐÒÁ×ÉÌ" #: timezone/zic.c:845 msgid "standard input" -msgstr "standard in" +msgstr "ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ" #: timezone/zic.c:850 #, c-format msgid "%s: Can't open %s: %s\n" -msgstr "%s: Kan inte öppna %s: %s\n" +msgstr "%s: îÅ×ÏÚÍÏÖÎÏ ÏÔËÒÙÔØ %s: %s\n" #: timezone/zic.c:861 msgid "line too long" -msgstr "för lång rad" +msgstr "ÓÔÒÏËÁ ÓÌÉÛËÏÍ ÄÌÉÎÎÁÑ" #: timezone/zic.c:881 msgid "input line of unknown type" -msgstr "inrad av okänd typ" +msgstr "×ÈÏÄÎÁÑ ÓÔÒÏËÁ ÎÅÉÚ×ÅÓÔÎÏÇÏ ÔÉÐÁ" #: timezone/zic.c:897 #, c-format msgid "%s: Leap line in non leap seconds file %s\n" -msgstr "%s: \"Leap\"-rad i fil %s som inte är skottsekundsfil\n" +msgstr "%s: ÷ÉÓÏËÏÓÎÁÑ ÓÔÒÏËÁ ×ÅË ÆÁÊÌÁ ×ÉÓÏËÏÓÎÙÈ ÓÅËÕÎÄ %s\n" #: timezone/zic.c:904 timezone/zic.c:1325 timezone/zic.c:1350 #, c-format msgid "%s: panic: Invalid l_value %d\n" -msgstr "%s: panik: ogiltigt l_value %d\n" +msgstr "%s: ÐÁÎÉËÁ: îÅÄÏÐÕÓÔÉÍÏÅ l_value %d\n" #: timezone/zic.c:912 #, c-format msgid "%s: Error reading %s\n" -msgstr "%s: Fel vid läsning från %s\n" +msgstr "%s: ïÛÉÂËÁ ÞÔÅÎÉÑ %s\n" #: timezone/zic.c:919 #, c-format msgid "%s: Error closing %s: %s\n" -msgstr "%s: Fel vid stängning av %s: %s\n" +msgstr "%s: ïÛÉÂËÁ ÚÁËÒÙÔÉÑ %s: %s\n" #: timezone/zic.c:924 msgid "expected continuation line not found" -msgstr "förväntad fortsättningsrad inte funnen" +msgstr "ÏÖÉÄÁÅÍÁÑ ÓÔÒÏËÁ ÐÒÏÄÏÌÖÅÎÉÑ ÎÅ ÎÁÊÄÅÎÁ" #: timezone/zic.c:968 msgid "24:00 not handled by pre-1998 versions of zic" -msgstr "24:00 hanteras inte av zic-versioner före 1998" +msgstr "24:00 ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ×ÅÒÓÉÑÍÉ zic ÓÔÁÒÛÅ 1998 ÇÏÄÁ" #: timezone/zic.c:982 msgid "wrong number of fields on Rule line" -msgstr "fel antal fält på \"Rule\"-rad" +msgstr "ÎÅÐÒÁ×ÉÌØÎÏÅ ÞÉÓÌÏ ÐÏÌÅÊ × ÓÔÒÏËÅ Rule" #: timezone/zic.c:986 msgid "nameless rule" -msgstr "namnlös regel" +msgstr "ÂÅÚÙÍÑÎÎÏÅ ÐÒÁ×ÉÌÏ" #: timezone/zic.c:991 msgid "invalid saved time" -msgstr "ogiltigt sparad tid" +msgstr "ÎÅ×ÅÒÎÏÅ ÓÏÈÒÁÎÅÎÎÏÅ ×ÒÅÍÑ" #: timezone/zic.c:1010 msgid "wrong number of fields on Zone line" -msgstr "fel antal fält på \"Zone\"-rad" +msgstr "ÎÅ×ÅÒÎÏÅ ÞÉÓÌÏ ÐÏÌÅÊ × ÓÔÒÏËÅ Zone" #: timezone/zic.c:1016 #, c-format msgid "\"Zone %s\" line and -l option are mutually exclusive" -msgstr "\"Zone %s\"-rad och flaggan -l är ömsesidigt uteslutande" +msgstr "ÓÔÒÏËÁ \"Zone %s\" É ËÌÀÞ -l ×ÚÁÉÍÎÏ ÉÓËÌÀÞÁÀÔÓÑ" #: timezone/zic.c:1024 #, c-format msgid "\"Zone %s\" line and -p option are mutually exclusive" -msgstr "\"Zone %s\"-rad och flaggan -p är ömsesidigt uteslutande" +msgstr "ÓÔÒÏËÁ \"Zone %s\" É ËÌÀÞ -p ×ÚÁÉÍÎÏ ÉÓËÌÀÞÁÀÔÓÑ" #: timezone/zic.c:1036 #, c-format msgid "duplicate zone name %s (file \"%s\", line %d)" -msgstr "dubblerat zonnamn %s (fil \"%s\", rad %d)" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÉÍÑ ÚÏÎÙ %s (ÆÁÊÌ \"%s\", ÓÔÒÏËÁ %d)" #: timezone/zic.c:1052 msgid "wrong number of fields on Zone continuation line" -msgstr "fel antal fält på \"Zone\"-fortsättningsrad" +msgstr "ÎÅÐÒÁ×ÉÌØÎÏÅ ÞÉÓÌÏ ÐÏÌÅÊ × ÓÔÒÏËÅ ÐÒÏÄÏÌÖÅÎÉÑ Zone" #: timezone/zic.c:1092 msgid "invalid UTC offset" -msgstr "ogiltigt UTC-tillägg" +msgstr "ÎÅ×ÅÒÎÏÅ ÓÍÅÝÅÎÉÅ ÏÔ UTC" #: timezone/zic.c:1095 msgid "invalid abbreviation format" -msgstr "ogiltigt förkortningsformat" +msgstr "ÎÅ×ÅÒÎÙÊ ÆÏÒÍÁÔ ÓÏËÒÁÝÅÎÉÑ" #: timezone/zic.c:1122 msgid "Zone continuation line end time is not after end time of previous line" -msgstr "Zon-fortsättningsradens sluttid är inte efter sluttiden på föregående rad" +msgstr "ËÏÎÅÞÎÏÅ ×ÒÅÍÑ × ÓÔÒÏËÅ ÐÒÏÄÏÌÖÅÎÉÑ Zone ÎÅ ÐÏÚÄÎÅÅ ËÏÎÅÞÎÏÇÏ ×ÒÅÍÅÎÉ × ÐÒÅÄÙÄÕÝÅÊ ÓÔÒÏËÅ" #: timezone/zic.c:1150 msgid "wrong number of fields on Leap line" -msgstr "fel antal fält på \"Leap\"-rad" +msgstr "ÎÅ×ÅÒÎÏÅ ÞÉÓÌÏ ÐÏÌÅÊ × ÓÔÒÏËÅ Leap" #: timezone/zic.c:1159 msgid "invalid leaping year" -msgstr "ogiltigt skottår" +msgstr "ÎÅ×ÅÒÎÙÊ ×ÉÓÏËÏÓÎÙÊ ÇÏÄ" #: timezone/zic.c:1174 timezone/zic.c:1280 msgid "invalid month name" -msgstr "ogiltigt månadsnamn" +msgstr "ÎÅ×ÅÒÎÏÅ ÎÁÚ×ÁÎÉÅ ÍÅÓÑÃÁ" #: timezone/zic.c:1187 timezone/zic.c:1402 timezone/zic.c:1416 msgid "invalid day of month" -msgstr "ogiltig dag i månaden" +msgstr "ÎÅ×ÅÒÎÙÊ ÄÅÎØ ÍÅÓÑÃÁ" #: timezone/zic.c:1192 msgid "time before zero" -msgstr "tid före noll" +msgstr "×ÒÅÍÑ ÄÏ ÎÕÌÑ" #: timezone/zic.c:1196 msgid "time too small" -msgstr "tid för kort" +msgstr "×ÒÅÍÑ ÓÌÉÛËÏÍ ÍÁÌÏ" #: timezone/zic.c:1200 msgid "time too large" -msgstr "tid för lång" +msgstr "×ÒÅÍÑ ÓÌÉÛËÏÍ ×ÅÌÉËÏ" #: timezone/zic.c:1204 timezone/zic.c:1309 msgid "invalid time of day" -msgstr "ogiltig tid på dagen" +msgstr "ÎÅ×ÅÒÎÏÅ ×ÒÅÍÑ ÄÎÑ" #: timezone/zic.c:1223 msgid "illegal CORRECTION field on Leap line" -msgstr "otillåtet \"CORRECTION\"-fält på \"Leap\"-rad" +msgstr "ÎÅ×ÅÒÎÏÅ ÐÏÌÅ CORRECTION × ÓÔÒÏËÅ Leap" #: timezone/zic.c:1228 msgid "illegal Rolling/Stationary field on Leap line" -msgstr "otillåtet \"Rolling/Stationary\"-fält på \"Leap\"-rad" +msgstr "ÎÅ×ÅÒÎÏÅ ÐÏÌÅ Rolling/Stationary × ÓÔÒÏËÅ Leap" #: timezone/zic.c:1244 msgid "wrong number of fields on Link line" -msgstr "fel antal fält på \"Link\"-rad" +msgstr "ÎÅ×ÅÒÎÏÅ ÞÉÓÌÏ ÐÏÌÅÊ × ÓÔÒÏËÅ Link" #: timezone/zic.c:1248 msgid "blank FROM field on Link line" -msgstr "tomt \"FROM\"-fält på \"Link\"-rad" +msgstr "ÐÕÓÔÏÅ ÐÏÌÅ FROM × ÓÔÒÏËÅ Link" #: timezone/zic.c:1252 msgid "blank TO field on Link line" -msgstr "tomt \"TO\"-fält på \"Link\"-rad" +msgstr "ÐÕÓÔÏÅ ÐÏÌÅ TO × ÓÔÒÏËÅ Link" #: timezone/zic.c:1329 msgid "invalid starting year" -msgstr "ogiltigt startår" +msgstr "ÎÅ×ÅÒÎÙÊ ÎÁÞÁÌØÎÙÊ ÇÏÄ" #: timezone/zic.c:1333 msgid "starting year too low to be represented" -msgstr "startår för litet för att kunna representeras" +msgstr "ÎÁÞÁÌØÎÙÊ ÇÏÄ ÓÌÉÛËÏÍ ÍÁÌ É ÅÇÏ ÎÅ×ÏÚÍÏÖÎÏ ÍÁÛÉÎÎÏ ÐÒÅÄÓÔÁ×ÉÔØ" #: timezone/zic.c:1335 msgid "starting year too high to be represented" -msgstr "startår för stort för att kunna representeras" +msgstr "ÎÁÞÁÌØÎÙÊ ÇÏÄ ÓÌÉÛËÏÍ ×ÅÌÉË É ÅÇÏ ÎÅ×ÏÚÍÏÖÎÏ ÍÁÛÉÎÎÏ ÐÒÅÄÓÔÁ×ÉÔØ" #: timezone/zic.c:1354 msgid "invalid ending year" -msgstr "ogiltigt slutår" +msgstr "ÎÅ×ÅÒÎÙÊ ËÏÎÅÞÎÙÊ ÇÏÄ" #: timezone/zic.c:1358 msgid "ending year too low to be represented" -msgstr "slutår för litet för att kunna representeras" +msgstr "ËÏÎÅÞÎÙÊ ÇÏÄ ÓÌÉÛËÏÍ ÍÁÌ É ÅÇÏ ÎÅ×ÏÚÍÏÖÎÏ ÍÁÛÉÎÎÏ ÐÒÅÄÓÔÁ×ÉÔØ" #: timezone/zic.c:1360 msgid "ending year too high to be represented" -msgstr "slutår för stort för att kunna representeras" +msgstr "ËÏÎÅÞÎÙÊ ÇÏÄ ÓÌÉÛËÏÍ ×ÅÌÉË É ÅÇÏ ÎÅ×ÏÚÍÏÖÎÏ ÍÁÛÉÎÎÏ ÐÒÅÄÓÔÁ×ÉÔØ" #: timezone/zic.c:1363 msgid "starting year greater than ending year" -msgstr "startår är större än slutår" +msgstr "ÎÁÞÁÌØÎÙÊ ÇÏÄ ÂÏÌØÛÅ ËÏÎÅÞÎÏÇÏ" #: timezone/zic.c:1370 msgid "typed single year" -msgstr "satte typ på endast ett år" +msgstr "ÏÄÉÎ ÔÉÐÉÚÉÒÏ×ÁÎÎÙÊ ÇÏÄ" #: timezone/zic.c:1407 msgid "invalid weekday name" -msgstr "ogiltigt veckodagsnamn" +msgstr "ÎÅ×ÅÒÎÏÅ ÎÁÚ×ÁÎÉÑ ÄÎÑ ÎÅÄÅÌÉ" #: timezone/zic.c:1521 #, c-format msgid "%s: Can't remove %s: %s\n" -msgstr "%s: Kan inte ta bort %s: %s\n" +msgstr "%s: îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ %s: %s\n" #: timezone/zic.c:1531 #, c-format msgid "%s: Can't create %s: %s\n" -msgstr "%s: Kan inte skapa %s: %s\n" +msgstr "%s: îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ %s: %s\n" #: timezone/zic.c:1598 #, c-format msgid "%s: Error writing %s\n" -msgstr "%s: Fel vid skrivning till %s\n" +msgstr "%s: ïÛÉÂËÁ ÚÁÐÉÓÉ %s\n" #: timezone/zic.c:1789 msgid "can't determine time zone abbreviation to use just after until time" -msgstr "kan inte avgöra tidszonsförkortning att använda just efter \"until\"-tid" +msgstr "" #: timezone/zic.c:1832 msgid "too many transitions?!" -msgstr "för många övergångar?!" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÐÅÒÅÈÏÄÏ×?!" #: timezone/zic.c:1851 msgid "internal error - addtype called with bad isdst" -msgstr "internt fel - addtype anropad med felaktig isdst" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ -- addtype ×ÙÚ×ÁÎÁ Ó ÎÅÐÒÁ×ÉÌØÎÙÍ isdst" #: timezone/zic.c:1855 msgid "internal error - addtype called with bad ttisstd" -msgstr "internt fel - addtype anropad med felaktig ttisstd" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ -- addtype ×ÙÚ×ÁÎÁ Ó ÎÅÐÒÁ×ÉÌØÎÙÍ ttisstd" #: timezone/zic.c:1859 msgid "internal error - addtype called with bad ttisgmt" -msgstr "internt fel - addtype anropad med felaktig ttisgmt" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ -- addtype ×ÙÚ×ÁÎÁ Ó ÎÅÐÒÁ×ÉÌØÎÙÍ ttisgmt" #: timezone/zic.c:1878 msgid "too many local time types" -msgstr "för många lokala tidstyper" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÔÉÐÏ× ÍÅÓÔÎÏÇÏ ×ÒÅÍÅÎÉ" #: timezone/zic.c:1906 msgid "too many leap seconds" -msgstr "för många skottsekunder" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ×ÉÓÏËÏÓÎÙÈ ÓÅËÕÎÄ" #: timezone/zic.c:1912 msgid "repeated leap second moment" -msgstr "upprepat skottsekundstillfälle" +msgstr "ÐÏ×ÔÏÒÑÀÝÉÊÓÑ ÍÏÍÅÎÔ ×ÉÓÏËÏÓÎÏÊ ÓÅËÕÎÄÙ" #: timezone/zic.c:1964 msgid "Wild result from command execution" -msgstr "Vilt resultat från kommandokörning" +msgstr "îÅÁÄÅË×ÁÔÎÙÊ ÒÅÚÕÌØÔÁÔ ×ÙÐÏÌÎÅÎÉÑ ËÏÍÁÎÄÙ" #: timezone/zic.c:1965 #, c-format msgid "%s: command was '%s', result was %d\n" -msgstr "%s: kommandot var \"%s\", resultatet blev %d\n" +msgstr "%s: ËÏÍÁÎÄÁ ÂÙÌÁ '%s', ÒÅÚÕÌØÔÁÔ ÂÙÌ %d\n" #: timezone/zic.c:2062 msgid "Odd number of quotation marks" -msgstr "Ojämnt antal citationstecken" +msgstr "îÅÞÅÔÎÏÅ ÞÉÓÌÏ ËÁ×ÙÞÅË" #: timezone/zic.c:2083 timezone/zic.c:2102 msgid "time overflow" -msgstr "för stort tidsvärde" +msgstr "ÐÅÒÅÐÏÌÎÅÎÉÅ ×ÒÅÍÅÎÉ" #: timezone/zic.c:2149 msgid "use of 2/29 in non leap-year" -msgstr "använder 29/2 i icke-skottår" +msgstr "ÉÓÐÏÌØÚÏ×ÁÎÉÅ 29 ÆÅ×ÒÁÌÑ × ÎÅ×ÉÓÏËÏÓÎÏÍ ÇÏÄÕ" #: timezone/zic.c:2184 msgid "rule goes past start/end of month--will not work with pre-2004 versions of zic" -msgstr "regeln går utanför start/slut på månad, fungerar inte på zic-versioner före 2004" +msgstr "ÐÒÁ×ÉÌÏ ÐÅÒÅÈÏÄÉÔ ÚÁ ÎÁÞÁÌÏ/ËÏÎÅà ÍÅÓÑÃÁ -- ÜÔÏ ÎÅ ÂÕÄÅÔ ÒÁÂÏÔÁÔØ × ×ÅÒÓÉÑÈ zic ÓÔÁÒÛÅ 2004 ÇÏÄÁ" #: timezone/zic.c:2218 msgid "time zone abbreviation lacks alphabetic at start" -msgstr "tidszonsförkortning saknar alfabetiskt tecken i början" +msgstr "ÓÏËÒÁÝÅÎÉÅ ÞÁÓÏ×ÏÇÏ ÐÏÑÓÁ ÎÅ ÎÁÞÉÎÁÅÔÓÑ Ó ÂÕË×Ù" #: timezone/zic.c:2220 msgid "time zone abbreviation has more than 3 alphabetics" -msgstr "tidszonsförkortning har fler än 3 alafabetiska tecken" +msgstr "ÓÏËÒÁÝÅÎÉÅ ÞÁÓÏ×ÏÇÏ ÐÏÑÓÁ ÓÏÄÅÒÖÉÔ ÂÏÌÅÅ ÔÒÅÈ ÂÕË×" #: timezone/zic.c:2222 msgid "time zone abbreviation has too many alphabetics" -msgstr "tidszonsförkortning har för många alabetiska tecken" +msgstr "ÓÏËÒÁÝÅÎÉÅ ÞÁÓÏ×ÏÇÏ ÐÏÑÓÁ ÓÏÄÅÒÖÉÔ ÓÌÉÛËÏÍ ÍÎÏÇÏ ÂÕË×" #: timezone/zic.c:2232 msgid "time zone abbreviation differs from POSIX standard" -msgstr "tidszonsförkortning skiljer sig från POSIX-standarden" +msgstr "ÓÏËÒÁÝÅÎÉÅ ÞÁÓÏ×ÏÇÏ ÐÏÑÓÁ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÓÔÁÎÄÁÒÔÁ POSIX" #: timezone/zic.c:2244 msgid "too many, or too long, time zone abbreviations" -msgstr "för många eller för långa tidszonförkortningar" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÓÏËÒÁÝÅÎÉÊ ÞÁÓÏ×ÙÈ ÐÏÑÓÏ× ÉÌÉ ÏÎÉ ÓÌÉÛËÏÍ ÄÌÉÎÎÙÅ" #: timezone/zic.c:2285 #, c-format msgid "%s: Can't create directory %s: %s\n" -msgstr "%s: Kan inte skapa katalog %s: %s\n" +msgstr "%s: îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ %s: %s\n" #: timezone/zic.c:2307 #, c-format msgid "%s: %d did not sign extend correctly\n" -msgstr "%s: %d teckenexpanderades inte korrekt\n" +msgstr "%s: %d ÎÅ ÓÏÈÒÁÎÉÌÏ ÚÎÁË ÐÒÉ ÒÁÓÛÉÒÅÎÉÉ\n" diff --git a/po/sv.po b/po/sv.po index 6aeb308fe5..07d28095b9 100644 --- a/po/sv.po +++ b/po/sv.po @@ -1,13 +1,13 @@ # GNU libc message catalog for swedish # Copyright © 1996, 1998, 2001, 2002, 2003, 2006 Free Software Foundation, Inc. # Jan Djärv , 1996, 1998, 2001, 2002, 2003, 2006. -# Revision: 1.52 +# Revision: 1.54 # msgid "" msgstr "" "Project-Id-Version: libc 2.5\n" "POT-Creation-Date: 2006-09-29 11:38-0700\n" -"PO-Revision-Date: 2006-11-09 13:51+0100\n" +"PO-Revision-Date: 2006-12-30 18:53+0100\n" "Last-Translator: Jan Djärv \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" @@ -1407,7 +1407,7 @@ msgstr "misslyckades ta status (fstat)" #: inet/rcmd.c:492 msgid "bad owner" -msgstr "olämplig ägare" +msgstr "felaktig ägare" #: inet/rcmd.c:494 msgid "writeable by other than owner" @@ -1451,7 +1451,7 @@ msgstr "teckenuppsättningsfil \"%s\" finns inte" #: locale/programs/charmap.c:194 #, c-format msgid "default character map file `%s' not found" -msgstr "standardteckenuppsättningsfil \"%s\" inte hittad" +msgstr "standardteckenuppsättningsfil \"%s\" finns inte" #: locale/programs/charmap.c:257 #, c-format @@ -1540,7 +1540,7 @@ msgstr "definition av \"%1$s\" slutar inte med \"END %1$s\"" #: locale/programs/charmap.c:642 msgid "only WIDTH definitions are allowed to follow the CHARMAP definition" -msgstr "endast definition av \"WIDTH\" får följa definitionen av \"CHARMAP\"" +msgstr "endast definition av \"WIDTH\" får komma efter definitionen av \"CHARMAP\"" #: locale/programs/charmap.c:650 locale/programs/charmap.c:713 #, c-format @@ -1630,7 +1630,7 @@ msgstr "%s: fält \"%s\" är inte definierat" #: locale/programs/ld-name.c:116 locale/programs/ld-telephone.c:116 #, c-format msgid "%s: field `%s' must not be empty" -msgstr "%s: fält \"%s\" kan inte vara tomt" +msgstr "%s: fält \"%s\" får inte vara tomt" #: locale/programs/ld-address.c:167 #, c-format @@ -1640,7 +1640,7 @@ msgstr "%s: ogiltig kontrollsekvens \"%%%c\" i fält \"%s\" " #: locale/programs/ld-address.c:218 #, c-format msgid "%s: terminology language code `%s' not defined" -msgstr "%s: terminologilandskod \"%s\" inte definierad" +msgstr "%s: terminologispråkkod \"%s\" inte definierad" #: locale/programs/ld-address.c:243 #, c-format @@ -1800,12 +1800,12 @@ msgstr "%s: bytesekvens för första tecknet är inte mindre än den för sista #: locale/programs/ld-collate.c:1273 #, c-format msgid "%s: symbolic range ellipsis must not directly follow `order_start'" -msgstr "%s: symboliskt intervall kan inte vara omedelbart efter \"order_start\"" +msgstr "%s: symboliskt intervall får inte vara omedelbart efter \"order_start\"" #: locale/programs/ld-collate.c:1277 #, c-format msgid "%s: symbolic range ellipsis must not be directly followed by `order_end'" -msgstr "%s: symboliskt intervall kan inte omedelbart följas av \"order_end\"" +msgstr "%s: symboliskt intervall får inte omedelbart följas av \"order_end\"" #: locale/programs/ld-collate.c:1297 locale/programs/ld-ctype.c:1475 #, c-format @@ -2119,7 +2119,7 @@ msgstr "%s: dubbla definitioner av \"default_missing\"" #: locale/programs/ld-ctype.c:2863 msgid "previous definition was here" -msgstr "föregående definition var här" +msgstr "här var föregående definition" #: locale/programs/ld-ctype.c:2885 #, c-format @@ -2354,7 +2354,7 @@ msgstr "avslutande skräp vid radslutet" #: locale/programs/linereader.c:297 msgid "garbage at end of number" -msgstr "skräp i slutet av nummer" +msgstr "skräp i slutet av tal" #: locale/programs/linereader.c:409 msgid "garbage at end of character code specification" @@ -2567,9 +2567,9 @@ msgid "" " locale path : %s\n" "%s" msgstr "" -"Systemets kataloger för teckentabeller: %s\n" -" repertoartabeller: %s\n" -" lokal-sökväg : %s\n" +"Systemets kataloger för teckentabeller : %s\n" +" repertoartabeller: %s\n" +" lokal-sökväg : %s\n" "%s" #: locale/programs/localedef.c:566 @@ -2673,7 +2673,7 @@ msgstr "kan inte lägga till till lokalarkiv" #: locale/programs/locarchive.c:977 #, c-format msgid "locale alias file `%s' not found" -msgstr "fil \"%s\" för lokalalias hittas inte" +msgstr "fil \"%s\" för lokalalias finns inte" #: locale/programs/locarchive.c:1121 #, c-format @@ -2717,7 +2717,7 @@ msgstr "argumentet till \"%s\" måste vara ett enskilt tecken" #: locale/programs/locfile.c:251 msgid "syntax error: not inside a locale definition section" -msgstr "syntaxfel: inte inne i en lokaldefinition" +msgstr "syntaxfel: inte inne i en lokalsektion" #: locale/programs/locfile.c:625 #, c-format @@ -2764,7 +2764,7 @@ msgstr "kan inte spara ny repertoartabell" #: locale/programs/repertoire.c:342 #, c-format msgid "repertoire map file `%s' not found" -msgstr "hittar inte repertoartabell \"%s\"" +msgstr "hittar inte repertoarfiltabell \"%s\"" #: locale/programs/repertoire.c:449 #, c-format @@ -2859,7 +2859,7 @@ msgid "" "For bug reporting instructions, please see:\n" "." msgstr "" -"UsageAnvändning: memusage [FLAGGA]... PROGRAM [PROGRAMFLAGGA]...\n" +"Användning: memusage [FLAGGA]... PROGRAM [PROGRAMFLAGGA]...\n" "Spåra minnesanvändning för PROGRAM.\n" "\n" " -n,--progname=NAMN Namn på program att spåra\n" @@ -2922,7 +2922,7 @@ msgstr "Titelsträng att använda i resultatgrafiken" #: malloc/memusagestat.c:55 msgid "Generate output linear to time (default is linear to number of function calls)" -msgstr "Generera utdata linjär i tiden (standardvärde är linjär mot anta funktionsanrop)" +msgstr "Generera utdata linjär i tiden (standardvärde är linjär mot antal funktionsanrop)" #: malloc/memusagestat.c:57 msgid "Also draw graph for total memory consumption" @@ -2930,11 +2930,11 @@ msgstr "Visa också en graf av totala minnesåtgången" #: malloc/memusagestat.c:58 msgid "make output graphic VALUE pixel wide" -msgstr "gör resultatgrafiken VALUE pixlar bred" +msgstr "gör resultatgrafiken ANTAL pixlar bred" #: malloc/memusagestat.c:59 msgid "make output graphic VALUE pixel high" -msgstr "gör resultatgrafiken VALUE pixlar hög" +msgstr "gör resultatgrafiken ANTAL pixlar hög" #: malloc/memusagestat.c:64 msgid "Generate graphic from memory profiling data" @@ -3016,7 +3016,7 @@ msgstr "Objekt med samma namn existerar" #: nis/nis_error.h:16 msgid "Not master server for this domain" -msgstr "Ingen huvudserver för denna domän" +msgstr "Inte huvudserver för denna domän" #: nis/nis_error.h:17 msgid "Invalid object for operation" @@ -3207,7 +3207,7 @@ msgstr "Huvudserver:\n" #: nis/nis_print.c:175 msgid "Replicate :\n" -msgstr "Replikerad:\n" +msgstr "Replikera:\n" #: nis/nis_print.c:176 #, c-format @@ -3404,7 +3404,7 @@ msgstr "Antal objekt : %u\n" #: nis/nis_print.c:377 #, c-format msgid "Object #%d:\n" -msgstr "Objekt #%d:\n" +msgstr "Objekt nr %d:\n" #: nis/nis_print_group_entry.c:117 #, c-format @@ -3437,7 +3437,7 @@ msgstr " Inga rekursiva medlemmar\n" #: nis/nis_print_group_entry.c:149 nis/nis_print_group_entry.c:165 msgid " Explicit nonmembers:\n" -msgstr " Explicit icke-medlemmar:\n" +msgstr " Explicita icke-medlemmar:\n" #: nis/nis_print_group_entry.c:154 msgid " No explicit nonmembers\n" @@ -3609,7 +3609,7 @@ msgstr "beskär %s cache; tid %ld" #: nscd/cache.c:289 #, c-format msgid "considering %s entry \"%s\", timeout %" -msgstr "överväger %s post \"%s\", tidsgräns %" +msgstr "överväger %s-post \"%s\", tidsgräns %" #: nscd/connections.c:469 nscd/connections.c:481 nscd/connections.c:493 #: nscd/connections.c:512 @@ -3692,7 +3692,7 @@ msgstr "ge åtkomst till FD %d, för %s" #: nscd/connections.c:904 #, c-format msgid "cannot handle old request version %d; current version is %d" -msgstr "Kan inte hantera äldre förfrågansversion %d, nuvarande version är %d" +msgstr "kan inte hantera äldre förfrågansversion %d, nuvarande version är %d" #: nscd/connections.c:954 nscd/connections.c:1007 #, c-format @@ -3851,7 +3851,7 @@ msgstr "Invalidera den angivna cachen" #: nscd/nscd.c:105 msgid "TABLE,yes" -msgstr "TABELL,yes" +msgstr "TABELL,ja" #: nscd/nscd.c:106 msgid "Use separate cache for each user" @@ -5073,7 +5073,7 @@ msgstr "Avbruten (SIGABRT)" #: sysdeps/generic/siglist.h:35 sysdeps/unix/siglist.c:34 msgid "Floating point exception" -msgstr "Aritmetiskt fel" +msgstr "Flyttalsfel" #: sysdeps/generic/siglist.h:36 sysdeps/unix/siglist.c:35 msgid "Killed" @@ -5359,7 +5359,7 @@ msgstr "Kodfil upptagen" #. TRANS File too big; the size of a file would be larger than allowed by the system. #: sysdeps/gnu/errlist.c:307 msgid "File too large" -msgstr "Fil för stor" +msgstr "För stor fil" #. TRANS No space left on device; write operation on a file failed because the #. TRANS disk is full. @@ -5514,7 +5514,7 @@ msgstr "Adressfamiljen stöds inte av protokollet" #. TRANS The requested socket address is already in use. @xref{Socket Addresses}. #: sysdeps/gnu/errlist.c:555 msgid "Address already in use" -msgstr "Adressen upptagen" +msgstr "Adressen redan upptagen" #. 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. @@ -5577,7 +5577,7 @@ msgstr "Transportslutpunkten är inte förbunden" #. TRANS without first specifying a destination for the data with @code{connect}. #: sysdeps/gnu/errlist.c:658 msgid "Destination address required" -msgstr "Destination krävs" +msgstr "Destinationsadress krävs" #. TRANS The socket has already been shut down. #: sysdeps/gnu/errlist.c:667 @@ -5612,7 +5612,7 @@ msgstr "För många nivåer av symboliska länkar" #. TRANS @code{sethostname}; @pxref{Host Identification}). #: sysdeps/gnu/errlist.c:717 msgid "File name too long" -msgstr "Filnamn för långt" +msgstr "För långt filnamn" #. TRANS The remote host for a requested network connection is down. #: sysdeps/gnu/errlist.c:726 @@ -6147,7 +6147,7 @@ msgstr "%s: användning är %s [ --version ] [ -v ] [ -c [startår,}slutår ] zo #: timezone/zdump.c:301 #, c-format msgid "%s: wild -c argument %s\n" -msgstr "%s: flaggan -c har okänt argument %s\n" +msgstr "%s: argument \"%s\" till flaggan -c har fel format\n" #: timezone/zdump.c:392 msgid "Error writing to standard output" @@ -6226,7 +6226,7 @@ msgstr "%s: Kan inte länka från %s till %s: %s\n" #: timezone/zic.c:774 timezone/zic.c:776 msgid "same rule name in multiple files" -msgstr "samma regel i flera filer" +msgstr "samma regelnamn i flera filer" #: timezone/zic.c:817 msgid "unruly zone" @@ -6262,7 +6262,7 @@ msgstr "%s: \"Leap\"-rad i fil %s som inte är skottsekundsfil\n" #: timezone/zic.c:904 timezone/zic.c:1325 timezone/zic.c:1350 #, c-format msgid "%s: panic: Invalid l_value %d\n" -msgstr "%s: panik: ogiltigt l_value %d\n" +msgstr "%s: panik: Ogiltigt l_value %d\n" #: timezone/zic.c:912 #, c-format @@ -6292,7 +6292,7 @@ msgstr "namnlös regel" #: timezone/zic.c:991 msgid "invalid saved time" -msgstr "ogiltigt sparad tid" +msgstr "ogiltig sparad tid" #: timezone/zic.c:1010 msgid "wrong number of fields on Zone line" diff --git a/posix/Makefile b/posix/Makefile index 712e7c2069..d17e976e3c 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -81,7 +81,8 @@ tests := tstgetopt testfnm runtests runptests \ bug-regex13 bug-regex14 bug-regex15 bug-regex16 \ bug-regex17 bug-regex18 bug-regex19 bug-regex20 \ bug-regex21 bug-regex22 bug-regex23 bug-regex24 \ - bug-regex25 bug-regex26 tst-nice tst-nanosleep tst-regex2 \ + bug-regex25 bug-regex26 bug-regex27 bug-regex28 \ + tst-nice tst-nanosleep tst-regex2 \ transbug tst-rxspencer tst-pcre tst-boost \ bug-ga1 tst-vfork1 tst-vfork2 tst-vfork3 tst-waitid \ tst-getaddrinfo2 bug-glob1 bug-glob2 tst-sysconf \ diff --git a/posix/bug-regex27.c b/posix/bug-regex27.c new file mode 100644 index 0000000000..327acd8684 --- /dev/null +++ b/posix/bug-regex27.c @@ -0,0 +1,64 @@ +/* Test REG_NEWLINE. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2007. + + 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 + +struct tests +{ + const char *regex; + const char *string; + int cflags; + int retval; +} tests[] = { + { "a.b", "a\nb", REG_EXTENDED | REG_NEWLINE, REG_NOMATCH }, + { "a.b", "a\nb", REG_EXTENDED, 0 }, + { "a[^x]b", "a\nb", REG_EXTENDED | REG_NEWLINE, REG_NOMATCH }, + { "a[^x]b", "a\nb", REG_EXTENDED, 0 } +}; + +int +main (void) +{ + regex_t r; + size_t i; + int ret = 0; + + for (i = 0; i < sizeof (tests) / sizeof (tests[i]); ++i) + { + memset (&r, 0, sizeof (r)); + if (regcomp (&r, tests[i].regex, tests[i].cflags)) + { + printf ("regcomp %zd failed\n", i); + ret = 1; + continue; + } + int rv = regexec (&r, tests[i].string, 0, NULL, 0); + if (rv != tests[i].retval) + { + printf ("regexec %zd unexpected value %d != %d\n", + i, rv, tests[i].retval); + ret = 1; + } + regfree (&r); + } + return ret; +} diff --git a/posix/bug-regex28.c b/posix/bug-regex28.c new file mode 100644 index 0000000000..e58a08fabe --- /dev/null +++ b/posix/bug-regex28.c @@ -0,0 +1,75 @@ +/* Test RE_HAT_LISTS_NOT_NEWLINE and RE_DOT_NEWLINE. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2007. + + 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 + +struct tests +{ + const char *regex; + const char *string; + reg_syntax_t syntax; + int retval; +} tests[] = { +#define EGREP RE_SYNTAX_EGREP +#define EGREP_NL (RE_SYNTAX_EGREP | RE_DOT_NEWLINE) & ~RE_HAT_LISTS_NOT_NEWLINE + { "a.b", "a\nb", EGREP, -1 }, + { "a.b", "a\nb", EGREP_NL, 0 }, + { "a[^x]b", "a\nb", EGREP, -1 }, + { "a[^x]b", "a\nb", EGREP_NL, 0 }, + /* While \S and \W are internally handled as [^[:space:]] and [^[:alnum:]_], + RE_HAT_LISTS_NOT_NEWLINE did not make any difference, so ensure + it doesn't change. */ + { "a\\Sb", "a\nb", EGREP, -1 }, + { "a\\Sb", "a\nb", EGREP_NL, -1 }, + { "a\\Wb", "a\nb", EGREP, 0 }, + { "a\\Wb", "a\nb", EGREP_NL, 0 } +}; + +int +main (void) +{ + struct re_pattern_buffer r; + size_t i; + int ret = 0; + + for (i = 0; i < sizeof (tests) / sizeof (tests[i]); ++i) + { + re_set_syntax (tests[i].syntax); + memset (&r, 0, sizeof (r)); + if (re_compile_pattern (tests[i].regex, strlen (tests[i].regex), &r)) + { + printf ("re_compile_pattern %zd failed\n", i); + ret = 1; + continue; + } + size_t len = strlen (tests[i].string); + int rv = re_search (&r, tests[i].string, len, 0, len, NULL); + if (rv != tests[i].retval) + { + printf ("re_search %zd unexpected value %d != %d\n", + i, rv, tests[i].retval); + ret = 1; + } + regfree (&r); + } + return ret; +} diff --git a/posix/getconf.c b/posix/getconf.c index c7a9d57628..3c5ffe454c 100644 --- a/posix/getconf.c +++ b/posix/getconf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 1995-2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 1995-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify @@ -1008,7 +1008,7 @@ main (int argc, char *argv[]) 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\ -"), "2007"); +"), "2006"); fprintf (stderr, gettext ("Written by %s.\n"), "Roland McGrath"); return 0; } diff --git a/posix/regcomp.c b/posix/regcomp.c index 78a1218cf8..e99fd74924 100644 --- a/posix/regcomp.c +++ b/posix/regcomp.c @@ -1,5 +1,5 @@ /* Extended regular expression matching and search library. - Copyright (C) 2002,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Isamu Hasegawa . @@ -3019,7 +3019,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, #endif /* not RE_ENABLE_I18N */ non_match = 1; if (syntax & RE_HAT_LISTS_NOT_NEWLINE) - bitset_set (sbcset, '\0'); + bitset_set (sbcset, '\n'); re_string_skip_bytes (regexp, token_len); /* Skip a token. */ token_len = peek_token_bracket (token, regexp, syntax); if (BE (token->type == END_OF_RE, 0)) @@ -3549,10 +3549,6 @@ build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans, if (non_match) { #ifdef RE_ENABLE_I18N - /* - if (syntax & RE_HAT_LISTS_NOT_NEWLINE) - bitset_set(cset->sbcset, '\0'); - */ mbcset->non_match = 1; #endif /* not RE_ENABLE_I18N */ } diff --git a/posix/unistd.h b/posix/unistd.h index c74190dfc3..4e1e9dfaa2 100644 --- a/posix/unistd.h +++ b/posix/unistd.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2002,2003,2004,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1991-2006, 2007 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 +56,9 @@ __BEGIN_DECLS #define _POSIX2_LOCALEDEF 200112L /* X/Open version number to which the library conforms. It is selectable. */ -#ifdef __USE_UNIX98 +#ifdef __USE_XOPEN2K +# define _XOPEN_VERSION 600 +#elif defined __USE_UNIX98 # define _XOPEN_VERSION 500 #else # define _XOPEN_VERSION 4 @@ -559,7 +561,7 @@ extern long int pathconf (__const char *__path, int __name) extern long int fpathconf (int __fd, int __name) __THROW; /* Get the value of the system variable NAME. */ -extern long int sysconf (int __name) __THROW; +extern long int sysconf (int __name) __THROW __attribute__ ((__const__)); #ifdef __USE_POSIX2 /* Get the value of the string-valued system variable NAME. */ @@ -1060,7 +1062,7 @@ extern int lockf64 (int __fd, int __cmd, __off64_t __len) __wur; #if defined __USE_POSIX199309 || defined __USE_UNIX98 /* Synchronize at least the data part of a file with the underlying media. */ -extern int fdatasync (int __fildes) __THROW; +extern int fdatasync (int __fildes); #endif /* Use POSIX199309 */ diff --git a/posix/wordexp.c b/posix/wordexp.c index 765d14d81f..adece95ef8 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -1809,7 +1809,7 @@ envsubst: /* Substitute parameter */ break; - if (free_value) + if (free_value && value) free (value); if (!colon_seen && value) @@ -1827,7 +1827,7 @@ envsubst: case ACT_NONNULL_SUBST: if (value && (*value || !colon_seen)) { - if (free_value) + if (free_value && value) free (value); value = pattern ? __strdup (pattern) : pattern; diff --git a/resolv/Makefile b/resolv/Makefile index f6230da8fb..6ac226735a 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1994,1995,1996,1997,1998,1999,2000,2001,2003,2004 +# Copyright (C) 1994,1995,1996,1997,1998,1999,2000,2001,2003,2004,2007 # Free Software Foundation, Inc. # This file is part of the GNU C Library. @@ -32,7 +32,7 @@ distribute := ../conf/portability.h mapv4v6addr.h mapv4v6hostent.h \ routines := herror inet_addr inet_ntop inet_pton nsap_addr res_init \ res_hconf res_libc res-state -tests = tst-aton tst-leaks +tests = tst-aton tst-leaks tst-inet_ntop xtests = tst-leaks2 generate := mtrace-tst-leaks tst-leaks.mtrace tst-leaks2.mtrace diff --git a/resolv/Versions b/resolv/Versions index 5a350cae36..7016365be5 100644 --- a/resolv/Versions +++ b/resolv/Versions @@ -2,7 +2,7 @@ libc { GLIBC_2.0 { -%if !HAVE___THREAD +%if !(USE_TLS && HAVE___THREAD) # global variables _h_errno; %endif @@ -17,7 +17,7 @@ libc { # variables in normal name space h_errlist; h_nerr; -%if !HAVE___THREAD +%if !(USE_TLS && HAVE___THREAD) h_errno; %endif @@ -34,7 +34,7 @@ libc { GLIBC_PRIVATE { __gai_sigqueue; -%if HAVE___THREAD +%if USE_TLS && HAVE___THREAD # This version is for the TLS symbol, GLIBC_2.0 is the old object symbol. h_errno; __resp; %endif diff --git a/resolv/arpa/nameser.h b/resolv/arpa/nameser.h index f6330a8979..496c8dbe85 100644 --- a/resolv/arpa/nameser.h +++ b/resolv/arpa/nameser.h @@ -287,7 +287,7 @@ typedef enum __ns_type { ns_t_naptr = 35, /* Naming Authority PoinTeR */ ns_t_kx = 36, /* Key Exchange */ ns_t_cert = 37, /* Certification record */ - ns_t_a6 = 38, /* IPv6 address (deprecated, use ns_t_aaaa) */ + ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ ns_t_sink = 40, /* Kitchen sink (experimentatl) */ ns_t_opt = 41, /* EDNS0 option (meta-RR) */ diff --git a/resolv/inet_ntop.c b/resolv/inet_ntop.c index e5553a1d3b..1222d08bda 100644 --- a/resolv/inet_ntop.c +++ b/resolv/inet_ntop.c @@ -96,7 +96,7 @@ inet_ntop4(src, dst, size) static const char fmt[] = "%u.%u.%u.%u"; char tmp[sizeof "255.255.255.255"]; - if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) { + if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) >= size) { __set_errno (ENOSPC); return (NULL); } diff --git a/resolv/mapv4v6addr.h b/resolv/mapv4v6addr.h index 7f85f7d5e3..bc3290f162 100644 --- a/resolv/mapv4v6addr.h +++ b/resolv/mapv4v6addr.h @@ -56,14 +56,16 @@ static void map_v4v6_address (const char *src, char *dst) { u_char *p = (u_char *) dst; + char tmp[INADDRSZ]; int i; - /* Move the IPv4 part to the right position. */ - memcpy (dst + 12, src, INADDRSZ); - + /* Stash a temporary copy so our caller can update in place. */ + memcpy (tmp, src, INADDRSZ); /* Mark this ipv6 addr as a mapped ipv4. */ for (i = 0; i < 10; i++) *p++ = 0x00; *p++ = 0xff; - *p = 0xff; + *p++ = 0xff; + /* Retrieve the saved copy and we're done. */ + memcpy ((void *) p, tmp, INADDRSZ); } diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 7045c5915b..cf060be8ef 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1996-2003, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Extended from original form by Ulrich Drepper , 1996. @@ -465,8 +465,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, char *aliases[MAX_NR_ALIASES]; unsigned char host_addr[16]; /* IPv4 or IPv6 */ char *h_addr_ptrs[0]; - } *host_data = (struct host_data *) buffer; - int linebuflen = buflen - sizeof (struct host_data); + } *host_data; + int linebuflen; register const HEADER *hp; const u_char *end_of_message, *cp; int n, ancount, qdcount; @@ -478,8 +478,9 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, u_char packtmp[NS_MAXCDNAME]; int have_to_map = 0; int32_t ttl = 0; - - if (__builtin_expect (linebuflen, 0) < 0) + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data); + buffer += pad; + if (__builtin_expect (buflen < sizeof (struct host_data) + pad, 0)) { /* The buffer is too small. */ too_small: @@ -487,6 +488,10 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } + host_data = (struct host_data *) buffer; + linebuflen = buflen - sizeof (struct host_data); + if (buflen - sizeof (struct host_data) != linebuflen) + linebuflen = INT_MAX; tname = qname; result->h_name = NULL; diff --git a/resolv/nss_dns/dns-network.c b/resolv/nss_dns/dns-network.c index 97d9263895..4552b5b678 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 +/* Copyright (C) 1996, 1997, 1998, 1999, 2002, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Extended from original form by Ulrich Drepper , 1996. @@ -102,7 +102,8 @@ extern int __ns_name_unpack (const u_char *, const u_char *, /* Prototypes for local functions. */ static enum nss_status getanswer_r (const querybuf *answer, int anslen, struct netent *result, char *buffer, - size_t buflen, lookup_method net_i); + size_t buflen, int *errnop, int *h_errnop, + lookup_method net_i); enum nss_status @@ -142,7 +143,8 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result, ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; } - status = getanswer_r (net_buffer.buf, anslen, result, buffer, buflen, BYNAME); + status = getanswer_r (net_buffer.buf, anslen, result, buffer, buflen, + errnop, herrnop, BYNAME); if (net_buffer.buf != orig_net_buffer) free (net_buffer.buf); return status; @@ -218,7 +220,8 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result, ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; } - status = getanswer_r (net_buffer.buf, anslen, result, buffer, buflen, BYADDR); + status = getanswer_r (net_buffer.buf, anslen, result, buffer, buflen, + errnop, herrnop, BYADDR); if (net_buffer.buf != orig_net_buffer) free (net_buffer.buf); if (status == NSS_STATUS_SUCCESS) @@ -240,7 +243,8 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result, static enum nss_status getanswer_r (const querybuf *answer, int anslen, struct netent *result, - char *buffer, size_t buflen, lookup_method net_i) + char *buffer, size_t buflen, int *errnop, int *h_errnop, + lookup_method net_i) { /* * Find first satisfactory answer @@ -260,8 +264,25 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result, { char *aliases[MAX_NR_ALIASES]; char linebuffer[0]; - } *net_data = (struct net_data *) buffer; + } *net_data; + + uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct net_data); + buffer += pad; + + if (__builtin_expect (buflen < sizeof (*net_data) + pad, 0)) + { + /* The buffer is too small. */ + too_small: + *errnop = ERANGE; + *h_errnop = NETDB_INTERNAL; + return NSS_STATUS_TRYAGAIN; + } + buflen -= pad; + + net_data = (struct net_data *) buffer; int linebuflen = buflen - offsetof (struct net_data, linebuffer); + if (buflen - offsetof (struct net_data, linebuffer) != linebuflen) + linebuflen = INT_MAX; const unsigned char *end_of_message = &answer->buf[anslen]; const HEADER *header_pointer = &answer->hdr; /* #/records in the answer section. */ @@ -319,10 +340,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result, if (n != -1 && __ns_name_ntop (packtmp, bp, linebuflen) == -1) { if (errno == EMSGSIZE) - { - errno = ERANGE; - return NSS_STATUS_TRYAGAIN; - } + goto too_small; n = -1; } @@ -346,10 +364,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result, if (n != -1 && __ns_name_ntop (packtmp, bp, linebuflen) == -1) { if (errno == EMSGSIZE) - { - errno = ERANGE; - return NSS_STATUS_TRYAGAIN; - } + goto too_small; n = -1; } diff --git a/resolv/res_libc.c b/resolv/res_libc.c index 8af57f7a4a..834773c32f 100644 --- a/resolv/res_libc.c +++ b/resolv/res_libc.c @@ -33,7 +33,7 @@ extern unsigned long long int __res_initstamp attribute_hidden; #if __WORDSIZE == 64 # define atomicinclock(lock) (void) 0 # define atomicincunlock(lock) (void) 0 -# define atomicinc(var) catomic_increment (&(var)) +# define atomicinc(var) atomic_increment (&(var)) #else __libc_lock_define_initialized (static, lock); # define atomicinclock(lock) __libc_lock_lock (lock) diff --git a/resolv/tst-inet_ntop.c b/resolv/tst-inet_ntop.c new file mode 100644 index 0000000000..a042c74c91 --- /dev/null +++ b/resolv/tst-inet_ntop.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include + +int +main (void) +{ + struct in_addr addr4; + struct in6_addr addr6; + char buf[64]; + int result = 0; + + addr4.s_addr = 0xe0e0e0e0; + addr6.s6_addr16[0] = 0; + addr6.s6_addr16[1] = 0; + addr6.s6_addr16[2] = 0; + addr6.s6_addr16[3] = 0; + addr6.s6_addr16[4] = 0; + addr6.s6_addr16[5] = 0xffff; + addr6.s6_addr32[3] = 0xe0e0e0e0; + memset (buf, 'x', sizeof buf); + + if (inet_ntop (AF_INET, &addr4, buf, 15) != NULL) + { + puts ("1st inet_ntop returned non-NULL"); + result++; + } + else if (errno != ENOSPC) + { + puts ("1st inet_ntop didn't fail with ENOSPC"); + result++; + } + if (buf[15] != 'x') + { + puts ("1st inet_ntop wrote past the end of buffer"); + result++; + } + + if (inet_ntop (AF_INET, &addr4, buf, 16) != buf) + { + puts ("2nd inet_ntop did not return buf"); + result++; + } + if (memcmp (buf, "224.224.224.224\0" "xxxxxxxx", 24) != 0) + { + puts ("2nd inet_ntop wrote past the end of buffer"); + result++; + } + + if (inet_ntop (AF_INET6, &addr6, buf, 22) != NULL) + { + puts ("3rd inet_ntop returned non-NULL"); + result++; + } + else if (errno != ENOSPC) + { + puts ("3rd inet_ntop didn't fail with ENOSPC"); + result++; + } + if (buf[22] != 'x') + { + puts ("3rd inet_ntop wrote past the end of buffer"); + result++; + } + + if (inet_ntop (AF_INET6, &addr6, buf, 23) != buf) + { + puts ("4th inet_ntop did not return buf"); + result++; + } + if (memcmp (buf, "::ffff:224.224.224.224\0" "xxxxxxxx", 31) != 0) + { + puts ("4th inet_ntop wrote past the end of buffer"); + result++; + } + + memset (&addr6.s6_addr, 0xe0, sizeof (addr6.s6_addr)); + + if (inet_ntop (AF_INET6, &addr6, buf, 39) != NULL) + { + puts ("5th inet_ntop returned non-NULL"); + result++; + } + else if (errno != ENOSPC) + { + puts ("5th inet_ntop didn't fail with ENOSPC"); + result++; + } + if (buf[39] != 'x') + { + puts ("5th inet_ntop wrote past the end of buffer"); + result++; + } + + if (inet_ntop (AF_INET6, &addr6, buf, 40) != buf) + { + puts ("6th inet_ntop did not return buf"); + result++; + } + if (memcmp (buf, "e0e0:e0e0:e0e0:e0e0:e0e0:e0e0:e0e0:e0e0\0" + "xxxxxxxx", 48) != 0) + { + puts ("6th inet_ntop wrote past the end of buffer"); + result++; + } + + + return result; +} diff --git a/scripts/check-local-headers.sh b/scripts/check-local-headers.sh index 88c85f7106..98da58e927 100755 --- a/scripts/check-local-headers.sh +++ b/scripts/check-local-headers.sh @@ -1,5 +1,5 @@ #! /bin/bash -# Copyright (C) 2005 Free Software Foundation, Inc. +# Copyright (C) 2005, 2007 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,6 +30,7 @@ if fgrep "$includedir" */*.d | fgrep -v "$includedir/asm" | fgrep -v "$includedir/linux" | fgrep -v "$includedir/selinux" | +fgrep -v "$includedir/sys/capability.h" | fgrep -v "$includedir/gd"; then # If we found a match something is wrong. exit 1 diff --git a/soft-fp/op-4.h b/soft-fp/op-4.h index 34f5098e8c..1b90535c56 100644 --- a/soft-fp/op-4.h +++ b/soft-fp/op-4.h @@ -564,7 +564,7 @@ r1 = x1 - y1; \ _c2 = r1 > x1; \ r1 -= _c1; \ - _c2 |= r1 > _c1; \ + _c2 |= _c1 && (y1 == x1); \ r2 = x2 - y2 - _c2; \ } while (0) #endif @@ -578,11 +578,11 @@ r1 = x1 - y1; \ _c2 = r1 > x1; \ r1 -= _c1; \ - _c2 |= r1 > _c1; \ + _c2 |= _c1 && (y1 == x1); \ r2 = x2 - y2; \ _c3 = r2 > x2; \ r2 -= _c2; \ - _c3 |= r2 > _c2; \ + _c3 |= _c2 && (y2 == x2); \ r3 = x3 - y3 - _c3; \ } while (0) #endif diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h index 4ec7fade48..0aa6e3e05d 100644 --- a/soft-fp/op-common.h +++ b/soft-fp/op-common.h @@ -1,5 +1,5 @@ /* Software floating-point emulation. Common operations. - Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc. + Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson (rth@cygnus.com), Jakub Jelinek (jj@ultra.linux.cz), @@ -99,10 +99,10 @@ do { \ else \ { \ X##_e = _FP_EXPMAX_##fs - 1; \ - FP_SET_EXCEPTION(FP_EX_OVERFLOW); \ - FP_SET_EXCEPTION(FP_EX_INEXACT); \ _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc); \ } \ + FP_SET_EXCEPTION(FP_EX_INEXACT); \ + FP_SET_EXCEPTION(FP_EX_OVERFLOW); \ } while (0) /* Check for a semi-raw value being a signaling NaN and raise the @@ -1252,6 +1252,9 @@ do { \ _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs \ - _FP_WFRACBITS_##dfs)); \ _FP_FRAC_COPY_##dwc##_##swc(D, S); \ + /* Semi-raw NaN must have all workbits cleared. */ \ + _FP_FRAC_LOW_##dwc(D) \ + &= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1); \ _FP_FRAC_HIGH_##dfs(D) |= _FP_QNANBIT_SH_##dfs; \ } \ } \ diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 37bcdb3bc8..7bd368bdca 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2002,2003,2004,2005,2006 Free Software Foundation, Inc. +# Copyright (C) 1991-2006, 2007 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,7 +54,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \ tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \ tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \ tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \ - tst-fwrite bug16 + tst-fwrite bug16 bug17 tst-sprintf2 test-srcs = tst-unbputc tst-printf diff --git a/stdio-common/_itoa.c b/stdio-common/_itoa.c index f61b23fceb..285fde2ab9 100644 --- a/stdio-common/_itoa.c +++ b/stdio-common/_itoa.c @@ -1,5 +1,5 @@ /* Internal function for converting integers to ASCII. - Copyright (C) 1994, 1995, 1996, 1999, 2000, 2002, 2003, 2004 + Copyright (C) 1994, 1995, 1996, 1999, 2000, 2002, 2003, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Torbjorn Granlund @@ -269,6 +269,7 @@ _itoa (value, buflim, base, upper_case) default: { + char *bufend = buflim; #if BITS_PER_MP_LIMB == 64 mp_limb_t base_multiplier = brec->base_multiplier; if (brec->flag) @@ -454,6 +455,8 @@ _itoa (value, buflim, base, upper_case) } while (n != 0); #endif + if (buflim == bufend) + *--buflim = '0'; } break; } diff --git a/stdio-common/bug17.c b/stdio-common/bug17.c new file mode 100644 index 0000000000..2ef398674b --- /dev/null +++ b/stdio-common/bug17.c @@ -0,0 +1,31 @@ +#include +#include + +static int +do_test (void) +{ + static const char expect[] = "0, 0, 0"; + char buf[100]; + int status = 0; + + static const char fmt1[] = "%0d, %0ld, %0lld"; + snprintf (buf, sizeof (buf), fmt1, 0, 0L, 0LL); + if (strcmp (buf, expect) != 0) + { + printf ("\"%s\": got \"%s\", expected \"%s\"\n", fmt1, buf, expect); + status = 1; + } + + static const char fmt2[] = "%0u, %0lu, %0llu"; + snprintf (buf, sizeof (buf), fmt2, 0u, 0uL, 0uLL); + if (strcmp (buf, expect) != 0) + { + printf ("\"%s\": got \"%s\", expected \"%s\"\n", fmt2, buf, expect); + status = 1; + } + + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c index e4e32f9c28..b48b689661 100644 --- a/stdio-common/printf_fp.c +++ b/stdio-common/printf_fp.c @@ -1,6 +1,5 @@ /* Floating point output for `printf'. - Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2006 - Free Software Foundation, Inc. + Copyright (C) 1995-2003, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper , 1995. @@ -793,7 +792,7 @@ ___printf_fp (FILE *fp, else { /* This is a special case. We don't need a factor because the - numbers are in the range of 0.0 <= fp < 8.0. We simply + numbers are in the range of 1.0 <= |fp| < 8.0. We simply shift it to the right place and divide it by 1.0 to get the leading digit. (Of course this division is not really made.) */ assert (0 <= exponent && exponent < 3 && @@ -811,12 +810,14 @@ ___printf_fp (FILE *fp, int chars_needed; int expscale; int intdig_max, intdig_no = 0; - int fracdig_min, fracdig_max, fracdig_no = 0; + int fracdig_min; + int fracdig_max; int dig_max; int significant; int ngroups = 0; + char spec = _tolower (info->spec); - if (_tolower (info->spec) == 'e') + if (spec == 'e') { type = info->spec; intdig_max = 1; @@ -826,7 +827,7 @@ ___printf_fp (FILE *fp, dig_max = INT_MAX; /* Unlimited. */ significant = 1; /* Does not matter here. */ } - else if (_tolower (info->spec) == 'f') + else if (spec == 'f') { type = 'f'; fracdig_min = fracdig_max = info->prec < 0 ? 6 : info->prec; @@ -923,7 +924,9 @@ ___printf_fp (FILE *fp, } /* Generate the needed number of fractional digits. */ - while (fracdig_no < fracdig_min + int fracdig_no = 0; + int added_zeros = 0; + while (fracdig_no < fracdig_min + added_zeros || (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0))) { ++fracdig_no; @@ -934,7 +937,7 @@ ___printf_fp (FILE *fp, { ++fracdig_max; if (fracdig_min > 0) - ++fracdig_min; + ++added_zeros; } } @@ -971,11 +974,25 @@ ___printf_fp (FILE *fp, { /* Process fractional digits. Terminate if not rounded or radix character is reached. */ + int removed = 0; while (*--wtp != decimalwc && *wtp == L'9') - *wtp = '0'; + { + *wtp = L'0'; + ++removed; + } + if (removed == fracdig_min && added_zeros > 0) + --added_zeros; if (*wtp != decimalwc) /* Round up. */ (*wtp)++; + else if (__builtin_expect (spec == 'g' && type == 'f' && info->alt + && wtp == wstartp + 1 + && wstartp[0] == L'0', + 0)) + /* This is a special case: the rounded number is 1.0, + the format is 'g' or 'G', and the alternative format + is selected. This means the result must be "1.". */ + --added_zeros; } if (fracdig_no == 0 || *wtp == decimalwc) @@ -997,6 +1014,12 @@ ___printf_fp (FILE *fp, { *wstartp = '1'; exponent += expsign == 0 ? 1 : -1; + + /* The above exponent adjustment could lead to 1.0e-00, + e.g. for 0.999999999. Make sure exponent 0 always + uses + sign. */ + if (exponent == 0) + expsign = 0; } else if (intdig_no == dig_max) { @@ -1042,7 +1065,7 @@ ___printf_fp (FILE *fp, do_expo: /* Now remove unnecessary '0' at the end of the string. */ - while (fracdig_no > fracdig_min && *(wcp - 1) == L'0') + while (fracdig_no > fracdig_min + added_zeros && *(wcp - 1) == L'0') { --wcp; --fracdig_no; @@ -1060,26 +1083,46 @@ ___printf_fp (FILE *fp, /* Write the exponent if it is needed. */ if (type != 'f') { - *wcp++ = (wchar_t) type; - *wcp++ = expsign ? L'-' : L'+'; + if (__builtin_expect (expsign != 0 && exponent == 4 && spec == 'g', 0)) + { + /* This is another special case. The exponent of the number is + really smaller than -4, which requires the 'e'/'E' format. + But after rounding the number has an exponent of -4. */ + assert (wcp >= wstartp + 1); + assert (wstartp[0] == L'1'); + __wmemcpy (wstartp, L"0.0001", 6); + wstartp[1] = decimalwc; + if (wcp >= wstartp + 2) + { + wmemset (wstartp + 6, L'0', wcp - (wstartp + 2)); + wcp += 4; + } + else + wcp += 5; + } + else + { + *wcp++ = (wchar_t) type; + *wcp++ = expsign ? L'-' : L'+'; - /* Find the magnitude of the exponent. */ - expscale = 10; - while (expscale <= exponent) - expscale *= 10; + /* Find the magnitude of the exponent. */ + expscale = 10; + while (expscale <= exponent) + expscale *= 10; - if (exponent < 10) - /* Exponent always has at least two digits. */ - *wcp++ = L'0'; - else - do - { - expscale /= 10; - *wcp++ = L'0' + (exponent / expscale); - exponent %= expscale; - } - while (expscale > 10); - *wcp++ = L'0' + exponent; + if (exponent < 10) + /* Exponent always has at least two digits. */ + *wcp++ = L'0'; + else + do + { + expscale /= 10; + *wcp++ = L'0' + (exponent / expscale); + exponent %= expscale; + } + while (expscale > 10); + *wcp++ = L'0' + exponent; + } } /* Compute number of characters which must be filled with the padding diff --git a/stdio-common/test-vfprintf.c b/stdio-common/test-vfprintf.c index a683eac779..342ac471da 100644 --- a/stdio-common/test-vfprintf.c +++ b/stdio-common/test-vfprintf.c @@ -1,5 +1,5 @@ /* Tests of *printf for very large strings. - Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2000, 2002, 2003, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2000. @@ -94,6 +94,7 @@ main (void) fprintf (fp, "%.*s", 30000, large); large[20000] = '\0'; fprintf (fp, large); + fprintf (fp, "%-1.300000000s", "hello"); if (fflush (fp) != 0 || ferror (fp) != 0 || fclose (fp) != 0) { @@ -108,11 +109,12 @@ main (void) setlocale (LC_ALL, NULL)); exit (1); } - else if (st.st_size != 99999) + else if (st.st_size != 50000 + 30000 + 19999 + 5) { printf ("file size incorrect for locale %s: %jd instead of %jd\n", setlocale (LC_ALL, NULL), - (intmax_t) st.st_size, (intmax_t) 99999); + (intmax_t) st.st_size, + (intmax_t) 50000 + 30000 + 19999 + 5); res = 1; } else diff --git a/stdio-common/tfformat.c b/stdio-common/tfformat.c index ea7365b2c9..7704ddde39 100644 --- a/stdio-common/tfformat.c +++ b/stdio-common/tfformat.c @@ -4012,6 +4012,32 @@ sprint_double_type sprint_doubles[] = {__LINE__, 16, "0x1.0p+4", "%.1a"}, {__LINE__, 16, "0x1.00000000000000000000p+4", "%.20a"}, {__LINE__, 4444.88888888, "4445", "%2.F"}, + {__LINE__, 0.956, "1", "%.0g"}, + {__LINE__, 1.0956, "1.", "%#.0g"}, + {__LINE__, 0.956, "1.", "%#.0g"}, + {__LINE__, 0.0956, "0.1", "%#.0g"}, + {__LINE__, 0.00956, "0.01", "%#.0g"}, + {__LINE__, 0.000956, "0.001", "%#.0g"}, + {__LINE__, 0.000098, "0.0001", "%#.0g"}, + {__LINE__, 0.0000996, "0.00010", "%#.2g"}, + {__LINE__, 9.999999999999999e-05, "0.0001", "%g"}, + {__LINE__, 1.0, "1.000000e+00", "%e"}, + {__LINE__, .9999999999999999, "1.000000e+00", "%e"}, + + {__LINE__, 912.98, "913.0", "%#.4g"}, + {__LINE__, 50.999999, "51.000", "%#.5g"}, + {__LINE__, 0.956, "1", "%.1g"}, + {__LINE__, 0.956, "1.", "%#.1g"}, + {__LINE__, 0.996, "1", "%.2g"}, + {__LINE__, 0.996, "1.0", "%#.2g"}, + {__LINE__, 999.98, "1000", "%.4g"}, + {__LINE__, 999.98, "1000.", "%#.4g"}, + {__LINE__, 999.998, "1000", "%.5g"}, + {__LINE__, 999.998, "1000.0", "%#.5g"}, + {__LINE__, 999.9998, "1000", "%g"}, + {__LINE__, 999.9998, "1000.00", "%#g"}, + {__LINE__, 912.98, "913", "%.4g"}, + {__LINE__, 50.999999, "51", "%.5g"}, {0 } @@ -4023,13 +4049,8 @@ sprint_double_type sprint_doubles[] = int required_precision = 13; -#if defined(__STDC__) || defined(__cplusplus) static int matches (register char *result, register const char *desired) -#else -int matches(result, desired) - register char *result; register const char *desired; -#endif { int digits_seen = 0; for (;; result++, desired++) { @@ -4080,7 +4101,7 @@ int main(int argc, char *argv[]) /* And one special test. */ { - const char ref[] = "1.7763568394002504646778106689453125e-15"; + static const char ref[] = "1.7763568394002504646778106689453125e-15"; int i; d = 1.0; for (i = 1; i < 50; ++i) diff --git a/stdio-common/tst-sprintf.c b/stdio-common/tst-sprintf.c index c61d3b50e4..c04fef18f4 100644 --- a/stdio-common/tst-sprintf.c +++ b/stdio-common/tst-sprintf.c @@ -37,5 +37,26 @@ main (void) free (dst); } + if (sprintf (buf, "%1$d%3$.*2$s%4$d", 7, 67108863, "x", 8) != 3 + || strcmp (buf, "7x8") != 0) + { + printf ("sprintf (buf, \"%%1$d%%3$.*2$s%%4$d\", 7, 67108863, \"x\", 8) produced `%s' output", buf); + result = 1; + } + + if (sprintf (buf, "%67108863.16\"%d", 7) != 14 + || strcmp (buf, "%67108863.16\"7") != 0) + { + printf ("sprintf (buf, \"%%67108863.16\\\"%%d\", 7) produced `%s' output", buf); + result = 1; + } + + if (sprintf (buf, "%*\"%d", 0x3ffffff, 7) != 11 + || strcmp (buf, "%67108863\"7") != 0) + { + printf ("sprintf (buf, \"%%*\\\"%%d\", 0x3ffffff, 7) produced `%s' output", buf); + result = 1; + } + return result; } diff --git a/stdio-common/tst-sprintf2.c b/stdio-common/tst-sprintf2.c new file mode 100644 index 0000000000..debb68e21f --- /dev/null +++ b/stdio-common/tst-sprintf2.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include + +int +main (void) +{ + volatile union { long double l; long long x[2]; } u, v; + char buf[64]; + int result = 0; + +#if LDBL_MANT_DIG == 106 || LDBL_MANT_DIG == 113 +# define COMPARE_LDBL(u, v) \ + ((u).l == (v).l && (u).x[0] == (v).x[0] && (u).x[1] == (v).x[1]) +#else +# define COMPARE_LDBL(u, v) ((u).l == (v).l) +#endif + +#define TEST(val) \ + do \ + { \ + u.l = (val); \ + snprintf (buf, sizeof buf, "%LaL", u.l); \ + if (strcmp (buf, #val) != 0) \ + { \ + printf ("Error on line %d: %s != %s\n", __LINE__, buf, #val); \ + result = 1; \ + } \ + if (sscanf (#val, "%La", &v.l) != 1 || !COMPARE_LDBL (u, v)) \ + { \ + printf ("Error sscanf on line %d: %La != %La\n", __LINE__, \ + u.l, v.l); \ + result = 1; \ + } \ + /* printf ("%s %La %016Lx %016Lx\n", #val, u.l, u.x[0], u.x[1]); */ \ + } \ + while (0) + +#if LDBL_MANT_DIG >= 106 +# if LDBL_MANT_DIG == 106 + TEST (0x0.ffffffffffffp-1022L); + TEST (0x0.ffffffffffff1p-1022L); + TEST (0x0.fffffffffffffp-1022L); +# endif + TEST (0x1p-1022L); + TEST (0x1.0000000000001p-1022L); + TEST (0x1.00000000001e7p-1022L); + TEST (0x1.fffffffffffffp-1022L); + TEST (0x1p-1021L); + TEST (0x1.00000000000008p-1021L); + TEST (0x1.0000000000001p-1021L); + TEST (0x1.00000000000018p-1021L); + TEST (0x1.0000000000000f8p-1017L); + TEST (0x1.0000000000001p-1017L); + TEST (0x1.000000000000108p-1017L); + TEST (0x1.000000000000dcf8p-1013L); + TEST (0x1.000000000000ddp-1013L); + TEST (0x1.000000000000dd08p-1013L); + TEST (0x1.ffffffffffffffffffffffffffp-1L); + TEST (0x1.ffffffffffffffffffffffffff8p-1L); + TEST (0x1p+0L); + TEST (0x1.000000000000000000000000008p+0L); + TEST (0x1.00000000000000000000000001p+0L); + TEST (0x1.000000000000000000000000018p+0L); + TEST (0x1.23456789abcdef123456789abc8p+0L); + TEST (0x1.23456789abcde7123456789abc8p+0L); + TEST (0x1.23456789abcdef123456789abc8p+64L); + TEST (0x1.23456789abcde7123456789abc8p+64L); + TEST (0x1.123456789abcdef123456789p-969L); +# if LDBL_MANT_DIG == 106 + TEST (-0x1.2d71957cc1263bbbeb1d365f1e8p-969L); + TEST (0x1.23456789abcdef0123456789abp-970L); + TEST (0x1.579bde02468acp-1001L); + TEST (0x0.abcdef0123456p-1022L); + TEST (0x1.abcdef0123456p-1022L); + TEST (0x1.abcdef012345678p-1014L); + TEST (0x1.abcdef0123456f8p-1014L); +# endif +#endif + return result; +} diff --git a/stdio-common/tstscanf.c b/stdio-common/tstscanf.c index 44ddf49e15..123d733e3f 100644 --- a/stdio-common/tstscanf.c +++ b/stdio-common/tstscanf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,96,97,98,99,2000,2001 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,1996-2001,2007 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 @@ -272,7 +272,7 @@ main (int argc, char **argv) res = sscanf ("0x1234", "%lf", &d); printf ("res = %d, d = %f\n", res, d); - if (res != 0 || d != 123456.789) + if (res != 1 || d != 4660) { fputs ("test failed!\n", stdout); result = 1; diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 53339f3078..bf5227873b 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006 +/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -1025,10 +1025,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) const char *mbs = (const char *) string; \ mbstate_t mbstate; \ \ - len = prec != -1 ? (size_t) prec : strlen (mbs); \ + len = prec != -1 ? __strnlen (mbs, (size_t) prec) : strlen (mbs); \ \ /* Allocate dynamically an array which definitely is long \ - enough for the wide character version. */ \ + enough for the wide character version. Each byte in the \ + multi-byte string can produce at most one wide character. */ \ if (__libc_use_alloca (len * sizeof (wchar_t))) \ string = (CHAR_T *) alloca (len * sizeof (wchar_t)); \ else if ((string = (CHAR_T *) malloc (len * sizeof (wchar_t))) \ @@ -1159,19 +1160,26 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) else \ { \ /* In case we have a multibyte character set the \ - situation is more compilcated. We must not copy \ + situation is more complicated. We must not copy \ bytes at the end which form an incomplete character. */\ - wchar_t ignore[prec]; \ + size_t ignore_size = (unsigned) prec > 1024 ? 1024 : prec;\ + wchar_t ignore[ignore_size]; \ const char *str2 = string; \ - mbstate_t ps; \ + const char *strend = string + prec; \ + if (strend < string) \ + strend = (const char *) UINTPTR_MAX; \ \ + mbstate_t ps; \ memset (&ps, '\0', sizeof (ps)); \ - if (__mbsnrtowcs (ignore, &str2, prec, prec, &ps) \ - == (size_t) -1) \ - { \ - done = -1; \ - goto all_done; \ - } \ + \ + while (str2 != NULL && str2 < strend) \ + if (__mbsnrtowcs (ignore, &str2, strend - str2, \ + ignore_size, &ps) == (size_t) -1) \ + { \ + done = -1; \ + goto all_done; \ + } \ + \ if (str2 == NULL) \ len = strlen (string); \ else \ @@ -1618,6 +1626,8 @@ do_positional: /* Just a counter. */ size_t cnt; + free (workstart); + workstart = NULL; if (grouping == (const char *) -1) { @@ -1792,7 +1802,9 @@ do_positional: int use_outdigits = specs[nspecs_done].info.i18n; char pad = specs[nspecs_done].info.pad; CHAR_T spec = specs[nspecs_done].info.spec; - CHAR_T *workstart = NULL; + + workstart = NULL; + workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)]; /* Fill in last information. */ if (specs[nspecs_done].width_arg != -1) @@ -1888,8 +1900,7 @@ do_positional: break; } - if (__builtin_expect (workstart != NULL, 0)) - free (workstart); + free (workstart); workstart = NULL; /* Write the following constant string. */ @@ -1917,7 +1928,7 @@ printf_unknown (FILE *s, const struct printf_info *info, { int done = 0; - CHAR_T work_buffer[MAX (info->width, info->spec) + 32]; + CHAR_T work_buffer[MAX (sizeof (info->width), sizeof (info->prec)) * 3]; CHAR_T *const workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)]; register CHAR_T *w; diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index 1ea9bc4e07..6671602291 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. +/* Copyright (C) 1991-2006, 2007 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 @@ -1888,9 +1887,8 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, /* Have we read any character? If we try to read a number in hexadecimal notation and we have read only the `0x' - prefix or no exponent this is an error. */ - if (__builtin_expect (wpsize == 0 - || (is_hexa && (wpsize == 2 || ! got_e)), 0)) + prefix this is an error. */ + if (__builtin_expect (wpsize == 0 || (is_hexa && wpsize == 2), 0)) conv_error (); scan_float: diff --git a/stdlib/Makefile b/stdlib/Makefile index b4518b2bb3..ecda85b0dd 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -104,6 +104,10 @@ CFLAGS-strfmon.c = -D_IO_MTSAFE_IO CFLAGS-strfmon_l.c = -D_IO_MTSAFE_IO endif +ifeq (yes,$(have-protected)) +CFLAGS-atexit.c = -DHAVE_DOT_HIDDEN +endif + CFLAGS-tst-bsearch.c = $(stack-align-test-flags) CFLAGS-tst-qsort.c = $(stack-align-test-flags) diff --git a/stdlib/atexit.c b/stdlib/atexit.c index 256c5fcfc0..307662bdcd 100644 --- a/stdlib/atexit.c +++ b/stdlib/atexit.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1996, 1999, 2001, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1996, 1999, 2001 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,11 +43,14 @@ extern void *__dso_handle __attribute__ ((__weak__)); /* Register FUNC to be executed by `exit'. */ int -#ifndef atexit -attribute_hidden -#endif atexit (void (*func) (void)) { return __cxa_atexit ((void (*) (void *)) func, NULL, &__dso_handle == NULL ? NULL : __dso_handle); } + +/* Hide the symbol so that no definition but the one locally in the + executable or DSO is used. */ +#ifdef HAVE_DOT_HIDDEN +asm (".hidden\tatexit"); +#endif diff --git a/stdlib/cxa_finalize.c b/stdlib/cxa_finalize.c index 148d57f200..bb49f36ddd 100644 --- a/stdlib/cxa_finalize.c +++ b/stdlib/cxa_finalize.c @@ -45,8 +45,8 @@ __cxa_finalize (void *d) /* We don't want to run this cleanup more than once. */ && (cxafn = f->func.cxa.fn, cxaarg = f->func.cxa.arg, - ! catomic_compare_and_exchange_bool_acq (&f->flavor, ef_free, - ef_cxa))) + ! atomic_compare_and_exchange_bool_acq (&f->flavor, ef_free, + ef_cxa))) { uint64_t check = __new_exitfn_called; diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index 7b39bc018a..fd81cf9e5b 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2003,2004,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1991-2003,2004,2005,2006,2007 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 @@ -741,18 +741,18 @@ __END_NAMESPACE_STD #ifdef __USE_GNU /* Return a malloc'd string containing the canonical absolute name of the - existing named file. */ + named file. The last file name component need not exist, and may be a + symlink to a nonexistent file. */ extern char *canonicalize_file_name (__const char *__name) __THROW __nonnull ((1)) __wur; #endif #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED -/* Return the canonical absolute name of file NAME. The last file name - component need not exist, and may be a symlink to a nonexistent file. - If RESOLVED is null, the result is malloc'd; otherwise, if the canonical - name is PATH_MAX chars or more, returns null with `errno' set to - ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars, returns the - name in RESOLVED. */ +/* Return the canonical absolute name of file NAME. If RESOLVED is + null, the result is malloc'd; otherwise, if the canonical name is + PATH_MAX chars or more, returns null with `errno' set to + ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars, + returns the name in RESOLVED. */ extern char *realpath (__const char *__restrict __name, char *__restrict __resolved) __THROW __wur; #endif diff --git a/sunrpc/auth_unix.c b/sunrpc/auth_unix.c index 3eaf0a25ab..1740e58cdc 100644 --- a/sunrpc/auth_unix.c +++ b/sunrpc/auth_unix.c @@ -347,7 +347,7 @@ marshal_new_auth (AUTH *auth) INTUSE(xdrmem_create) (xdrs, au->au_marshed, MAX_AUTH_BYTES, XDR_ENCODE); if ((!INTUSE(xdr_opaque_auth) (xdrs, &(auth->ah_cred))) || (!INTUSE(xdr_opaque_auth) (xdrs, &(auth->ah_verf)))) - perror (_("auth_unix.c: Fatal marshalling problem")); + perror (_("auth_none.c - Fatal marshalling problem")); else au->au_mpos = XDR_GETPOS (xdrs); diff --git a/sunrpc/clnt_raw.c b/sunrpc/clnt_raw.c index 44ea03efb7..019f1bbae0 100644 --- a/sunrpc/clnt_raw.c +++ b/sunrpc/clnt_raw.c @@ -114,7 +114,7 @@ clntraw_create (u_long prog, u_long vers) INTUSE(xdrmem_create) (xdrs, clp->mashl_callmsg, MCALL_MSG_SIZE, XDR_ENCODE); if (!INTUSE(xdr_callhdr) (xdrs, &call_msg)) { - perror (_ ("clnt_raw.c: fatal header serialization error")); + perror (_ ("clnt_raw.c - Fatal header serialization error.")); } clp->mcnt = XDR_GETPOS (xdrs); XDR_DESTROY (xdrs); diff --git a/sunrpc/pm_getmaps.c b/sunrpc/pm_getmaps.c index b21e7ea85c..2a6876d9d8 100644 --- a/sunrpc/pm_getmaps.c +++ b/sunrpc/pm_getmaps.c @@ -80,7 +80,7 @@ pmap_getmaps (struct sockaddr_in *address) (xdrproc_t)INTUSE(xdr_pmaplist), (caddr_t)&head, minutetimeout) != RPC_SUCCESS) { - clnt_perror (client, _("pmap_getmaps.c: rpc problem")); + clnt_perror (client, _("pmap_getmaps rpc problem")); } CLNT_DESTROY (client); } diff --git a/sunrpc/rpc_main.c b/sunrpc/rpc_main.c index bda432d3cd..954657a7e4 100644 --- a/sunrpc/rpc_main.c +++ b/sunrpc/rpc_main.c @@ -457,7 +457,7 @@ check_nettype (const char *name, const char *list_to_check[]) return 1; } } - fprintf (stderr, _ ("illegal nettype: `%s'\n"), name); + fprintf (stderr, _ ("illegal nettype :`%s'\n"), name); return 0; } diff --git a/sunrpc/svc_run.c b/sunrpc/svc_run.c index f1f47fbf30..d5e24dd0fc 100644 --- a/sunrpc/svc_run.c +++ b/sunrpc/svc_run.c @@ -51,52 +51,42 @@ void svc_run (void) { int i; - struct pollfd *my_pollfd = NULL; - int last_max_pollfd = 0; for (;;) { - int max_pollfd = svc_max_pollfd; - if (max_pollfd == 0 && svc_pollfd == NULL) - break; + struct pollfd *my_pollfd; - if (last_max_pollfd != max_pollfd) - { - struct pollfd *new_pollfd - = realloc (my_pollfd, sizeof (struct pollfd) * max_pollfd); - - if (new_pollfd == NULL) - { - perror (_("svc_run: - out of memory")); - break; - } + if (svc_max_pollfd == 0 && svc_pollfd == NULL) + return; - my_pollfd = new_pollfd; - last_max_pollfd = max_pollfd; + my_pollfd = malloc (sizeof (struct pollfd) * svc_max_pollfd); + if (my_pollfd == NULL) + { + perror (_("svc_run: - out of memory")); + return; } - for (i = 0; i < max_pollfd; ++i) + for (i = 0; i < svc_max_pollfd; ++i) { my_pollfd[i].fd = svc_pollfd[i].fd; my_pollfd[i].events = svc_pollfd[i].events; my_pollfd[i].revents = 0; } - switch (i = __poll (my_pollfd, max_pollfd, -1)) + switch (i = __poll (my_pollfd, svc_max_pollfd, -1)) { case -1: + free (my_pollfd); if (errno == EINTR) continue; perror (_("svc_run: - poll failed")); - break; + return; case 0: + free (my_pollfd); continue; default: INTUSE(svc_getreq_poll) (my_pollfd, i); - continue; + free (my_pollfd); } - break; } - - free (my_pollfd); } diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h index 29f500b2d0..88c357ea07 100644 --- a/sysdeps/alpha/dl-machine.h +++ b/sysdeps/alpha/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. Alpha version. - Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson . @@ -232,14 +232,14 @@ $fixup_stack: \n\ to one of the main executable's symbols, as for a COPY reloc. This is unused on Alpha. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD -# define elf_machine_type_class(type) \ +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) +#define elf_machine_type_class(type) \ (((type) == R_ALPHA_JMP_SLOT \ || (type) == R_ALPHA_DTPMOD64 \ || (type) == R_ALPHA_DTPREL64 \ || (type) == R_ALPHA_TPREL64) * ELF_RTYPE_CLASS_PLT) #else -# define elf_machine_type_class(type) \ +#define elf_machine_type_class(type) \ (((type) == R_ALPHA_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) #endif @@ -439,40 +439,40 @@ elf_machine_rela (struct link_map *map, memcpy (reloc_addr_arg, &sym_value, 8); } #endif -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) else if (r_type == R_ALPHA_DTPMOD64) { -# ifdef RTLD_BOOTSTRAP +#ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always index 1. */ *reloc_addr = 1; -# else +#else /* Get the information from the link map returned by the resolv function. */ if (sym_map != NULL) *reloc_addr = sym_map->l_tls_modid; -# endif +#endif } else if (r_type == R_ALPHA_DTPREL64) { -# ifndef RTLD_BOOTSTRAP +#ifndef RTLD_BOOTSTRAP /* During relocation all TLS symbols are defined and used. Therefore the offset is already correct. */ *reloc_addr = sym_raw_value; -# endif +#endif } else if (r_type == R_ALPHA_TPREL64) { -# ifdef RTLD_BOOTSTRAP +#ifdef RTLD_BOOTSTRAP *reloc_addr = sym_raw_value + map->l_tls_offset; -# else +#else if (sym_map) { CHECK_STATIC_TLS (map, sym_map); *reloc_addr = sym_raw_value + sym_map->l_tls_offset; } -# endif - } #endif + } +#endif /* USE_TLS */ else _dl_reloc_bad_type (map, r_type, 0); } diff --git a/sysdeps/alpha/libc-tls.c b/sysdeps/alpha/libc-tls.c index 7e02769171..24629e9aca 100644 --- a/sysdeps/alpha/libc-tls.c +++ b/sysdeps/alpha/libc-tls.c @@ -1,5 +1,5 @@ /* Thread-local storage handling in the ELF dynamic linker. Alpha version. - Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 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 @@ -20,6 +20,8 @@ #include #include +#if USE_TLS + /* On Alpha, linker optimizations are not required, so __tls_get_addr can be called even in statically linked binaries. In this case module must be always 1 and PT_TLS segment exist in the binary, otherwise it @@ -31,3 +33,5 @@ __tls_get_addr (tls_index *ti) dtv_t *dtv = THREAD_DTV (); return (char *) dtv[1].pointer.val + ti->ti_offset; } + +#endif diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index dda91bb806..eee6141c6a 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -1,5 +1,5 @@ /* Run-time dynamic linker data structures for loaded ELF shared objects. - Copyright (C) 1995-2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2006, 2007 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 @@ -38,7 +38,6 @@ #include #include #include -#include __BEGIN_DECLS @@ -439,18 +438,23 @@ struct rtld_global EXTERN void (*_dl_rtld_unlock_recursive) (void *); #endif - /* Prevailing state of the stack, PF_X indicating it's executable. */ - EXTERN ElfW(Word) _dl_stack_flags; - /* If loading a shared object requires that we make the stack executable when it was not, we do it by calling this function. It returns an errno code or zero on success. */ EXTERN int (*_dl_make_stack_executable_hook) (void **) internal_function; - /* Highest dtv index currently needed. */ - EXTERN size_t _dl_tls_max_dtv_idx; + /* Prevailing state of the stack, PF_X indicating it's executable. */ + EXTERN ElfW(Word) _dl_stack_flags; + + /* Keep the conditional TLS members at the end so the layout of the + structure used by !USE_TLS code matches the prefix of the layout in + the USE_TLS rtld. Note that `struct link_map' is conditionally + defined as well, so _dl_rtld_map needs to be last before this. */ +#ifdef USE_TLS /* Flag signalling whether there are gaps in the module ID allocation. */ EXTERN bool _dl_tls_dtv_gaps; + /* Highest dtv index currently needed. */ + EXTERN size_t _dl_tls_max_dtv_idx; /* Information about the dtv slots. */ EXTERN struct dtv_slotinfo_list { @@ -474,10 +478,10 @@ struct rtld_global /* Number of additional entries in the slotinfo array of each slotinfo list element. A large number makes it almost certain take we never have to iterate beyond the first element in the slotinfo list. */ -#define TLS_SLOTINFO_SURPLUS (62) +# define TLS_SLOTINFO_SURPLUS (62) /* Number of additional slots in the dtv allocated. */ -#define DTV_SURPLUS (14) +# define DTV_SURPLUS (14) /* Initial dtv of the main thread, not allocated with normal malloc. */ EXTERN void *_dl_initial_dtv; @@ -485,18 +489,31 @@ struct rtld_global EXTERN size_t _dl_tls_generation; EXTERN void (*_dl_init_static_tls) (struct link_map *); +#endif + + EXTERN void (*_dl_wait_lookup_done) (void); + /* Scopes to free after next THREAD_GSCOPE_WAIT (). */ + EXTERN struct dl_scope_free_list + { + size_t count; + struct r_scope_elem **list[50]; + } *_dl_scope_free_list; #ifdef SHARED }; # define __rtld_global_attribute__ # ifdef IS_IN_rtld -# ifdef HAVE_SDATA_SECTION -# define __rtld_local_attribute__ \ +# ifdef HAVE_VISIBILITY_ATTRIBUTE +# ifdef HAVE_SDATA_SECTION +# define __rtld_local_attribute__ \ __attribute__ ((visibility ("hidden"), section (".sdata"))) -# undef __rtld_global_attribute__ -# define __rtld_global_attribute__ __attribute__ ((section (".sdata"))) +# undef __rtld_global_attribute__ +# define __rtld_global_attribute__ __attribute__ ((section (".sdata"))) +# else +# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden"))) +# endif # else -# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden"))) +# define __rtld_local_attribute__ # endif extern struct rtld_global _rtld_local __rtld_local_attribute__; # undef __rtld_local_attribute__ @@ -532,15 +549,15 @@ struct rtld_global_ro #define DL_DEBUG_HELP (1 << 9) #define DL_DEBUG_PRELINK (1 << 10) - /* Cached value of `getpagesize ()'. */ - EXTERN size_t _dl_pagesize; - /* OS version. */ EXTERN unsigned int _dl_osversion; /* Platform name. */ EXTERN const char *_dl_platform; EXTERN size_t _dl_platformlen; + /* Cached value of `getpagesize ()'. */ + EXTERN size_t _dl_pagesize; + /* Copy of the content of `_dl_main_searchlist' at startup time. */ EXTERN struct r_scope_elem _dl_initial_searchlist; @@ -569,9 +586,6 @@ struct rtld_global_ro /* Expected cache ID. */ EXTERN int _dl_correct_cache_id; - /* 0 if internal pointer values should not be guarded, 1 if they should. */ - EXTERN int _dl_pointer_guard; - /* Mask for hardware capabilities that are available. */ EXTERN uint64_t _dl_hwcap; @@ -655,10 +669,17 @@ struct rtld_global_ro /* List of auditing interfaces. */ struct audit_ifaces *_dl_audit; unsigned int _dl_naudit; + + /* 0 if internal pointer values should not be guarded, 1 if they should. */ + EXTERN int _dl_pointer_guard; }; # define __rtld_global_attribute__ # ifdef IS_IN_rtld -# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden"))) +# ifdef HAVE_VISIBILITY_ATTRIBUTE +# define __rtld_local_attribute__ __attribute__ ((visibility ("hidden"))) +# else +# define __rtld_local_attribute__ +# endif extern struct rtld_global_ro _rtld_local_ro attribute_relro __rtld_local_attribute__; extern struct rtld_global_ro _rtld_global_ro @@ -1023,7 +1044,9 @@ rtld_hidden_proto (_dl_allocate_tls_init) extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb) internal_function; rtld_hidden_proto (_dl_deallocate_tls) +#if defined USE_TLS extern void _dl_nothread_init_static_tls (struct link_map *) attribute_hidden; +#endif /* Find origin of the executable. */ extern const char *_dl_get_origin (void) attribute_hidden; @@ -1046,6 +1069,11 @@ extern void *_dl_open (const char *name, int mode, const void *caller, Lmid_t nsid, int argc, char *argv[], char *env[]) attribute_hidden; +/* Free or queue for freeing scope OLD. If other threads might be + in the middle of _dl_fixup, _dl_profile_fixup or dl*sym using the + old scope, OLD can't be freed until no thread is using it. */ +extern int _dl_scope_free (struct r_scope_elem **old) attribute_hidden; + /* Add module to slot information data. */ extern void _dl_add_to_slotinfo (struct link_map *l) attribute_hidden; @@ -1057,6 +1085,8 @@ extern struct link_map *_dl_update_slotinfo (unsigned long int req_modid); but never touch anything. Return null if it's not allocated yet. */ extern void *_dl_tls_get_addr_soft (struct link_map *l) internal_function; +extern int _dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr) + internal_function attribute_hidden; __END_DECLS diff --git a/sysdeps/generic/tls.h b/sysdeps/generic/tls.h index 06e41ad121..6a23ec05e1 100644 --- a/sysdeps/generic/tls.h +++ b/sysdeps/generic/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. Generic version. - Copyright (C) 2002, 2006 Free Software Foundation, Inc. + Copyright (C) 2002 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,11 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +/* By default no TLS support is available. This is signaled by the + absence of the symbol USE_TLS. */ +#undef USE_TLS + + /* An architecture-specific version of this file has to defined a number of symbols: diff --git a/sysdeps/gnu/errlist-compat.awk b/sysdeps/gnu/errlist-compat.awk index 307c4d7020..ab67a18f64 100644 --- a/sysdeps/gnu/errlist-compat.awk +++ b/sysdeps/gnu/errlist-compat.awk @@ -1,5 +1,5 @@ # awk script to generate errlist-compat.c -# Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc. +# Copyright (C) 2002, 2004 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -92,18 +92,16 @@ END { printf "# include \n"; printf "extern const char *const __sys_errlist_%s[NERR];\n", old; printf "const int __sys_nerr_%s = %d;\n", old, n; - printf "declare_symbol_alias (__sys_errlist_%s, _sys_errlist_internal,", \ - old; - printf " object, __WORDSIZE/8*%d)\n", n; + printf "strong_alias (_sys_errlist_internal, __sys_errlist_%s)\n", old; + printf "declare_symbol (__sys_errlist_%s, object, __WORDSIZE/8*%d)\n", \ + old, n; printf "compat_symbol (libc, __sys_errlist_%s, sys_errlist, %s);\n", \ old, old; printf "compat_symbol (libc, __sys_nerr_%s, sys_nerr, %s);\n", old, old; printf "extern const char *const ___sys_errlist_%s[NERR];\n", old; printf "extern const int __sys_nerr_%s;\n", old; - printf "declare_symbol_alias (___sys_errlist_%s, _sys_errlist_internal,", \ - old; - printf " object, __WORDSIZE/8*%d)\n", n; + printf "strong_alias (__sys_errlist_%s, ___sys_errlist_%s)\n", old, old; printf "strong_alias (__sys_nerr_%s, ___sys_nerr_%s)\n", old, old; printf "compat_symbol (libc, ___sys_errlist_%s, _sys_errlist, %s);\n", \ old, old; diff --git a/sysdeps/gnu/netinet/tcp.h b/sysdeps/gnu/netinet/tcp.h index 2c04ec9b7f..87099ec14a 100644 --- a/sysdeps/gnu/netinet/tcp.h +++ b/sysdeps/gnu/netinet/tcp.h @@ -49,7 +49,6 @@ #define TCP_WINDOW_CLAMP 10 /* Bound advertised window */ #define TCP_INFO 11 /* Information about this connection. */ #define TCP_QUICKACK 12 /* Bock/reenable quick ACKs. */ -#define TCP_CONGESTION 13 /* Congestion control algorithm. */ #ifdef __USE_MISC # include diff --git a/sysdeps/gnu/siglist.c b/sysdeps/gnu/siglist.c index 3005f867f0..cb1875f9eb 100644 --- a/sysdeps/gnu/siglist.c +++ b/sysdeps/gnu/siglist.c @@ -1,5 +1,5 @@ /* Define list of all signal numbers and their names. - Copyright (C) 1997-2000, 2002, 2003, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-2000, 2002, 2003 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 @@ -40,30 +40,27 @@ const char *const __new_sys_sigabbrev[NSIG] = strong_alias (__new_sys_sigabbrev, _sys_sigabbrev_internal) #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) -declare_symbol_alias (__old_sys_siglist, __new_sys_siglist, object, - OLD_SIGLIST_SIZE * __WORDSIZE / 8) +strong_alias (_sys_siglist_internal, __old_sys_siglist) +declare_symbol (__old_sys_siglist, object, OLD_SIGLIST_SIZE * __WORDSIZE / 8) -declare_symbol_alias (__old_sys_sigabbrev, __new_sys_sigabbrev, object, - OLD_SIGLIST_SIZE * __WORDSIZE / 8) - -declare_symbol_alias (_old_sys_siglist, __new_sys_siglist, object, - OLD_SIGLIST_SIZE * __WORDSIZE / 8) +strong_alias (_sys_sigabbrev_internal, __old_sys_sigabbrev) +declare_symbol (__old_sys_sigabbrev, object, OLD_SIGLIST_SIZE * __WORDSIZE / 8) +strong_alias (__old_sys_siglist, _old_sys_siglist) compat_symbol (libc, __old_sys_siglist, _sys_siglist, GLIBC_2_0); compat_symbol (libc, _old_sys_siglist, sys_siglist, GLIBC_2_0); compat_symbol (libc, __old_sys_sigabbrev, sys_sigabbrev, GLIBC_2_0); #endif #if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3_3) && defined OLD2_SIGLIST_SIZE -declare_symbol_alias (__old2_sys_siglist, __new_sys_siglist, object, - OLD2_SIGLIST_SIZE * __WORDSIZE / 8) - -declare_symbol_alias (__old2_sys_sigabbrev, __new_sys_sigabbrev, object, - OLD2_SIGLIST_SIZE * __WORDSIZE / 8) +strong_alias (_sys_siglist_internal, __old2_sys_siglist) +declare_symbol (__old2_sys_siglist, object, OLD2_SIGLIST_SIZE * __WORDSIZE / 8) -declare_symbol_alias (_old2_sys_siglist, __new_sys_siglist, object, - OLD2_SIGLIST_SIZE * __WORDSIZE / 8) +strong_alias (_sys_sigabbrev_internal, __old2_sys_sigabbrev) +declare_symbol (__old2_sys_sigabbrev, object, + OLD2_SIGLIST_SIZE * __WORDSIZE / 8) +strong_alias (__old2_sys_siglist, _old2_sys_siglist) compat_symbol (libc, __old2_sys_siglist, _sys_siglist, GLIBC_2_1); compat_symbol (libc, _old2_sys_siglist, sys_siglist, GLIBC_2_1); compat_symbol (libc, __old2_sys_sigabbrev, sys_sigabbrev, GLIBC_2_1); diff --git a/sysdeps/i386/bits/byteswap.h b/sysdeps/i386/bits/byteswap.h index bed27559c5..7f2ddc2dc5 100644 --- a/sysdeps/i386/bits/byteswap.h +++ b/sysdeps/i386/bits/byteswap.h @@ -1,5 +1,6 @@ /* Macros to swap the order of bytes in integer values. - Copyright (C) 1997,1998,2000,2002,2003,2006 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007 + 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 @@ -66,7 +67,8 @@ __bswap_16 (unsigned short int __bsx) `bswap' opcode. On i386 we have to use three instructions. */ # if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__ \ && !defined __pentium4__ && !defined __k8__ && !defined __athlon__ \ - && !defined __k6__ + && !defined __k6__ && !defined __nocona__ && !defined __core2__ \ + && !defined __geode__ && !defined __amdfam10__ # define __bswap_32(x) \ (__extension__ \ ({ register unsigned int __v, __x = (x); \ diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index 04296d2a9a..df3edf5460 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. i386 version. - Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2002, 2003, 2004, 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 @@ -34,7 +34,9 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr) } -#ifdef PI_STATIC_AND_HIDDEN +#if defined PI_STATIC_AND_HIDDEN \ + && defined HAVE_VISIBILITY_ATTRIBUTE && defined HAVE_HIDDEN \ + && !defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE /* Return the link-time address of _DYNAMIC. Conveniently, this is the first element of the GOT, a special entry that is never relocated. */ @@ -242,7 +244,7 @@ _dl_start_user:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) # 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 \ @@ -350,7 +352,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, *reloc_addr = value; break; -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) case R_386_TLS_DTPMOD32: # ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always the module @@ -474,6 +476,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = (value + reloc->r_addend - (Elf32_Addr) reloc_addr); break; +# ifdef USE_TLS case R_386_TLS_DTPMOD32: /* Get the information from the link map returned by the resolv function. */ @@ -510,6 +513,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + reloc->r_addend; } break; +# endif /* use TLS */ case R_386_COPY: if (sym == NULL) /* This can happen in trace mode if an object could not be diff --git a/sysdeps/i386/fpu/e_log.S b/sysdeps/i386/fpu/e_log.S index 5604e638f5..ce55b72292 100644 --- a/sysdeps/i386/fpu/e_log.S +++ b/sysdeps/i386/fpu/e_log.S @@ -36,11 +36,15 @@ limit: .double 0.29 ENTRY(__ieee754_log) fldln2 // log(2) fldl 4(%esp) // x : log(2) + fxam + fnstsw #ifdef PIC LOAD_PIC_REG (dx) #endif fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + sahf + jc 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -54,4 +58,9 @@ ENTRY(__ieee754_log) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: jp 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_log) diff --git a/sysdeps/i386/fpu/e_logf.S b/sysdeps/i386/fpu/e_logf.S index 128bb2754c..cd4538b594 100644 --- a/sysdeps/i386/fpu/e_logf.S +++ b/sysdeps/i386/fpu/e_logf.S @@ -37,11 +37,15 @@ limit: .double 0.29 ENTRY(__ieee754_logf) fldln2 // log(2) flds 4(%esp) // x : log(2) + fxam + fnstsw #ifdef PIC LOAD_PIC_REG (dx) #endif fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + sahf + jc 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -55,4 +59,9 @@ ENTRY(__ieee754_logf) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: jp 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_logf) diff --git a/sysdeps/i386/fpu/e_logl.S b/sysdeps/i386/fpu/e_logl.S index 5023d3012f..551dcf1e46 100644 --- a/sysdeps/i386/fpu/e_logl.S +++ b/sysdeps/i386/fpu/e_logl.S @@ -37,11 +37,15 @@ limit: .double 0.29 ENTRY(__ieee754_logl) fldln2 // log(2) fldt 4(%esp) // x : log(2) + fxam + fnstsw #ifdef PIC LOAD_PIC_REG (dx) #endif fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + sahf + jc 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -55,4 +59,9 @@ ENTRY(__ieee754_logl) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: jp 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_logl) diff --git a/sysdeps/i386/fpu/e_pow.S b/sysdeps/i386/fpu/e_pow.S index c554ca4ecb..792f926902 100644 --- a/sysdeps/i386/fpu/e_pow.S +++ b/sysdeps/i386/fpu/e_pow.S @@ -1,5 +1,5 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005 + Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -161,10 +161,11 @@ ENTRY(__ieee754_pow) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y sahf @@ -197,9 +198,10 @@ ENTRY(__ieee754_pow) // y == ±inf .align ALIGNARG(4) 12: fstp %st(0) // pop y - fldl 4(%esp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + fldl 4(%esp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/i386/fpu/e_powf.S b/sysdeps/i386/fpu/e_powf.S index c835b978b9..c91545418d 100644 --- a/sysdeps/i386/fpu/e_powf.S +++ b/sysdeps/i386/fpu/e_powf.S @@ -1,5 +1,5 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1999, 2001, 2004, 2005 + Copyright (C) 1996, 1997, 1999, 2001, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -155,10 +155,11 @@ ENTRY(__ieee754_powf) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y sahf @@ -191,9 +192,10 @@ ENTRY(__ieee754_powf) // y == ±inf .align ALIGNARG(4) 12: fstp %st(0) // pop y - flds 4(%esp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + flds 4(%esp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/i386/fpu/e_powl.S b/sysdeps/i386/fpu/e_powl.S index 74f422816a..6215496207 100644 --- a/sysdeps/i386/fpu/e_powl.S +++ b/sysdeps/i386/fpu/e_powl.S @@ -1,5 +1,5 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005 + Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -161,10 +161,11 @@ ENTRY(__ieee754_powl) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y sahf @@ -210,9 +211,10 @@ ENTRY(__ieee754_powl) // y == ±inf .align ALIGNARG(4) 12: fstp %st(0) // pop y - fldt 4(%esp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + fldt 4(%esp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/i386/fpu/math_private.h b/sysdeps/i386/fpu/math_private.h new file mode 100644 index 0000000000..a426788ef1 --- /dev/null +++ b/sysdeps/i386/fpu/math_private.h @@ -0,0 +1,18 @@ +#ifndef _MATH_PRIVATE_H + +#define math_opt_barrier(x) \ +({ __typeof(x) __x; \ + __asm ("" : "=t" (__x) : "0" (x)); \ + __x; }) +#define math_force_eval(x) \ +do \ + { \ + if (sizeof (x) <= sizeof (double)) \ + __asm __volatile ("" : : "m" (x)); \ + else \ + __asm __volatile ("" : : "f" (x)); \ + } \ +while (0) + +#include +#endif diff --git a/sysdeps/i386/fpu/s_nextafterl.c b/sysdeps/i386/fpu/s_nextafterl.c index 5b617cb4e7..aef0a144e5 100644 --- a/sysdeps/i386/fpu/s_nextafterl.c +++ b/sysdeps/i386/fpu/s_nextafterl.c @@ -27,7 +27,7 @@ static char rcsid[] = "$NetBSD: $"; */ #include "math.h" -#include "math_private.h" +#include #ifdef __STDC__ long double __nextafterl(long double x, long double y) @@ -52,9 +52,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if(x==y) return y; /* x=y, return y */ if((ix|hx|lx)==0) { /* x == 0 */ + long double u; SET_LDOUBLE_WORDS(x,esy&0x8000,0,1);/* return +-minsubnormal */ - y = x*x; - if(y==x) return y; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(esx>=0) { /* x > 0 */ if(esx>esy||((esx==esy) && (hx>hy||((hx==hy)&&(lx>ly))))) { @@ -109,12 +112,9 @@ static char rcsid[] = "$NetBSD: $"; } esy = esx&0x7fff; if(esy==0x7fff) return x+x; /* overflow */ - if(esy==0) { /* underflow */ - y = x*x; - if(y!=x) { /* raise underflow flag */ - SET_LDOUBLE_WORDS(y,esx,hx,lx); - return y; - } + if(esy==0) { + long double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_LDOUBLE_WORDS(x,esx,hx,lx); return x; diff --git a/sysdeps/i386/fpu/s_nexttoward.c b/sysdeps/i386/fpu/s_nexttoward.c index 2bd768e448..9bd86a3724 100644 --- a/sysdeps/i386/fpu/s_nexttoward.c +++ b/sysdeps/i386/fpu/s_nexttoward.c @@ -27,7 +27,8 @@ static char rcsid[] = "$NetBSD: $"; */ #include "math.h" -#include "math_private.h" +#include +#include #ifdef __STDC__ double __nexttoward(double x, long double y) @@ -52,10 +53,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if((long double) x==y) return y; /* x=y, return y */ if((ix|lx)==0) { /* x == 0 */ - double x2; + double u; INSERT_WORDS(x,(esy&0x8000)<<16,1); /* return +-minsub */ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if (esy>=0x8000||((ix>>20)&0x7ff)>iy-0x3c00 @@ -85,16 +88,14 @@ static char rcsid[] = "$NetBSD: $"; hy = hx&0x7ff00000; if(hy>=0x7ff00000) { x = x+x; /* overflow */ - /* Force conversion to double. */ - asm ("" : "=m"(x) : "m"(x)); + if (FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1) + /* Force conversion to double. */ + asm ("" : "+m"(x)); return x; } - if(hy<0x00100000) { /* underflow */ - double x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - INSERT_WORDS(x2,hx,lx); - return x2; - } + if(hy<0x00100000) { + double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } INSERT_WORDS(x,hx,lx); return x; diff --git a/sysdeps/i386/fpu/s_nexttowardf.c b/sysdeps/i386/fpu/s_nexttowardf.c index 3fbe53c338..25f70e4f4d 100644 --- a/sysdeps/i386/fpu/s_nexttowardf.c +++ b/sysdeps/i386/fpu/s_nexttowardf.c @@ -19,7 +19,8 @@ static char rcsid[] = "$NetBSD: $"; #endif #include "math.h" -#include "math_private.h" +#include +#include #ifdef __STDC__ float __nexttowardf(float x, long double y) @@ -44,10 +45,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if((long double) x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ - float x2; + float u; SET_FLOAT_WORD(x,((esy&0x8000)<<16)|1);/* return +-minsub*/ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(esy>=0x8000||((ix>>23)&0xff)>iy-0x3f80 @@ -69,16 +72,14 @@ static char rcsid[] = "$NetBSD: $"; hy = hx&0x7f800000; if(hy>=0x7f800000) { x = x+x; /* overflow */ - /* Force conversion to float. */ - asm ("" : "=m"(x) : "m"(x)); + if (FLT_EVAL_METHOD != 0) + /* Force conversion to float. */ + asm ("" : "+m"(x)); return x; } - if(hy<0x00800000) { /* underflow */ - float x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - SET_FLOAT_WORD(x2,hx); - return x2; - } + if(hy<0x00800000) { + float u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_FLOAT_WORD(x,hx); return x; diff --git a/sysdeps/i386/i486/bits/atomic.h b/sysdeps/i386/i486/bits/atomic.h index a27734c37e..c748761758 100644 --- a/sysdeps/i386/i486/bits/atomic.h +++ b/sysdeps/i386/i486/bits/atomic.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -18,7 +18,6 @@ 02111-1307 USA. */ #include -#include /* For tcbhead_t. */ typedef int8_t atomic8_t; @@ -77,40 +76,6 @@ typedef uintmax_t uatomic_max_t; : "r" (newval), "m" (*mem), "0" (oldval)); \ ret; }) - -#define __arch_c_compare_and_exchange_val_8_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%gs:%P5\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchgb %b2, %1" \ - : "=a" (ret), "=m" (*mem) \ - : "q" (newval), "m" (*mem), "0" (oldval), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) - -#define __arch_c_compare_and_exchange_val_16_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%gs:%P5\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchgw %w2, %1" \ - : "=a" (ret), "=m" (*mem) \ - : "r" (newval), "m" (*mem), "0" (oldval), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) - -#define __arch_c_compare_and_exchange_val_32_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%gs:%P5\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchgl %2, %1" \ - : "=a" (ret), "=m" (*mem) \ - : "r" (newval), "m" (*mem), "0" (oldval), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) - /* XXX We do not really need 64-bit compare-and-exchange. At least not in the moment. Using it would mean causing portability problems since not many other 32-bit architectures have support for @@ -120,8 +85,6 @@ typedef uintmax_t uatomic_max_t; #if 1 # define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ({ __typeof (*mem) ret = *(mem); abort (); ret = (newval); ret = (oldval); }) -# define __arch_c_compare_and_exchange_val_64_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret = *(mem); abort (); ret = (newval); ret = (oldval); }) #else # ifdef __PIC__ # define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ @@ -137,24 +100,6 @@ typedef uintmax_t uatomic_max_t; & 0xffffffff), \ "d" (((unsigned long long int) (oldval)) >> 32)); \ ret; }) - -# define __arch_c_compare_and_exchange_val_64_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("xchgl %2, %%ebx\n\t" \ - "cmpl $0, %%gs:%P7\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchg8b %1\n\t" \ - "xchgl %2, %%ebx" \ - : "=A" (ret), "=m" (*mem) \ - : "DS" (((unsigned long long int) (newval)) \ - & 0xffffffff), \ - "c" (((unsigned long long int) (newval)) >> 32), \ - "m" (*mem), "a" (((unsigned long long int) (oldval)) \ - & 0xffffffff), \ - "d" (((unsigned long long int) (oldval)) >> 32), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) # else # define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ ({ __typeof (*mem) ret; \ @@ -167,22 +112,6 @@ typedef uintmax_t uatomic_max_t; & 0xffffffff), \ "d" (((unsigned long long int) (oldval)) >> 32)); \ ret; }) - -# define __arch_c_compare_and_exchange_val_64_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%gs:%P7\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchg8b %1" \ - : "=A" (ret), "=m" (*mem) \ - : "b" (((unsigned long long int) (newval)) \ - & 0xffffffff), \ - "c" (((unsigned long long int) (newval)) >> 32), \ - "m" (*mem), "a" (((unsigned long long int) (oldval)) \ - & 0xffffffff), \ - "d" (((unsigned long long int) (oldval)) >> 32), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) # endif #endif @@ -210,24 +139,21 @@ typedef uintmax_t uatomic_max_t; result; }) -#define __arch_exchange_and_add_body(lock, pfx, mem, value) \ +#define atomic_exchange_and_add(mem, value) \ ({ __typeof (*mem) __result; \ __typeof (value) __addval = (value); \ if (sizeof (*mem) == 1) \ - __asm __volatile (lock "xaddb %b0, %1" \ + __asm __volatile (LOCK_PREFIX "xaddb %b0, %1" \ : "=r" (__result), "=m" (*mem) \ - : "0" (__addval), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "0" (__addval), "m" (*mem)); \ else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "xaddw %w0, %1" \ + __asm __volatile (LOCK_PREFIX "xaddw %w0, %1" \ : "=r" (__result), "=m" (*mem) \ - : "0" (__addval), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "0" (__addval), "m" (*mem)); \ else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "xaddl %0, %1" \ + __asm __volatile (LOCK_PREFIX "xaddl %0, %1" \ : "=r" (__result), "=m" (*mem) \ - : "0" (__addval), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "0" (__addval), "m" (*mem)); \ else \ { \ __typeof (mem) __memp = (mem); \ @@ -235,64 +161,41 @@ typedef uintmax_t uatomic_max_t; __result = *__memp; \ do \ __tmpval = __result; \ - while ((__result = pfx##_compare_and_exchange_val_64_acq \ + while ((__result = __arch_compare_and_exchange_val_64_acq \ (__memp, __result + __addval, __result)) == __tmpval); \ } \ __result; }) -#define atomic_exchange_and_add(mem, value) \ - __arch_exchange_and_add_body (LOCK_PREFIX, __arch, mem, value) - -#define __arch_exchange_and_add_cprefix \ - "cmpl $0, %%gs:%P4\n\tje 0f\n\tlock\n0:\t" - -#define catomic_exchange_and_add(mem, value) \ - __arch_exchange_and_add_body (__arch_exchange_and_add_cprefix, __arch_c, \ - mem, value) - - -#define __arch_add_body(lock, pfx, mem, value) \ - do { \ - if (__builtin_constant_p (value) && (value) == 1) \ - atomic_increment (mem); \ - else if (__builtin_constant_p (value) && (value) == -1) \ - atomic_decrement (mem); \ - else if (sizeof (*mem) == 1) \ - __asm __volatile (lock "addb %b1, %0" \ - : "=m" (*mem) \ - : "ir" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "addw %w1, %0" \ - : "=m" (*mem) \ - : "ir" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "addl %1, %0" \ - : "=m" (*mem) \ - : "ir" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - { \ - __typeof (value) __addval = (value); \ - __typeof (mem) __memp = (mem); \ - __typeof (*mem) __oldval = *__memp; \ - __typeof (*mem) __tmpval; \ - do \ - __tmpval = __oldval; \ - while ((__oldval = pfx##_compare_and_exchange_val_64_acq \ - (__memp, __oldval + __addval, __oldval)) == __tmpval); \ - } \ - } while (0) #define atomic_add(mem, value) \ - __arch_add_body (LOCK_PREFIX, __arch, mem, value) - -#define __arch_add_cprefix \ - "cmpl $0, %%gs:%P3\n\tje 0f\n\tlock\n0:\t" - -#define catomic_add(mem, value) \ - __arch_add_body (__arch_add_cprefix, __arch_c, mem, value) + (void) ({ if (__builtin_constant_p (value) && (value) == 1) \ + atomic_increment (mem); \ + else if (__builtin_constant_p (value) && (value) == -1) \ + atomic_decrement (mem); \ + else if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "addb %b1, %0" \ + : "=m" (*mem) \ + : "ir" (value), "m" (*mem)); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "addw %w1, %0" \ + : "=m" (*mem) \ + : "ir" (value), "m" (*mem)); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "addl %1, %0" \ + : "=m" (*mem) \ + : "ir" (value), "m" (*mem)); \ + else \ + { \ + __typeof (value) __addval = (value); \ + __typeof (mem) __memp = (mem); \ + __typeof (*mem) __oldval = *__memp; \ + __typeof (*mem) __tmpval; \ + do \ + __tmpval = __oldval; \ + while ((__oldval = __arch_compare_and_exchange_val_64_acq \ + (__memp, __oldval + __addval, __oldval)) == __tmpval); \ + } \ + }) #define atomic_add_negative(mem, value) \ @@ -333,42 +236,30 @@ typedef uintmax_t uatomic_max_t; __result; }) -#define __arch_increment_body(lock, pfx, mem) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (lock "incb %b0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "incw %w0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "incl %0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - { \ - __typeof (mem) __memp = (mem); \ - __typeof (*mem) __oldval = *__memp; \ - __typeof (*mem) __tmpval; \ - do \ - __tmpval = __oldval; \ - while ((__oldval = pfx##_compare_and_exchange_val_64_acq \ - (__memp, __oldval + 1, __oldval)) == __tmpval); \ - } \ - } while (0) - -#define atomic_increment(mem) __arch_increment_body (LOCK_PREFIX, __arch, mem) - -#define __arch_increment_cprefix \ - "cmpl $0, %%gs:%P2\n\tje 0f\n\tlock\n0:\t" - -#define catomic_increment(mem) \ - __arch_increment_body (__arch_increment_cprefix, __arch_c, mem) +#define atomic_increment(mem) \ + (void) ({ if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "incb %b0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "incw %w0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "incl %0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else \ + { \ + __typeof (mem) __memp = (mem); \ + __typeof (*mem) __oldval = *__memp; \ + __typeof (*mem) __tmpval; \ + do \ + __tmpval = __oldval; \ + while ((__oldval = __arch_compare_and_exchange_val_64_acq \ + (__memp, __oldval + 1, __oldval)) == __tmpval); \ + } \ + }) #define atomic_increment_and_test(mem) \ @@ -390,42 +281,30 @@ typedef uintmax_t uatomic_max_t; __result; }) -#define __arch_decrement_body(lock, pfx, mem) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (lock "decb %b0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "decw %w0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "decl %0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - { \ - __typeof (mem) __memp = (mem); \ - __typeof (*mem) __oldval = *__memp; \ - __typeof (*mem) __tmpval; \ - do \ - __tmpval = __oldval; \ - while ((__oldval = pfx##_compare_and_exchange_val_64_acq \ - (__memp, __oldval - 1, __oldval)) == __tmpval); \ - } \ - } while (0) - -#define atomic_decrement(mem) __arch_decrement_body (LOCK_PREFIX, __arch, mem) - -#define __arch_decrement_cprefix \ - "cmpl $0, %%gs:%P2\n\tje 0f\n\tlock\n0:\t" - -#define catomic_decrement(mem) \ - __arch_decrement_body (__arch_decrement_cprefix, __arch_c, mem) +#define atomic_decrement(mem) \ + (void) ({ if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "decb %b0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "decw %w0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "decl %0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else \ + { \ + __typeof (mem) __memp = (mem); \ + __typeof (*mem) __oldval = *__memp; \ + __typeof (*mem) __tmpval; \ + do \ + __tmpval = __oldval; \ + while ((__oldval = __arch_compare_and_exchange_val_64_acq \ + (__memp, __oldval - 1, __oldval)) == __tmpval); \ + } \ + }) #define atomic_decrement_and_test(mem) \ @@ -448,22 +327,21 @@ typedef uintmax_t uatomic_max_t; #define atomic_bit_set(mem, bit) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (LOCK_PREFIX "orb %b2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "ir" (1 << (bit))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (LOCK_PREFIX "orw %w2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "ir" (1 << (bit))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (LOCK_PREFIX "orl %2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "ir" (1 << (bit))); \ - else \ - abort (); \ - } while (0) + (void) ({ if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "orb %b2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "ir" (1 << (bit))); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "orw %w2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "ir" (1 << (bit))); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "orl %2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "ir" (1 << (bit))); \ + else \ + abort (); \ + }) #define atomic_bit_test_set(mem, bit) \ @@ -486,51 +364,3 @@ typedef uintmax_t uatomic_max_t; #define atomic_delay() asm ("rep; nop") - - -#define atomic_and(mem, mask) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (LOCK_PREFIX "andb %1, %b0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem)); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (LOCK_PREFIX "andw %1, %w0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem)); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (LOCK_PREFIX "andl %1, %0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem)); \ - else \ - abort (); \ - } while (0) - - -#define __arch_or_body(lock, mem, mask) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (lock "orb %1, %b0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "orw %1, %w0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "orl %1, %0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - abort (); \ - } while (0) - -#define atomic_or(mem, mask) __arch_or_body (LOCK_PREFIX, mem, mask) - -#define __arch_or_cprefix \ - "cmpl $0, %%gs:%P3\n\tje 0f\n\tlock\n0:\t" - -#define catomic_or(mem, mask) __arch_or_body (__arch_or_cprefix, mem, mask) diff --git a/sysdeps/i386/i686/memcmp.S b/sysdeps/i386/i686/memcmp.S index 4fa6adea98..4bd5394bec 100644 --- a/sysdeps/i386/i686/memcmp.S +++ b/sysdeps/i386/i686/memcmp.S @@ -1,5 +1,5 @@ /* Compare two memory blocks for differences in the first COUNT bytes. - Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2004, 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 @@ -44,9 +44,13 @@ absolute address. */ \ addl (%ebx,INDEX,4), %ebx +#ifdef HAVE_HIDDEN .section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits .globl __i686.get_pc_thunk.bx .hidden __i686.get_pc_thunk.bx +#else + .text +#endif ALIGN (4) .type __i686.get_pc_thunk.bx,@function __i686.get_pc_thunk.bx: @@ -380,38 +384,38 @@ END (BP_SYM (memcmp)) .section .rodata ALIGN (2) L(table_32bytes) : - .long L(0bytes) - L(table_32bytes) - .long L(1bytes) - L(table_32bytes) - .long L(2bytes) - L(table_32bytes) - .long L(3bytes) - L(table_32bytes) - .long L(4bytes) - L(table_32bytes) - .long L(5bytes) - L(table_32bytes) - .long L(6bytes) - L(table_32bytes) - .long L(7bytes) - L(table_32bytes) - .long L(8bytes) - L(table_32bytes) - .long L(9bytes) - L(table_32bytes) - .long L(10bytes) - L(table_32bytes) - .long L(11bytes) - L(table_32bytes) - .long L(12bytes) - L(table_32bytes) - .long L(13bytes) - L(table_32bytes) - .long L(14bytes) - L(table_32bytes) - .long L(15bytes) - L(table_32bytes) - .long L(16bytes) - L(table_32bytes) - .long L(17bytes) - L(table_32bytes) - .long L(18bytes) - L(table_32bytes) - .long L(19bytes) - L(table_32bytes) - .long L(20bytes) - L(table_32bytes) - .long L(21bytes) - L(table_32bytes) - .long L(22bytes) - L(table_32bytes) - .long L(23bytes) - L(table_32bytes) - .long L(24bytes) - L(table_32bytes) - .long L(25bytes) - L(table_32bytes) - .long L(26bytes) - L(table_32bytes) - .long L(27bytes) - L(table_32bytes) - .long L(28bytes) - L(table_32bytes) - .long L(29bytes) - L(table_32bytes) - .long L(30bytes) - L(table_32bytes) - .long L(31bytes) - L(table_32bytes) + .long L(0bytes) - . + 0x0 + .long L(1bytes) - . + 0x4 + .long L(2bytes) - . + 0x8 + .long L(3bytes) - . + 0xc + .long L(4bytes) - . + 0x10 + .long L(5bytes) - . + 0x14 + .long L(6bytes) - . + 0x18 + .long L(7bytes) - . + 0x1c + .long L(8bytes) - . + 0x20 + .long L(9bytes) - . + 0x24 + .long L(10bytes) - . + 0x28 + .long L(11bytes) - . + 0x2c + .long L(12bytes) - . + 0x30 + .long L(13bytes) - . + 0x34 + .long L(14bytes) - . + 0x38 + .long L(15bytes) - . + 0x3c + .long L(16bytes) - . + 0x40 + .long L(17bytes) - . + 0x44 + .long L(18bytes) - . + 0x48 + .long L(19bytes) - . + 0x4c + .long L(20bytes) - . + 0x50 + .long L(21bytes) - . + 0x54 + .long L(22bytes) - . + 0x58 + .long L(23bytes) - . + 0x5c + .long L(24bytes) - . + 0x60 + .long L(25bytes) - . + 0x64 + .long L(26bytes) - . + 0x68 + .long L(27bytes) - . + 0x6c + .long L(28bytes) - . + 0x70 + .long L(29bytes) - . + 0x74 + .long L(30bytes) - . + 0x78 + .long L(31bytes) - . + 0x7c #undef bcmp diff --git a/sysdeps/i386/ldbl2mpn.c b/sysdeps/i386/ldbl2mpn.c index bf4e4ff43f..01be777270 100644 --- a/sysdeps/i386/ldbl2mpn.c +++ b/sysdeps/i386/ldbl2mpn.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 2000, 2007 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 @@ #include "gmp.h" #include "gmp-impl.h" #include "longlong.h" -#include "ieee754.h" +#include #include #include @@ -46,7 +46,7 @@ __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size, #elif BITS_PER_MP_LIMB == 64 /* Hopefully the compiler will combine the two bitfield extracts and this composition into just the original quadword extract. */ - res_ptr[0] = ((unsigned long int) u.ieee.mantissa0 << 32) | u.ieee.mantissa1; + res_ptr[0] = ((mp_limb_t) u.ieee.mantissa0 << 32) | u.ieee.mantissa1; #define N 1 #else #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" @@ -109,6 +109,13 @@ __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size, } } } + else if (u.ieee.exponent < 0x7fff +#if N == 2 + && res_ptr[0] == 0 +#endif + && res_ptr[N - 1] == 0) + /* Pseudo zero. */ + *expt = 0; return N; } diff --git a/sysdeps/i386/soft-fp/sfp-machine.h b/sysdeps/i386/soft-fp/sfp-machine.h new file mode 100644 index 0000000000..ed71ae418a --- /dev/null +++ b/sysdeps/i386/soft-fp/sfp-machine.h @@ -0,0 +1,89 @@ +#define _FP_W_TYPE_SIZE 32 +#define _FP_W_TYPE unsigned long +#define _FP_WS_TYPE signed long +#define _FP_I_TYPE long + +#define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl) \ + __asm__("addl %5,%1; adcl %3,%0" \ + : "=r"(rh), "=r"(rl) \ + : "%0"(xh), "g"(yh), "%1"(xl), "g"(yl) \ + : "cc") + +#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \ + do { \ + __asm__ volatile("addl %5,%1; adcl %3,%0" \ + : "=r"(r1), "=r"(r0) \ + : "%0"(x1), "g"(y1), "%1"(x0), "g"(y0) \ + : "cc"); \ + __asm__ volatile("adcl %5,%1; adcl %3,%0" \ + : "=r"(r3), "=r"(r2) \ + : "%0"(x3), "g"(y3), "%1"(x2), "g"(y2) \ + : "cc"); \ + } while (0) + +#define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl) \ + __asm__("subl %5,%1; sbbl %4,%0" \ + : "=r"(rh), "=r"(rl) \ + : "0"(xh), "1"(xl), "g"(yh), "g"(yl) \ + : "cc") + +#define __FP_CLZ(r, x) \ + do { \ + __asm__("bsrl %1,%0" : "=r"(r) : "g"(x) : "cc"); \ + r ^= 31; \ + } while (0) + +#define _i386_mul_32_64(rh, rl, x, y) \ + __asm__("mull %2" : "=d"(rh), "=a"(rl) : "%g"(x), "1"(y) : "cc") + +#define _i386_div_64_32(q, r, nh, nl, d) \ + __asm__ ("divl %4" : "=a"(q), "=d"(r) : "0"(nl), "1"(nh), "g"(d) : "cc") + + +#define _FP_MUL_MEAT_S(R,X,Y) \ + _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,_i386_mul_32_64) +#define _FP_MUL_MEAT_D(R,X,Y) \ + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,_i386_mul_32_64) + +#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y) +#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y) + +#define _FP_NANFRAC_S _FP_QNANBIT_S +#define _FP_NANFRAC_D _FP_QNANBIT_D, 0 +#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 +#define _FP_NANSIGN_S 1 +#define _FP_NANSIGN_D 1 +#define _FP_NANSIGN_Q 1 + +#define _FP_KEEPNANFRACP 1 +/* Here is something Intel misdesigned: the specs don't define + the case where we have two NaNs with same mantissas, but + different sign. Different operations pick up different NaNs. + */ +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ + do { \ + if (_FP_FRAC_GT_##wc(X, Y) \ + || (_FP_FRAC_EQ_##wc(X,Y) && (OP == '+' || OP == '*'))) \ + { \ + R##_s = X##_s; \ + _FP_FRAC_COPY_##wc(R,X); \ + } \ + else \ + { \ + R##_s = Y##_s; \ + _FP_FRAC_COPY_##wc(R,Y); \ + } \ + R##_c = FP_CLS_NAN; \ + } while (0) + +#define FP_EX_INVALID (1 << 0) +#define FP_EX_DENORM (1 << 1) +#define FP_EX_DIVZERO (1 << 2) +#define FP_EX_OVERFLOW (1 << 3) +#define FP_EX_UNDERFLOW (1 << 4) +#define FP_EX_INEXACT (1 << 5) + +#define FP_RND_NEAREST 0 +#define FP_RND_ZERO 3 +#define FP_RND_PINF 2 +#define FP_RND_MINF 1 diff --git a/sysdeps/i386/sysdep.h b/sysdeps/i386/sysdep.h index e03a8e926d..2739cb00b3 100644 --- a/sysdeps/i386/sysdep.h +++ b/sysdeps/i386/sysdep.h @@ -1,6 +1,5 @@ /* Assembler macros for i386. - Copyright (C) 1991-93,95,96,98,2002,2003,2005,2006 - Free Software Foundation, Inc. + Copyright (C) 1991-93,95,96,98,2002,2003,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 @@ -133,7 +132,15 @@ lose: SYSCALL_PIC_SETUP \ cfi_adjust_cfa_offset (-4); \ addl $_GLOBAL_OFFSET_TABLE+[.-0b], %ebx; -# define SETUP_PIC_REG(reg) \ +# ifndef HAVE_HIDDEN +# define SETUP_PIC_REG(reg) \ + call 1f; \ + .subsection 1; \ +1:movl (%esp), %e##reg; \ + ret; \ + .previous +# else +# define SETUP_PIC_REG(reg) \ .ifndef __i686.get_pc_thunk.reg; \ .section .gnu.linkonce.t.__i686.get_pc_thunk.reg,"ax",@progbits; \ .globl __i686.get_pc_thunk.reg; \ @@ -146,6 +153,7 @@ __i686.get_pc_thunk.reg: \ .previous; \ .endif; \ call __i686.get_pc_thunk.reg +# endif # define LOAD_PIC_REG(reg) \ SETUP_PIC_REG(reg); addl $_GLOBAL_OFFSET_TABLE_, %e##reg diff --git a/sysdeps/ia64/dl-machine.h b/sysdeps/ia64/dl-machine.h index 61b4ea99a7..55349690e3 100644 --- a/sysdeps/ia64/dl-machine.h +++ b/sysdeps/ia64/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. IA-64 version. - Copyright (C) 1995-1997, 2000-2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-1997, 2000-2004, 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 @@ -311,7 +311,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) of the main executable's symbols, as for a COPY reloc, which we don't use. */ /* ??? Ignore *MSB for now. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) #define elf_machine_type_class(type) \ (((type) == R_IA64_IPLTLSB || (type) == R_IA64_DTPMOD64LSB \ || (type) == R_IA64_DTPREL64LSB || (type) == R_IA64_TPREL64LSB) \ @@ -432,7 +432,7 @@ elf_machine_rela (struct link_map *map, value = _dl_make_fptr (sym_map, sym, value); else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_PCREL64LSB)) value -= (Elf64_Addr) reloc_addr & -16; -#if !defined RTLD_BOOTSTRAP || defined USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || defined USE___THREAD) else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPMOD64LSB)) # ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always index 1. */ diff --git a/sysdeps/ia64/fpu/fesetround.c b/sysdeps/ia64/fpu/fesetround.c index 351bcc2f10..13801c848b 100644 --- a/sysdeps/ia64/fpu/fesetround.c +++ b/sysdeps/ia64/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 1999, 2000, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Christian Boissat , 1999. @@ -26,7 +26,7 @@ fesetround (int round) fenv_t fpsr; if (round & ~3) - return 0; + return 1; /* Get the current state. */ __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr)); @@ -37,6 +37,6 @@ fesetround (int round) /* Put the new state in effect. */ __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (fpsr) : "memory"); - return 1; + return 0; } libm_hidden_def (fesetround) diff --git a/sysdeps/ia64/ldbl2mpn.c b/sysdeps/ia64/ldbl2mpn.c new file mode 100644 index 0000000000..641b789cd4 --- /dev/null +++ b/sysdeps/ia64/ldbl2mpn.c @@ -0,0 +1 @@ +#include "../i386/ldbl2mpn.c" diff --git a/sysdeps/ia64/libc-tls.c b/sysdeps/ia64/libc-tls.c index 9751284008..2c0eeae86f 100644 --- a/sysdeps/ia64/libc-tls.c +++ b/sysdeps/ia64/libc-tls.c @@ -1,5 +1,5 @@ /* Thread-local storage handling in the ELF dynamic linker. IA-64 version. - Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 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,6 +19,8 @@ #include +#if USE_TLS + /* On IA-64, as it lacks linker optimizations, __tls_get_addr can be called even in statically linked binaries. In this case module must be always 1 and PT_TLS segment @@ -30,3 +32,5 @@ __tls_get_addr (size_t m, size_t offset) dtv_t *dtv = THREAD_DTV (); return (char *) dtv[1].pointer.val + offset; } + +#endif diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c index d9bd8b479f..1e159f2c0b 100644 --- a/sysdeps/ieee754/dbl-64/e_pow.c +++ b/sysdeps/ieee754/dbl-64/e_pow.c @@ -106,20 +106,28 @@ double __ieee754_pow(double x, double y) { else return y < 0 ? 1.0/ABS(x) : 0.0; /* return 0 */ } + + qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */ + qy = v.i[HIGH_HALF]&0x7fffffff; /* no sign */ + + if (qx >= 0x7ff00000 && (qx > 0x7ff00000 || u.i[LOW_HALF] != 0)) return NaNQ.x; + if (qy >= 0x7ff00000 && (qy > 0x7ff00000 || v.i[LOW_HALF] != 0)) + return x == 1.0 ? 1.0 : NaNQ.x; + /* if x<0 */ if (u.i[HIGH_HALF] < 0) { k = checkint(y); if (k==0) { - if ((v.i[HIGH_HALF] & 0x7fffffff) == 0x7ff00000 && v.i[LOW_HALF] == 0) { + if (qy == 0x7ff00000) { if (x == -1.0) return 1.0; else if (x > -1.0) return v.i[HIGH_HALF] < 0 ? INF.x : 0.0; else return v.i[HIGH_HALF] < 0 ? 0.0 : INF.x; } - else if (u.i[HIGH_HALF] == 0xfff00000 && u.i[LOW_HALF] == 0) + else if (qx == 0x7ff00000) return y < 0 ? 0.0 : INF.x; return NaNQ.x; /* y not integer and x<0 */ } - else if (u.i[HIGH_HALF] == 0xfff00000 && u.i[LOW_HALF] == 0) + else if (qx == 0x7ff00000) { if (k < 0) return y < 0 ? nZERO.x : nINF.x; @@ -129,14 +137,6 @@ double __ieee754_pow(double x, double y) { return (k==1)?__ieee754_pow(-x,y):-__ieee754_pow(-x,y); /* if y even or odd */ } /* x>0 */ - qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */ - qy = v.i[HIGH_HALF]&0x7fffffff; /* no sign */ - - if (qx > 0x7ff00000 || (qx == 0x7ff00000 && u.i[LOW_HALF] != 0)) return NaNQ.x; - /* if 0 0x7ff00000 || (qy == 0x7ff00000 && v.i[LOW_HALF] != 0)) - return x == 1.0 ? 1.0 : NaNQ.x; - /* if y<2^-0x7fe */ if (qx == 0x7ff00000) /* x= 2^-0x3ff */ {if (y == 0) return NaNQ.x; diff --git a/sysdeps/ieee754/flt-32/s_nextafterf.c b/sysdeps/ieee754/flt-32/s_nextafterf.c index e1568e24c9..600c14621f 100644 --- a/sysdeps/ieee754/flt-32/s_nextafterf.c +++ b/sysdeps/ieee754/flt-32/s_nextafterf.c @@ -18,7 +18,7 @@ static char rcsid[] = "$NetBSD: s_nextafterf.c,v 1.4 1995/05/10 20:48:01 jtc Exp #endif #include "math.h" -#include "math_private.h" +#include #include #ifdef __STDC__ @@ -40,9 +40,12 @@ static char rcsid[] = "$NetBSD: s_nextafterf.c,v 1.4 1995/05/10 20:48:01 jtc Exp return x+y; if(x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ + float u; SET_FLOAT_WORD(x,(hy&0x80000000)|1);/* return +-minsubnormal */ - y = x*x; - if(y==x) return y; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u*u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(hx>hy) { /* x > y, x -= ulp */ @@ -61,15 +64,12 @@ static char rcsid[] = "$NetBSD: s_nextafterf.c,v 1.4 1995/05/10 20:48:01 jtc Exp if(hy>=0x7f800000) { x = x+x; /* overflow */ if (FLT_EVAL_METHOD != 0) - asm ("" : "=m"(x) : "m"(x)); + asm ("" : "+m"(x)); return x; /* overflow */ } - if(hy<0x00800000) { /* underflow */ - y = x*x; - if(y!=x) { /* raise underflow flag */ - SET_FLOAT_WORD(y,hx); - return y; - } + if(hy<0x00800000) { + float u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_FLOAT_WORD(x,hx); return x; diff --git a/sysdeps/ieee754/ldbl-128/s_nextafterl.c b/sysdeps/ieee754/ldbl-128/s_nextafterl.c index d3df668178..7bc869a518 100644 --- a/sysdeps/ieee754/ldbl-128/s_nextafterl.c +++ b/sysdeps/ieee754/ldbl-128/s_nextafterl.c @@ -25,7 +25,7 @@ static char rcsid[] = "$NetBSD: $"; */ #include "math.h" -#include "math_private.h" +#include #ifdef __STDC__ long double __nextafterl(long double x, long double y) @@ -47,9 +47,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if(x==y) return y; /* x=y, return y */ if((ix|lx)==0) { /* x == 0 */ + long double u; SET_LDOUBLE_WORDS64(x,hy&0x8000000000000000ULL,1);/* return +-minsubnormal */ - y = x*x; - if(y==x) return y; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(hx>hy||((hx==hy)&&(lx>ly))) { /* x > y, x -= ulp */ @@ -70,12 +73,9 @@ static char rcsid[] = "$NetBSD: $"; } hy = hx&0x7fff000000000000LL; if(hy==0x7fff000000000000LL) return x+x;/* overflow */ - if(hy==0) { /* underflow */ - y = x*x; - if(y!=x) { /* raise underflow flag */ - SET_LDOUBLE_WORDS64(y,hx,lx); - return y; - } + if(hy==0) { + long double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_LDOUBLE_WORDS64(x,hx,lx); return x; diff --git a/sysdeps/ieee754/ldbl-128/s_nexttoward.c b/sysdeps/ieee754/ldbl-128/s_nexttoward.c index 553e401973..178505c58f 100644 --- a/sysdeps/ieee754/ldbl-128/s_nexttoward.c +++ b/sysdeps/ieee754/ldbl-128/s_nexttoward.c @@ -26,7 +26,7 @@ static char rcsid[] = "$NetBSD: $"; */ #include "math.h" -#include "math_private.h" +#include #include #ifdef __STDC__ @@ -53,10 +53,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if((long double) x==y) return y; /* x=y, return y */ if((ix|lx)==0) { /* x == 0 */ - double x2; + double u; INSERT_WORDS(x,(u_int32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if (hy<0||(ix>>20)>(iy>>48)-0x3c00 @@ -87,16 +89,13 @@ static char rcsid[] = "$NetBSD: $"; if(hy>=0x7ff00000) { x = x+x; /* overflow */ if (FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1) - /* Force conversion to float. */ - asm ("" : "=m"(x) : "m"(x)); + /* Force conversion to double. */ + asm ("" : "+m"(x)); return x; } - if(hy<0x00100000) { /* underflow */ - double x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - INSERT_WORDS(x2,hx,lx); - return x2; - } + if(hy<0x00100000) { + double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } INSERT_WORDS(x,hx,lx); return x; diff --git a/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c b/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c index 8a2d45e2d8..21d1e62dab 100644 --- a/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c +++ b/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2006 +/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -31,19 +31,20 @@ long double __mpn_construct_long_double (mp_srcptr frac_ptr, int expt, int sign) { union ibm_extended_long_double u; - unsigned long hidden2, lzcount; + unsigned long lzcount; unsigned long long hi, lo; + int exponent2; u.ieee.negative = sign; u.ieee.negative2 = sign; u.ieee.exponent = expt + IBM_EXTENDED_LONG_DOUBLE_BIAS; - u.ieee.exponent2 = expt - 53 + IBM_EXTENDED_LONG_DOUBLE_BIAS; + u.ieee.exponent2 = 0; + exponent2 = expt - 53 + IBM_EXTENDED_LONG_DOUBLE_BIAS; #if BITS_PER_MP_LIMB == 32 /* The low order 53 bits (52 + hidden) go into the lower double */ lo = frac_ptr[0]; lo |= (frac_ptr[1] & ((1LL << (53 - 32)) - 1)) << 32; - hidden2 = (frac_ptr[1] >> (52 - 32)) & ((mp_limb_t) 1); /* The high order 53 bits (52 + hidden) go into the upper double */ hi = (frac_ptr[1] >> (53 - 32)) & ((1 << 11) - 1); hi |= ((unsigned long long) frac_ptr[2]) << 11; @@ -51,7 +52,6 @@ __mpn_construct_long_double (mp_srcptr frac_ptr, int expt, int sign) #elif BITS_PER_MP_LIMB == 64 /* The low order 53 bits (52 + hidden) go into the lower double */ lo = frac_ptr[0] & (((mp_limb_t) 1 << 53) - 1); - hidden2 = (frac_ptr[0] >> 52) & ((mp_limb_t) 1); /* The high order 53 bits (52 + hidden) go into the upper double */ hi = (frac_ptr[0] >> 53) & (((mp_limb_t) 1 << 11) - 1); hi |= (frac_ptr[1] << 11); @@ -59,14 +59,62 @@ __mpn_construct_long_double (mp_srcptr frac_ptr, int expt, int sign) #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" #endif + if ((hi & (1LL << 52)) == 0 && (hi | lo) != 0) + { + /* denormal number */ + unsigned long long val = hi ? hi : lo; + + if (sizeof (val) == sizeof (long)) + lzcount = __builtin_clzl (val); + else if ((val >> 32) != 0) + lzcount = __builtin_clzl ((long) (val >> 32)); + else + lzcount = __builtin_clzl ((long) val) + 32; + if (hi) + lzcount = lzcount - 11; + else + lzcount = lzcount + 42; + + if (lzcount > u.ieee.exponent) + { + lzcount = u.ieee.exponent; + u.ieee.exponent = 0; + exponent2 -= lzcount; + } + else + { + u.ieee.exponent -= (lzcount - 1); + exponent2 -= (lzcount - 1); + } + + if (lzcount <= 53) + { + hi = (hi << lzcount) | (lo >> (53 - lzcount)); + lo = (lo << lzcount) & ((1LL << 53) - 1); + } + else + { + hi = lo << (lzcount - 53); + lo = 0; + } + } + if (lo != 0L) { /* hidden2 bit of low double controls rounding of the high double. - If hidden2 is '1' then round up hi and adjust lo (2nd mantissa) + If hidden2 is '1' and either the explicit mantissa is non-zero + or hi is odd, then round up hi and adjust lo (2nd mantissa) plus change the sign of the low double to compensate. */ - if (hidden2) + if ((lo & (1LL << 52)) != 0 + && ((hi & 1) != 0 || (lo & ((1LL << 52) - 1)))) { hi++; + if ((hi & ((1LL << 52) - 1)) == 0) + { + if ((hi & (1LL << 53)) != 0) + hi -= 1LL << 52; + u.ieee.exponent++; + } u.ieee.negative2 = !sign; lo = (1LL << 53) - lo; } @@ -85,17 +133,18 @@ __mpn_construct_long_double (mp_srcptr frac_ptr, int expt, int sign) if (lzcount > 0) { lo = lo << lzcount; - u.ieee.exponent2 = u.ieee.exponent2 - lzcount; + exponent2 = exponent2 - lzcount; } + if (exponent2 > 0) + u.ieee.exponent2 = exponent2; + else + lo >>= 1 - exponent2; } else - { - u.ieee.negative2 = 0; - u.ieee.exponent2 = 0; - } + u.ieee.negative2 = 0; u.ieee.mantissa3 = lo & 0xffffffffLL; - u.ieee.mantissa2 = (lo >> 32) & 0xffffff; + u.ieee.mantissa2 = (lo >> 32) & 0xfffff; u.ieee.mantissa1 = hi & 0xffffffffLL; u.ieee.mantissa0 = (hi >> 32) & ((1LL << (LDBL_MANT_DIG - 86)) - 1); diff --git a/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c b/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c index 2a7b70fabf..b2ad25e31f 100644 --- a/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c +++ b/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c @@ -1,5 +1,5 @@ /* Print floating point number in hexadecimal notation according to ISO C99. - Copyright (C) 1997,1998,1999,2000,2001,2002,2004,2006 + Copyright (C) 1997,1998,1999,2000,2001,2002,2004,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -35,21 +35,24 @@ do { \ \ lo = ((long long)eldbl.ieee.mantissa2 << 32) | eldbl.ieee.mantissa3; \ hi = ((long long)eldbl.ieee.mantissa0 << 32) | eldbl.ieee.mantissa1; \ - /* If the lower double is not a denomal or zero then set the hidden \ - 53rd bit. */ \ - if (eldbl.ieee.exponent2 > 0x001) \ - { \ - lo |= (1ULL << 52); \ - lo = lo << 7; /* pre-shift lo to match ieee854. */ \ - /* The lower double is normalized separately from the upper. We \ - may need to adjust the lower manitissa to reflect this. */ \ - ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2; \ - if (ediff > 53) \ - lo = lo >> (ediff-53); \ - } \ - \ - if ((eldbl.ieee.negative != eldbl.ieee.negative2) \ - && ((eldbl.ieee.exponent2 != 0) && (lo != 0L))) \ + lo <<= 7; /* pre-shift lo to match ieee854. */ \ + /* If the lower double is not a denomal or zero then set the hidden \ + 53rd bit. */ \ + if (eldbl.ieee.exponent2 != 0) \ + lo |= (1ULL << (52 + 7)); \ + else \ + lo <<= 1; \ + /* The lower double is normalized separately from the upper. We \ + may need to adjust the lower manitissa to reflect this. */ \ + ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2; \ + if (ediff > 53 + 63) \ + lo = 0; \ + else if (ediff > 53) \ + lo = lo >> (ediff - 53); \ + else if (eldbl.ieee.exponent2 == 0 && ediff < 53) \ + lo = lo << (53 - ediff); \ + if (eldbl.ieee.negative != eldbl.ieee.negative2 \ + && (eldbl.ieee.exponent2 != 0 || lo != 0L)) \ { \ lo = (1ULL << 60) - lo; \ if (hi == 0L) \ diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c b/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c index 3ca178a3c5..6999abc250 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c @@ -1,5 +1,5 @@ /* Return classification value corresponding to argument. - Copyright (C) 1997,1999,2002,2004,2006 Free Software Foundation, Inc. + Copyright (C) 1997,1999,2002,2004,2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997 and Jakub Jelinek , 1999. @@ -30,14 +30,16 @@ * -NaN fffn nnnn nnnn nnnn xxxx xxxx xxxx xxxx * +Inf 7ff0 0000 0000 0000 xxxx xxxx xxxx xxxx * -Inf fff0 0000 0000 0000 xxxx xxxx xxxx xxxx - * +0 0000 0000 0000 0000 - * -0 8000 0000 0000 0000 - * +normal 001n nnnn nnnn nnnn (smallest) - * -normal 801n nnnn nnnn nnnn (smallest) - * +normal 7fen nnnn nnnn nnnn (largest) - * -normal ffen nnnn nnnn nnnn (largest) - * +denorm 000n nnnn nnnn nnnn - * -denorm 800n nnnn nnnn nnnn + * +0 0000 0000 0000 0000 xxxx xxxx xxxx xxxx + * -0 8000 0000 0000 0000 xxxx xxxx xxxx xxxx + * +normal 0360 0000 0000 0000 0000 0000 0000 0000 (smallest) + * -normal 8360 0000 0000 0000 0000 0000 0000 0000 (smallest) + * +normal 7fef ffff ffff ffff 7c8f ffff ffff fffe (largest) + * +normal ffef ffff ffff ffff fc8f ffff ffff fffe (largest) + * +denorm 0360 0000 0000 0000 8000 0000 0000 0001 (largest) + * -denorm 8360 0000 0000 0000 0000 0000 0000 0001 (largest) + * +denorm 000n nnnn nnnn nnnn xxxx xxxx xxxx xxxx + * -denorm 800n nnnn nnnn nnnn xxxx xxxx xxxx xxxx */ int @@ -59,12 +61,23 @@ ___fpclassifyl (long double x) /* +/-zero or +/- normal or +/- denormal */ if (hx & 0x7fffffffffffffffULL) { /* +/- normal or +/- denormal */ - if ((hx & 0x7ff0000000000000ULL) >= 0x0360000000000000ULL) { + if ((hx & 0x7ff0000000000000ULL) > 0x0360000000000000ULL) { /* +/- normal */ retval = FP_NORMAL; } else { - /* +/- denormal */ - retval = FP_SUBNORMAL; + if ((hx & 0x7ff0000000000000ULL) == 0x0360000000000000ULL) { + if ((lx & 0x7fffffffffffffff) /* lower is non-zero */ + && ((lx^hx) & 0x8000000000000000ULL)) { /* and sign differs */ + /* +/- denormal */ + retval = FP_SUBNORMAL; + } else { + /* +/- normal */ + retval = FP_NORMAL; + } + } else { + /* +/- denormal */ + retval = FP_SUBNORMAL; + } } } else { /* +/- zero */ diff --git a/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c b/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c index e35ce50829..39d0e6a5e3 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c @@ -24,8 +24,8 @@ static char rcsid[] = "$NetBSD: $"; * Special cases: */ -#include "math.h" -#include "math_private.h" +#include +#include #include #ifdef __STDC__ @@ -35,7 +35,7 @@ static char rcsid[] = "$NetBSD: $"; long double x,y; #endif { - int64_t hx,hy,ihx,ihy,ilx,ily; + int64_t hx,hy,ihx,ihy,ilx; u_int64_t lx,ly; GET_LDOUBLE_WORDS64(hx,lx,x); @@ -43,7 +43,6 @@ static char rcsid[] = "$NetBSD: $"; ihx = hx&0x7fffffffffffffffLL; /* |hx| */ ilx = lx&0x7fffffffffffffffLL; /* |lx| */ ihy = hy&0x7fffffffffffffffLL; /* |hy| */ - ily = ly&0x7fffffffffffffffLL; /* |ly| */ if((((ihx&0x7ff0000000000000LL)==0x7ff0000000000000LL)&& ((ihx&0x000fffffffffffffLL)!=0)) || /* x is nan */ @@ -53,55 +52,67 @@ static char rcsid[] = "$NetBSD: $"; if(x==y) return y; /* x=y, return y */ if(ihx == 0 && ilx == 0) { /* x == 0 */ - SET_LDOUBLE_WORDS64(x,hy&0x8000000000000000ULL,1);/* return +-minsubnormal */ - y = x*x; - if(y==x) return y; else return x; /* raise underflow flag */ + long double u; + hy = (hy & 0x8000000000000000ULL) | 1; + SET_LDOUBLE_WORDS64(x,hy,0ULL);/* return +-minsubnormal */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } - if(ihx>=0) { /* x > 0 */ - if(ihx>ihy||((ihx==ihy)&&(ilx>ily))) { /* x > y, x -= ulp */ - - if(ilx==0) - hx--; - else - lx--; - } else { /* x < y, x += ulp */ - if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) - { - SET_LDOUBLE_WORDS64(x,0x7ff0000000000000,0x8000000000000000); - return x; - } - else if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) - { - SET_LDOUBLE_WORDS64(x,0xfff0000000000000,0x8000000000000000); - return x; - } - else if((lx&0x7fffffffffffffff)==0) hx++; - else - lx++; + + long double u; + if(x > y) { /* x > y, x -= ulp */ + if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) + return x+x; /* overflow, return -inf */ + if (hx >= 0x7ff0000000000000LL) { + SET_LDOUBLE_WORDS64(u,0x7fefffffffffffffLL,0x7c8ffffffffffffeLL); + return u; } - } else { /* x < 0 */ - if(ihy>=0||ihx>ihy||((ihx==ihy)&&(ilx>ily))){/* x < y, x -= ulp */ - if((lx&0x7fffffffffffffff)==0) - hx--; - else - lx--; - } else { /* x > y, x += ulp */ - if((lx&0x7fffffffffffffff)==0) hx++; - else - lx++; + if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ + u = math_opt_barrier (x); + x -= __LDBL_DENORM_MIN__; + if (ihx < 0x0360000000000000LL + || (hx > 0 && (int64_t) lx <= 0) + || (hx < 0 && (int64_t) lx > 1)) { + u = u * u; + math_force_eval (u); /* raise underflow flag */ + } + return x; } - } - hy = hx&0x7ff0000000000000LL; - if(hy==0x7ff0000000000000LL) return x+x;/* overflow */ - if(hy==0) { /* underflow */ - y = x*x; - if(y!=x) { /* raise underflow flag */ - SET_LDOUBLE_WORDS64(y,hx,lx); - return y; + if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ + SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); + u *= 0x1.0000000000000p-105L; + } else + SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); + return x - u; + } else { /* x < y, x += ulp */ + if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) + return x+x; /* overflow, return +inf */ + if ((u_int64_t) hx >= 0xfff0000000000000ULL) { + SET_LDOUBLE_WORDS64(u,0xffefffffffffffffLL,0xfc8ffffffffffffeLL); + return u; + } + if(ihx <= 0x0360000000000000LL) { /* x <= LDBL_MIN */ + u = math_opt_barrier (x); + x += __LDBL_DENORM_MIN__; + if (ihx < 0x0360000000000000LL + || (hx > 0 && (int64_t) lx < 0 && lx != 0x8000000000000001LL) + || (hx < 0 && (int64_t) lx >= 0)) { + u = u * u; + math_force_eval (u); /* raise underflow flag */ + } + if (x == 0.0L) /* handle negative __LDBL_DENORM_MIN__ case */ + x = -0.0L; + return x; } + if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */ + SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL); + u *= 0x1.0000000000000p-105L; + } else + SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL); + return x + u; } - SET_LDOUBLE_WORDS64(x,hx,lx); - return x; } strong_alias (__nextafterl, __nexttowardl) long_double_symbol (libm, __nextafterl, nextafterl); diff --git a/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c b/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c index 3335100592..e2f6521f57 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_nexttoward.c @@ -26,7 +26,7 @@ static char rcsid[] = "$NetBSD: $"; */ #include "math.h" -#include "math_private.h" +#include #include #include @@ -55,10 +55,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if((long double) x==y) return y; /* x=y, return y */ if((ix|lx)==0) { /* x == 0 */ - double x2; + double u; INSERT_WORDS(x,(u_int32_t)((hy>>32)&0x80000000),1);/* return +-minsub */ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if (hy<0||(ix>>20)>(iy>>52) @@ -89,16 +91,13 @@ static char rcsid[] = "$NetBSD: $"; if(hy>=0x7ff00000) { x = x+x; /* overflow */ if (FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1) - /* Force conversion to float. */ - asm ("" : "=m"(x) : "m"(x)); + /* Force conversion to double. */ + asm ("" : "+m"(x)); return x; } - if(hy<0x00100000) { /* underflow */ - double x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - INSERT_WORDS(x2,hx,lx); - return x2; - } + if(hy<0x00100000) { + double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } INSERT_WORDS(x,hx,lx); return x; diff --git a/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c b/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c index a9373ff822..cf655fad16 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c @@ -19,8 +19,9 @@ static char rcsid[] = "$NetBSD: $"; #endif #include "math.h" -#include "math_private.h" +#include #include +#include #ifdef __STDC__ float __nexttowardf(float x, long double y) @@ -46,10 +47,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if((long double) x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ - float x2; + float u; SET_FLOAT_WORD(x,(u_int32_t)((hy>>32)&0x80000000)|1);/* return +-minsub*/ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(hy<0||(ix>>23)>(iy>>52)-0x380 @@ -69,13 +72,16 @@ static char rcsid[] = "$NetBSD: $"; } } hy = hx&0x7f800000; - if(hy>=0x7f800000) return x+x; /* overflow */ + if(hy>=0x7f800000) { + x = x+x; /* overflow */ + if (FLT_EVAL_METHOD != 0) + /* Force conversion to float. */ + asm ("" : "+m"(x)); + return x; + } if(hy<0x00800000) { /* underflow */ - float x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - SET_FLOAT_WORD(x2,hx); - return x2; - } + float u = x*x; + math_force_eval (u); /* raise underflow flag */ } SET_FLOAT_WORD(x,hx); return x; diff --git a/sysdeps/ieee754/ldbl-96/s_nextafterl.c b/sysdeps/ieee754/ldbl-96/s_nextafterl.c index 1798261b28..ed0877d6dd 100644 --- a/sysdeps/ieee754/ldbl-96/s_nextafterl.c +++ b/sysdeps/ieee754/ldbl-96/s_nextafterl.c @@ -26,7 +26,7 @@ static char rcsid[] = "$NetBSD: $"; */ #include "math.h" -#include "math_private.h" +#include #ifdef __STDC__ long double __nextafterl(long double x, long double y) @@ -48,9 +48,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if(x==y) return y; /* x=y, return y */ if((ix|hx|lx)==0) { /* x == 0 */ + long double u; SET_LDOUBLE_WORDS(x,esy&0x8000,0,1);/* return +-minsubnormal */ - y = x*x; - if(y==x) return y; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(esx<0x8000) { /* x > 0 */ if(ix>iy||((ix==iy) && (hx>hy||((hx==hy)&&(lx>ly))))) { @@ -85,13 +88,10 @@ static char rcsid[] = "$NetBSD: $"; } } esy = esx&0x7fff; - if(esy==0x7fff) return x+x; /* overflow */ - if(esy==0) { /* underflow */ - y = x*x; - if(y!=x) { /* raise underflow flag */ - SET_LDOUBLE_WORDS(y,esx,hx,lx); - return y; - } + if(esy==0x7fff) return x+x; /* overflow */ + if(esy==0) { + long double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_LDOUBLE_WORDS(x,esx,hx,lx); return x; diff --git a/sysdeps/ieee754/ldbl-96/s_nexttoward.c b/sysdeps/ieee754/ldbl-96/s_nexttoward.c index 7945cb5cb1..e30438482c 100644 --- a/sysdeps/ieee754/ldbl-96/s_nexttoward.c +++ b/sysdeps/ieee754/ldbl-96/s_nexttoward.c @@ -26,7 +26,7 @@ static char rcsid[] = "$NetBSD: $"; */ #include "math.h" -#include "math_private.h" +#include #include #ifdef __STDC__ @@ -50,10 +50,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if((long double) x==y) return y; /* x=y, return y */ if((ix|lx)==0) { /* x == 0 */ - double x2; + double u; INSERT_WORDS(x,(esy&0x8000)<<16,1); /* return +-minsub */ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if (esy>=0x8000||((ix>>20)&0x7ff)>iy-0x3c00 @@ -84,16 +86,13 @@ static char rcsid[] = "$NetBSD: $"; if(hy>=0x7ff00000) { x = x+x; /* overflow */ if (FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1) - /* Force conversion to float. */ - asm ("" : "=m"(x) : "m"(x)); + /* Force conversion to double. */ + asm ("" : "+m"(x)); return x; } - if(hy<0x00100000) { /* underflow */ - double x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - INSERT_WORDS(x2,hx,lx); - return x2; - } + if(hy<0x00100000) { + double u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } INSERT_WORDS(x,hx,lx); return x; diff --git a/sysdeps/ieee754/ldbl-96/s_nexttowardf.c b/sysdeps/ieee754/ldbl-96/s_nexttowardf.c index a1c38b5d4c..6357975ffc 100644 --- a/sysdeps/ieee754/ldbl-96/s_nexttowardf.c +++ b/sysdeps/ieee754/ldbl-96/s_nexttowardf.c @@ -18,7 +18,8 @@ static char rcsid[] = "$NetBSD: $"; #endif #include "math.h" -#include "math_private.h" +#include +#include #ifdef __STDC__ float __nexttowardf(float x, long double y) @@ -41,10 +42,12 @@ static char rcsid[] = "$NetBSD: $"; return x+y; if((long double) x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ - float x2; + float u; SET_FLOAT_WORD(x,((esy&0x8000)<<16)|1);/* return +-minsub*/ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(esy>=0x8000||((ix>>23)&0xff)>iy-0x3f80 @@ -64,13 +67,16 @@ static char rcsid[] = "$NetBSD: $"; } } hy = hx&0x7f800000; - if(hy>=0x7f800000) return x+x; /* overflow */ - if(hy<0x00800000) { /* underflow */ - float x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - SET_FLOAT_WORD(x2,hx); - return x2; - } + if(hy>=0x7f800000) { + x = x+x; /* overflow */ + if (FLT_EVAL_METHOD != 0) + /* Force conversion to float. */ + asm ("" : "+m"(x)); + return x; + } + if(hy<0x00800000) { + float u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_FLOAT_WORD(x,hx); return x; diff --git a/sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c b/sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c index d52526f719..68027f26fa 100644 --- a/sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c +++ b/sysdeps/ieee754/ldbl-opt/s_nexttowardfd.c @@ -20,7 +20,10 @@ * Special cases: */ +#include +#include #include +#include float __nldbl_nexttowardf(float x, double y); @@ -39,10 +42,12 @@ float __nldbl_nexttowardf(float x, double y) return x+y; if((double) x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ - float x2; + float u; SET_FLOAT_WORD(x,(u_int32_t)(hy&0x80000000)|1);/* return +-minsub*/ - x2 = x*x; - if(x2==x) return x2; else return x; /* raise underflow flag */ + u = math_opt_barrier (x); + u = u * u; + math_force_eval (u); /* raise underflow flag */ + return x; } if(hx>=0) { /* x > 0 */ if(hy<0||(ix>>23)>(iy>>20)-0x380 @@ -60,13 +65,16 @@ float __nldbl_nexttowardf(float x, double y) hx += 1; } hy = hx&0x7f800000; - if(hy>=0x7f800000) return x+x; /* overflow */ - if(hy<0x00800000) { /* underflow */ - float x2 = x*x; - if(x2!=x) { /* raise underflow flag */ - SET_FLOAT_WORD(x2,hx); - return x2; - } + if(hy>=0x7f800000) { + x = x+x; /* overflow */ + if (FLT_EVAL_METHOD != 0) + /* Force conversion to float. */ + asm ("" : "+m"(x)); + return x; + } + if(hy<0x00800000) { + float u = x*x; /* underflow */ + math_force_eval (u); /* raise underflow flag */ } SET_FLOAT_WORD(x,hx); return x; diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c index 3288f186e5..fa7da60204 100644 --- a/sysdeps/mach/hurd/fork.c +++ b/sysdeps/mach/hurd/fork.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994,1995,1996,1997,1999,2001,2002,2004,2005,2006 +/* Copyright (C) 1994,1995,1996,1997,1999,2001,2002,2004,2005 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -532,9 +532,11 @@ __fork (void) /* Set the child user thread up to return 1 from the setjmp above. */ _hurd_longjmp_thread_state (&state, env, 1); +#if USE_TLS /* Do special thread setup for TLS if needed. */ if (err = _hurd_tls_fork (thread, &state)) LOSE; +#endif if (err = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR, (natural_t *) &state, statecount)) diff --git a/sysdeps/mach/hurd/futimes.c b/sysdeps/mach/hurd/futimes.c index 4628eee2c3..ca687b8bdf 100644 --- a/sysdeps/mach/hurd/futimes.c +++ b/sysdeps/mach/hurd/futimes.c @@ -1,5 +1,5 @@ /* futimes -- change access and modification times of open file. Hurd version. - Copyright (C) 2002, 2006 Free Software Foundation, Inc. + Copyright (C) 2002 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 @@ -28,24 +28,20 @@ int __futimes (int fd, const struct timeval tvp[2]) { - union tv - { - struct timeval tv; - time_value_t tvt; - }; - const union tv *u = (const union tv *) tvp; - union tv nulltv[2]; + struct timeval timevals[2]; error_t err; if (tvp == NULL) { /* Setting the number of microseconds to `-1' tells the underlying filesystems to use the current time. */ - nulltv[0].tvt.microseconds = nulltv[1].tvt.microseconds = -1; - u = nulltv; + timevals[1].tv_usec = timevals[0].tv_usec = (time_t)-1; + tvp = timevals; } - err = HURD_DPORT_USE (fd, __file_utimes (port, u[0].tvt, u[1].tvt)); + err = HURD_DPORT_USE (fd, __file_utimes (port, + *(time_value_t *) &tvp[0], + *(time_value_t *) &tvp[1])); return err ? __hurd_dfail (fd, err) : 0; } weak_alias (__futimes, futimes) diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h index 972cac57a1..223a47d2f2 100644 --- a/sysdeps/mach/hurd/i386/tls.h +++ b/sysdeps/mach/hurd/i386/tls.h @@ -1,5 +1,5 @@ /* Definitions for thread-local data handling. Hurd/i386 version. - Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 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 @@ -25,6 +25,9 @@ /* Some things really need not be machine-dependent. */ # include +/* Indiciate that TLS support is available. */ +# define USE_TLS 1 + /* The TCB can have any size and the memory following the address the thread pointer points to is unspecified. Allocate the TCB there. */ # define TLS_TCB_AT_TP 1 diff --git a/sysdeps/mach/hurd/lutimes.c b/sysdeps/mach/hurd/lutimes.c index bf5610c467..cf89d8862f 100644 --- a/sysdeps/mach/hurd/lutimes.c +++ b/sysdeps/mach/hurd/lutimes.c @@ -1,5 +1,5 @@ /* lutimes -- change access and modification times of a symlink. Hurd version. - Copyright (C) 2002, 2006 Free Software Foundation, Inc. + Copyright (C) 2002 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 @@ -28,13 +28,7 @@ int __lutimes (const char *file, const struct timeval tvp[2]) { - union tv - { - struct timeval tv; - time_value_t tvt; - }; - const union tv *u = (const union tv *) tvp; - union tv nulltv[2]; + struct timeval timevals[2]; error_t err; file_t port; @@ -42,14 +36,15 @@ __lutimes (const char *file, const struct timeval tvp[2]) { /* Setting the number of microseconds to `-1' tells the underlying filesystems to use the current time. */ - nulltv[0].tvt.microseconds = nulltv[1].tvt.microseconds = -1; - u = nulltv; + timevals[1].tv_usec = timevals[0].tv_usec = (time_t)-1; + tvp = timevals; } port = __file_name_lookup (file, O_NOLINK, 0); if (port == MACH_PORT_NULL) return -1; - err = __file_utimes (port, u[0].tvt, u[1].tvt); + err = __file_utimes (port, + *(time_value_t *) &tvp[0], *(time_value_t *) &tvp[1]); __mach_port_deallocate (__mach_task_self (), port); if (err) return __hurd_fail (err); diff --git a/sysdeps/mach/hurd/utimes.c b/sysdeps/mach/hurd/utimes.c index fdc1427feb..74f3a342f4 100644 --- a/sysdeps/mach/hurd/utimes.c +++ b/sysdeps/mach/hurd/utimes.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1991-1995,1997,1999,2000,2006 - Free Software Foundation, Inc. +/* Copyright (C) 1991-1995, 97, 99, 2000 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 @@ -29,13 +28,7 @@ __utimes (file, tvp) const char *file; const struct timeval tvp[2]; { - union tv - { - struct timeval tv; - time_value_t tvt; - }; - const union tv *u = (const union tv *) tvp; - union tv nulltv[2]; + struct timeval timevals[2]; error_t err; file_t port; @@ -43,17 +36,19 @@ __utimes (file, tvp) { /* Setting the number of microseconds to `-1' tells the underlying filesystems to use the current time. */ - nulltv[0].tvt.microseconds = nulltv[1].tvt.microseconds = -1; - u = nulltv; + timevals[1].tv_usec = timevals[0].tv_usec = (time_t)-1; + tvp = timevals; } port = __file_name_lookup (file, 0, 0); if (port == MACH_PORT_NULL) return -1; - err = __file_utimes (port, u[0].tvt, u[1].tvt); + err = __file_utimes (port, + *(time_value_t *) &tvp[0], *(time_value_t *) &tvp[1]); __mach_port_deallocate (__mach_task_self (), port); if (err) return __hurd_fail (err); return 0; } + weak_alias (__utimes, utimes) diff --git a/sysdeps/posix/euidaccess.c b/sysdeps/posix/euidaccess.c index 76a09d455d..333870cdde 100644 --- a/sysdeps/posix/euidaccess.c +++ b/sysdeps/posix/euidaccess.c @@ -1,5 +1,5 @@ /* Check if effective user id can access file - Copyright (C) 1990,1991,1995-2001,2005 Free Software Foundation, Inc. + Copyright (C) 1990,1991,1995-2001,2005,2007 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 @@ -128,10 +128,6 @@ euidaccess (path, mode) #ifdef _LIBC uid_t euid; gid_t egid; - - if (! __libc_enable_secure) - /* If we are not set-uid or set-gid, access does the same. */ - return __access (path, mode); #else if (have_ids == 0) { @@ -162,6 +158,10 @@ euidaccess (path, mode) /* Now we need the IDs. */ euid = __geteuid (); egid = __getegid (); + + if (__getuid () == euid && __getgid () == egid) + /* If we are not set-uid or set-gid, access does the same. */ + return __access (path, mode); #endif /* The super-user can read and write any file, and execute any file diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index b4966852a7..a7e1459c9c 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -1157,7 +1157,7 @@ get_scope (const struct sockaddr_storage *ss) 169.254/16 and 127/8 are link-local. */ if ((addr[0] == 169 && addr[1] == 254) || addr[0] == 127) scope = 2; - else if (addr[0] == 10 || (addr[0] == 172 && addr[1] == 16) + else if (addr[0] == 10 || (addr[0] == 172 && (addr[1] & 0xf0) == 16) || (addr[0] == 192 && addr[1] == 168)) scope = 5; else @@ -1218,6 +1218,10 @@ static const struct prefixentry default_labels[] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 7, 6 }, { { .in6_u + = { .u6_addr8 = { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, + 32, 7 }, + { { .in6_u = { .u6_addr8 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 0, 1 } @@ -2085,12 +2089,10 @@ getaddrinfo (const char *name, const char *service, if (q->ai_family == PF_INET6 && in6ai != NULL) { - /* See whether the source address is the list of - deprecated or temporary addresses. */ + /* See whether the address is the list of deprecated + or temporary addresses. */ struct in6addrinfo tmp; - struct sockaddr_in6 *sin6p - = (struct sockaddr_in6 *) &results[i].source_addr; - memcpy (tmp.addr, &sin6p->sin6_addr, IN6ADDRSZ); + memcpy (tmp.addr, q->ai_addr, IN6ADDRSZ); struct in6addrinfo *found = bsearch (&tmp, in6ai, in6ailen, sizeof (*in6ai), diff --git a/sysdeps/powerpc/fpu/bits/mathinline.h b/sysdeps/powerpc/fpu/bits/mathinline.h index 04478309d9..aed899e882 100644 --- a/sysdeps/powerpc/fpu/bits/mathinline.h +++ b/sysdeps/powerpc/fpu/bits/mathinline.h @@ -121,4 +121,62 @@ __NTH (fdimf (float __x, float __y)) #endif /* __USE_ISOC99 */ #endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ + +/* This code is used internally in the GNU libc. */ +#ifdef __LIBC_INTERNAL_MATH_INLINES + +#include +#include +#include + +# if __WORDSIZE == 64 || defined _ARCH_PWR4 +# define __CPU_HAS_FSQRT 1 +# else +# define __CPU_HAS_FSQRT ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0) +# endif + +extern double __slow_ieee754_sqrt (double); +__MATH_INLINE double +__NTH (__ieee754_sqrt (double __x)) +{ + double __z; + + /* If the CPU is 64-bit we can use the optional FP instructions. */ + if (__CPU_HAS_FSQRT) + { + /* Volatile is required to prevent the compiler from moving the + fsqrt instruction above the branch. */ + __asm __volatile ( + " fsqrt %0,%1\n" + : "=f" (__z) + : "f" (__x)); + } + else + __z = __slow_ieee754_sqrt(__x); + + return __z; +} + +extern float __slow_ieee754_sqrtf (float); +__MATH_INLINE float +__NTH (__ieee754_sqrtf (float __x)) +{ + float __z; + + /* If the CPU is 64-bit we can use the optional FP instructions. */ + if (__CPU_HAS_FSQRT) + { + /* Volatile is required to prevent the compiler from moving the + fsqrts instruction above the branch. */ + __asm __volatile ( + " fsqrts %0,%1\n" + : "=f" (__z) + : "f" (__x)); + } + else + __z = __slow_ieee754_sqrtf(__x); + + return __z; +} +#endif /* __LIBC_INTERNAL_MATH_INLINES */ #endif /* __GNUC__ && !_SOFT_FLOAT */ diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h deleted file mode 100644 index 90021c6d3c..0000000000 --- a/sysdeps/powerpc/fpu/math_private.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Private inline math functions for powerpc. - Copyright (C) 2006 - Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - 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., 51 Franklin St - Fifth Floor, Boston, - MA 02110-1301 USA */ - -#ifndef _PPC_MATH_PRIVATE_H_ -#define _PPC_MATH_PRIVATE_H_ - -#include -#include -#include - -# if __WORDSIZE == 64 || defined _ARCH_PWR4 -# define __CPU_HAS_FSQRT 1 -# else -# define __CPU_HAS_FSQRT ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0) -# endif - -# ifndef __LIBC_INTERNAL_MATH_INLINES -extern double __slow_ieee754_sqrt (double); -__inline double -__ieee754_sqrt (double __x) -{ - double __z; - - /* If the CPU is 64-bit we can use the optional FP instructions. */ - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrt instruction above the branch. */ - __asm __volatile ( - " fsqrt %0,%1\n" - : "=f" (__z) - : "f" (__x)); - } - else - __z = __slow_ieee754_sqrt(__x); - - return __z; -} - -extern float __slow_ieee754_sqrtf (float); - -__inline float -__ieee754_sqrtf (float __x) -{ - float __z; - - /* If the CPU is 64-bit we can use the optional FP instructions. */ - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrts instruction above the branch. */ - __asm __volatile ( - " fsqrts %0,%1\n" - : "=f" (__z) - : "f" (__x)); - } - else - __z = __slow_ieee754_sqrtf(__x); - - return __z; -} -#endif /* __LIBC_INTERNAL_MATH_INLINES */ - -#include - -#endif /* _PPC_MATH_PRIVATE_H_ */ diff --git a/sysdeps/powerpc/powerpc32/dl-machine.c b/sysdeps/powerpc/powerpc32/dl-machine.c index fc460993b1..4120a02382 100644 --- a/sysdeps/powerpc/powerpc32/dl-machine.c +++ b/sysdeps/powerpc/powerpc32/dl-machine.c @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation functions. PowerPC version. - Copyright (C) 1995-2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2003, 2004, 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 @@ -564,12 +564,13 @@ __process_machine_rela (struct link_map *map, } break; +#ifdef USE_TLS #define CHECK_STATIC_TLS(map, sym_map) \ do { \ if (__builtin_expect ((sym_map)->l_tls_offset == NO_TLS_OFFSET, 0)) \ _dl_allocate_static_tls (sym_map); \ } while (0) -#define DO_TLS_RELOC(suffix) \ +# define DO_TLS_RELOC(suffix) \ case R_PPC_DTPREL##suffix: \ /* During relocation all TLS symbols are defined and used. \ Therefore the offset is already correct. */ \ @@ -608,6 +609,7 @@ __process_machine_rela (struct link_map *map, DO_TLS_RELOC (16_LO) DO_TLS_RELOC (16_HI) DO_TLS_RELOC (16_HA) +#endif default: _dl_reloc_bad_type (map, rinfo, 0); diff --git a/sysdeps/powerpc/powerpc32/dl-machine.h b/sysdeps/powerpc/powerpc32/dl-machine.h index a50ffdd1c2..496fa71ecc 100644 --- a/sysdeps/powerpc/powerpc32/dl-machine.h +++ b/sysdeps/powerpc/powerpc32/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. PowerPC version. - Copyright (C) 1995-2002, 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2002, 2003, 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 @@ -138,7 +138,7 @@ __elf_preferred_address(struct link_map *loader, size_t maplength, /* We never want to use a PLT entry as the destination of a reloc, when what is being relocated is a branch. This is partly for efficiency, but mostly so we avoid loops. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) #define elf_machine_type_class(type) \ ((((type) == R_PPC_JMP_SLOT \ || (type) == R_PPC_REL24 \ @@ -330,7 +330,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = value; break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) \ && !defined RESOLVE_CONFLICT_FIND_MAP # ifdef RTLD_BOOTSTRAP # define NOT_BOOTSTRAP 0 @@ -361,7 +361,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = TLS_TPREL_VALUE (sym_map, sym, reloc); } break; -#endif +#endif /* USE_TLS etc. */ case R_PPC_JMP_SLOT: #ifdef RESOLVE_CONFLICT_FIND_MAP diff --git a/sysdeps/powerpc/powerpc32/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h index 88cfe71e0b..8fc624ebd9 100644 --- a/sysdeps/powerpc/powerpc32/sysdep.h +++ b/sysdeps/powerpc/powerpc32/sysdep.h @@ -96,7 +96,7 @@ #endif #if defined SHARED && defined DO_VERSIONING && defined PIC \ - && !defined NO_HIDDEN + && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN # undef HIDDEN_JUMPTARGET # define HIDDEN_JUMPTARGET(name) __GI_##name##@local #endif diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 89a69e1a23..cec271bb3a 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -1,6 +1,7 @@ /* Machine-dependent ELF dynamic relocation inline functions. PowerPC64 version. - Copyright 1995-2005, 2006 Free Software Foundation, Inc. + Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 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 @@ -259,7 +260,7 @@ BODY_PREFIX "_dl_start_user:\n" \ ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) #define elf_machine_type_class(type) \ /* This covers all the TLS relocs, though most won't appear. */ \ (((((type) >= R_PPC64_DTPMOD64 && (type) <= R_PPC64_TPREL16_HIGHESTA) \ @@ -494,7 +495,7 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, *reloc_addr = l_addr + reloc->r_addend; } -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) /* This computes the value used by TPREL* relocs. */ auto inline Elf64_Addr __attribute__ ((always_inline, const)) elf_machine_tprel (struct link_map *map, @@ -561,7 +562,7 @@ elf_machine_rela (struct link_map *map, #endif return; -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) case R_PPC64_DTPMOD64: # ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always index 1. */ @@ -644,7 +645,7 @@ elf_machine_rela (struct link_map *map, value = elf_machine_tprel (map, sym_map, sym, reloc); *(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value); break; -#endif +#endif /* USE_TLS etc. */ #ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */ case R_PPC64_ADDR16_LO_DS: diff --git a/sysdeps/s390/libc-tls.c b/sysdeps/s390/libc-tls.c index 766d565a9c..f177f436e9 100644 --- a/sysdeps/s390/libc-tls.c +++ b/sysdeps/s390/libc-tls.c @@ -1,5 +1,5 @@ /* Thread-local storage handling in the ELF dynamic linker. S390 version. - Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 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 @@ -20,9 +20,11 @@ #include #include +#if USE_TLS + /* On s390, the literal pool entry that refers to __tls_get_offset is not removed, even if all branches that use the literal pool - entry gets removed by TLS optimizations. To get binaries + entry gets removed by TLS optimizations. To get binaries statically linked __tls_get_offset is defined here but aborts if it is used. */ @@ -31,3 +33,5 @@ __tls_get_offset (size_t m, size_t offset) { abort (); } + +#endif diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h index 64bf3423b6..8bbf858fbf 100644 --- a/sysdeps/s390/s390-32/dl-machine.h +++ b/sysdeps/s390/s390-32/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. S390 Version. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Contributed by Carl Pederson & Martin Schwidefsky. This file is part of the GNU C Library. @@ -209,11 +209,17 @@ _dl_start_user:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#define elf_machine_type_class(type) \ +#ifdef USE_TLS +# define elf_machine_type_class(type) \ ((((type) == R_390_JMP_SLOT || (type) == R_390_TLS_DTPMOD \ || (type) == R_390_TLS_DTPOFF || (type) == R_390_TLS_TPOFF) \ * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_390_COPY) * ELF_RTYPE_CLASS_COPY)) +#else +# define elf_machine_type_class(type) \ + ((((type) == R_390_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ + | (((type) == R_390_COPY) * ELF_RTYPE_CLASS_COPY)) +#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_390_JMP_SLOT @@ -309,7 +315,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = value + reloc->r_addend; break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) \ && !defined RESOLVE_CONFLICT_FIND_MAP case R_390_TLS_DTPMOD: # ifdef RTLD_BOOTSTRAP diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h index fa893befdf..5026a2edad 100644 --- a/sysdeps/s390/s390-64/dl-machine.h +++ b/sysdeps/s390/s390-64/dl-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF dynamic relocation inline functions. 64 bit S/390 Version. - Copyright (C) 2001-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -192,11 +192,17 @@ _dl_start_user:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#define elf_machine_type_class(type) \ +#ifdef USE_TLS +# define elf_machine_type_class(type) \ ((((type) == R_390_JMP_SLOT || (type) == R_390_TLS_DTPMOD \ || (type) == R_390_TLS_DTPOFF || (type) == R_390_TLS_TPOFF) \ * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_390_COPY) * ELF_RTYPE_CLASS_COPY)) +#else +# define elf_machine_type_class(type) \ + ((((type) == R_390_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ + | (((type) == R_390_COPY) * ELF_RTYPE_CLASS_COPY)) +#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_390_JMP_SLOT @@ -288,7 +294,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, *reloc_addr = value + reloc->r_addend; break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) \ && !defined RESOLVE_CONFLICT_FIND_MAP case R_390_TLS_DTPMOD: # ifdef RTLD_BOOTSTRAP diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h index 78f70e3880..e73c6d79c3 100644 --- a/sysdeps/sh/dl-machine.h +++ b/sysdeps/sh/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. SH version. - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -208,7 +208,7 @@ __fpscr_values:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) # define elf_machine_type_class(type) \ ((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \ || (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \ @@ -354,7 +354,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, /* These addresses are always aligned. */ *reloc_addr = value; break; -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) /* XXX Remove TLS relocations which are not needed. */ case R_SH_TLS_DTPMOD32: # ifdef RTLD_BOOTSTRAP diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h index 19aac6a7fe..02dabaabb4 100644 --- a/sysdeps/sparc/sparc32/dl-machine.h +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -188,7 +188,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) PLT entries should not be allowed to define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) # define elf_machine_type_class(type) \ ((((type) == R_SPARC_JMP_SLOT \ || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \ @@ -459,7 +459,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, so we can optimize the first instruction of .plt out. */ sparc_fixup_plt (reloc, reloc_addr, value, 0); break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) \ && !defined RESOLVE_CONFLICT_FIND_MAP case R_SPARC_TLS_DTPMOD32: /* Get the information from the link map returned by the diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h index 3eee672912..314a784dbc 100644 --- a/sysdeps/sparc/sparc64/dl-machine.h +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -240,7 +240,7 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc, PLT entries should not be allowed to define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) # define elf_machine_type_class(type) \ ((((type) == R_SPARC_JMP_SLOT \ || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \ @@ -589,7 +589,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, sparc64_fixup_plt (map, reloc, reloc_addr, value, reloc->r_addend, 0); #endif break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) \ && !defined RESOLVE_CONFLICT_FIND_MAP case R_SPARC_TLS_DTPMOD64: /* Get the information from the link map returned by the diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions index 137b44c2b8..7c015b1d62 100644 --- a/sysdeps/unix/sysv/linux/Versions +++ b/sysdeps/unix/sysv/linux/Versions @@ -126,9 +126,6 @@ libc { GLIBC_2.5 { splice; sync_file_range; tee; vmsplice; } - GLIBC_2.6 { - epoll_pwait; - } GLIBC_PRIVATE { # functions used in other libraries __syscall_rt_sigqueueinfo; diff --git a/sysdeps/unix/sysv/linux/bits/statvfs.h b/sysdeps/unix/sysv/linux/bits/statvfs.h index 84717c3d96..cca0871ac0 100644 --- a/sysdeps/unix/sysv/linux/bits/statvfs.h +++ b/sysdeps/unix/sysv/linux/bits/statvfs.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997,1998,2000,2001,2002,2006 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 2000, 2001, 2002 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 @@ -101,9 +101,7 @@ enum # define ST_IMMUTABLE ST_IMMUTABLE ST_NOATIME = 1024, /* Do not update access times. */ # define ST_NOATIME ST_NOATIME - ST_NODIRATIME = 2048, /* Do not update directory access times. */ + ST_NODIRATIME = 2048 /* Do not update directory access times. */ # define ST_NODIRATIME ST_NODIRATIME - ST_RELATIME = 4096 /* Update atime relative to mtime/ctime. */ -# define ST_RELATIME ST_RELATIME #endif /* Use GNU. */ }; diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index 13ccd7acb4..46161a806a 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -1,5 +1,5 @@ /* Determine protocol families for which interfaces exist. Linux version. - Copyright (C) 2003, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2006, 2007 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 @@ -71,17 +71,38 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, memset (&nladdr, '\0', sizeof (nladdr)); nladdr.nl_family = AF_NETLINK; +#ifdef PAGE_SIZE + /* Help the compiler optimize out the malloc call if PAGE_SIZE + is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ + const size_t buf_size = PAGE_SIZE; +#else + const size_t buf_size = __getpagesize (); +#endif + bool use_malloc = false; + char *buf; + + if (__libc_use_alloca (buf_size)) + buf = alloca (buf_size); + else + { + buf = malloc (buf_size); + if (buf != NULL) + use_malloc = true; + else + goto out_fail; + } + + struct iovec iov = { buf, buf_size }; + if (TEMP_FAILURE_RETRY (__sendto (fd, (void *) &req, sizeof (req), 0, (struct sockaddr *) &nladdr, sizeof (nladdr))) < 0) - return -1; + goto out_fail; *seen_ipv4 = false; *seen_ipv6 = false; bool done = false; - char buf[4096]; - struct iovec iov = { buf, sizeof (buf) }; struct in6ailist { struct in6addrinfo info; @@ -101,10 +122,10 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, ssize_t read_len = TEMP_FAILURE_RETRY (__recvmsg (fd, &msg, 0)); if (read_len < 0) - return -1; + goto out_fail; if (msg.msg_flags & MSG_TRUNC) - return -1; + goto out_fail; struct nlmsghdr *nlmh; for (nlmh = (struct nlmsghdr *) buf; @@ -186,7 +207,7 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, { *in6ai = malloc (in6ailistlen * sizeof (**in6ai)); if (*in6ai == NULL) - return -1; + goto out_fail; *in6ailen = in6ailistlen; @@ -198,7 +219,14 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, while (in6ailist != NULL); } + if (use_malloc) + free (buf); return 0; + +out_fail: + if (use_malloc) + free (buf); + return -1; } diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S index f73a4b5195..54524ec120 100644 --- a/sysdeps/unix/sysv/linux/i386/clone.S +++ b/sysdeps/unix/sysv/linux/i386/clone.S @@ -120,9 +120,6 @@ L(pseudo_end): ret L(thread_start): - cfi_startproc; - /* Clearing frame pointer is insufficient, use CFI. */ - cfi_undefined (eip); /* Note: %esi is zero. */ movl %esi,%ebp /* terminate the stack frame */ #ifdef RESET_PID @@ -155,7 +152,6 @@ L(nomoregetpid): jmp L(haspid) .previous #endif - cfi_endproc; cfi_startproc PSEUDO_END (BP_SYM (__clone)) diff --git a/sysdeps/unix/sysv/linux/i386/getgroups.c b/sysdeps/unix/sysv/linux/i386/getgroups.c index f69baf943b..b7a0a4efd4 100644 --- a/sysdeps/unix/sysv/linux/i386/getgroups.c +++ b/sysdeps/unix/sysv/linux/i386/getgroups.c @@ -52,6 +52,8 @@ __getgroups (int n, gid_t *groups) } else { + int i, ngids; + __kernel_gid_t kernel_groups[n = MIN (n, __sysconf (_SC_NGROUPS_MAX))]; # ifdef __NR_getgroups32 if (__libc_missing_32bit_uids <= 0) { @@ -67,9 +69,6 @@ __getgroups (int n, gid_t *groups) } # endif /* __NR_getgroups32 */ - int i, ngids; - __kernel_gid_t kernel_groups[n = MIN (n, __sysconf (_SC_NGROUPS_MAX))]; - ngids = INLINE_SYSCALL (getgroups, 2, n, CHECK_N (kernel_groups, n)); if (n != 0 && ngids > 0) for (i = 0; i < ngids; i++) diff --git a/sysdeps/unix/sysv/linux/i386/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c index b5c1b98573..299574dac4 100644 --- a/sysdeps/unix/sysv/linux/i386/sigaction.c +++ b/sysdeps/unix/sysv/linux/i386/sigaction.c @@ -1,5 +1,5 @@ /* POSIX.1 `sigaction' call for Linux/i386. - Copyright (C) 1991,1995-2000,2002-2005,2006 Free Software Foundation, Inc. + Copyright (C) 1991,1995-2000,2002-2004,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 @@ -46,10 +46,18 @@ int __libc_missing_rt_sigs; /* Using the hidden attribute here does not change the code but it helps to avoid warnings. */ -#ifdef __NR_rt_sigaction +#if defined HAVE_HIDDEN && defined HAVE_VISIBILITY_ATTRIBUTE \ + && !defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE +# ifdef __NR_rt_sigaction extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; -#endif +# endif extern void restore (void) asm ("__restore") attribute_hidden; +#else +# ifdef __NR_rt_sigaction +static void restore_rt (void) asm ("__restore_rt"); +# endif +static void restore (void) asm ("__restore"); +#endif /* If ACT is not NULL, change the action for SIG to *ACT. diff --git a/sysdeps/unix/sysv/linux/ifaddrs.c b/sysdeps/unix/sysv/linux/ifaddrs.c index 82495de03e..02e6935538 100644 --- a/sysdeps/unix/sysv/linux/ifaddrs.c +++ b/sysdeps/unix/sysv/linux/ifaddrs.c @@ -1,5 +1,5 @@ /* getifaddrs -- get names and addresses of all network interfaces - Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007 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 @@ -122,36 +122,36 @@ int __netlink_request (struct netlink_handle *h, int type) { struct netlink_res *nlm_next; - struct netlink_res **new_nlm_list; - static volatile size_t buf_size = 4096; - char *buf; struct sockaddr_nl nladdr; struct nlmsghdr *nlmh; ssize_t read_len; bool done = false; - bool use_malloc = false; - if (__netlink_sendreq (h, type) < 0) - return -1; +#ifdef PAGE_SIZE + /* Help the compiler optimize out the malloc call if PAGE_SIZE + is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ + const size_t buf_size = PAGE_SIZE; +#else + const size_t buf_size = __getpagesize (); +#endif + bool use_malloc = false; + char *buf; - size_t this_buf_size = buf_size; - if (__libc_use_alloca (this_buf_size)) - buf = alloca (this_buf_size); + if (__libc_use_alloca (buf_size)) + buf = alloca (buf_size); else { - buf = malloc (this_buf_size); + buf = malloc (buf_size); if (buf != NULL) use_malloc = true; else goto out_fail; } - struct iovec iov = { buf, this_buf_size }; + struct iovec iov = { buf, buf_size }; - if (h->nlm_list != NULL) - new_nlm_list = &h->end_ptr->next; - else - new_nlm_list = &h->nlm_list; + if (__netlink_sendreq (h, type) < 0) + goto out_fail; while (! done) { @@ -171,48 +171,7 @@ __netlink_request (struct netlink_handle *h, int type) continue; if (__builtin_expect (msg.msg_flags & MSG_TRUNC, 0)) - { - if (this_buf_size >= SIZE_MAX / 2) - goto out_fail; - - nlm_next = *new_nlm_list; - while (nlm_next != NULL) - { - struct netlink_res *tmpptr; - - tmpptr = nlm_next->next; - free (nlm_next); - nlm_next = tmpptr; - } - *new_nlm_list = NULL; - - if (__libc_use_alloca (2 * this_buf_size)) - buf = extend_alloca (buf, this_buf_size, 2 * this_buf_size); - else - { - this_buf_size *= 2; - - char *new_buf = realloc (use_malloc ? buf : NULL, this_buf_size); - if (new_buf == NULL) - goto out_fail; - new_buf = buf; - - use_malloc = true; - } - buf_size = this_buf_size; - - iov.iov_base = buf; - iov.iov_len = this_buf_size; - - /* Increase sequence number, so that we can distinguish - between old and new request messages. */ - h->seq++; - - if (__netlink_sendreq (h, type) < 0) - goto out_fail; - - continue; - } + goto out_fail; size_t count = 0; size_t remaining_len = read_len; diff --git a/sysdeps/unix/sysv/linux/internal_statvfs.c b/sysdeps/unix/sysv/linux/internal_statvfs.c index 28c1cb691f..73317ecafd 100644 --- a/sysdeps/unix/sysv/linux/internal_statvfs.c +++ b/sysdeps/unix/sysv/linux/internal_statvfs.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1998-2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1998. @@ -156,8 +156,6 @@ __statvfs_getflags (const char *name, int fstype, struct stat64 *st) result |= ST_NOATIME; else if (strcmp (opt, "nodiratime") == 0) result |= ST_NODIRATIME; - else if (strcmp (opt, "relatime") == 0) - result |= ST_RELATIME; /* We can stop looking for more entries. */ success = true; diff --git a/misc/madvise.c b/sysdeps/unix/sysv/linux/posix_madvise.c similarity index 53% copy from misc/madvise.c copy to sysdeps/unix/sysv/linux/posix_madvise.c index dbef959dd8..880b17ef31 100644 --- a/misc/madvise.c +++ b/sysdeps/unix/sysv/linux/posix_madvise.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc. +/* Copyright (C) 2007 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,18 +16,23 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include +#include #include -#include -/* Advise the system about particular usage patterns the program follows - for the region starting at ADDR and extending LEN bytes. */ int -madvise (__ptr_t addr, size_t len, int advice) +posix_madvise (void *addr, size_t len, int advice) { - __set_errno (ENOSYS); - return -1; + /* We have one problem: the kernel's MADV_DONTNEED does not + correspond to POSIX's POSIX_MADV_DONTNEED. The former simply + discards changes made to the memory without writing it back to + disk, if this would be necessary. The POSIX behavior does not + allow this. There is no functionality mapping the POSIX behavior + so far so we ignore that advice for now. */ + if (advice == POSIX_MADV_DONTNEED) + return 0; + + INTERNAL_SYSCALL_DECL (err); + int result = INTERNAL_SYSCALL (madvise, err, 3, addr, len, advice); + return INTERNAL_SYSCALL_ERRNO (result, err); } -stub_warning (madvise) -#include diff --git a/sysdeps/unix/sysv/linux/sh/bits/shm.h b/sysdeps/unix/sysv/linux/sh/bits/shm.h deleted file mode 100644 index 189179394b..0000000000 --- a/sysdeps/unix/sysv/linux/sh/bits/shm.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (C) 1995,1996,1997,2000,2002,2004,2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - 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 _SYS_SHM_H -# error "Never include directly; use instead." -#endif - -#include - -/* Permission flag for shmget. */ -#define SHM_R 0400 /* or S_IRUGO from */ -#define SHM_W 0200 /* or S_IWUGO from */ - -/* Flags for `shmat'. */ -#define SHM_RDONLY 010000 /* attach read-only else read-write */ -#define SHM_RND 020000 /* round attach address to SHMLBA */ -#define SHM_REMAP 040000 /* take-over region on attach */ - -/* Commands for `shmctl'. */ -#define SHM_LOCK 11 /* lock segment (root only) */ -#define SHM_UNLOCK 12 /* unlock segment (root only) */ - -__BEGIN_DECLS - -/* Segment low boundary address multiple. */ -#define SHMLBA 0x4000 - -/* Type to count number of attaches. */ -typedef unsigned long int shmatt_t; - -/* Data structure describing a set of semaphores. */ -struct shmid_ds - { - struct ipc_perm shm_perm; /* operation permission struct */ - size_t shm_segsz; /* size of segment in bytes */ - __time_t shm_atime; /* time of last shmat() */ - unsigned long int __unused1; - __time_t shm_dtime; /* time of last shmdt() */ - unsigned long int __unused2; - __time_t shm_ctime; /* time of last change by shmctl() */ - unsigned long int __unused3; - __pid_t shm_cpid; /* pid of creator */ - __pid_t shm_lpid; /* pid of last shmop */ - shmatt_t shm_nattch; /* number of current attaches */ - unsigned long int __unused4; - unsigned long int __unused5; - }; - -#ifdef __USE_MISC - -/* ipcs ctl commands */ -# define SHM_STAT 13 -# define SHM_INFO 14 - -/* shm_mode upper byte flags */ -# define SHM_DEST 01000 /* segment will be destroyed on last detach */ -# define SHM_LOCKED 02000 /* segment will not be swapped */ -# define SHM_HUGETLB 04000 /* segment is mapped via hugetlb */ -# define SHM_NORESERVE 010000 /* don't check for reservations */ - -struct shminfo - { - unsigned long int shmmax; - unsigned long int shmmin; - unsigned long int shmmni; - unsigned long int shmseg; - unsigned long int shmall; - unsigned long int __unused1; - unsigned long int __unused2; - unsigned long int __unused3; - unsigned long int __unused4; - }; - -struct shm_info - { - int used_ids; - unsigned long int shm_tot; /* total allocated shm */ - unsigned long int shm_rss; /* total resident shm */ - unsigned long int shm_swp; /* total swapped shm */ - unsigned long int swap_attempts; - unsigned long int swap_successes; - }; - -#endif /* __USE_MISC */ - -__END_DECLS diff --git a/sysdeps/unix/sysv/linux/sh/sys/io.h b/sysdeps/unix/sysv/linux/sh/sys/io.h new file mode 100644 index 0000000000..6fdc44ff89 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/sys/io.h @@ -0,0 +1,48 @@ +/* Copyright (C) 1996, 1998, 1999, 2000 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 _SYS_IO_H + +#define _SYS_IO_H 1 +#include + +__BEGIN_DECLS + +/* If TURN_ON is TRUE, request for permission to do direct i/o on the + port numbers in the range [FROM,FROM+NUM-1]. Otherwise, turn I/O + permission off for that range. This call requires root privileges. */ +extern int ioperm (unsigned long int __from, unsigned long int __num, + int __turn_on) __THROW; + +/* Set the I/O privilege level to LEVEL. If LEVEL is nonzero, + permission to access any I/O port is granted. This call requires + root privileges. */ +extern int iopl (int __level) __THROW; + +/* The functions that actually perform reads and writes. */ +extern unsigned char inb (unsigned long int port) __THROW; +extern unsigned short int inw (unsigned long int port) __THROW; +extern unsigned long int inl (unsigned long int port) __THROW; + +extern void outb (unsigned char value, unsigned long int port) __THROW; +extern void outw (unsigned short value, unsigned long int port) __THROW; +extern void outl (unsigned long value, unsigned long int port) __THROW; + +__END_DECLS + +#endif /* _SYS_IO_H */ diff --git a/sysdeps/unix/sysv/linux/sys/epoll.h b/sysdeps/unix/sysv/linux/sys/epoll.h index d8901f7d53..68f173a04d 100644 --- a/sysdeps/unix/sysv/linux/sys/epoll.h +++ b/sysdeps/unix/sysv/linux/sys/epoll.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004, 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 @@ -22,14 +22,6 @@ #include #include -/* Get __sigset_t. */ -#include - -#ifndef __sigset_t_defined -# define __sigset_t_defined -typedef __sigset_t sigset_t; -#endif - enum EPOLL_EVENTS { @@ -113,16 +105,6 @@ extern int epoll_ctl (int __epfd, int __op, int __fd, extern int epoll_wait (int __epfd, struct epoll_event *__events, int __maxevents, int __timeout); - -/* Same as epoll_wait, but the thread's signal mask is temporarily - and atomically replaced with the one provided as parameter. - - This function is a cancellation point and therefore not marked with - __THROW. */ -extern int epoll_pwait (int __epfd, struct epoll_event *__events, - int __maxevents, int __timeout, - __const __sigset_t *__ss); - __END_DECLS #endif /* sys/epoll.h */ diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 5776673733..e16110480f 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -10,8 +10,7 @@ delete_module EXTRA delete_module 3 delete_module epoll_create EXTRA epoll_create i:i epoll_create epoll_ctl EXTRA epoll_ctl i:iiip epoll_ctl epoll_wait EXTRA epoll_wait Ci:ipii epoll_wait -epoll_pwait EXTRA epoll_pwait Ci:ipiipi epoll_pwait -fdatasync - fdatasync i:i fdatasync +fdatasync - fdatasync Ci:i fdatasync flock - flock i:ii __flock flock fork - fork i: __libc_fork __fork fork get_kernel_syms EXTRA get_kernel_syms i:p get_kernel_syms @@ -32,7 +31,6 @@ ioperm - ioperm i:iii ioperm iopl - iopl i:i iopl klogctl EXTRA syslog i:isi klogctl lchown - lchown i:sii __lchown lchown -posix_madvise - madvise Vi:pii posix_madvise madvise - madvise i:pii madvise mincore - mincore i:anV mincore mlock - mlock i:bn mlock diff --git a/sysdeps/unix/sysv/linux/x86_64/Makefile b/sysdeps/unix/sysv/linux/x86_64/Makefile index bdad5063df..0f20367236 100644 --- a/sysdeps/unix/sysv/linux/x86_64/Makefile +++ b/sysdeps/unix/sysv/linux/x86_64/Makefile @@ -10,6 +10,6 @@ ifeq ($(subdir),stdlib) sysdep_routines += __start_context endif -ifeq ($(subdir),csu) +ifeq ($(subdir),stdlib) gen-as-const-headers += ucontext_i.sym endif diff --git a/sysdeps/unix/sysv/linux/x86_64/clone.S b/sysdeps/unix/sysv/linux/x86_64/clone.S index db42f209c9..8a12b09035 100644 --- a/sysdeps/unix/sysv/linux/x86_64/clone.S +++ b/sysdeps/unix/sysv/linux/x86_64/clone.S @@ -89,9 +89,6 @@ L(pseudo_end): ret L(thread_start): - cfi_startproc; - /* Clearing frame pointer is insufficient, use CFI. */ - cfi_undefined (rip); /* Clear the frame pointer. The ABI suggests this be done, to mark the outermost frame obviously. */ xorl %ebp, %ebp @@ -116,7 +113,6 @@ L(thread_start): /* Call exit with return value from function call. */ movq %rax, %rdi call HIDDEN_JUMPTARGET (_exit) - cfi_endproc; cfi_startproc; PSEUDO_END (BP_SYM (__clone)) diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c index ab10123858..d6f4558cef 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c +++ b/sysdeps/unix/sysv/linux/x86_64/sigaction.c @@ -1,5 +1,5 @@ /* POSIX.1 `sigaction' call for Linux/x86-64. - Copyright (C) 2001, 2002, 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 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 @@ -33,14 +33,17 @@ translate it here. */ #include -#include "ucontext_i.h" - /* We do not globally define the SA_RESTORER flag so do it here. */ #define SA_RESTORER 0x04000000 /* Using the hidden attribute here does not change the code but it helps to avoid warnings. */ +#if defined HAVE_HIDDEN && defined HAVE_VISIBILITY_ATTRIBUTE \ + && !defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; +#else +static void restore_rt (void) asm ("__restore_rt"); +#endif /* If ACT is not NULL, change the action for SIG to *ACT. @@ -92,95 +95,18 @@ weak_alias (__libc_sigaction, sigaction) signal handlers work right. Important are both the names (__restore_rt) and the exact instruction sequence. If you ever feel the need to make any changes, please notify the - appropriate GDB maintainer. - - The unwind information starts a byte before __restore_rt, so that - it is found when unwinding, to get an address the unwinder assumes - will be in the middle of a call instruction. See the Linux kernel - (the i386 vsyscall, in particular) for an explanation of the complex - unwind information used here in order to get the traditional CFA. - We do not restore cs - it's only stored as two bytes here so that's - a bit tricky. We don't use the gas cfi directives, so that we can - reliably add .cfi_signal_frame. */ - -#define do_cfa_expr \ - " .byte 0x0f\n" /* DW_CFA_def_cfa_expression */ \ - " .uleb128 2f-1f\n" /* length */ \ - "1: .byte 0x77\n" /* DW_OP_breg7 */ \ - " .sleb128 " CFI_STRINGIFY (oRSP) "\n" \ - " .byte 0x06\n" /* DW_OP_deref */ \ - "2:" - -#define do_expr(regno, offset) \ - " .byte 0x10\n" /* DW_CFA_expression */ \ - " .uleb128 " CFI_STRINGIFY (regno) "\n" \ - " .uleb128 2f-1f\n" /* length */ \ - "1: .byte 0x77\n" /* DW_OP_breg7 */ \ - " .sleb128 " CFI_STRINGIFY (offset) "\n" \ - "2:" + appropriate GDB maintainer. */ #define RESTORE(name, syscall) RESTORE2 (name, syscall) # define RESTORE2(name, syscall) \ -asm \ - ( \ - /* `nop' for debuggers assuming `call' should not disalign the code. */ \ - " nop\n" \ - ".align 16\n" \ - ".LSTART_" #name ":\n" \ - " .type __" #name ",@function\n" \ - "__" #name ":\n" \ - " movq $" #syscall ", %rax\n" \ - " syscall\n" \ - ".LEND_" #name ":\n" \ - ".section .eh_frame,\"a\",@progbits\n" \ - ".LSTARTFRAME_" #name ":\n" \ - " .long .LENDCIE_" #name "-.LSTARTCIE_" #name "\n" \ - ".LSTARTCIE_" #name ":\n" \ - " .long 0\n" /* CIE ID */ \ - " .byte 1\n" /* Version number */ \ - " .string \"zRS\"\n" /* NUL-terminated augmentation string */ \ - " .uleb128 1\n" /* Code alignment factor */ \ - " .sleb128 -8\n" /* Data alignment factor */ \ - " .uleb128 16\n" /* Return address register column (rip) */ \ - /* Augmentation value length */ \ - " .uleb128 .LENDAUGMNT_" #name "-.LSTARTAUGMNT_" #name "\n" \ - ".LSTARTAUGMNT_" #name ":\n" \ - " .byte 0x1b\n" /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */ \ - ".LENDAUGMNT_" #name ":\n" \ - " .align 8\n" \ - ".LENDCIE_" #name ":\n" \ - " .long .LENDFDE_" #name "-.LSTARTFDE_" #name "\n" /* FDE len */ \ - ".LSTARTFDE_" #name ":\n" \ - " .long .LSTARTFDE_" #name "-.LSTARTFRAME_" #name "\n" /* CIE */ \ - /* `LSTART_' is subtracted 1 as debuggers assume a `call' here. */ \ - " .long (.LSTART_" #name "-1)-.\n" /* PC-relative start addr. */ \ - " .long .LEND_" #name "-(.LSTART_" #name "-1)\n" \ - " .uleb128 0\n" /* FDE augmentation length */ \ - do_cfa_expr \ - do_expr (8 /* r8 */, oR8) \ - do_expr (9 /* r9 */, oR9) \ - do_expr (10 /* r10 */, oR10) \ - do_expr (11 /* r11 */, oR11) \ - do_expr (12 /* r12 */, oR12) \ - do_expr (13 /* r13 */, oR13) \ - do_expr (14 /* r14 */, oR14) \ - do_expr (15 /* r15 */, oR15) \ - do_expr (5 /* rdi */, oRDI) \ - do_expr (4 /* rsi */, oRSI) \ - do_expr (6 /* rbp */, oRBP) \ - do_expr (3 /* rbx */, oRBX) \ - do_expr (1 /* rdx */, oRDX) \ - do_expr (0 /* rax */, oRAX) \ - do_expr (2 /* rcx */, oRCX) \ - do_expr (7 /* rsp */, oRSP) \ - do_expr (16 /* rip */, oRIP) \ - /* libgcc-4.1.1 has only `DWARF_FRAME_REGISTERS == 17'. */ \ - /* do_expr (49 |* rflags *|, oEFL) */ \ - /* `cs'/`ds'/`fs' are unaligned and a different size. */ \ - /* gas: Error: register save offset not a multiple of 8 */ \ - " .align 8\n" \ - ".LENDFDE_" #name ":\n" \ - " .previous\n" \ +asm \ + ( \ + ".align 16\n" \ + CFI_STARTPROC "\n" \ + "__" #name ":\n" \ + " movq $" #syscall ", %rax\n" \ + " syscall\n" \ + CFI_ENDPROC "\n" \ ); /* The return code for realtime-signals. */ RESTORE (restore_rt, __NR_rt_sigreturn) diff --git a/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym b/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym index af3e0e544b..b3cfe9aa4c 100644 --- a/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym +++ b/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym @@ -18,8 +18,6 @@ oRSP mreg (RSP) oRBX mreg (RBX) oR8 mreg (R8) oR9 mreg (R9) -oR10 mreg (R10) -oR11 mreg (R11) oR12 mreg (R12) oR13 mreg (R13) oR14 mreg (R14) @@ -30,7 +28,6 @@ oRDX mreg (RDX) oRAX mreg (RAX) oRCX mreg (RCX) oRIP mreg (RIP) -oEFL mreg (EFL) oFPREGS mcontext (fpregs) oSIGMASK ucontext (uc_sigmask) oFPREGSMEM ucontext (__fpregs_mem) diff --git a/sysdeps/x86_64/bits/atomic.h b/sysdeps/x86_64/bits/atomic.h index 65d6b02008..133a68d192 100644 --- a/sysdeps/x86_64/bits/atomic.h +++ b/sysdeps/x86_64/bits/atomic.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -18,7 +18,6 @@ 02111-1307 USA. */ #include -#include /* For tcbhead_t. */ typedef int8_t atomic8_t; @@ -81,54 +80,8 @@ typedef uintmax_t uatomic_max_t; ({ __typeof (*mem) ret; \ __asm __volatile (LOCK_PREFIX "cmpxchgq %q2, %1" \ : "=a" (ret), "=m" (*mem) \ - : "r" ((long int) (newval)), "m" (*mem), \ - "0" ((long int) (oldval))); \ - ret; }) - - -#define __arch_c_compare_and_exchange_val_8_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%fs:%P5\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchgb %b2, %1" \ - : "=a" (ret), "=m" (*mem) \ - : "q" (newval), "m" (*mem), "0" (oldval), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) - -#define __arch_c_compare_and_exchange_val_16_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%fs:%P5\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchgw %w2, %1" \ - : "=a" (ret), "=m" (*mem) \ - : "q" (newval), "m" (*mem), "0" (oldval), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) - -#define __arch_c_compare_and_exchange_val_32_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%fs:%P5\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchgl %2, %1" \ - : "=a" (ret), "=m" (*mem) \ - : "q" (newval), "m" (*mem), "0" (oldval), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - ret; }) - -#define __arch_c_compare_and_exchange_val_64_acq(mem, newval, oldval) \ - ({ __typeof (*mem) ret; \ - __asm __volatile ("cmpl $0, %%fs:%P5\n\t" \ - "je 0f\n\t" \ - "lock\n" \ - "0:\tcmpxchgq %q2, %1" \ - : "=a" (ret), "=m" (*mem) \ - : "q" ((long int) (newval)), "m" (*mem), \ - "0" ((long int)oldval), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "r" ((long) (newval)), "m" (*mem), \ + "0" ((long) (oldval))); \ ret; }) @@ -154,76 +107,49 @@ typedef uintmax_t uatomic_max_t; result; }) -#define __arch_exchange_and_add_body(lock, mem, value) \ +#define atomic_exchange_and_add(mem, value) \ ({ __typeof (*mem) result; \ if (sizeof (*mem) == 1) \ - __asm __volatile (lock "xaddb %b0, %1" \ + __asm __volatile (LOCK_PREFIX "xaddb %b0, %1" \ : "=r" (result), "=m" (*mem) \ - : "0" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "0" (value), "m" (*mem)); \ else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "xaddw %w0, %1" \ + __asm __volatile (LOCK_PREFIX "xaddw %w0, %1" \ : "=r" (result), "=m" (*mem) \ - : "0" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "0" (value), "m" (*mem)); \ else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "xaddl %0, %1" \ + __asm __volatile (LOCK_PREFIX "xaddl %0, %1" \ : "=r" (result), "=m" (*mem) \ - : "0" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "0" (value), "m" (*mem)); \ else \ - __asm __volatile (lock "xaddq %q0, %1" \ + __asm __volatile (LOCK_PREFIX "xaddq %q0, %1" \ : "=r" (result), "=m" (*mem) \ - : "0" ((long) (value)), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ + : "0" ((long) (value)), "m" (*mem)); \ result; }) -#define atomic_exchange_and_add(mem, value) \ - __arch_exchange_and_add_body (LOCK_PREFIX, mem, value) - -#define __arch_exchange_and_add_cprefix \ - "cmpl $0, %%fs:%P4\n\tje 0f\n\tlock\n0:\t" - -#define catomic_exchange_and_add(mem, value) \ - __arch_exchange_and_add_body (__arch_exchange_and_add_cprefix, mem, value) - - -#define __arch_add_body(lock, pfx, mem, value) \ - do { \ - if (__builtin_constant_p (value) && (value) == 1) \ - pfx##_increment (mem); \ - else if (__builtin_constant_p (value) && (value) == -1) \ - pfx##_decrement (mem); \ - else if (sizeof (*mem) == 1) \ - __asm __volatile (lock "addb %b1, %0" \ - : "=m" (*mem) \ - : "ir" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "addw %w1, %0" \ - : "=m" (*mem) \ - : "ir" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "addl %1, %0" \ - : "=m" (*mem) \ - : "ir" (value), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - __asm __volatile (lock "addq %q1, %0" \ - : "=m" (*mem) \ - : "ir" ((long) (value)), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - } while (0) #define atomic_add(mem, value) \ - __arch_add_body (LOCK_PREFIX, atomic, mem, value) - -#define __arch_add_cprefix \ - "cmpl $0, %%fs:%P3\n\tje 0f\n\tlock\n0:\t" - -#define catomic_add(mem, value) \ - __arch_add_body (__arch_add_cprefix, catomic, mem, value) + (void) ({ if (__builtin_constant_p (value) && (value) == 1) \ + atomic_increment (mem); \ + else if (__builtin_constant_p (value) && (value) == 1) \ + atomic_decrement (mem); \ + else if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "addb %b1, %0" \ + : "=m" (*mem) \ + : "ir" (value), "m" (*mem)); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "addw %w1, %0" \ + : "=m" (*mem) \ + : "ir" (value), "m" (*mem)); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "addl %1, %0" \ + : "=m" (*mem) \ + : "ir" (value), "m" (*mem)); \ + else \ + __asm __volatile (LOCK_PREFIX "addq %q1, %0" \ + : "=m" (*mem) \ + : "ir" ((long) (value)), "m" (*mem)); \ + }) #define atomic_add_negative(mem, value) \ @@ -268,37 +194,24 @@ typedef uintmax_t uatomic_max_t; __result; }) -#define __arch_increment_body(lock, mem) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (lock "incb %b0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "incw %w0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "incl %0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - __asm __volatile (lock "incq %q0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - } while (0) - -#define atomic_increment(mem) __arch_increment_body (LOCK_PREFIX, mem) - -#define __arch_increment_cprefix \ - "cmpl $0, %%fs:%P2\n\tje 0f\n\tlock\n0:\t" - -#define catomic_increment(mem) \ - __arch_increment_body (__arch_increment_cprefix, mem) +#define atomic_increment(mem) \ + (void) ({ if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "incb %b0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "incw %w0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "incl %0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else \ + __asm __volatile (LOCK_PREFIX "incq %q0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + }) #define atomic_increment_and_test(mem) \ @@ -322,37 +235,24 @@ typedef uintmax_t uatomic_max_t; __result; }) -#define __arch_decrement_body(lock, mem) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (lock "decb %b0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "decw %w0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "decl %0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - __asm __volatile (lock "decq %q0" \ - : "=m" (*mem) \ - : "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - } while (0) - -#define atomic_decrement(mem) __arch_decrement_body (LOCK_PREFIX, mem) - -#define __arch_decrement_cprefix \ - "cmpl $0, %%fs:%P2\n\tje 0f\n\tlock\n0:\t" - -#define catomic_decrement(mem) \ - __arch_decrement_body (__arch_decrement_cprefix, mem) +#define atomic_decrement(mem) \ + (void) ({ if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "decb %b0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "decw %w0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "decl %0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + else \ + __asm __volatile (LOCK_PREFIX "decq %q0" \ + : "=m" (*mem) \ + : "m" (*mem)); \ + }) #define atomic_decrement_and_test(mem) \ @@ -377,28 +277,27 @@ typedef uintmax_t uatomic_max_t; #define atomic_bit_set(mem, bit) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (LOCK_PREFIX "orb %b2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "ir" (1L << (bit))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (LOCK_PREFIX "orw %w2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "ir" (1L << (bit))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (LOCK_PREFIX "orl %2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "ir" (1L << (bit))); \ - else if (__builtin_constant_p (bit) && (bit) < 32) \ - __asm __volatile (LOCK_PREFIX "orq %2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "i" (1L << (bit))); \ - else \ - __asm __volatile (LOCK_PREFIX "orq %q2, %0" \ - : "=m" (*mem) \ - : "m" (*mem), "r" (1UL << (bit))); \ - } while (0) + (void) ({ if (sizeof (*mem) == 1) \ + __asm __volatile (LOCK_PREFIX "orb %b2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "ir" (1L << (bit))); \ + else if (sizeof (*mem) == 2) \ + __asm __volatile (LOCK_PREFIX "orw %w2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "ir" (1L << (bit))); \ + else if (sizeof (*mem) == 4) \ + __asm __volatile (LOCK_PREFIX "orl %2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "ir" (1L << (bit))); \ + else if (__builtin_constant_p (bit) && (bit) < 32) \ + __asm __volatile (LOCK_PREFIX "orq %2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "i" (1L << (bit))); \ + else \ + __asm __volatile (LOCK_PREFIX "orq %q2, %0" \ + : "=m" (*mem) \ + : "m" (*mem), "r" (1UL << (bit))); \ + }) #define atomic_bit_test_set(mem, bit) \ @@ -423,56 +322,3 @@ typedef uintmax_t uatomic_max_t; #define atomic_delay() asm ("rep; nop") - - -#define atomic_and(mem, mask) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (LOCK_PREFIX "andb %1, %b0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem)); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (LOCK_PREFIX "andw %1, %w0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem)); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (LOCK_PREFIX "andl %1, %0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem)); \ - else \ - __asm __volatile (LOCK_PREFIX "andq %1, %q0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem)); \ - } while (0) - - -#define __arch_or_body(lock, mem, mask) \ - do { \ - if (sizeof (*mem) == 1) \ - __asm __volatile (lock "orb %1, %b0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 2) \ - __asm __volatile (lock "orw %1, %w0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else if (sizeof (*mem) == 4) \ - __asm __volatile (lock "orl %1, %0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - else \ - __asm __volatile (lock "orq %1, %q0" \ - : "=m" (*mem) \ - : "ir" (mask), "m" (*mem), \ - "i" (offsetof (tcbhead_t, multiple_threads))); \ - } while (0) - -#define atomic_or(mem, mask) __arch_or_body (LOCK_PREFIX, mem, mask) - -#define __arch_or_cprefix \ - "cmpl $0, %%fs:%P3\n\tje 0f\n\tlock\n0:\t" - -#define catomic_or(mem, mask) __arch_or_body (__arch_or_cprefix, mem, mask) diff --git a/sysdeps/x86_64/bits/byteswap.h b/sysdeps/x86_64/bits/byteswap.h index e1c861c75f..ec2b17889d 100644 --- a/sysdeps/x86_64/bits/byteswap.h +++ b/sysdeps/x86_64/bits/byteswap.h @@ -1,5 +1,6 @@ /* 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, 2007 + 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 @@ -59,7 +60,9 @@ # if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__ \ || defined __pentiumpro__ || defined __pentium4__ \ || defined __k8__ || defined __athlon__ \ - || defined __k6__) + || defined __k6__ || defined __nocona__ \ + || defined __core2__ || defined __geode__ \ + || defined __amdfam10__) /* To swap the bytes in a word the i486 processors and up provide the `bswap' opcode. On i386 we have to use three instructions. */ # define __bswap_32(x) \ diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h index 31a7013d50..73e271775a 100644 --- a/sysdeps/x86_64/dl-machine.h +++ b/sysdeps/x86_64/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. x86-64 version. - Copyright (C) 2001-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger . @@ -190,7 +190,7 @@ _dl_start_user:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) # define elf_machine_type_class(type) \ ((((type) == R_X86_64_JUMP_SLOT \ || (type) == R_X86_64_DTPMOD64 \ @@ -300,7 +300,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, *reloc_addr = value + reloc->r_addend; break; -#ifndef RESOLVE_CONFLICT_FIND_MAP +#if defined USE_TLS && !defined RESOLVE_CONFLICT_FIND_MAP case R_X86_64_DTPMOD64: # ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always the module @@ -339,7 +339,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, - sym_map->l_tls_offset); } break; -#endif +#endif /* use TLS */ #ifndef RTLD_BOOTSTRAP case R_X86_64_64: diff --git a/sysdeps/x86_64/fpu/e_log10l.S b/sysdeps/x86_64/fpu/e_log10l.S index b4343bef45..633234b744 100644 --- a/sysdeps/x86_64/fpu/e_log10l.S +++ b/sysdeps/x86_64/fpu/e_log10l.S @@ -42,7 +42,7 @@ ENTRY(__ieee754_log10l) fxam fnstsw fld %st // x : x : log10(2) - andb $1,%ah + testb $1, %ah jnz 3f // in case x is NaN or ±Inf 4: fsubl MO(one) // x-1 : x : log10(2) fld %st // x-1 : x-1 : x : log10(2) @@ -59,7 +59,8 @@ ENTRY(__ieee754_log10l) fyl2x // log10(x) ret -3: jp 4b // in case x is ±Inf +3: testb $4, %ah + jnz 4b // in case x is ±Inf fstp %st(1) fstp %st(1) ret diff --git a/sysdeps/x86_64/fpu/e_log2l.S b/sysdeps/x86_64/fpu/e_log2l.S index 7a89b94d9f..f04d30a05a 100644 --- a/sysdeps/x86_64/fpu/e_log2l.S +++ b/sysdeps/x86_64/fpu/e_log2l.S @@ -39,7 +39,7 @@ ENTRY(__ieee754_log2l) fxam fnstsw fld %st // x : x : 1 - andb $1,%ah + testb $1, %ah jnz 3f // in case x is NaN or ±Inf 4: fsub %st(2), %st // x-1 : x : 1 fld %st // x-1 : x-1 : x : 1 @@ -56,7 +56,8 @@ ENTRY(__ieee754_log2l) fyl2x // log(x) ret -3: jp 4b // in case x is ±Inf +3: testb $4, %ah + jnz 4b // in case x is ±Inf fstp %st(1) fstp %st(1) ret diff --git a/sysdeps/x86_64/fpu/e_logl.S b/sysdeps/x86_64/fpu/e_logl.S index a0bed663c8..2ba91eedfd 100644 --- a/sysdeps/x86_64/fpu/e_logl.S +++ b/sysdeps/x86_64/fpu/e_logl.S @@ -38,8 +38,12 @@ limit: .double 0.29 ENTRY(__ieee754_logl) fldln2 // log(2) fldt 8(%rsp) // x : log(2) + fxam + fnstsw fld %st // x : x : log(2) - fsubl MO(one) // x-1 : x : log(2) + testb $1, %ah + jnz 3f // in case x is NaN or +-Inf +4: fsubl MO(one) // x-1 : x : log(2) fld %st // x-1 : x-1 : x : log(2) fabs // |x-1| : x-1 : x : log(2) fcompl MO(limit) // x-1 : x : log(2) @@ -53,4 +57,10 @@ ENTRY(__ieee754_logl) 2: fstp %st(0) // x : log(2) fyl2x // log(x) ret + +3: testb $4, %ah + jnz 4b // in case x is +-Inf + fstp %st(1) + fstp %st(1) + ret END (__ieee754_logl) diff --git a/sysdeps/x86_64/fpu/e_powl.S b/sysdeps/x86_64/fpu/e_powl.S index 85f4deb3c7..4959bea7ac 100644 --- a/sysdeps/x86_64/fpu/e_powl.S +++ b/sysdeps/x86_64/fpu/e_powl.S @@ -1,5 +1,6 @@ /* ix87 specific implementation of pow function. - Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -146,10 +147,11 @@ ENTRY(__ieee754_powl) 2: /* y is a real number. */ fxch // x : y fldl MO(one) // 1.0 : x : y - fld %st(1) // x : 1.0 : x : y - fsub %st(1) // x-1 : 1.0 : x : y - fabs // |x-1| : 1.0 : x : y - fcompl MO(limit) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y test $4500,%eax @@ -190,9 +192,10 @@ ENTRY(__ieee754_powl) // y == ±inf .align ALIGNARG(4) 12: fstp %st(0) // pop y - fldt 8(%rsp) // x - fabs - fcompl MO(one) // < 1, == 1, or > 1 + fldl MO(one) // 1 + fldt 8(%rsp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 fnstsw andb $0x45, %ah cmpb $0x45, %ah diff --git a/sysdeps/x86_64/fpu/math_private.h b/sysdeps/x86_64/fpu/math_private.h new file mode 100644 index 0000000000..4febcbb5ec --- /dev/null +++ b/sysdeps/x86_64/fpu/math_private.h @@ -0,0 +1,21 @@ +#ifndef _MATH_PRIVATE_H + +#define math_opt_barrier(x) \ +({ __typeof(x) __x; \ + if (sizeof (x) <= sizeof (double)) \ + __asm ("" : "=x" (__x) : "0" (x)); \ + else \ + __asm ("" : "=t" (__x) : "0" (x)); \ + __x; }) +#define math_force_eval(x) \ +do \ + { \ + if (sizeof (x) <= sizeof (double)) \ + __asm __volatile ("" : : "x" (x)); \ + else \ + __asm __volatile ("" : : "f" (x)); \ + } \ +while (0) + +#include +#endif diff --git a/sysdeps/x86_64/fpu/s_copysign.S b/sysdeps/x86_64/fpu/s_copysign.S index f3d9b0cbb4..f1ebcf8bf1 100644 --- a/sysdeps/x86_64/fpu/s_copysign.S +++ b/sysdeps/x86_64/fpu/s_copysign.S @@ -1,5 +1,5 @@ /* copy sign, double version. - Copyright (C) 2002, 2006 Free Software Foundation, Inc. + Copyright (C) 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger , 2002. @@ -31,8 +31,6 @@ signmask: .byte 0, 0, 0, 0, 0, 0, 0, 0x80 .byte 0, 0, 0, 0, 0, 0, 0, 0 - ASM_SIZE_DIRECTIVE(signmask) - ASM_TYPE_DIRECTIVE(othermask,@object) othermask: .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f .byte 0, 0, 0, 0, 0, 0, 0, 0 @@ -44,7 +42,6 @@ othermask: #define MO(op) op #endif - .text ENTRY(__copysign) andpd MO(othermask),%xmm0 andpd MO(signmask),%xmm1 diff --git a/sysdeps/x86_64/fpu/s_copysignf.S b/sysdeps/x86_64/fpu/s_copysignf.S index 0fbe1d4c96..f5dc5f78ad 100644 --- a/sysdeps/x86_64/fpu/s_copysignf.S +++ b/sysdeps/x86_64/fpu/s_copysignf.S @@ -1,5 +1,5 @@ /* copy sign, double version. - Copyright (C) 2002, 2006 Free Software Foundation, Inc. + Copyright (C) 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger , 2002. @@ -38,7 +38,6 @@ mask: #define MO(op) op #endif - .text ENTRY(__copysignf) movss MO(mask),%xmm3 andps %xmm3,%xmm0 diff --git a/sysdeps/x86_64/fpu/s_log1pl.S b/sysdeps/x86_64/fpu/s_log1pl.S index 7fbd0e5aaa..ac2bd22a4f 100644 --- a/sysdeps/x86_64/fpu/s_log1pl.S +++ b/sysdeps/x86_64/fpu/s_log1pl.S @@ -45,7 +45,7 @@ ENTRY(__log1pl) fxam fnstsw fld %st - andb $1,%ah + testb $1, %ah jnz 3f // in case x is NaN or ±Inf 4: fabs @@ -62,7 +62,8 @@ ENTRY(__log1pl) 2: fyl2xp1 ret -3: jp 4b // in case x is ±Inf +3: testb $4, %ah + jnz 4b // in case x is ±Inf fstp %st(1) fstp %st(1) ret diff --git a/sysdeps/x86_64/ldbl2mpn.c b/sysdeps/x86_64/ldbl2mpn.c new file mode 100644 index 0000000000..641b789cd4 --- /dev/null +++ b/sysdeps/x86_64/ldbl2mpn.c @@ -0,0 +1 @@ +#include "../i386/ldbl2mpn.c" diff --git a/sysdeps/x86_64/soft-fp/sfp-machine.h b/sysdeps/x86_64/soft-fp/sfp-machine.h new file mode 100644 index 0000000000..77df02380c --- /dev/null +++ b/sysdeps/x86_64/soft-fp/sfp-machine.h @@ -0,0 +1,51 @@ +#define _FP_W_TYPE_SIZE 64 +#define _FP_W_TYPE unsigned long +#define _FP_WS_TYPE signed long +#define _FP_I_TYPE long + +#define __FP_CLZ(r, x) \ + do { \ + __asm__("bsrq %1,%0" : "=r"(r) : "g"(x) : "cc"); \ + r ^= 63; \ + } while (0) + +#define _FP_NANFRAC_S _FP_QNANBIT_S +#define _FP_NANFRAC_D _FP_QNANBIT_D, 0 +#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 +#define _FP_NANSIGN_S 1 +#define _FP_NANSIGN_D 1 +#define _FP_NANSIGN_Q 1 + +#define _FP_KEEPNANFRACP 1 +/* Here is something Intel misdesigned: the specs don't define + the case where we have two NaNs with same mantissas, but + different sign. Different operations pick up different NaNs. + */ +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ + do { \ + if (_FP_FRAC_GT_##wc(X, Y) \ + || (_FP_FRAC_EQ_##wc(X,Y) && (OP == '+' || OP == '*'))) \ + { \ + R##_s = X##_s; \ + _FP_FRAC_COPY_##wc(R,X); \ + } \ + else \ + { \ + R##_s = Y##_s; \ + _FP_FRAC_COPY_##wc(R,Y); \ + } \ + R##_c = FP_CLS_NAN; \ + } while (0) + +#define FP_EX_INVALID (1 << 0) +#define FP_EX_DENORM (1 << 1) +#define FP_EX_DIVZERO (1 << 2) +#define FP_EX_OVERFLOW (1 << 3) +#define FP_EX_UNDERFLOW (1 << 4) +#define FP_EX_INEXACT (1 << 5) + +#define FP_RND_NEAREST 0 +#define FP_RND_ZERO 3 +#define FP_RND_PINF 2 +#define FP_RND_MINF 1 + diff --git a/time/Makefile b/time/Makefile index d93b84bb2f..8ce34e4565 100644 --- a/time/Makefile +++ b/time/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 1991-2003, 2004, 2005, 2007 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 @@ -35,7 +35,8 @@ distribute := datemsk tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \ tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \ - tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 + tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \ + tst-strptime3 include ../Rules diff --git a/time/strptime_l.c b/time/strptime_l.c index dc0cc686fd..443a6fa88e 100644 --- a/time/strptime_l.c +++ b/time/strptime_l.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2004, 2005, 2007 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 @@ -400,6 +400,7 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) /* Does not match a month name. */ return NULL; tm->tm_mon = cnt; + have_mon = 1; want_xday = 1; break; case 'c': @@ -1085,11 +1086,15 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) tm->tm_mday = (tm->tm_yday - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1); + have_mon = 1; + have_mday = 1; } - day_of_the_week (tm); + /* Don't crash in day_of_the_week if tm_mon is uninitialized. */ + if (have_mon || (unsigned) tm->tm_mon <= 11) + day_of_the_week (tm); } - if (want_xday && !have_yday) + if (want_xday && !have_yday && (have_mon || (unsigned) tm->tm_mon <= 11)) day_of_the_year (tm); if ((have_uweek || have_wweek) && have_wday) diff --git a/time/tst-strptime3.c b/time/tst-strptime3.c new file mode 100644 index 0000000000..9a8c6485e7 --- /dev/null +++ b/time/tst-strptime3.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include + + +int +main (void) +{ + int result = 0; + struct tm tm; + + memset (&tm, 0xaa, sizeof (tm)); + + /* Test we don't crash on uninitialized struct tm. + Some fields might contain bogus values until everything + needed is initialized, but we shouldn't crash. */ + if (strptime ("2007", "%Y", &tm) == NULL + || strptime ("12", "%d", &tm) == NULL + || strptime ("Feb", "%b", &tm) == NULL + || strptime ("13", "%M", &tm) == NULL + || strptime ("21", "%S", &tm) == NULL + || strptime ("16", "%H", &tm) == NULL) + { + puts ("strptimes failed"); + result = 1; + } + + if (tm.tm_sec != 21 || tm.tm_min != 13 || tm.tm_hour != 16 + || tm.tm_mday != 12 || tm.tm_mon != 1 || tm.tm_year != 107 + || tm.tm_wday != 1 || tm.tm_yday != 42) + { + puts ("unexpected tm content"); + result = 1; + } + + if (strptime ("8", "%d", &tm) == NULL) + { + puts ("strptime failed"); + result = 1; + } + + if (tm.tm_sec != 21 || tm.tm_min != 13 || tm.tm_hour != 16 + || tm.tm_mday != 8 || tm.tm_mon != 1 || tm.tm_year != 107 + || tm.tm_wday != 4 || tm.tm_yday != 38) + { + puts ("unexpected tm content"); + result = 1; + } + + if (result == 0) + puts ("all OK"); + + return 0; +} diff --git a/time/tzfile.c b/time/tzfile.c index ea2d7cae4c..e95fd55f36 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1991-1993,1995-2001,2003,2004,2006 - Free Software Foundation, Inc. +/* Copyright (C) 1991-1993,1995-2001,2003,2004 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 @@ -72,34 +71,24 @@ static inline int __attribute ((always_inline)) decode (const void *ptr) { - if (BYTE_ORDER == BIG_ENDIAN && sizeof (int) == 4) + if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4) return *(const int *) ptr; - if (sizeof (int) == 4) + else if (BYTE_ORDER == LITTLE_ENDIAN && sizeof (int) == 4) return bswap_32 (*(const int *) ptr); + else + { + const unsigned char *p = ptr; + int result = *p & (1 << (CHAR_BIT - 1)) ? ~0 : 0; - const unsigned char *p = ptr; - int result = *p & (1 << (CHAR_BIT - 1)) ? ~0 : 0; - - result = (result << 8) | *p++; - result = (result << 8) | *p++; - result = (result << 8) | *p++; - result = (result << 8) | *p++; - - return result; -} - + result = (result << 8) | *p++; + result = (result << 8) | *p++; + result = (result << 8) | *p++; + result = (result << 8) | *p++; -static inline int64_t -__attribute ((always_inline)) -decode64 (const void *ptr) -{ - if ((BYTE_ORDER == BIG_ENDIAN)) - return *(const int64_t *) ptr; - - return bswap_64 (*(const int64_t *) ptr); + return result; + } } - void __tzfile_read (const char *file, size_t extra, char **extrap) { @@ -113,10 +102,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) size_t types_idx; size_t leaps_idx; int was_using_tzfile = __use_tzfile; - int trans_width = 4; - - if (sizeof (time_t) != 4 && sizeof (time_t) != 8) - abort (); __use_tzfile = 0; @@ -200,10 +185,8 @@ __tzfile_read (const char *file, size_t extra, char **extrap) /* No threads reading this stream. */ __fsetlocking (f, FSETLOCKING_BYCALLER); - read_again: if (__builtin_expect (fread_unlocked ((void *) &tzhead, sizeof (tzhead), - 1, f) != 1, 0) - || memcmp (tzhead.tzh_magic, TZ_MAGIC, sizeof (tzhead.tzh_magic)) != 0) + 1, f) != 1, 0)) goto lose; num_transitions = (size_t) decode (tzhead.tzh_timecnt); @@ -213,26 +196,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) num_isstd = (size_t) decode (tzhead.tzh_ttisstdcnt); num_isgmt = (size_t) decode (tzhead.tzh_ttisgmtcnt); - /* For platforms with 64-bit time_t we use the new format if available. */ - if (sizeof (time_t) == 8 && trans_width == 4 - && tzhead.tzh_version[0] != '\0') - { - /* We use the 8-byte format. */ - trans_width = 8; - - /* Position the stream before the second header. */ - size_t to_skip = (num_transitions * (4 + 1) - + num_types * 6 - + chars - + num_leaps * 8 - + num_isstd - + num_isgmt); - if (fseek (f, to_skip, SEEK_CUR) != 0) - goto lose; - - goto read_again; - } - total_size = num_transitions * (sizeof (time_t) + 1); total_size = ((total_size + __alignof__ (struct ttinfo) - 1) & ~(__alignof__ (struct ttinfo) - 1)); @@ -242,10 +205,10 @@ __tzfile_read (const char *file, size_t extra, char **extrap) & ~(__alignof__ (struct leap) - 1)); leaps_idx = total_size; total_size += num_leaps * sizeof (struct leap); + /* This is for the extra memory required by the caller. */ + total_size += extra; - /* Allocate enough memory including the extra block requested by the - caller. */ - transitions = (time_t *) malloc (total_size + extra); + transitions = (time_t *) malloc (total_size); if (transitions == NULL) goto lose; @@ -257,11 +220,14 @@ __tzfile_read (const char *file, size_t extra, char **extrap) if (extra > 0) *extrap = (char *) &leaps[num_leaps]; - if (sizeof (time_t) == 4 || trans_width == 8) + if (sizeof (time_t) < 4) + abort (); + + if (sizeof (time_t) == 4) { - if (__builtin_expect (fread_unlocked (transitions, trans_width + 1, - num_transitions, f) - != num_transitions, 0)) + if (__builtin_expect (fread_unlocked (transitions, 1, + (4 + 1) * num_transitions, f) + != (4 + 1) * num_transitions, 0)) goto lose; } else @@ -279,9 +245,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap) if (__builtin_expect (type_idxs[i] >= num_types, 0)) goto lose; - if ((BYTE_ORDER != BIG_ENDIAN && (sizeof (time_t) == 4 || trans_width == 4)) - || (BYTE_ORDER == BIG_ENDIAN && sizeof (time_t) == 8 - && trans_width == 4)) + if (BYTE_ORDER != BIG_ENDIAN || sizeof (time_t) != 4) { /* Decode the transition times, stored as 4-byte integers in network (big-endian) byte order. We work from the end of @@ -291,13 +255,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) while (i-- > 0) transitions[i] = decode ((char *) transitions + i * 4); } - else if (BYTE_ORDER != BIG_ENDIAN && sizeof (time_t) == 8) - { - /* Decode the transition times, stored as 8-byte integers in - network (big-endian) byte order. */ - for (i = 0; i < num_transitions; ++i) - transitions[i] = decode64 ((char *) transitions + i * 8); - } for (i = 0; i < num_types; ++i) { @@ -323,16 +280,13 @@ __tzfile_read (const char *file, size_t extra, char **extrap) for (i = 0; i < num_leaps; ++i) { - unsigned char x[8]; - if (__builtin_expect (fread_unlocked (x, 1, trans_width, f) - != trans_width, 0)) + unsigned char x[4]; + if (__builtin_expect (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x), + 0)) goto lose; - if (sizeof (time_t) == 4 || trans_width == 4) - leaps[i].transition = (time_t) decode (x); - else - leaps[i].transition = (time_t) decode64 (x); - - if (__builtin_expect (fread_unlocked (x, 1, 4, f) != 4, 0)) + leaps[i].transition = (time_t) decode (x); + if (__builtin_expect (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x), + 0)) goto lose; leaps[i].change = (long int) decode (x); } @@ -357,12 +311,6 @@ __tzfile_read (const char *file, size_t extra, char **extrap) while (i < num_types) types[i++].isgmt = 0; - /* XXX When a version 2 file is available it can contain a POSIX TZ-style - formatted string which specifies how times past the last one specified - are supposed to be handled. We might want to handle this at some - point. But it might be overhead since most/all? files have an - open-ended last entry. */ - fclose (f); /* First "register" all timezone names. */ diff --git a/timezone/africa b/timezone/africa index d73d340751..29625df934 100644 --- a/timezone/africa +++ b/timezone/africa @@ -1,15 +1,15 @@ -# @(#)africa 8.5 +# @(#)africa 8.1 #
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-03-22):
 #
 # A good source for time zone historical data outside the U.S. is
-# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
-# San Diego: ACS Publications, Inc. (2003).
+# Thomas G. Shanks, The International Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1999).
 #
 # Gwillim Law writes that a good source
 # for recent time zone data is the International Air Transport
@@ -17,8 +17,8 @@
 # published semiannually.  Law sent in several helpful summaries
 # of the IATA's data after 1990.
 #
-# Except where otherwise noted, Shanks & Pottenger is the source for
-# entries through 1990, and IATA SSIM is the source for entries afterwards.
+# Except where otherwise noted, Shanks is the source for entries through 1990,
+# and IATA SSIM is the source for entries after 1990.
 #
 # Another source occasionally used is Edward W. Whitman, World Time Differences,
 # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
@@ -65,7 +65,7 @@
 # Algeria
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Algeria	1916	only	-	Jun	14	23:00s	1:00	S
-Rule	Algeria	1916	1919	-	Oct	Sun>=1	23:00s	0	-
+Rule	Algeria	1916	1919	-	Oct	Sun<=7	23:00s	0	-
 Rule	Algeria	1917	only	-	Mar	24	23:00s	1:00	S
 Rule	Algeria	1918	only	-	Mar	 9	23:00s	1:00	S
 Rule	Algeria	1919	only	-	Mar	 1	23:00s	1:00	S
@@ -75,7 +75,7 @@ Rule	Algeria	1921	only	-	Mar	14	23:00s	1:00	S
 Rule	Algeria	1921	only	-	Jun	21	23:00s	0	-
 Rule	Algeria	1939	only	-	Sep	11	23:00s	1:00	S
 Rule	Algeria	1939	only	-	Nov	19	 1:00	0	-
-Rule	Algeria	1944	1945	-	Apr	Mon>=1	 2:00	1:00	S
+Rule	Algeria	1944	1945	-	Apr	Mon<=7	 2:00	1:00	S
 Rule	Algeria	1944	only	-	Oct	 8	 2:00	0	-
 Rule	Algeria	1945	only	-	Sep	16	 1:00	0	-
 Rule	Algeria	1971	only	-	Apr	25	23:00s	1:00	S
@@ -86,8 +86,7 @@ Rule	Algeria	1978	only	-	Mar	24	 1:00	1:00	S
 Rule	Algeria	1978	only	-	Sep	22	 3:00	0	-
 Rule	Algeria	1980	only	-	Apr	25	 0:00	1:00	S
 Rule	Algeria	1980	only	-	Oct	31	 2:00	0	-
-# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
-# more precise 0:09:21.
+# Shanks gives 0:09 for Paris Mean Time; go with Howse's more precise 0:09:21.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Algiers	0:12:12 -	LMT	1891 Mar 15 0:01
 			0:09:21	-	PMT	1911 Mar 11    # Paris Mean Time
@@ -107,8 +106,7 @@ Zone	Africa/Luanda	0:52:56	-	LMT	1892
 			1:00	-	WAT
 
 # Benin
-# Whitman says they switched to 1:00 in 1946, not 1934;
-# go with Shanks & Pottenger.
+# Whitman says they switched to 1:00 in 1946, not 1934; go with Shanks.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Africa/Porto-Novo	0:10:28	-	LMT	1912
 			0:00	-	GMT	1934 Feb 26
@@ -132,7 +130,7 @@ Zone Africa/Bujumbura	1:57:28	-	LMT	1890
 			2:00	-	CAT
 
 # Cameroon
-# Whitman says they switched to 1:00 in 1920; go with Shanks & Pottenger.
+# Whitman says they switched to 1:00 in 1920; go with Shanks.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Douala	0:38:48	-	LMT	1912
 			1:00	-	WAT
@@ -211,14 +209,7 @@ Rule	Egypt	1990	1994	-	May	 1	1:00	1:00	S
 # IATA (after 1990) says transitions are at 0:00.
 # Go with IATA starting in 1995, except correct 1995 entry from 09-30 to 09-29.
 Rule	Egypt	1995	max	-	Apr	lastFri	 0:00s	1:00	S
-Rule	Egypt	1995	2005	-	Sep	lastThu	23:00s	0	-
-# From Steffen Thorsen (2006-09-19):
-# The Egyptian Gazette, issue 41,090 (2006-09-18), page 1, reports:
-# Egypt will turn back clocks by one hour at the midnight of Thursday
-# after observing the daylight saving time since May.
-# http://news.gom.com.eg/gazette/pdf/2006/09/18/01.pdf
-Rule	Egypt	2006	only	-	Sep	21	23:00s	0	-
-Rule	Egypt	2007	max	-	Sep	lastThu	23:00s	0	-
+Rule	Egypt	1995	max	-	Sep	lastThu	23:00s	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Cairo	2:05:00 -	LMT	1900 Oct
@@ -238,9 +229,9 @@ Zone	Africa/Asmera	2:35:32 -	LMT	1870
 			3:00	-	EAT
 
 # Ethiopia
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger write that Ethiopia had six narrowly-spaced time zones
-# between 1870 and 1890, and that they merged to 38E50 (2:35:20) in 1890.
+# From Paul Eggert (1997-10-05):
+# Shanks writes that Ethiopia had six narrowly-spaced time zones between
+# 1870 and 1890, and that they merged to 38E50 (2:35:20) in 1890.
 # We'll guess that 38E50 is for Adis Dera.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Africa/Addis_Ababa	2:34:48 -	LMT	1870
@@ -261,8 +252,7 @@ Zone	Africa/Banjul	-1:06:36 -	LMT	1912
 
 # Ghana
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# Whitman says DST was observed from 1931 to ``the present'';
-# go with Shanks & Pottenger.
+# Whitman says DST was observed from 1931 to ``the present''; go with Shanks.
 Rule	Ghana	1936	1942	-	Sep	 1	0:00	0:20	GHST
 Rule	Ghana	1936	1942	-	Dec	31	0:00	0	GMT
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -298,14 +288,13 @@ Zone	Africa/Maseru	1:50:00 -	LMT	1903 Mar
 			2:00	-	SAST
 
 # Liberia
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2001-07-17):
 # In 1972 Liberia was the last country to switch
 # from a UTC offset that was not a multiple of 15 or 20 minutes.
 # Howse reports that it was in honor of their president's birthday.
-# Shank & Pottenger report the date as May 1, whereas Howse reports Jan;
-# go with Shanks & Pottenger.
-# For Liberia before 1972, Shanks & Pottenger report -0:44, whereas Howse and
-# Whitman each report -0:44:30; go with the more precise figure.
+# Shanks reports the date as May 1, whereas Howse reports Jan; go with Shanks.
+# For Liberia before 1972, Shanks reports -0:44, whereas Howse and Whitman
+# each report -0:44:30; go with the more precise figure.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Monrovia	-0:43:08 -	LMT	1882
 			-0:43:08 -	MMT	1919 Mar # Monrovia Mean Time
@@ -335,7 +324,7 @@ Zone	Africa/Tripoli	0:52:44 -	LMT	1920
 			1:00	Libya	CE%sT	1959
 			2:00	-	EET	1982
 			1:00	Libya	CE%sT	1990 May  4
-# The following entries are from Shanks & Pottenger;
+# The following entries are all from Shanks;
 # the IATA SSIM data contain some obvious errors.
 			2:00	-	EET	1996 Sep 30
 			1:00	-	CET	1997 Apr  4
@@ -414,8 +403,8 @@ Zone	Africa/Maputo	2:10:20 -	LMT	1903 Mar
 			2:00	-	CAT
 
 # Namibia
-# The 1994-04-03 transition is from Shanks & Pottenger.
-# Shanks & Pottenger report no DST after 1998-04; go with IATA.
+# The 1994-04-03 transition is from Shanks.
+# Shanks reports no DST after 1998-04; go with IATA.
 # RULE	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Namibia	1994	max	-	Sep	Sun>=1	2:00	1:00	S
 Rule	Namibia	1995	max	-	Apr	Sun>=1	2:00	0	-
@@ -499,7 +488,7 @@ Zone	Indian/Mahe	3:41:48 -	LMT	1906 Jun	# Victoria
 
 # Sierra Leone
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# Whitman gives Mar 31 - Aug 31 for 1931 on; go with Shanks & Pottenger.
+# Whitman gives Mar 31 - Aug 31 for 1931 on; go with Shanks.
 Rule	SL	1935	1942	-	Jun	 1	0:00	0:40	SLST
 Rule	SL	1935	1942	-	Oct	 1	0:00	0	WAT
 Rule	SL	1957	1962	-	Jun	 1	0:00	1:00	SLST
@@ -568,6 +557,7 @@ Zone	Africa/Lome	0:04:52 -	LMT	1893
 # Tunisia
 
 # From Gwillim Law (2005-04-30):
+#
 # My correspondent, Risto Nykanen, has alerted me to another adoption of DST,
 # this time in Tunisia.  According to Yahoo France News
 # , in a story attributed to AP
@@ -581,12 +571,6 @@ Zone	Africa/Lome	0:04:52 -	LMT	1893
 # 
 # ... DST for 2005: on: Sun May 1 0h standard time, off: Fri Sept. 30,
 # 1h standard time.
-#
-# From Atef Loukil (2006-03-28):
-# The daylight saving time will be the same each year:
-# Beginning      : the last Sunday of March at 02:00
-# Ending         : the last Sunday of October at 03:00 ...
-# http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=1188&Itemid=50
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Tunisia	1939	only	-	Apr	15	23:00s	1:00	S
@@ -612,11 +596,8 @@ Rule	Tunisia	1989	only	-	Mar	26	 0:00s	1:00	S
 Rule	Tunisia	1990	only	-	May	 1	 0:00s	1:00	S
 Rule	Tunisia	2005	only	-	May	 1	 0:00s	1:00	S
 Rule	Tunisia	2005	only	-	Sep	30	 1:00s	0	-
-Rule	Tunisia	2006	max	-	Mar	lastSun	 2:00s	1:00	S
-Rule	Tunisia	2006	max	-	Oct	lastSun	 2:00s	0	-
-# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
-# more precise 0:09:21.
-# Shanks & Pottenger say the 1911 switch was on Mar 9; go with Howse's Mar 11.
+# Shanks gives 0:09 for Paris Mean Time; go with Howse's more precise 0:09:21.
+# Shanks says the 1911 switch occurred on Mar 9; go with Howse's Mar 11.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Tunis	0:40:44 -	LMT	1881 May 12
 			0:09:21	-	PMT	1911 Mar 11    # Paris Mean Time
diff --git a/timezone/antarctica b/timezone/antarctica
index 2584ae4f1d..8a9ea939c9 100644
--- a/timezone/antarctica
+++ b/timezone/antarctica
@@ -1,4 +1,4 @@
-# @(#)antarctica	8.3
+# @(#)antarctica	8.1
 # 
 
 # From Paul Eggert (1999-11-15):
@@ -33,27 +33,19 @@ Rule	RussAQ	1996	max	-	Oct	lastSun	 2:00s	0	-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	ArgAQ	1964	1966	-	Mar	 1	0:00	0	-
 Rule	ArgAQ	1964	1966	-	Oct	15	0:00	1:00	S
-Rule	ArgAQ	1967	only	-	Apr	 2	0:00	0	-
-Rule	ArgAQ	1967	1968	-	Oct	Sun>=1	0:00	1:00	S
-Rule	ArgAQ	1968	1969	-	Apr	Sun>=1	0:00	0	-
+Rule	ArgAQ	1967	only	-	Apr	 1	0:00	0	-
+Rule	ArgAQ	1967	1968	-	Oct	Sun<=7	0:00	1:00	S
+Rule	ArgAQ	1968	1969	-	Apr	Sun<=7	0:00	0	-
 Rule	ArgAQ	1974	only	-	Jan	23	0:00	1:00	S
 Rule	ArgAQ	1974	only	-	May	 1	0:00	0	-
-Rule	ChileAQ	1972	1986	-	Mar	Sun>=9	3:00u	0	-
-Rule	ChileAQ	1974	1987	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	ChileAQ	1987	only	-	Apr	12	3:00u	0	-
-Rule	ChileAQ	1988	1989	-	Mar	Sun>=9	3:00u	0	-
-Rule	ChileAQ	1988	only	-	Oct	Sun>=1	4:00u	1:00	S
-Rule	ChileAQ	1989	only	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	ChileAQ	1990	only	-	Mar	18	3:00u	0	-
-Rule	ChileAQ	1990	only	-	Sep	16	4:00u	1:00	S
-Rule	ChileAQ	1991	1996	-	Mar	Sun>=9	3:00u	0	-
-Rule	ChileAQ	1991	1997	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	ChileAQ	1997	only	-	Mar	30	3:00u	0	-
-Rule	ChileAQ	1998	only	-	Mar	Sun>=9	3:00u	0	-
-Rule	ChileAQ	1998	only	-	Sep	27	4:00u	1:00	S
-Rule	ChileAQ	1999	only	-	Apr	 4	3:00u	0	-
-Rule	ChileAQ	1999	max	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	ChileAQ	2000	max	-	Mar	Sun>=9	3:00u	0	-
+Rule	ArgAQ	1974	1976	-	Oct	Sun<=7	0:00	1:00	S
+Rule	ArgAQ	1975	1977	-	Apr	Sun<=7	0:00	0	-
+Rule	ChileAQ	1966	1997	-	Oct	Sun>=9	0:00	1:00	S
+Rule	ChileAQ	1967	1998	-	Mar	Sun>=9	0:00	0	-
+Rule	ChileAQ	1998	only	-	Sep	27	0:00	1:00	S
+Rule	ChileAQ	1999	only	-	Apr	 4	0:00	0	-
+Rule	ChileAQ	1999	max	-	Oct	Sun>=9	0:00	1:00	S
+Rule	ChileAQ	2000	max	-	Mar	Sun>=9	0:00	0	-
 
 
 # Argentina - year-round bases
diff --git a/timezone/asia b/timezone/asia
index 04ddc863e7..446cc16e6f 100644
--- a/timezone/asia
+++ b/timezone/asia
@@ -1,15 +1,15 @@
-# @(#)asia	8.8
+# @(#)asia	8.1
 # 
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-03-22):
 #
 # A good source for time zone historical data outside the U.S. is
-# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
-# San Diego: ACS Publications, Inc. (2003).
+# Thomas G. Shanks, The International Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1999).
 #
 # Gwillim Law writes that a good source
 # for recent time zone data is the International Air Transport
@@ -17,8 +17,8 @@
 # published semiannually.  Law sent in several helpful summaries
 # of the IATA's data after 1990.
 #
-# Except where otherwise noted, Shanks & Pottenger is the source for
-# entries through 1990, and IATA SSIM is the source for entries afterwards.
+# Except where otherwise noted, Shanks is the source for entries through 1990,
+# and IATA SSIM is the source for entries after 1990.
 #
 # Another source occasionally used is Edward W. Whitman, World Time Differences,
 # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
@@ -61,7 +61,6 @@
 # These rules are stolen from the `europe' file.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	EUAsia	1981	max	-	Mar	lastSun	 1:00u	1:00	S
-Rule	EUAsia	1979	1995	-	Sep	lastSun	 1:00u	0	-
 Rule	EUAsia	1996	max	-	Oct	lastSun	 1:00u	0	-
 Rule E-EurAsia	1981	max	-	Mar	lastSun	 0:00	1:00	S
 Rule E-EurAsia	1979	1995	-	Sep	lastSun	 0:00	0	-
@@ -83,11 +82,10 @@ Zone	Asia/Kabul	4:36:48 -	LMT	1890
 			4:30	-	AFT
 
 # Armenia
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger have Yerevan switching to 3:00 (with Russian DST)
-# in spring 1991, then to 4:00 with no DST in fall 1995, then
-# readopting Russian DST in 1997.  Go with Shanks & Pottenger, even
-# when they disagree with others.  Edgar Der-Danieliantz
+# From Paul Eggert (1999-10-29):
+# Shanks has Yerevan switching to 3:00 (with Russian DST) in spring 1991,
+# then to 4:00 with no DST in fall 1995, then readopting Russian DST in 1997.
+# Go with Shanks, even when he disagrees with others.  Edgar Der-Danieliantz
 # reported (1996-05-04) that Yerevan probably wouldn't use DST
 # in 1996, though it did use DST in 1995.  IATA SSIM (1991/1998) reports that
 # Armenia switched from 3:00 to 4:00 in 1998 and observed DST after 1991,
@@ -196,15 +194,13 @@ Zone	Asia/Phnom_Penh	6:59:40 -	LMT	1906 Jun  9
 # CHINA               8 H  AHEAD OF UTC  ALL OF CHINA, INCL TAIWAN
 # CHINA               9 H  AHEAD OF UTC  APR 17 - SEP 10
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger write that China (except for Hong Kong and Macau)
-# has had a single time zone since 1980 May 1, observing summer DST
-# from 1986 through 1991; this contradicts Devine's
+# From Paul Eggert (1995-12-19):
+# Shanks writes that China has had a single time zone since 1980 May 1,
+# observing summer DST from 1986 through 1991; this contradicts Devine's
 # note about Time magazine, though apparently _something_ happened in 1986.
-# Go with Shanks & Pottenger for now.  I made up names for the other
-# pre-1980 time zones.
+# Go with Shanks for now.  I made up names for the other pre-1980 time zones.
 
-# From Shanks & Pottenger:
+# From Shanks:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Shang	1940	only	-	Jun	 3	0:00	1:00	D
 Rule	Shang	1940	1941	-	Oct	 1	0:00	0	S
@@ -212,27 +208,14 @@ Rule	Shang	1941	only	-	Mar	16	0:00	1:00	D
 Rule	PRC	1986	only	-	May	 4	0:00	1:00	D
 Rule	PRC	1986	1991	-	Sep	Sun>=11	0:00	0	S
 Rule	PRC	1987	1991	-	Apr	Sun>=10	0:00	1:00	D
-
+#
+# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+#
 # From Anthony Fok (2001-12-20):
 # BTW, I did some research on-line and found some info regarding these five
 # historic timezones from some Taiwan websites.  And yes, there are official
-# Chinese names for these locales (before 1949).
-# 
-# From Jesper Norgaard Welen (2006-07-14):
-# I have investigated the timezones around 1970 on the
-# http://www.astro.com/atlas site [with provinces and county
-# boundaries summarized below]....  A few other exceptions were two
-# counties on the Sichuan side of the Xizang-Sichuan border,
-# counties Dege and Baiyu which lies on the Sichuan side and are
-# therefore supposed to be GMT+7, Xizang region being GMT+6, but Dege
-# county is GMT+8 according to astro.com while Baiyu county is GMT+6
-# (could be true), for the moment I am assuming that those two
-# counties are mistakes in the astro.com data.
-
-
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+# Chinese names for these locales (before 1949):
 # Changbai Time ("Long-white Time", Long-white = Heilongjiang area)
-# Heilongjiang (except Mohe county), Jilin
 Zone	Asia/Harbin	8:26:44	-	LMT	1928 # or Haerbin
 			8:30	-	CHAT	1932 Mar # Changbai Time
 			8:00	-	CST	1940
@@ -240,35 +223,18 @@ Zone	Asia/Harbin	8:26:44	-	LMT	1928 # or Haerbin
 			8:30	-	CHAT	1980 May
 			8:00	PRC	C%sT
 # Zhongyuan Time ("Central plain Time")
-# most of China
 Zone	Asia/Shanghai	8:05:52	-	LMT	1928
 			8:00	Shang	C%sT	1949
 			8:00	PRC	C%sT
 # Long-shu Time (probably due to Long and Shu being two names of that area)
-# Guangxi, Guizhou, Hainan, Ningxia, Sichuan, Shaanxi, and Yunnan;
-# most of Gansu; west Inner Mongolia; west Qinghai; and the Guangdong
-# counties Deqing, Enping, Kaiping, Luoding, Taishan, Xinxing,
-# Yangchun, Yangjiang, Yu'nan, and Yunfu.
 Zone	Asia/Chongqing	7:06:20	-	LMT	1928 # or Chungking
 			7:00	-	LONT	1980 May # Long-shu Time
 			8:00	PRC	C%sT
 # Xin-zang Time ("Xinjiang-Tibet Time")
-# The Gansu counties Aksay, Anxi, Dunhuang, Subei; west Qinghai;
-# the Guangdong counties  Xuwen, Haikang, Suixi, Lianjiang,
-# Zhanjiang, Wuchuan, Huazhou, Gaozhou, Maoming, Dianbai, and Xinyi;
-# east Tibet, including Lhasa, Chamdo, Shigaise, Jimsar, Shawan and Hutubi;
-# east Xinjiang, including Urumqi, Turpan, Karamay, Korla, Minfeng, Jinghe,
-# Wusu, Qiemo, Xinyan, Wulanwusu, Jinghe, Yumin, Tacheng, Tuoli, Emin,
-# Shihezi, Changji, Yanqi, Heshuo, Tuokexun, Tulufan, Shanshan, Hami,
-# Fukang, Kuitun, Kumukuli, Miquan, Qitai, and Turfan.
 Zone	Asia/Urumqi	5:50:20	-	LMT	1928 # or Urumchi
 			6:00	-	URUT	1980 May # Urumqi Time
 			8:00	PRC	C%sT
 # Kunlun Time
-# West Tibet, including Pulan, Aheqi, Shufu, Shule;
-# West Xinjiang, including Aksu, Atushi, Yining, Hetian, Cele, Luopu, Nileke,
-# Zhaosu, Tekesi, Gongliu, Chabuchaer, Huocheng, Bole, Pishan, Suiding,
-# and Yarkand.
 Zone	Asia/Kashgar	5:03:56	-	LMT	1928 # or Kashi or Kaxgar
 			5:30	-	KAST	1940	 # Kashgar Time
 			5:00	-	KAST	1980 May
@@ -300,7 +266,7 @@ Zone	Asia/Hong_Kong	7:36:36 -	LMT	1904 Oct 30
 
 # Taiwan
 
-# Shanks & Pottenger write that Taiwan observed DST during 1945, when it
+# Shanks writes that Taiwan observed DST during 1945, when it
 # was still controlled by Japan.  This is hard to believe, but we don't
 # have any other information.
 
@@ -457,7 +423,7 @@ Zone	Asia/Calcutta	5:53:28 -	LMT	1880	# Kolkata
 
 # Indonesia
 #
-# From Gwillim Law (2001-05-28), overriding Shanks & Pottenger:
+# From Gwillim Law (2001-05-28), overriding Shanks:
 # 
 # says that Indonesia's time zones changed on 1988-01-01.  Looking at some
 # time zone maps, I think that must refer to Western Borneo (Kalimantan Barat
@@ -465,7 +431,7 @@ Zone	Asia/Calcutta	5:53:28 -	LMT	1880	# Kolkata
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Asia/Jakarta	7:07:12 -	LMT	1867 Aug 10
-# Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
+# Shanks says the next transition was at 1924 Jan 1 0:13,
 # but this must be a typo.
 			7:07:12	-	JMT	1923 Dec 31 23:47:12 # Jakarta
 			7:20	-	JAVT	1932 Nov	 # Java Time
@@ -532,8 +498,8 @@ Zone Asia/Jayapura	9:22:48 -	LMT	1932 Nov
 # leap year calculation involved.  There has never been any serious
 # plan to change that law....
 #
-# From Paul Eggert (2006-03-22):
-# Go with Shanks & Pottenger before Sept. 1991, and with Pournader thereafter.
+# From Paul Eggert (2005-04-05):
+# Go with Shanks before September 1991, and with Pournader thereafter.
 # I used Ed Reingold's cal-persia in GNU Emacs 21.2 to check Persian dates,
 # stopping after 2037 when 32-bit time_t's overflow.
 # That cal-persia used Birashk's approximation, which disagrees with the solar
@@ -553,14 +519,6 @@ Zone Asia/Jayapura	9:22:48 -	LMT	1932 Nov
 # Reingold's/Dershowitz' calculator gives correctly the Gregorian date
 # 2058-03-21 for 1 Farvardin 1437 (astronomical).
 #
-# From Paul Eggert (2006-03-22):
-# The above comments about post-2006 transitions may become relevant again,
-# if Iran ever resuscitates DST, so we'll leave the comments in.
-#
-# From Steffen Thorsen (2006-03-22):
-# Several of my users have reported that Iran will not observe DST anymore:
-# http://www.irna.ir/en/news/view/line-17/0603193812164948.htm
-#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Iran	1978	1980	-	Mar	21	0:00	1:00	D
 Rule	Iran	1978	only	-	Oct	21	0:00	0	S
@@ -579,8 +537,38 @@ Rule	Iran	2001	2003	-	Mar	22	0:00	1:00	D
 Rule	Iran	2001	2003	-	Sep	22	0:00	0	S
 Rule	Iran	2004	only	-	Mar	21	0:00	1:00	D
 Rule	Iran	2004	only	-	Sep	21	0:00	0	S
-Rule	Iran	2005	only	-	Mar	22	0:00	1:00	D
-Rule	Iran	2005	only	-	Sep	22	0:00	0	S
+Rule	Iran	2005	2007	-	Mar	22	0:00	1:00	D
+Rule	Iran	2005	2007	-	Sep	22	0:00	0	S
+Rule	Iran	2008	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2008	only	-	Sep	21	0:00	0	S
+Rule	Iran	2009	2011	-	Mar	22	0:00	1:00	D
+Rule	Iran	2009	2011	-	Sep	22	0:00	0	S
+Rule	Iran	2012	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2012	only	-	Sep	21	0:00	0	S
+Rule	Iran	2013	2015	-	Mar	22	0:00	1:00	D
+Rule	Iran	2013	2015	-	Sep	22	0:00	0	S
+Rule	Iran	2016	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2016	only	-	Sep	21	0:00	0	S
+Rule	Iran	2017	2019	-	Mar	22	0:00	1:00	D
+Rule	Iran	2017	2019	-	Sep	22	0:00	0	S
+Rule	Iran	2020	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2020	only	-	Sep	21	0:00	0	S
+Rule	Iran	2021	2023	-	Mar	22	0:00	1:00	D
+Rule	Iran	2021	2023	-	Sep	22	0:00	0	S
+Rule	Iran	2024	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2024	only	-	Sep	21	0:00	0	S
+Rule	Iran	2025	2027	-	Mar	22	0:00	1:00	D
+Rule	Iran	2025	2027	-	Sep	22	0:00	0	S
+Rule	Iran	2028	2029	-	Mar	21	0:00	1:00	D
+Rule	Iran	2028	2029	-	Sep	21	0:00	0	S
+Rule	Iran	2030	2031	-	Mar	22	0:00	1:00	D
+Rule	Iran	2030	2031	-	Sep	22	0:00	0	S
+Rule	Iran	2032	2033	-	Mar	21	0:00	1:00	D
+Rule	Iran	2032	2033	-	Sep	21	0:00	0	S
+Rule	Iran	2034	2035	-	Mar	22	0:00	1:00	D
+Rule	Iran	2034	2035	-	Sep	22	0:00	0	S
+Rule	Iran	2036	2037	-	Mar	21	0:00	1:00	D
+Rule	Iran	2036	2037	-	Sep	21	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Tehran	3:25:44	-	LMT	1916
 			3:25:44	-	TMT	1946	# Tehran Mean Time
@@ -613,8 +601,7 @@ Rule	Iraq	1984	1985	-	Apr	1	0:00	1:00	D
 Rule	Iraq	1985	1990	-	Sep	lastSun	1:00s	0	S
 Rule	Iraq	1986	1990	-	Mar	lastSun	1:00s	1:00	D
 # IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo.
-# Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
-# 
+# Shanks says Iraq did not observe DST 1992/1997 or 1999 on; ignore this.
 Rule	Iraq	1991	max	-	Apr	 1	3:00s	1:00	D
 Rule	Iraq	1991	max	-	Oct	 1	3:00s	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -648,7 +635,7 @@ Zone	Asia/Baghdad	2:57:40	-	LMT	1890
 # high on my favorite-country list (and not only because my wife's
 # family is from India).
 
-# From Shanks & Pottenger:
+# From Shanks:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Zion	1940	only	-	Jun	 1	0:00	1:00	D
 Rule	Zion	1942	1944	-	Nov	 1	0:00	0	S
@@ -887,15 +874,14 @@ Zone	Asia/Jerusalem	2:20:56 -	LMT	1880
 # of the Japanese wanted to scrap daylight-saving time, as opposed to 30% who
 # wanted to keep it.)
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger write that DST in Japan during those years was as follows:
+# Shanks writes that daylight saving in Japan during those years was as follows:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Japan	1948	only	-	May	Sun>=1	2:00	1:00	D
 Rule	Japan	1948	1951	-	Sep	Sat>=8	2:00	0	S
 Rule	Japan	1949	only	-	Apr	Sun>=1	2:00	1:00	D
 Rule	Japan	1950	1951	-	May	Sun>=1	2:00	1:00	D
 # but the only locations using it (for birth certificates, presumably, since
-# their audience is astrologers) were US military bases.  For now, assume
+# Shanks's audience is astrologers) were US military bases.  For now, assume
 # that for most purposes daylight-saving time was observed; otherwise, what
 # would have been the point of the 1951 poll?
 
@@ -920,9 +906,8 @@ Rule	Japan	1950	1951	-	May	Sun>=1	2:00	1:00	D
 # I wrote "ordinance" above, but I don't know how to translate.
 # In Japanese it's "chokurei", which means ordinance from emperor.
 
-# Shanks & Pottenger claim JST in use since 1896, and that a few
-# places (e.g. Ishigaki) use +0800; go with Suzuki.  Guess that all
-# ordinances took effect on Jan 1.
+# Shanks claims JST in use since 1896, and that a few places (e.g. Ishigaki)
+# use +0800; go with Suzuki.  Guess that all ordinances took effect on Jan 1.
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Tokyo	9:18:59	-	LMT	1887 Dec 31 15:00u
@@ -953,10 +938,6 @@ Zone	Asia/Tokyo	9:18:59	-	LMT	1887 Dec 31 15:00u
 # For Jordan I have received multiple independent user reports every year
 # about DST end dates, as the end-rule is different every year.
 #
-# From Steffen Thorsen (2006-10-01), after a heads-up from Hilal Malawi:
-# http://www.petranews.gov.jo/nepras/2006/Sep/05/4000.htm
-# "Jordan will switch to winter time on Friday, October 27".
-#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Jordan	1973	only	-	Jun	6	0:00	1:00	S
 Rule	Jordan	1973	1975	-	Oct	1	0:00	0	-
@@ -983,8 +964,7 @@ Rule	Jordan	1999	2002	-	Sep	lastThu	0:00s	0	-
 Rule	Jordan	2000	max	-	Mar	lastThu	0:00s	1:00	S
 Rule	Jordan	2003	only	-	Oct	24	0:00s	0	-
 Rule	Jordan	2004	only	-	Oct	15	0:00s	0	-
-Rule	Jordan	2005	only	-	Sep	lastFri	0:00s	0	-
-Rule	Jordan	2006	max	-	Oct	lastFri	0:00s	0	-
+Rule	Jordan	2005	max	-	Sep	lastFri	0:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Amman	2:23:44 -	LMT	1931
 			2:00	Jordan	EE%sT
@@ -999,11 +979,11 @@ Zone	Asia/Amman	2:23:44 -	LMT	1931
 # Guess that Aqtau and Aqtobe diverged in 1995, since that's the first time
 # IATA SSIM mentions a third time zone in Kazakhstan.
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2001-10-18):
 # German Iofis, ELSI, Almaty (2001-10-09) reports that Kazakhstan uses
 # RussiaAsia rules, instead of switching at 00:00 as the IATA has it.
-# Go with Shanks & Pottenger, who have them always using RussiaAsia rules.
-# Also go with the following claims of Shanks & Pottenger:
+# Go with Shanks, who has them always using RussiaAsia rules.
+# Also go with the following claims of Shanks:
 #
 # - Kazakhstan did not observe DST in 1991.
 # - Qyzylorda switched from +5:00 to +6:00 on 1992-01-19 02:00.
@@ -1083,7 +1063,7 @@ Zone	Asia/Oral	3:25:24	-	LMT	1924 May  2 # or Ural'sk
 			5:00	-	ORAT
 
 # Kyrgyzstan (Kirgizstan)
-# Transitions through 1991 are from Shanks & Pottenger.
+# Transitions through 1991 are from Shanks.
 
 # From Paul Eggert (2005-08-15):
 # According to an article dated today in the Kyrgyzstan Development Gateway
@@ -1111,19 +1091,17 @@ Zone	Asia/Bishkek	4:58:24 -	LMT	1924 May  2
 
 # Korea (North and South)
 
-# From Annie I. Bang (2006-07-10) in
-# :
-# The Ministry of Commerce, Industry and Energy has already
-# commissioned a research project [to reintroduce DST] and has said
-# the system may begin as early as 2008....  Korea ran a daylight
-# saving program from 1949-61 but stopped it during the 1950-53 Korean War.
+# From Guy Harris:
+# According to someone at the Korean Times in San Francisco,
+# Daylight Savings Time was not observed until 1987.  He did not know
+# at what time of day DST starts or ends.
 
-# From Shanks & Pottenger:
+# From Shanks:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	ROK	1960	only	-	May	15	0:00	1:00	D
 Rule	ROK	1960	only	-	Sep	13	0:00	0	S
-Rule	ROK	1987	1988	-	May	Sun>=8	0:00	1:00	D
-Rule	ROK	1987	1988	-	Oct	Sun>=8	0:00	0	S
+Rule	ROK	1987	1988	-	May	Sun<=14	0:00	1:00	D
+Rule	ROK	1987	1988	-	Oct	Sun<=14	0:00	0	S
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Seoul	8:27:52	-	LMT	1890
@@ -1206,8 +1184,8 @@ Zone Asia/Kuala_Lumpur	6:46:46 -	LMT	1901 Jan  1
 			7:30	-	MALT	1982 Jan  1
 			8:00	-	MYT	# Malaysia Time
 # Sabah & Sarawak
-# From Paul Eggert (2006-03-22):
-# The data here are mostly from Shanks & Pottenger, but the 1942, 1945 and 1982
+# From Paul Eggert (2003-11-01):
+# The data here are mostly from Shanks, but the 1942, 1945 and 1982
 # transition dates are from Mok Ly Yng.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Asia/Kuching	7:21:20	-	LMT	1926 Mar
@@ -1225,8 +1203,8 @@ Zone	Indian/Maldives	4:54:00 -	LMT	1880	# Male
 
 # Mongolia
 
-# Shanks & Pottenger say that Mongolia has three time zones, but
-# usno1995 and the CIA map Standard Time Zones of the World (2005-03)
+# Shanks says that Mongolia has three time zones, but usno1995 and the CIA map
+# Standard Time Zones of the World (1997-01)
 # both say that it has just one.
 
 # From Oscar van Vlijmen (1999-12-11):
@@ -1296,19 +1274,11 @@ Zone	Indian/Maldives	4:54:00 -	LMT	1880	# Male
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Mongol	1983	1984	-	Apr	1	0:00	1:00	S
 Rule	Mongol	1983	only	-	Oct	1	0:00	0	-
-# Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00,
-# but McDow says the 2001 switches occurred at 02:00.  Also, IATA SSIM
-# (1996-09) says 1996-10-25.  Go with Shanks & Pottenger through 1998.
-#
-# Shanks & Pottenger say that the Sept. 1984 through Sept. 1990 switches
-# in Choibalsan (more precisely, in Dornod and Sukhbaatar) took place
-# at 02:00 standard time, not at 00:00 local time as in the rest of
-# the country.  That would be odd, and possibly is a result of their
-# correction of 02:00 (in the previous edition) not being done correctly
-# in the latest edition; so ignore it for now.
-
-Rule	Mongol	1985	1998	-	Mar	lastSun	0:00	1:00	S
-Rule	Mongol	1984	1998	-	Sep	lastSun	0:00	0	-
+# IATA SSIM says 1990s switches occurred at 00:00, but Shanks (1995) lists
+# them at 02:00s, and McDow says the 2001 switches also occurred at 02:00.
+# Also, IATA SSIM (1996-09) says 1996-10-25.  Go with Shanks through 1998.
+Rule	Mongol	1985	1998	-	Mar	lastSun	2:00s	1:00	S
+Rule	Mongol	1984	1998	-	Sep	lastSun	2:00s	0	-
 # IATA SSIM (1999-09) says Mongolia no longer observes DST.
 Rule	Mongol	2001	only	-	Apr	lastSat	2:00	1:00	S
 Rule	Mongol	2001	max	-	Sep	lastSat	2:00	0	-
@@ -1434,8 +1404,8 @@ Zone	Asia/Karachi	4:28:12 -	LMT	1907
 # I guess more info may be available from the PA's web page (if/when they
 # have one).
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger write that Gaza did not observe DST until 1957, but go
+# From Paul Eggert (1998-02-25):
+# Shanks writes that Gaza did not observe DST until 1957, but we'll go
 # with Shapir and assume that it observed DST from 1940 through 1947,
 # and that it used Jordanian rules starting in 1996.
 # We don't yet need a separate entry for the West Bank, since
@@ -1473,23 +1443,6 @@ Zone	Asia/Karachi	4:28:12 -	LMT	1907
 # there is a good chance next year's end date will be around two weeks
 # earlier--the same goes for Jordan.
 
-# From Steffen Thorsen (2006-08-17):
-# I was informed by a user in Bethlehem that in Bethlehem it started the
-# same day as Israel, and after checking with other users in the area, I
-# was informed that they started DST one day after Israel.  I was not
-# able to find any authoritative sources at the time, nor details if
-# Gaza changed as well, but presumed Gaza to follow the same rules as
-# the West Bank.
-
-# From Steffen Thorsen (2006-09-26):
-# according to the Palestine News Network (2006-09-19):
-# http://english.pnn.ps/index.php?option=com_content&task=view&id=596&Itemid=5
-# > The Council of Ministers announced that this year its winter schedule
-# > will begin early, as of midnight Thursday.  It is also time to turn
-# > back the clocks for winter.  Friday will begin an hour late this week.
-# I guess it is likely that next year's date will be moved as well,
-# because of the Ramadan.
-
 # The rules for Egypt are stolen from the `africa' file.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule EgyptAsia	1957	only	-	May	10	0:00	1:00	S
@@ -1499,13 +1452,10 @@ Rule EgyptAsia	1959	1967	-	May	 1	1:00	1:00	S
 Rule EgyptAsia	1959	1965	-	Sep	30	3:00	0	-
 Rule EgyptAsia	1966	only	-	Oct	 1	3:00	0	-
 
-Rule Palestine	1999	2005	-	Apr	Fri>=15	0:00	1:00	S
+Rule Palestine	1999	max	-	Apr	Fri>=15	0:00	1:00	S
 Rule Palestine	1999	2003	-	Oct	Fri>=15	0:00	0	-
 Rule Palestine	2004	only	-	Oct	 1	1:00	0	-
-Rule Palestine	2005	only	-	Oct	 4	2:00	0	-
-Rule Palestine	2006	max	-	Apr	 1	0:00	1:00	S
-Rule Palestine	2006	only	-	Sep	22	0:00	0	-
-Rule Palestine	2007	max	-	Oct	Fri>=15	0:00	0	-
+Rule Palestine	2005	max	-	Oct	 4	2:00	0	-
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Gaza	2:17:52	-	LMT	1900 Oct
@@ -1523,21 +1473,7 @@ Zone	Asia/Gaza	2:17:52	-	LMT	1900 Oct
 # Philippines, issued a proclamation announcing that 1844-12-30 was to
 # be immediately followed by 1845-01-01.  Robert H. van Gent has a
 # transcript of the decree in .
-# The rest of the data are from Shanks & Pottenger.
-
-# From Paul Eggert (2006-04-25):
-# Tomorrow's Manila Standard reports that the Philippines Department of
-# Trade and Industry is considering adopting DST this June when the
-# rainy season begins.  See
-# .
-# For now, we'll ignore this, since it's not definite and we lack details.
-#
-# From Jesper Norgaard Welen (2006-04-26):
-# ... claims that Philippines had DST last time in 1990:
-# http://story.philippinetimes.com/p.x/ct/9/id/145be20cc6b121c0/cid/3e5bbccc730d258c/
-# [a story dated 2006-04-25 by Cris Larano of Dow Jones Newswires,
-# but no details]
-
+# The rest of this data is from Shanks.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Phil	1936	only	-	Nov	1	0:00	1:00	S
 Rule	Phil	1937	only	-	Feb	1	0:00	0	-
@@ -1597,49 +1533,6 @@ Zone	Asia/Singapore	6:55:25 -	LMT	1901 Jan  1
 # With effect from 12.30 a.m. on 26th October 1996
 # Sri Lanka will be six (06) hours ahead of GMT.
 
-# From Jesper Norgaard Welen (2006-04-14), quoting Sri Lanka News Online
-#  (2006-04-13):
-# 0030 hrs on April 15, 2006 (midnight of April 14, 2006 +30 minutes)
-# at present, become 2400 hours of April 14, 2006 (midnight of April 14, 2006).
-
-# From Peter Apps and Ranga Sirila of Reuters (2006-04-12) in:
-# 
-# [The Tamil Tigers] never accepted the original 1996 time change and simply
-# kept their clocks set five and a half hours ahead of Greenwich Mean
-# Time (GMT), in line with neighbor India.
-# From Paul Eggert (2006-04-18):
-# People who live in regions under Tamil control can use TZ='Asia/Calcutta',
-# as that zone has agreed with the Tamil areas since our cutoff date of 1970.
-
-# From K Sethu (2006-04-25):
-# I think the abbreviation LKT originated from the world of computers at
-# the time of or subsequent to the time zone changes by SL Government
-# twice in 1996 and probably SL Government or its standardization
-# agencies never declared an abbreviation as a national standard.
-#
-# I recollect before the recent change the government annoucemments
-# mentioning it as simply changing Sri Lanka Standard Time or Sri Lanka
-# Time and no mention was made about the abbreviation.
-#
-# If we look at Sri Lanka Department of Government's "Official News
-# Website of Sri Lanka" ... http://www.news.lk/ we can see that they
-# use SLT as abbreviation in time stamp at the beginning of each news
-# item....
-#
-# Within Sri Lanka I think LKT is well known among computer users and
-# adminsitrators.  In my opinion SLT may not be a good choice because the
-# nation's largest telcom / internet operator Sri Lanka Telcom is well
-# known by that abbreviation - simply as SLT (there IP domains are
-# slt.lk and sltnet.lk).
-#
-# But if indeed our government has adopted SLT as standard abbreviation
-# (that we have not known so far) then  it is better that it be used for
-# all computers.
-
-# From Paul Eggert (2006-04-25):
-# One possibility is that we wait for a bit for the dust to settle down
-# and then see what people actually say in practice.
-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Colombo	5:19:24 -	LMT	1880
 			5:19:32	-	MMT	1906	# Moratuwa Mean Time
@@ -1648,8 +1541,7 @@ Zone	Asia/Colombo	5:19:24 -	LMT	1880
 			5:30	1:00	IST	1945 Oct 16 2:00
 			5:30	-	IST	1996 May 25 0:00
 			6:30	-	LKT	1996 Oct 26 0:30
-			6:00	-	LKT	2006 Apr 15 0:30
-			5:30	-	IST
+			6:00	-	LKT
 
 # Syria
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
@@ -1684,24 +1576,17 @@ Rule	Syria	1993	only	-	Sep	25	0:00	0	-
 # IATA SSIM (1998-02) says 1998-04-02;
 # (1998-09) says 1999-03-29 and 1999-09-29; (1999-02) says 1999-04-02,
 # 2000-04-02, and 2001-04-02; (1999-09) says 2000-03-31 and 2001-03-31;
-# (2006) says 2006-03-31 and 2006-09-22;
-# for now ignore all these claims and go with Shanks & Pottenger,
-# except for the 2006-09-22 claim (which seems right for Ramadan).
+# ignore all these claims and go with Shanks.
 Rule	Syria	1994	1996	-	Apr	 1	0:00	1:00	S
-Rule	Syria	1994	2005	-	Oct	 1	0:00	0	-
+Rule	Syria	1994	max	-	Oct	 1	0:00	0	-
 Rule	Syria	1997	1998	-	Mar	lastMon	0:00	1:00	S
 Rule	Syria	1999	max	-	Apr	 1	0:00	1:00	S
-# From Stephen Colebourne (2006-09-18):
-# According to IATA data, Syria will change DST on 21st September [21:00 UTC]
-# this year [only]....  This is probably related to Ramadan, like Egypt.
-Rule	Syria	2006	only	-	Sep	22	0:00	0	-
-Rule	Syria	2007	max	-	Oct	 1	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Damascus	2:25:12 -	LMT	1920	# Dimashq
 			2:00	Syria	EE%sT
 
 # Tajikistan
-# From Shanks & Pottenger.
+# From Shanks.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Dushanbe	4:35:12 -	LMT	1924 May  2
 			5:00	-	DUST	1930 Jun 21 # Dushanbe Time
@@ -1716,13 +1601,13 @@ Zone	Asia/Bangkok	6:42:04	-	LMT	1880
 			7:00	-	ICT
 
 # Turkmenistan
-# From Shanks & Pottenger.
+# From Shanks.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Ashgabat	3:53:32 -	LMT	1924 May  2 # or Ashkhabad
 			4:00	-	ASHT	1930 Jun 21 # Ashkhabad Time
 			5:00 RussiaAsia	ASH%sT	1991 Mar 31 2:00
 			4:00 RussiaAsia	ASH%sT	1991 Oct 27 # independence
-			4:00 RussiaAsia	TM%sT	1992 Jan 19 2:00
+			4:00 RussiaAsia TM%sT	1992 Jan 19 2:00
 			5:00	-	TMT
 
 # United Arab Emirates
@@ -1736,24 +1621,24 @@ Zone	Asia/Samarkand	4:27:12 -	LMT	1924 May  2
 			4:00	-	SAMT	1930 Jun 21 # Samarkand Time
 			5:00	-	SAMT	1981 Apr  1
 			5:00	1:00	SAMST	1981 Oct  1
-			6:00	-	TAST	1982 Apr  1 # Tashkent Time
-			5:00 RussiaAsia	SAM%sT	1991 Sep  1 # independence
+			6:00 RussiaAsia TAS%sT	1991 Mar 31 2:00 # Tashkent Time
+			5:00 RussiaAsia	TAS%sT	1991 Sep  1 # independence
 			5:00 RussiaAsia	UZ%sT	1992
+			5:00 RussiaAsia	UZ%sT	1993
 			5:00	-	UZT
 Zone	Asia/Tashkent	4:37:12 -	LMT	1924 May  2
 			5:00	-	TAST	1930 Jun 21 # Tashkent Time
-			6:00 RussiaAsia	TAS%sT	1991 Mar 31 2:00
+			6:00 RussiaAsia TAS%sT	1991 Mar 31 2:00s
 			5:00 RussiaAsia	TAS%sT	1991 Sep  1 # independence
 			5:00 RussiaAsia	UZ%sT	1992
+			5:00 RussiaAsia	UZ%sT	1993
 			5:00	-	UZT
 
 # Vietnam
-
 # From Paul Eggert (1993-11-18):
 # Saigon's official name is Thanh-Pho Ho Chi Minh, but it's too long.
 # We'll stick with the traditional name for now.
-
-# From Shanks & Pottenger:
+# From Shanks:
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Asia/Saigon	7:06:40 -	LMT	1906 Jun  9
 			7:06:20	-	SMT	1911 Mar 11 0:01 # Saigon MT?
diff --git a/timezone/australasia b/timezone/australasia
index 2e17bcc0c3..70b845560e 100644
--- a/timezone/australasia
+++ b/timezone/australasia
@@ -1,4 +1,4 @@
-# @(#)australasia	8.3
+# @(#)australasia	8.1
 # 
 
 # This file also includes Pacific islands.
@@ -210,7 +210,7 @@ Zone Indian/Christmas	7:02:52 -	LMT	1895 Feb
 			7:00	-	CXT	# Christmas Island Time
 
 # Cook Is
-# From Shanks & Pottenger:
+# From Shanks:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cook	1978	only	-	Nov	12	0:00	0:30	HS
 Rule	Cook	1979	1991	-	Mar	Sun>=1	0:00	0	-
@@ -308,7 +308,7 @@ Zone	Pacific/Nauru	11:07:40 -	LMT	1921 Jan 15	# Uaobe
 Rule	NC	1977	1978	-	Dec	Sun>=1	0:00	1:00	S
 Rule	NC	1978	1979	-	Feb	27	0:00	0	-
 Rule	NC	1996	only	-	Dec	 1	2:00s	1:00	S
-# Shanks & Pottenger say the following was at 2:00; go with IATA.
+# Shanks says the following was at 2:00; go with IATA.
 Rule	NC	1997	only	-	Mar	 2	2:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Pacific/Noumea	11:05:48 -	LMT	1912 Jan 13
@@ -507,10 +507,10 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-10-29):
 # A good source for time zone historical data outside the U.S. is
-# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
-# San Diego: ACS Publications, Inc. (2003).
+# Thomas G. Shanks, The International Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1999).
 #
 # Gwillim Law writes that a good source
 # for recent time zone data is the International Air Transport
@@ -518,8 +518,8 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # published semiannually.  Law sent in several helpful summaries
 # of the IATA's data after 1990.
 #
-# Except where otherwise noted, Shanks & Pottenger is the source for
-# entries through 1990, and IATA SSIM is the source for entries afterwards.
+# Except where otherwise noted, Shanks is the source for entries through 1990,
+# and IATA SSIM is the source for entries after 1990.
 #
 # Another source occasionally used is Edward W. Whitman, World Time Differences,
 # Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
@@ -587,12 +587,6 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 #	WST	for any place operating at a GMTOFF of 8:00
 #	EST	for any place operating at a GMTOFF of 10:00
 
-# From Chuck Soper (2006-06-01):
-# I recently found this Australian government web page on time zones:
-# 
-# And this government web page lists time zone names and abbreviations:
-# 
-
 # From Paul Eggert (2001-04-05), summarizing a long discussion about "EST"
 # versus "AEST" etc.:
 #
@@ -675,7 +669,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 #   understood in Australia.
 
 # From Paul Eggert (1995-12-19):
-# Shanks & Pottenger report 2:00 for all autumn changes in Australia and NZ.
+# Shanks reports 2:00 for all autumn changes in Australia and New Zealand.
 # Mark Prior writes that his newspaper
 # reports that NSW's fall 1995 change will occur at 2:00,
 # but Robert Elz says it's been 3:00 in Victoria since 1970
@@ -848,14 +842,14 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # current DST ending dates, no worries.
 #
 # Rule	Oz	1971	1985	-	Oct	lastSun	2:00	1:00	-
-# Rule	Oz	1986	max	-	Oct	Sun>=18	2:00	1:00	-
+# Rule	Oz	1986	max	-	Oct	Sun<=24	2:00	1:00	-
 # Rule	Oz	1972	only	-	Feb	27	3:00	0	-
 # Rule	Oz	1973	1986	-	Mar	Sun>=1	3:00	0	-
-# Rule	Oz	1987	max	-	Mar	Sun>=15	3:00	0	-
+# Rule	Oz	1987	max	-	Mar	Sun<=21	3:00	0	-
 # Zone	Australia/Tasmania	10:00	Oz	EST
 # Zone	Australia/South		9:30	Oz	CST
 # Zone	Australia/Victoria	10:00	Oz	EST	1985 Oct lastSun 2:00
-#				10:00	1:00	EST	1986 Mar Sun>=15 3:00
+#				10:00	1:00	EST	1986 Mar Sun<=21 3:00
 #				10:00	Oz	EST
 
 # From Robert Elz (1991-03-06):
@@ -881,7 +875,7 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # ...
 # Rule	 AS	1971	max	-	Oct	lastSun	2:00	1:00	D
 # Rule	 AS	1972	1985	-	Mar	Sun>=1	3:00	0	C
-# Rule	 AS	1986	1990	-	Mar	Sun>=15	3:00	0	C
+# Rule	 AS	1986	1990	-	Mar	Sun<=21	3:00	0	C
 # Rule	 AS	1991	max	-	Mar	Sun>=1	3:00	0	C
 
 # From Bradley White (1992-03-11):
@@ -1074,9 +1068,9 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # shown on clocks on LHI. I guess this means that for 30 minutes at the start
 # of DST, LHI is actually 1 hour ahead of the rest of NSW.
 
-# From Paul Eggert (2006-03-22):
-# For Lord Howe dates we use Shanks & Pottenger through 1989, and
-# Lonergan thereafter.  For times we use Lonergan.
+# From Paul Eggert (2001-02-09):
+# For Lord Howe dates we use Shanks through 1989, and Lonergan thereafter.
+# For times we use Lonergan.
 
 ###############################################################################
 
@@ -1107,16 +1101,16 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # rather than the October 1 value.
 
 # From Paul Eggert (1995-12-19);
-# Shank & Pottenger report 2:00 for all autumn changes in Australia and NZ.
+# Shanks reports 2:00 for all autumn changes in Australia and New Zealand.
 # Robert Uzgalis writes that the New Zealand Daylight
 # Savings Time Order in Council dated 1990-06-18 specifies 2:00 standard
 # time on both the first Sunday in October and the third Sunday in March.
 # As with Australia, we'll assume the tradition is 2:00s, not 2:00.
 #
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2003-05-26):
 # The Department of Internal Affairs (DIA) maintains a brief history,
 # as does Carol Squires; see tz-link.htm for the full references.
-# Use these sources in preference to Shanks & Pottenger.
+# Use these sources in preference to Shanks.
 #
 # For Chatham, IATA SSIM (1991/1999) gives the NZ rules but with
 # transitions at 2:45 local standard time; this confirms that Chatham
@@ -1191,8 +1185,8 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # ``I am certain, having lived there for the past decade, that "Truk"
 # (now properly known as Chuuk) ... is in the time zone GMT+10.''
 #
-# Shanks & Pottenger write that Truk switched from UTC+10 to UTC+11
-# on 1978-10-01; ignore this for now.
+# Shanks writes that Truk switched from UTC+10 to UTC+11 on 1978-10-01;
+# ignore this for now.
 
 # From Paul Eggert (1999-10-29):
 # The Federated States of Micronesia Visitors Board writes in
@@ -1285,8 +1279,8 @@ Zone	Pacific/Wallis	12:15:20 -	LMT	1901
 # on the World Day of Prayer, you would be the first people on Earth
 # to say your prayers in the morning."
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell.
+# From Paul Eggert (1999-08-12):
+# Shanks says the transition was on 1968-10-01; go with Mundell.
 
 # From Eric Ulevik (1999-05-03):
 # Tonga's director of tourism, who is also secretary of the National Millenium
diff --git a/timezone/backward b/timezone/backward
index 00824407fa..66fbf30618 100644
--- a/timezone/backward
+++ b/timezone/backward
@@ -1,4 +1,4 @@
-# @(#)backward	8.2
+# @(#)backward	8.1
 
 # This file provides links between current names for time zones
 # and their old names.  Many names changed in late 1993.
@@ -8,7 +8,6 @@ Link	America/Argentina/Catamarca	America/Argentina/ComodRivadavia
 Link	America/Adak		America/Atka
 Link	America/Argentina/Buenos_Aires	America/Buenos_Aires
 Link	America/Argentina/Catamarca	America/Catamarca
-Link	America/Atikokan	America/Coral_Harbour
 Link	America/Argentina/Cordoba	America/Cordoba
 Link	America/Tijuana		America/Ensenada
 Link	America/Indiana/Indianapolis	America/Fort_Wayne
diff --git a/timezone/checktab.awk b/timezone/checktab.awk
index 80ad7d5701..6d532141e6 100644
--- a/timezone/checktab.awk
+++ b/timezone/checktab.awk
@@ -1,6 +1,6 @@
 # Check tz tables for consistency.
 
-# @(#)checktab.awk	8.1
+# @(#)checktab.awk	1.7
 
 # Contributed by Paul Eggert.
 
diff --git a/timezone/europe b/timezone/europe
index b3a3b269d3..54146d7400 100644
--- a/timezone/europe
+++ b/timezone/europe
@@ -1,14 +1,14 @@
-# @(#)europe	8.6
+# @(#)europe	8.1
 # 
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-10-29):
 # A good source for time zone historical data outside the U.S. is
-# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
-# San Diego: ACS Publications, Inc. (2003).
+# Thomas G. Shanks, The International Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1999).
 #
 # Gwillim Law writes that a good source
 # for recent time zone data is the International Air Transport
@@ -16,8 +16,8 @@
 # published semiannually.  Law sent in several helpful summaries
 # of the IATA's data after 1990.
 #
-# Except where otherwise noted, Shanks & Pottenger is the source for
-# entries through 1991, and IATA SSIM is the source for entries afterwards.
+# Except where otherwise noted, Shanks is the source for entries through 1991,
+# and IATA SSIM is the source for entries afterwards.
 #
 # Other sources occasionally used include:
 #
@@ -221,12 +221,11 @@
 # (Lords Hansard 11 June 1997 columns 964 to 976)
 # .
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2001-07-18):
 #
-# For lack of other data, follow Shanks & Pottenger for Eire in 1940-1948.
+# For lack of other data, we'll follow Shanks for Eire in 1940-1948.
 #
-# Given Ilieve and Myers's data, the following claims by Shanks & Pottenger
-# are incorrect:
+# Given Ilieve and Myers's data, the following claims by Shanks are incorrect:
 #     * Wales did not switch from GMT to daylight saving time until
 #	1921 Apr 3, when they began to conform with the rest of Great Britain.
 # Actually, Wales was identical after 1880.
@@ -238,19 +237,18 @@
 # Actually, that date saw the usual switch to summer time.
 # Standard time was not changed until 1968-10-27 (the clocks didn't change).
 #
-# Here is another incorrect claim by Shanks & Pottenger:
+# Here is another incorrect claim by Shanks:
 #     * Jersey, Guernsey, and the Isle of Man did not switch from GMT
 #	to daylight saving time until 1921 Apr 3, when they began to
 #	conform with Great Britain.
 # S.R.&O. 1916, No. 382 and HO 45/10811/312364 (quoted above) say otherwise.
 #
-# The following claim by Shanks & Pottenger is possible though doubtful;
+# The following claim by Shanks is possible though doubtful;
 # we'll ignore it for now.
 #     * Dublin's 1971-10-31 switch was at 02:00, even though London's was 03:00.
 #
 #
-# Whitman says Dublin Mean Time was -0:25:21, which is more precise than
-# Shanks & Pottenger.
+# Whitman says Dublin Mean Time was -0:25:21, which is more precise than Shanks.
 # Perhaps this was Dunsink Observatory Time, as Dunsink Observatory
 # (8 km NW of Dublin's center) seemingly was to Dublin as Greenwich was
 # to London.  For example:
@@ -420,14 +418,11 @@ Rule	GB-Eire 1990	1995	-	Oct	Sun>=22	1:00u	0	GMT
 # See EU for rules starting in 1996.
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Europe/London	-0:01:15 -	LMT	1847 Dec  1 0:00s
+Zone	Europe/London	-0:01:15 -	LMT	1847 Dec  1
 			 0:00	GB-Eire	%s	1968 Oct 27
 			 1:00	-	BST	1971 Oct 31 2:00u
 			 0:00	GB-Eire	%s	1996
 			 0:00	EU	GMT/BST
-Link	Europe/London	Europe/Jersey
-Link	Europe/London	Europe/Guernsey
-Link	Europe/London	Europe/Isle_of_Man
 Zone	Europe/Dublin	-0:25:00 -	LMT	1880 Aug  2
 			-0:25:21 -	DMT	1916 May 21 2:00
 			-0:25:21 1:00	IST	1916 Oct  1 2:00s
@@ -481,7 +476,7 @@ Rule	C-Eur	1942	only	-	Nov	 2	 2:00s	0	-
 Rule	C-Eur	1943	only	-	Mar	29	 2:00s	1:00	S
 Rule	C-Eur	1943	only	-	Oct	 4	 2:00s	0	-
 Rule	C-Eur	1944	only	-	Apr	 3	 2:00s	1:00	S
-# Whitman gives 1944 Oct 7; go with Shanks & Pottenger.
+# Whitman gives 1944 Oct 7; go with Shanks.
 Rule	C-Eur	1944	only	-	Oct	 2	 2:00s	0	-
 Rule	C-Eur	1977	1980	-	Apr	Sun>=1	 2:00s	1:00	S
 Rule	C-Eur	1977	only	-	Sep	lastSun	 2:00s	0	-
@@ -601,12 +596,12 @@ Zone	Europe/Andorra	0:06:04 -	LMT	1901
 
 # Austria
 
-# From Paul Eggert (2006-03-22): Shanks & Pottenger give 1918-06-16 and
+# From Paul Eggert (2003-02-28): Shanks gives 1918-06-16 and
 # 1945-11-18, but the Austrian Federal Office of Metrology and
 # Surveying (BEV) gives 1918-09-16 and for Vienna gives the "alleged"
 # date of 1945-04-12 with no time.  For the 1980-04-06 transition
-# Shanks & Pottenger give 02:00, the BEV 00:00.  Go with the BEV,
-# and guess 02:00 for 1945-04-12.
+# Shanks gives 02:00, the BEV 00:00.  Go with the BEV, and guess 02:00
+# for 1945-04-12.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Austria	1920	only	-	Apr	 5	2:00s	1:00	S
@@ -706,7 +701,7 @@ Zone	Europe/Brussels	0:17:30 -	LMT	1880
 			1:00	EU	CE%sT
 
 # Bosnia and Herzegovina
-# see Serbia
+# see Serbia and Montenegro
 
 # Bulgaria
 #
@@ -718,7 +713,7 @@ Zone	Europe/Brussels	0:17:30 -	LMT	1880
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Bulg	1979	only	-	Mar	31	23:00	1:00	S
 Rule	Bulg	1979	only	-	Oct	 1	 1:00	0	-
-Rule	Bulg	1980	1982	-	Apr	Sat>=1	23:00	1:00	S
+Rule	Bulg	1980	1982	-	Apr	Sat<=7	23:00	1:00	S
 Rule	Bulg	1980	only	-	Sep	29	 1:00	0	-
 Rule	Bulg	1981	only	-	Sep	27	 2:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -733,7 +728,7 @@ Zone	Europe/Sofia	1:33:16 -	LMT	1880
 			2:00	EU	EE%sT
 
 # Croatia
-# see Serbia
+# see Serbia and Montenegro
 
 # Cyprus
 # Please see the `asia' file for Asia/Nicosia.
@@ -818,10 +813,10 @@ Zone Atlantic/Faeroe	-0:27:04 -	LMT	1908 Jan 11	# Torshavn
 # East Greenland and Franz Josef Land, but we don't know their time zones.
 # My source for this is Wilhelm Dege's book mentioned under Svalbard.
 #
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1996-11-22):
 # Greenland joined the EU as part of Denmark, obtained home rule on 1979-05-01,
 # and left the EU on 1985-02-01.  It therefore should have been using EU
-# rules at least through 1984.  Shanks & Pottenger say Scoresbysund and Godthab
+# rules at least through 1984.  Shanks says Scoresbysund and Godthab
 # used C-Eur rules after 1980, but IATA SSIM (1991/1996) says they use EU
 # rules since at least 1991.  Assume EU rules since 1980.
 
@@ -876,28 +871,24 @@ Zone Atlantic/Faeroe	-0:27:04 -	LMT	1908 Jan 11	# Torshavn
 # I heard back from someone stationed at Thule; the time change took place
 # there at 2:00 AM.
 
-# From Paul Eggert (2006-03-22):
-# From 1997 on the CIA map shows Danmarkshavn on GMT;
-# the 1995 map as like Godthab.
+# From Paul Eggert (2001-11-19):
+# The 1997 CIA map shows Danmarkshavn on GMT; the 1995 map as like Godthab.
 # For lack of better info, assume they were like Godthab before 1996.
 # startkart.no says Thule does not observe DST, but this is clearly an error,
-# so go with Shanks & Pottenger for Thule transitions until this year.
-# For 2007 on assume Thule will stay in sync with US DST rules.
+# so go with Shanks for all Thule transitions.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Thule	1991	1992	-	Mar	lastSun	2:00	1:00	D
 Rule	Thule	1991	1992	-	Sep	lastSun	2:00	0	S
-Rule	Thule	1993	2006	-	Apr	Sun>=1	2:00	1:00	D
-Rule	Thule	1993	2006	-	Oct	lastSun	2:00	0	S
-Rule	Thule	2007	max	-	Mar	Sun>=8	2:00	1:00	D
-Rule	Thule	2007	max	-	Nov	Sun>=1	2:00	0	S
+Rule	Thule	1993	max	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Thule	1993	max	-	Oct	lastSun	2:00	0	S
 #
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Danmarkshavn -1:14:40 -	LMT	1916 Jul 28
 			-3:00	-	WGT	1980 Apr  6 2:00
 			-3:00	EU	WG%sT	1996
 			0:00	-	GMT
-Zone America/Scoresbysund -1:27:52 -	LMT	1916 Jul 28 # Ittoqqortoormiit
+Zone America/Scoresbysund -1:29:00 -	LMT	1916 Jul 28 # Ittoqqortoormiit
 			-2:00	-	CGT	1980 Apr  6 2:00
 			-2:00	C-Eur	CG%sT	1981 Mar 29
 			-1:00	EU	EG%sT
@@ -972,13 +963,13 @@ Zone	Europe/Tallinn	1:39:00	-	LMT	1880
 
 # Finland
 #
-# From Hannu Strang (1994-09-25 06:03:37 UTC):
+# From Hannu Strang (25 Sep 1994 06:03:37 UTC):
 # Well, here in Helsinki we're just changing from summer time to regular one,
 # and it's supposed to change at 4am...
 #
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger say Finland has switched at 02:00 standard time
-# since 1981.  Go with Strang instead.
+# From Paul Eggert (25 Sep 1994):
+# Shanks says Finland has switched at 02:00 standard time since 1981.
+# Go with Strang instead.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Finland	1942	only	-	Apr	3	0:00	1:00	S
@@ -1008,7 +999,7 @@ Link	Europe/Helsinki	Europe/Mariehamn
 
 
 #
-# Shank & Pottenger seem to use `24:00' ambiguously; resolve it with Whitman.
+# Shanks seems to use `24:00' ambiguously; we resolve it with Whitman.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	France	1916	only	-	Jun	14	23:00s	1:00	S
 Rule	France	1916	1919	-	Oct	Sun>=1	23:00s	0	-
@@ -1022,7 +1013,7 @@ Rule	France	1921	only	-	Oct	25	23:00s	0	-
 Rule	France	1922	only	-	Mar	25	23:00s	1:00	S
 # DSH writes that a law of 1923-05-24 specified 3rd Sat in Apr at 23:00 to 1st
 # Sat in Oct at 24:00; and that in 1930, because of Easter, the transitions
-# were Apr 12 and Oct 5.  Go with Shanks & Pottenger.
+# were Apr 12 and Oct 5.  Go with Shanks.
 Rule	France	1922	1938	-	Oct	Sat>=1	23:00s	0	-
 Rule	France	1923	only	-	May	26	23:00s	1:00	S
 Rule	France	1924	only	-	Mar	29	23:00s	1:00	S
@@ -1043,8 +1034,8 @@ Rule	France	1938	only	-	Mar	26	23:00s	1:00	S
 Rule	France	1939	only	-	Apr	15	23:00s	1:00	S
 Rule	France	1939	only	-	Nov	18	23:00s	0	-
 Rule	France	1940	only	-	Feb	25	 2:00	1:00	S
-# The French rules for 1941-1944 were not used in Paris, but Shanks & Pottenger
-# write that they were used in Monaco and in many French locations.
+# The French rules for 1941-1944 were not used in Paris, but Shanks writes
+# that they were used in Monaco and in many French locations.
 # Le Corre writes that the upper limit of the free zone was Arneguy, Orthez,
 # Mont-de-Marsan, Bazas, Langon, Lamotte-Montravel, Marouil, La
 # Rochefoucault, Champagne-Mouton, La Roche-Posay, La Haye-Decartes,
@@ -1052,7 +1043,7 @@ Rule	France	1940	only	-	Feb	25	 2:00	1:00	S
 # Paray-le-Monial, Montceau-les-Mines, Chalons-sur-Saone, Arbois,
 # Dole, Morez, St-Claude, and Collognes (Haute-Savioe).
 Rule	France	1941	only	-	May	 5	 0:00	2:00	M # Midsummer
-# Shanks & Pottenger say this transition occurred at Oct 6 1:00,
+# Shanks says this transition occurred at Oct 6 1:00,
 # but go with Denis Excoffier (1997-12-12),
 # who quotes the Ephemerides Astronomiques for 1998 from Bureau des Longitudes
 # as saying 5/10/41 22hUT.
@@ -1065,21 +1056,21 @@ Rule	France	1944	only	-	Apr	 3	 2:00	2:00	M
 Rule	France	1944	only	-	Oct	 8	 1:00	1:00	S
 Rule	France	1945	only	-	Apr	 2	 2:00	2:00	M
 Rule	France	1945	only	-	Sep	16	 3:00	0	-
-# Shanks & Pottenger give Mar 28 2:00 and Sep 26 3:00;
+# Shanks gives Mar 28 2:00 and Sep 26 3:00;
 # go with Excoffier's 28/3/76 0hUT and 25/9/76 23hUT.
 Rule	France	1976	only	-	Mar	28	 1:00	1:00	S
 Rule	France	1976	only	-	Sep	26	 1:00	0	-
-# Shanks & Pottenger give 0:09:20 for Paris Mean Time, and Whitman 0:09:05,
+# Shanks gives 0:09 for Paris Mean Time, and Whitman gives 0:09:05,
 # but Howse quotes the actual French legislation as saying 0:09:21.
 # Go with Howse.  Howse writes that the time in France was officially based
 # on PMT-0:09:21 until 1978-08-09, when the time base finally switched to UTC.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Paris	0:09:21 -	LMT	1891 Mar 15  0:01
 			0:09:21	-	PMT	1911 Mar 11  0:01  # Paris MT
-# Shanks & Pottenger give 1940 Jun 14 0:00; go with Excoffier and Le Corre.
+# Shanks gives 1940 Jun 14 0:00; go with Excoffier and Le Corre.
 			0:00	France	WE%sT	1940 Jun 14 23:00
 # Le Corre says Paris stuck with occupied-France time after the liberation;
-# go with Shanks & Pottenger.
+# go with Shanks.
 			1:00	C-Eur	CE%sT	1944 Aug 25
 			0:00	France	WE%sT	1945 Sep 16  3:00
 			1:00	France	CE%sT	1977
@@ -1130,23 +1121,23 @@ Zone	Europe/Berlin	0:53:28 -	LMT	1893 Apr
 
 # Gibraltar
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone Europe/Gibraltar	-0:21:24 -	LMT	1880 Aug  2 0:00s
+Zone Europe/Gibraltar	-0:21:24 -	LMT	1880 Aug  2
 			0:00	GB-Eire	%s	1957 Apr 14 2:00
 			1:00	-	CET	1982
 			1:00	EU	CE%sT
 
 # Greece
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# Whitman gives 1932 Jul 5 - Nov 1; go with Shanks & Pottenger.
+# Whitman gives 1932 Jul 5 - Nov 1; go with Shanks.
 Rule	Greece	1932	only	-	Jul	 7	0:00	1:00	S
 Rule	Greece	1932	only	-	Sep	 1	0:00	0	-
-# Whitman gives 1941 Apr 25 - ?; go with Shanks & Pottenger.
+# Whitman gives 1941 Apr 25 - ?; go with Shanks.
 Rule	Greece	1941	only	-	Apr	 7	0:00	1:00	S
-# Whitman gives 1942 Feb 2 - ?; go with Shanks & Pottenger.
+# Whitman gives 1942 Feb 2 - ?; go with Shanks.
 Rule	Greece	1942	only	-	Nov	 2	3:00	0	-
 Rule	Greece	1943	only	-	Mar	30	0:00	1:00	S
 Rule	Greece	1943	only	-	Oct	 4	0:00	0	-
-# Whitman gives 1944 Oct 3 - Oct 31; go with Shanks & Pottenger.
+# Whitman gives 1944 Oct 3 - Oct 31; go with Shanks.
 Rule	Greece	1952	only	-	Jul	 1	0:00	1:00	S
 Rule	Greece	1952	only	-	Nov	 2	0:00	0	-
 Rule	Greece	1975	only	-	Apr	12	0:00s	1:00	S
@@ -1166,7 +1157,7 @@ Zone	Europe/Athens	1:34:52 -	LMT	1895 Sep 14
 			2:00	Greece	EE%sT	1941 Apr 30
 			1:00	Greece	CE%sT	1944 Apr  4
 			2:00	Greece	EE%sT	1981
-			# Shanks & Pottenger say it switched to C-Eur in 1981;
+			# Shanks says they switched to C-Eur in 1981;
 			# go with EU instead, since Greece joined it on Jan 1.
 			2:00	EU	EE%sT
 
@@ -1229,10 +1220,10 @@ Zone	Europe/Budapest	1:16:20 -	LMT	1890 Oct
 # might be a reference to the Julian calendar as opposed to Gregorian, or it
 # might mean something else (???).
 #
-# From Paul Eggert (2006-03-22):
-# The Iceland Almanak, Shanks & Pottenger, and Whitman disagree on many points.
-# We go with the Almanak, except for one claim from Shanks & Pottenger, namely
-# that Reykavik was 21W57 from 1837 to 1908, local mean time before that.
+# From Paul Eggert (1999-10-29):
+# The Iceland Almanak, Shanks and Whitman disagree on many points.
+# We go with the Almanak, except for one claim from Shanks, namely that
+# Reykavik was 21W57 from 1837 to 1908, local mean time before that.
 #
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Iceland	1917	1918	-	Feb	19	23:00	1:00	S
@@ -1270,16 +1261,15 @@ Zone Atlantic/Reykjavik	-1:27:24 -	LMT	1837
 # But these events all occurred before the 1970 cutoff,
 # so record only the time in Rome.
 #
-# From Paul Eggert (2006-03-22):
-# For Italian DST we have three sources: Shanks & Pottenger, Whitman, and
-# F. Pollastri
+# From Paul Eggert (1996-05-06):
+# For Italian DST we have three sources: Shanks, Whitman, and F. Pollastri
 # 
-# Day-light Saving Time in Italy (2006-02-03)
+# Day-light Saving Time in Italy (1996-03-14)
 # 
 # (`FP' below), taken from an Italian National Electrotechnical Institute
 # publication. When the three sources disagree, guess who's right, as follows:
 #
-# year	FP	Shanks&P. (S)	Whitman (W)	Go with:
+# year	FP	Shanks (S)	Whitman (W)	Go with:
 # 1916	06-03	06-03 24:00	06-03 00:00	FP & W
 #	09-30	09-30 24:00	09-30 01:00	FP; guess 24:00s
 # 1917	04-01	03-31 24:00	03-31 00:00	FP & S
@@ -1335,7 +1325,7 @@ Rule	Italy	1978	only	-	Oct	 1	0:00s	0	-
 Rule	Italy	1979	only	-	Sep	30	0:00s	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Rome	0:49:56 -	LMT	1866 Sep 22
-			0:49:56	-	RMT	1893 Nov  1 0:00s # Rome Mean
+			0:49:56	-	RMT	1893 Nov	# Rome Mean Time
 			1:00	Italy	CE%sT	1942 Nov  2 2:00s
 			1:00	C-Eur	CE%sT	1944 Jul
 			1:00	Italy	CE%sT	1980
@@ -1477,8 +1467,7 @@ Zone	Europe/Vilnius	1:41:16	-	LMT	1880
 			2:00	EU	EE%sT
 
 # Luxembourg
-# Whitman disagrees with most of these dates in minor ways;
-# go with Shanks & Pottenger.
+# Whitman disagrees with most of these dates in minor ways; go with Shanks.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Lux	1916	only	-	May	14	23:00	1:00	S
 Rule	Lux	1916	only	-	Oct	 1	 1:00	0	-
@@ -1513,7 +1502,7 @@ Zone Europe/Luxembourg	0:24:36 -	LMT	1904 Jun
 			1:00	EU	CE%sT
 
 # Macedonia
-# see Serbia
+# see Serbia and Montenegro
 
 # Malta
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
@@ -1525,7 +1514,7 @@ Rule	Malta	1975	1979	-	Apr	Sun>=15	2:00	1:00	S
 Rule	Malta	1975	1980	-	Sep	Sun>=15	2:00	0	-
 Rule	Malta	1980	only	-	Mar	31	2:00	1:00	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Europe/Malta	0:58:04 -	LMT	1893 Nov  2 0:00s # Valletta
+Zone	Europe/Malta	0:58:04 -	LMT	1893 Nov  2	# Valletta
 			1:00	Italy	CE%sT	1942 Nov  2 2:00s
 			1:00	C-Eur	CE%sT	1945 Apr  2 2:00s
 			1:00	Italy	CE%sT	1973 Mar 31
@@ -1534,9 +1523,9 @@ Zone	Europe/Malta	0:58:04 -	LMT	1893 Nov  2 0:00s # Valletta
 
 # Moldova
 
-# From Paul Eggert (2006-03-22):
-# A previous version of this database followed Shanks & Pottenger, who write
-# that Tiraspol switched to Moscow time on 1992-01-19 at 02:00.
+# From Paul Eggert (2001-02-11):
+# A previous version of this database followed Shanks, who writes that
+# Tiraspol switched to Moscow time on 1992-01-19 at 02:00.
 # However, this is most likely an error, as Moldova declared independence
 # on 1991-08-27 (the 1992-01-19 date is that of a Russian decree).
 # In early 1992 there was large-scale interethnic violence in the area
@@ -1561,8 +1550,7 @@ Zone	Europe/Chisinau	1:55:20 -	LMT	1880
 			2:00	EU	EE%sT
 
 # Monaco
-# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
-# more precise 0:09:21.
+# Shanks gives 0:09 for Paris Mean Time; go with Howse's more precise 0:09:21.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Monaco	0:29:32 -	LMT	1891 Mar 15
 			0:09:21	-	PMT	1911 Mar 11    # Paris Mean Time
@@ -1570,9 +1558,6 @@ Zone	Europe/Monaco	0:29:32 -	LMT	1891 Mar 15
 			1:00	France	CE%sT	1977
 			1:00	EU	CE%sT
 
-# Montenegro
-# see Serbia
-
 # Netherlands
 
 # Howse writes that the Netherlands' railways used GMT between 1892 and 1940,
@@ -1648,8 +1633,7 @@ Zone Europe/Amsterdam	0:19:32 -	LMT	1835
 			1:00	EU	CE%sT
 
 # Norway
-# http://met.no/met/met_lex/q_u/sommertid.html (2004-01) agrees with Shanks &
-# Pottenger.
+# http://met.no/met/met_lex/q_u/sommertid.html (2004-01) agrees with Shanks.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Norway	1916	only	-	May	22	1:00	1:00	S
 Rule	Norway	1916	only	-	Sep	30	0:00	0	-
@@ -1720,10 +1704,9 @@ Link	Europe/Oslo	Atlantic/Jan_Mayen
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Poland	1918	1919	-	Sep	16	2:00s	0	-
 Rule	Poland	1919	only	-	Apr	15	2:00s	1:00	S
-Rule	Poland	1944	only	-	Apr	 3	2:00s	1:00	S
-# Whitman gives 1944 Nov 30; go with Shanks & Pottenger.
+# Whitman gives 1944 Nov 30; go with Shanks.
 Rule	Poland	1944	only	-	Oct	 4	2:00	0	-
-# For 1944-1948 Whitman gives the previous day; go with Shanks & Pottenger.
+# For 1944-1948 Whitman gives the previous day; go with Shanks.
 Rule	Poland	1945	only	-	Apr	29	0:00	1:00	S
 Rule	Poland	1945	only	-	Nov	 1	0:00	0	-
 # For 1946 on the source is Kazimierz Borkowski,
@@ -1779,9 +1762,9 @@ Zone	Europe/Warsaw	1:24:00 -	LMT	1880
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 # DSH writes that despite Decree 1,469 (1915), the change to the clocks was not
 # done every year, depending on what Spain did, because of railroad schedules.
-# Go with Shanks & Pottenger.
+# Go with Shanks.
 Rule	Port	1916	only	-	Jun	17	23:00	1:00	S
-# Whitman gives 1916 Oct 31; go with Shanks & Pottenger.
+# Whitman gives 1916 Oct 31; go with Shanks.
 Rule	Port	1916	only	-	Nov	 1	 1:00	0	-
 Rule	Port	1917	only	-	Feb	28	23:00s	1:00	S
 Rule	Port	1917	1921	-	Oct	14	23:00s	0	-
@@ -1797,23 +1780,24 @@ Rule	Port	1927	only	-	Apr	 9	23:00s	1:00	S
 Rule	Port	1928	only	-	Apr	14	23:00s	1:00	S
 Rule	Port	1929	only	-	Apr	20	23:00s	1:00	S
 Rule	Port	1931	only	-	Apr	18	23:00s	1:00	S
-# Whitman gives 1931 Oct 8; go with Shanks & Pottenger.
+# Whitman gives 1931 Oct 8; go with Shanks.
 Rule	Port	1931	1932	-	Oct	Sat>=1	23:00s	0	-
 Rule	Port	1932	only	-	Apr	 2	23:00s	1:00	S
+# Shanks gives 1934 Apr 4; go with Whitman.
 Rule	Port	1934	only	-	Apr	 7	23:00s	1:00	S
-# Whitman gives 1934 Oct 5; go with Shanks & Pottenger.
+# Whitman gives 1934 Oct 5; go with Shanks.
 Rule	Port	1934	1938	-	Oct	Sat>=1	23:00s	0	-
-# Shanks & Pottenger give 1935 Apr 30; go with Whitman.
+# Shanks gives 1935 Apr 30; go with Whitman.
 Rule	Port	1935	only	-	Mar	30	23:00s	1:00	S
 Rule	Port	1936	only	-	Apr	18	23:00s	1:00	S
-# Whitman gives 1937 Apr 2; go with Shanks & Pottenger.
+# Whitman gives 1937 Apr 2; go with Shanks.
 Rule	Port	1937	only	-	Apr	 3	23:00s	1:00	S
 Rule	Port	1938	only	-	Mar	26	23:00s	1:00	S
 Rule	Port	1939	only	-	Apr	15	23:00s	1:00	S
-# Whitman gives 1939 Oct 7; go with Shanks & Pottenger.
+# Whitman gives 1939 Oct 7; go with Shanks.
 Rule	Port	1939	only	-	Nov	18	23:00s	0	-
 Rule	Port	1940	only	-	Feb	24	23:00s	1:00	S
-# Shanks & Pottenger give 1940 Oct 7; go with Whitman.
+# Shanks gives 1940 Oct 7; go with Whitman.
 Rule	Port	1940	1941	-	Oct	 5	23:00s	0	-
 Rule	Port	1941	only	-	Apr	 5	23:00s	1:00	S
 Rule	Port	1942	1945	-	Mar	Sat>=8	23:00s	1:00	S
@@ -1827,8 +1811,8 @@ Rule	Port	1946	only	-	Apr	Sat>=1	23:00s	1:00	S
 Rule	Port	1946	only	-	Oct	Sat>=1	23:00s	0	-
 Rule	Port	1947	1949	-	Apr	Sun>=1	 2:00s	1:00	S
 Rule	Port	1947	1949	-	Oct	Sun>=1	 2:00s	0	-
-# Shanks & Pottenger say DST was observed in 1950; go with Whitman.
-# Whitman gives Oct lastSun for 1952 on; go with Shanks & Pottenger.
+# Shanks says DST was observed in 1950; go with Whitman.
+# Whitman gives Oct lastSun for 1952 on; go with Shanks.
 Rule	Port	1951	1965	-	Apr	Sun>=1	 2:00s	1:00	S
 Rule	Port	1951	1965	-	Oct	Sun>=1	 2:00s	0	-
 Rule	Port	1977	only	-	Mar	27	 0:00s	1:00	S
@@ -1840,7 +1824,7 @@ Rule	Port	1980	only	-	Mar	lastSun	 0:00s	1:00	S
 Rule	Port	1981	1982	-	Mar	lastSun	 1:00s	1:00	S
 Rule	Port	1983	only	-	Mar	lastSun	 2:00s	1:00	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-# Shanks & Pottenger say the transition from LMT to WET occurred 1911-05-24;
+# Shanks says that the transition from LMT to WET occurred 1911-05-24;
 # Willett says 1912-01-01.  Go with Willett.
 Zone	Europe/Lisbon	-0:36:32 -	LMT	1884
 			-0:36:32 -	LMT	1912 Jan  1  # Lisbon Mean Time
@@ -1893,12 +1877,11 @@ Zone Europe/Bucharest	1:44:24 -	LMT	1891 Oct
 
 # Russia
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-11-12):
 # Except for Moscow after 1919-07-01, I invented the time zone abbreviations.
 # Moscow time zone abbreviations after 1919-07-01, and Moscow rules after 1991,
-# are from Andrey A. Chernov.  The rest is from Shanks & Pottenger,
-# except we follow Chernov's report that 1992 DST transitions were Sat
-# 23:00, not Sun 02:00s.
+# are from Andrey A. Chernov.  The rest is from Shanks, except we follow
+# Chernov's report that 1992 DST transitions were Sat 23:00, not Sun 02:00s.
 #
 # From Stanislaw A. Kuzikowski (1994-06-29):
 # But now it is some months since Novosibirsk is 3 hours ahead of Moscow!
@@ -1943,20 +1926,20 @@ Zone Europe/Kaliningrad	 1:22:00 -	LMT	1893 Apr
 			 2:00	Russia	EE%sT
 #
 # From Oscar van Vlijmen (2001-08-25): [This region consists of]
-# Respublika Adygeya, Arkhangel'skaya oblast',
+# Respublika Adygeya, Arkhangel'skaya oblast', Astrakhanskaya oblast',
 # Belgorodskaya oblast', Bryanskaya oblast', Vladimirskaya oblast',
-# Vologodskaya oblast', Voronezhskaya oblast',
+# Volgogradskaya oblast', Vologodskaya oblast', Voronezhskaya oblast',
 # Respublika Dagestan, Ivanovskaya oblast', Respublika Ingushetiya,
 # Kabarbino-Balkarskaya Respublika, Respublika Kalmykiya,
 # Kalyzhskaya oblast', Respublika Karachaevo-Cherkessiya,
-# Respublika Kareliya, Respublika Komi,
+# Respublika Kareliya, Kirovskaya oblast', Respublika Komi,
 # Kostromskaya oblast', Krasnodarskij kraj, Kurskaya oblast',
 # Leningradskaya oblast', Lipetskaya oblast', Respublika Marij El,
 # Respublika Mordoviya, Moskva, Moskovskaya oblast',
 # Murmanskaya oblast', Nenetskij avtonomnyj okrug,
 # Nizhegorodskaya oblast', Novgorodskaya oblast', Orlovskaya oblast',
 # Penzenskaya oblast', Pskovskaya oblast', Rostovskaya oblast',
-# Ryazanskaya oblast', Sankt-Peterburg,
+# Ryazanskaya oblast', Sankt-Peterburg, Saratovskaya oblast',
 # Respublika Severnaya Osetiya, Smolenskaya oblast',
 # Stavropol'skij kraj, Tambovskaya oblast', Respublika Tatarstan,
 # Tverskaya oblast', Tyl'skaya oblast', Ul'yanovskaya oblast',
@@ -1971,25 +1954,11 @@ Zone Europe/Moscow	 2:30:20 -	LMT	1880
 			 2:00	Russia	EE%sT	1992 Jan 19 2:00s
 			 3:00	Russia	MSK/MSD
 #
-# Astrakhanskaya oblast', Kirovskaya oblast', Saratovskaya oblast',
-# Volgogradskaya oblast'.  Shanks & Pottenger say Kirov is still at +0400
-# but Wikipedia (2006-05-09) says +0300.  Perhaps it switched after the
-# others?  But we have no data.
-Zone Europe/Volgograd	 2:57:40 -	LMT	1920 Jan  3
-			 3:00	-	TSAT	1925 Apr  6 # Tsaritsyn Time
-			 3:00	-	STAT	1930 Jun 21 # Stalingrad Time
-			 4:00	-	STAT	1961 Nov 11
-			 4:00	Russia	VOL%sT	1989 Mar 26 2:00s # Volgograd T
-			 3:00	Russia	VOL%sT	1991 Mar 31 2:00s
-			 4:00	-	VOLT	1992 Mar 29 2:00s
-			 3:00	Russia	VOL%sT
-#
 # From Oscar van Vlijmen (2001-08-25): [This region consists of]
 # Samarskaya oblast', Udmyrtskaya respublika
 Zone Europe/Samara	 3:20:36 -	LMT	1919 Jul  1 2:00
-			 3:00	-	SAMT	1930 Jun 21
-			 4:00	-	SAMT	1935 Jan 27
-			 4:00	Russia	KUY%sT	1989 Mar 26 2:00s # Kuybyshev
+			 3:00	-	KUYT	1930 Jun 21 # Kuybyshev
+			 4:00	Russia	KUY%sT	1989 Mar 26 2:00s
 			 3:00	Russia	KUY%sT	1991 Mar 31 2:00s
 			 2:00	Russia	KUY%sT	1991 Sep 29 2:00s
 			 3:00	-	KUYT	1991 Oct 20 3:00
@@ -2015,19 +1984,17 @@ Zone Asia/Omsk		 4:53:36 -	LMT	1919 Nov 14
 			 5:00	Russia	OMS%sT	1992 Jan 19 2:00s
 			 6:00	Russia	OMS%sT
 #
-# From Paul Eggert (2006-08-19): I'm guessing about Tomsk here; it's
-# not clear when it switched from +7 to +6.
-# Novosibirskaya oblast', Tomskaya oblast'.
+# Novosibirskaya oblast'.
 Zone Asia/Novosibirsk	 5:31:40 -	LMT	1919 Dec 14 6:00
 			 6:00	-	NOVT	1930 Jun 21 # Novosibirsk Time
 			 7:00	Russia	NOV%sT	1991 Mar 31 2:00s
 			 6:00	Russia	NOV%sT	1992 Jan 19 2:00s
-			 7:00	Russia	NOV%sT	1993 May 23 # say Shanks & P.
+			 7:00	Russia	NOV%sT	1993 May 23 # says Shanks
 			 6:00	Russia	NOV%sT
 #
 # From Oscar van Vlijmen (2001-08-25): [This region consists of]
 # Kemerovskaya oblast', Krasnoyarskij kraj,
-# Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug,
+# Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug, Tomskaya oblast',
 # Respublika Tuva, Respublika Khakasiya, Evenkijskij avtonomnyj okrug.
 Zone Asia/Krasnoyarsk	 6:11:20 -	LMT	1920 Jan  6
 			 6:00	-	KRAT	1930 Jun 21 # Krasnoyarsk Time
@@ -2110,7 +2077,7 @@ Zone Asia/Anadyr	11:49:56 -	LMT	1924 May  2
 			11:00	Russia	ANA%sT	1992 Jan 19 2:00s
 			12:00	Russia	ANA%sT
 
-# Serbia
+# Serbia and Montenegro
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Belgrade	1:22:00	-	LMT	1884
 			1:00	-	CET	1941 Apr 18 23:00
@@ -2118,11 +2085,10 @@ Zone	Europe/Belgrade	1:22:00	-	LMT	1884
 			1:00	1:00	CEST	1945 Sep 16  2:00s
 # Metod Kozelj reports that the legal date of
 # transition to EU rules was 1982-11-27, for all of Yugoslavia at the time.
-# Shanks & Pottenger don't give as much detail, so go with Kozelj.
+# Shanks doesn't give as much detail, so go with Kozelj.
 			1:00	-	CET	1982 Nov 27
 			1:00	EU	CE%sT
 Link Europe/Belgrade Europe/Ljubljana	# Slovenia
-Link Europe/Belgrade Europe/Podgorica	# Montenegro
 Link Europe/Belgrade Europe/Sarajevo	# Bosnia and Herzegovina
 Link Europe/Belgrade Europe/Skopje	# Macedonia
 Link Europe/Belgrade Europe/Zagreb	# Croatia
@@ -2131,34 +2097,32 @@ Link Europe/Belgrade Europe/Zagreb	# Croatia
 Link Europe/Prague Europe/Bratislava
 
 # Slovenia
-# see Serbia
+# see Serbia and Montenegro
 
 # Spain
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# For 1917-1919 Whitman gives Apr Sat>=1 - Oct Sat>=1;
-# go with Shanks & Pottenger.
+# For 1917-1919 Whitman gives Apr Sat>=1 - Oct Sat>=1; go with Shanks.
 Rule	Spain	1917	only	-	May	 5	23:00s	1:00	S
 Rule	Spain	1917	1919	-	Oct	 6	23:00s	0	-
 Rule	Spain	1918	only	-	Apr	15	23:00s	1:00	S
 Rule	Spain	1919	only	-	Apr	 5	23:00s	1:00	S
-# Whitman gives 1921 Feb 28 - Oct 14; go with Shanks & Pottenger.
+# Whitman gives 1921 Feb 28 - Oct 14; go with Shanks.
 Rule	Spain	1924	only	-	Apr	16	23:00s	1:00	S
-# Whitman gives 1924 Oct 14; go with Shanks & Pottenger.
+# Whitman gives 1924 Oct 14; go with Shanks.
 Rule	Spain	1924	only	-	Oct	 4	23:00s	0	-
 Rule	Spain	1926	only	-	Apr	17	23:00s	1:00	S
-# Whitman says no DST in 1929; go with Shanks & Pottenger.
+# Whitman says no DST in 1929; go with Shanks.
 Rule	Spain	1926	1929	-	Oct	Sat>=1	23:00s	0	-
 Rule	Spain	1927	only	-	Apr	 9	23:00s	1:00	S
 Rule	Spain	1928	only	-	Apr	14	23:00s	1:00	S
 Rule	Spain	1929	only	-	Apr	20	23:00s	1:00	S
-# Whitman gives 1937 Jun 16, 1938 Apr 16, 1940 Apr 13;
-# go with Shanks & Pottenger.
+# Whitman gives 1937 Jun 16, 1938 Apr 16, 1940 Apr 13; go with Shanks.
 Rule	Spain	1937	only	-	May	22	23:00s	1:00	S
 Rule	Spain	1937	1939	-	Oct	Sat>=1	23:00s	0	-
 Rule	Spain	1938	only	-	Mar	22	23:00s	1:00	S
 Rule	Spain	1939	only	-	Apr	15	23:00s	1:00	S
 Rule	Spain	1940	only	-	Mar	16	23:00s	1:00	S
-# Whitman says no DST 1942-1945; go with Shanks & Pottenger.
+# Whitman says no DST 1942-1945; go with Shanks.
 Rule	Spain	1942	only	-	May	 2	22:00s	2:00	M # Midsummer
 Rule	Spain	1942	only	-	Sep	 1	22:00s	1:00	S
 Rule	Spain	1943	1946	-	Apr	Sat>=13	22:00s	2:00	M
@@ -2185,7 +2149,7 @@ Rule SpainAfrica 1977	only	-	Sep	28	 0:00	0	-
 Rule SpainAfrica 1978	only	-	Jun	 1	 0:00	1:00	S
 Rule SpainAfrica 1978	only	-	Aug	 4	 0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Europe/Madrid	-0:14:44 -	LMT	1901 Jan  1  0:00s
+Zone	Europe/Madrid	-0:14:44 -	LMT	1901
 			 0:00	Spain	WE%sT	1946 Sep 30
 			 1:00	Spain	CE%sT	1979
 			 1:00	EU	CE%sT
@@ -2207,7 +2171,7 @@ Zone	Atlantic/Canary	-1:01:36 -	LMT	1922 Mar # Las Palmas de Gran C.
 
 # Sweden
 
-# From Ivan Nilsson (2001-04-13), superseding Shanks & Pottenger:
+# From Ivan Nilsson (2001-04-13), superseding Shanks:
 #
 # The law "Svensk forfattningssamling 1878, no 14" about standard time in 1879:
 # From the beginning of 1879 (that is 01-01 00:00) the time for all
@@ -2268,7 +2232,7 @@ Zone Europe/Stockholm	1:12:12 -	LMT	1879 Jan  1
 # From Whitman (who writes ``Midnight?''):
 Rule	Swiss	1940	only	-	Nov	 2	0:00	1:00	S
 Rule	Swiss	1940	only	-	Dec	31	0:00	0	-
-# From Shanks & Pottenger:
+# From Shanks:
 Rule	Swiss	1941	1942	-	May	Sun>=1	2:00	1:00	S
 Rule	Swiss	1941	1942	-	Oct	Sun>=1	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -2287,8 +2251,7 @@ Rule	Turkey	1921	only	-	Apr	 3	0:00	1:00	S
 Rule	Turkey	1921	only	-	Oct	 3	0:00	0	-
 Rule	Turkey	1922	only	-	Mar	26	0:00	1:00	S
 Rule	Turkey	1922	only	-	Oct	 8	0:00	0	-
-# Whitman gives 1923 Apr 28 - Sep 16 and no DST in 1924-1925;
-# go with Shanks & Pottenger.
+# Whitman gives 1923 Apr 28 - Sep 16 and no DST in 1924-1925; go with Shanks.
 Rule	Turkey	1924	only	-	May	13	0:00	1:00	S
 Rule	Turkey	1924	1925	-	Oct	 1	0:00	0	-
 Rule	Turkey	1925	only	-	May	 1	0:00	1:00	S
@@ -2297,8 +2260,7 @@ Rule	Turkey	1940	only	-	Oct	 5	0:00	0	-
 Rule	Turkey	1940	only	-	Dec	 1	0:00	1:00	S
 Rule	Turkey	1941	only	-	Sep	21	0:00	0	-
 Rule	Turkey	1942	only	-	Apr	 1	0:00	1:00	S
-# Whitman omits the next two transition and gives 1945 Oct 1;
-# go with Shanks & Pottenger.
+# Whitman omits the next two transition and gives 1945 Oct 1; go with Shanks.
 Rule	Turkey	1942	only	-	Nov	 1	0:00	0	-
 Rule	Turkey	1945	only	-	Apr	 2	0:00	1:00	S
 Rule	Turkey	1945	only	-	Oct	 8	0:00	0	-
@@ -2395,13 +2357,11 @@ Zone Europe/Simferopol	2:16:24 -	LMT	1880
 			3:00	Russia	MSK/MSD	1990
 			3:00	-	MSK	1990 Jul  1 2:00
 			2:00	-	EET	1992
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-11-12):
 # The _Economist_ (1994-05-28, p 45) reports that central Crimea switched
 # from Kiev to Moscow time sometime after the January 1994 elections.
-# Shanks (1999) says ``date of change uncertain'', but implies that it happened
-# sometime between the 1994 DST switches.  Shanks & Pottenger simply say
-# 1994-09-25 03:00, but that can't be right.  For now, guess it
-# changed in May.
+# Shanks says ``date of change uncertain'', but implies that it happened
+# sometime between the 1994 DST switches.  For now, guess it changed in May.
 			2:00	E-Eur	EE%sT	1994 May
 # From IATA SSIM (1994/1997), which also says that Kerch is still like Kiev.
 			3:00	E-Eur	MSK/MSD	1996 Mar 31 3:00s
diff --git a/timezone/ialloc.c b/timezone/ialloc.c
index 1fc2035f45..8a0c701578 100644
--- a/timezone/ialloc.c
+++ b/timezone/ialloc.c
@@ -1,11 +1,6 @@
-/*
-** This file is in the public domain, so clarified as of
-** 2006-07-17 by Arthur David Olson.
-*/
-
 #ifndef lint
 #ifndef NOID
-static char	elsieid[] = "@(#)ialloc.c	8.30";
+static char	elsieid[] = "@(#)ialloc.c	8.29";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
diff --git a/timezone/iso3166.tab b/timezone/iso3166.tab
index 8bb8231055..1cfaf265c2 100644
--- a/timezone/iso3166.tab
+++ b/timezone/iso3166.tab
@@ -1,12 +1,12 @@
 # ISO 3166 alpha-2 country codes
 #
-# @(#)iso3166.tab	8.3
+# @(#)iso3166.tab	8.1
 #
-# From Paul Eggert (2006-09-27):
+# From Paul Eggert (2004-06-14):
 #
 # This file contains a table with the following columns:
 # 1.  ISO 3166-1 alpha-2 country code, current as of
-#     ISO 3166-1 Newsletter No. V-12 (2006-09-26).  See:
+#     ISO 3166-1 Newsletter No. V-10 (2004-04-26).  See:
 #     
 #     ISO 3166 Maintenance agency (ISO 3166/MA)
 #     .
@@ -70,6 +70,7 @@ CM	Cameroon
 CN	China
 CO	Colombia
 CR	Costa Rica
+CS	Serbia and Montenegro
 CU	Cuba
 CV	Cape Verde
 CX	Christmas Island
@@ -99,7 +100,6 @@ GB	Britain (UK)
 GD	Grenada
 GE	Georgia
 GF	French Guiana
-GG	Guernsey
 GH	Ghana
 GI	Gibraltar
 GL	Greenland
@@ -122,14 +122,12 @@ HU	Hungary
 ID	Indonesia
 IE	Ireland
 IL	Israel
-IM	Isle of Man
 IN	India
 IO	British Indian Ocean Territory
 IQ	Iraq
 IR	Iran
 IS	Iceland
 IT	Italy
-JE	Jersey
 JM	Jamaica
 JO	Jordan
 JP	Japan
@@ -158,7 +156,6 @@ LY	Libya
 MA	Morocco
 MC	Monaco
 MD	Moldova
-ME	Montenegro
 MG	Madagascar
 MH	Marshall Islands
 MK	Macedonia
@@ -207,7 +204,6 @@ PY	Paraguay
 QA	Qatar
 RE	Reunion
 RO	Romania
-RS	Serbia
 RU	Russia
 RW	Rwanda
 SA	Saudi Arabia
diff --git a/timezone/northamerica b/timezone/northamerica
index 3d80c5e3c2..73e2470e0b 100644
--- a/timezone/northamerica
+++ b/timezone/northamerica
@@ -1,4 +1,4 @@
-# @(#)northamerica	8.10
+# @(#)northamerica	8.1
 # 
 
 # also includes Central America and the Caribbean
@@ -30,12 +30,12 @@
 # That 1883 transition occurred at 12:00 new time, not at 12:00 old time.
 # See p 46 of David Prerau, Seize the daylight, Thunder's Mouth Press (2005).
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1995-12-19):
 # A good source for time zone historical data in the US is
 # Thomas G. Shanks, The American Atlas (5th edition),
 # San Diego: ACS Publications, Inc. (1991).
 # Make sure you have the errata sheet; the book is somewhat useless without it.
-# It is the source for most of the pre-1991 US entries below.
+# It is the source for most of the pre-1991 US and Puerto Rico entries below.
 
 # From Paul Eggert (2001-03-06):
 # Daylight Saving Time was first suggested as a joke by Benjamin Franklin
@@ -229,7 +229,7 @@ Zone	PST8PDT		 -8:00	US	P%sT
 # Public law 106-564 (2000-12-23) introduced the abbreviation
 # "Chamorro Standard Time" for time in Guam and the Northern Marianas.
 # See the file "australasia".
-
+ 
 # From Arthur David Olson, 2005-08-09
 # The following was signed into law on 2005-08-08.
 #
@@ -274,7 +274,7 @@ Zone	PST8PDT		 -8:00	US	P%sT
 # set their watches and clocks on Eastern time."  It quotes H.H. "Bubba"
 # Roberts, city administrator in Phenix City. as saying "We are in the Central
 # time zone, but we do go by the Eastern time zone because so many people work
-# in Columbus."
+# in Columbus." 
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule	NYC	1920	only	-	Mar	lastSun	2:00	1:00	D
@@ -301,13 +301,6 @@ Zone America/New_York	-4:56:02 -	LMT	1883 Nov 18 12:03:58
 # Nebraska, eastern North Dakota, Oklahoma, eastern South Dakota,
 # western Tennessee, most of Texas, Wisconsin
 
-# From Larry M. Smith (2006-04-26) re Wisconsin:
-# http://www.legis.state.wi.us/statutes/Stat0175.pdf ...
-# is currently enforced at the 01:00 time of change.  Because the local
-# "bar time" in the state corresponds to 02:00, a number of citations
-# are issued for the "sale of class 'B' alcohol after prohibited
-# hours" within the deviated hour of this change every year....
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule	Chicago	1920	only	-	Jun	13	2:00	1:00	D
 Rule	Chicago	1920	1921	-	Oct	lastSun	2:00	0	S
@@ -328,16 +321,14 @@ Zone America/Chicago	-5:50:36 -	LMT	1883 Nov 18 12:09:24
 Zone America/North_Dakota/Center -6:45:12 - LMT	1883 Nov 18 12:14:48
 			-7:00	US	M%sT	1992 Oct 25 02:00
 			-6:00	US	C%sT
-# Morton County, ND, switched from mountain to central time on
-# 2003-10-26, except for the area around Mandan which was already central time.
-# See .
-# Officially this switch also included part of Sioux County, and
-# Jones, Mellette, and Todd Counties in South Dakota;
-# but in practice these other counties were already observing central time.
-# See .
-Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21
-			-7:00	US	M%sT	2003 Oct 26 02:00
-			-6:00	US	C%sT
+# From Paul Eggert (2006-01-20):
+# The following is not implemented yet.
+# What is the most populous city in that area?
+# From http://www.statoids.com/tus.html (2006-01-20):
+# 2003-10-26 02:00: All of Morton County, ND, and the part of Sioux
+# County, ND east of ND route 31 moved from MT to CT.  (The area
+# around Fort Yates in Sioux County and the area around Mandan in
+# Morton County were already in CT.)
 
 # US mountain time, represented by Denver
 #
@@ -416,8 +407,7 @@ Zone America/Yakutat	 14:41:05 -	LMT	1867 Oct 18
 Zone America/Anchorage	 14:00:24 -	LMT	1867 Oct 18
 			 -9:59:36 -	LMT	1900 Aug 20 12:00
 			-10:00	-	CAT	1942
-			-10:00	US	CAT/CAWT 1945 Aug 14 23:00u
-			-10:00	US	CAT/CAPT 1946 # Peace
+			-10:00	US	CAT/CAWT 1946
 			-10:00	-	CAT	1967 Apr
 			-10:00	-	AHST	1969
 			-10:00	US	AH%sT	1983 Oct 30 2:00
@@ -537,9 +527,9 @@ Zone America/Boise	-7:44:49 -	LMT	1883 Nov 18 12:15:11
 # For a map of Indiana's time zone regions, see:
 # 
 # What time is it in Indiana?
-#  (2006-03-01)
+#  (2005-10-30)
 #
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2006-01-20):
 # Since 1970, most of Indiana has been like America/Indiana/Indianapolis,
 # with the following exceptions:
 #
@@ -559,7 +549,6 @@ Zone America/Boise	-7:44:49 -	LMT	1883 Nov 18 12:15:11
 #
 # Shanks partitioned Indiana into 345 regions, each with its own time history,
 # and wrote ``Even newspaper reports present contradictory information.''
-# Those Hoosiers!  Such a flighty and changeable people!
 # Fortunately, most of the complexity occurred before our cutoff date of 1970.
 #
 # Other than Indianapolis, the Indiana place names are so nondescript
@@ -569,10 +558,8 @@ Zone America/Boise	-7:44:49 -	LMT	1883 Nov 18 12:15:11
 # From Paul Eggert (2005-08-16):
 # http://www.mccsc.edu/time.html says that Indiana will use DST starting 2006.
 
-# From Nathan Stratton Treadway (2006-03-30):
-# http://www.dot.gov/affairs/dot0406.htm [3705 B]
 # From Deborah Goldsmith (2006-01-18):
-# http://dmses.dot.gov/docimages/pdf95/382329_web.pdf [2.9 MB]
+# http://dmses.dot.gov/docimages/pdf95/382329_web.pdf
 # From Paul Eggert (2006-01-20):
 # It says "DOT is relocating the time zone boundary in Indiana to move Starke,
 # Pulaski, Knox, Daviess, Martin, Pike, Dubois, and Perry Counties from the
@@ -638,7 +625,7 @@ Zone America/Indiana/Vincennes -5:50:07 - LMT	1883 Nov 18 12:09:53
 			-5:00	US	E%sT	1971
 			-5:00	-	EST	2006 Apr  2 2:00
 			-6:00	US	C%sT
-#
+# 
 # Pike County, Indiana moved from central to eastern time in 1977,
 # then switched back in 2006.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
@@ -831,10 +818,10 @@ Zone America/Menominee	-5:50:27 -	LMT	1885 Sep 18 12:00
 ################################################################################
 
 
-# From Paul Eggert (2006-03-22):
-# A good source for time zone historical data outside the U.S. is
-# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
-# San Diego: ACS Publications, Inc. (2003).
+# From Paul Eggert (1999-10-29):
+# A good source for time zone historical data outside the US is
+# Thomas G. Shanks, The International Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1999).
 #
 # Gwillim Law writes that a good source
 # for recent time zone data is the International Air Transport
@@ -842,8 +829,8 @@ Zone America/Menominee	-5:50:27 -	LMT	1885 Sep 18 12:00
 # published semiannually.  Law sent in several helpful summaries
 # of the IATA's data after 1990.
 #
-# Except where otherwise noted, Shanks & Pottenger is the source for
-# entries through 1990, and IATA SSIM is the source for entries afterwards.
+# Except where otherwise noted, Shanks is the source for entries through 1990,
+# and IATA SSIM is the source for entries after 1990.
 #
 # Other sources occasionally used include:
 #
@@ -891,51 +878,9 @@ Zone America/Menominee	-5:50:27 -	LMT	1885 Sep 18 12:00
 # From Paul Eggert (1994-11-22):
 # Alas, this sort of thing must be handled by localization software.
 
-# Unless otherwise specified, the data for Canada are all from Shanks
-# & Pottenger.
-
-# From Chris Walton (2006-04-01):
-# The British Columbia government announced yesterday that it will
-# adjust daylight savings next year to align with changes in the
-# U.S. and the rest of Canada....
-# http://www2.news.gov.bc.ca/news_releases_2005-2009/2006AG0014-000330.htm
-
-# From Chris Walton (2006-04-25):
-# Daylight saving time will be extended by four weeks starting in 2007....
-# Here is a news release which was issued today by the Nova Scotia government:
-# http://www.gov.ns.ca/news/details.asp?id=20060425004
-
-# From Chris Walton (2006-06-26):
-# [For New Brunswick] the new legislation dictates that the time change is to
-# be done at 02:00 instead of 00:01.
-# http://www.gnb.ca/0062/acts/BBA-2006/Chap-19.pdf
-# ...
-# Manitoba has traditionally changed the clock every fall at 03:00.
-# As of 2006, the transition is to take place one hour earlier at 02:00.
-# http://web2.gov.mb.ca/laws/statutes/ccsm/o030e.php
-# ...
-# [Alberta, Ontario, Quebec] will follow US rules.
-# http://www.qp.gov.ab.ca/documents/Acts/2006CH03_UNPR.cfm?frm_isbn=0779744934
-# http://www.e-laws.gov.on.ca/DBLaws/Source/Regs/English/2006/R06111_e.htm
-# http://www.assnat.qc.ca/eng/37legislature2/Projets-loi/Publics/06-a002.htm
-# ...
-# P.E.I. will follow US rules.  The new legislation is not law yet.
-# It passed first reading on April 20....
-# http://www.assembly.pe.ca/bills/pdf_first/62/3/bill-101.pdf
-# ...
-# Province of Newfoundland and Labrador.... The change is being considered.
-# http://www.releases.gov.nl.ca/releases/2006/mpa/0331n01.htm
-# ...
-# N.W.T. will follow US rules.  Whoever maintains the government web site
-# does not seem to believe in bookmarks.  To see the news release, click the
-# following link and search for "Daylight Savings Time Change".  Press the
-# "Daylight Savings Time Change" link; it will fire off a popup using
-# JavaScript.
-# http://www.exec.gov.nt.ca/currentnews/currentPR.asp?mode=archive
-
-
-
-# From Paul Eggert (2006-04-25):
+# Unless otherwise specified, the data for Canada are all from Shanks.
+
+# From Paul Eggert (2005-12-21):
 # H. David Matthews and Mary Vincent's map
 # 
 # "It's about TIME", _Canadian Geographic_ (September-October 1998)
@@ -947,10 +892,25 @@ Zone America/Menominee	-5:50:27 -	LMT	1885 Sep 18 12:00
 # information about standard and daylight saving time zones in Canada.
 #  (updated periodically).
 # Its unofficial information is often taken from Matthews and Vincent.
-
-# From Paul Eggert (2006-06-27):
-# For now, assume all of DST-observing Canada will fall into line with the
-# new US DST rules,
+#
+# CBC News reported that Ontario and Manitoba have announced plans to
+# follow the US change, and that Nova Scotia is considering it; see
+#  (2005-10-21).
+# CBC news also reported that Prince Edward Island is the first
+# province in Atlantic Canada to follow the US change, and that Quebec
+# had agreed; see 
+# (2005-12-07).
+#
+# To reflect all this, the Canada and Winn rules have been adjusted to
+# agree with the 2007 US change.  This means we assume most of Canada
+# will fall into line.  However, Alberta, British Columbia,
+# Newfoundland, Northwest Territories, and Yukon already have separate
+# rules in our database, so for now we'll leave them alone, which
+# means that we currently assume these regions will not change their
+# rules and will disagree with the US starting in 2007.  This
+# assumption is probably incorrect, with the possible exception of
+# Newfoundland.  We plan to adjust the Edm, Vanc, StJohns, and NT_YK
+# rules as the corresponding provinces make their announcements.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Canada	1918	only	-	Apr	14	2:00	1:00	D
@@ -965,7 +925,7 @@ Rule	Canada	2007	max	-	Mar	Sun>=8	2:00	1:00	D
 Rule	Canada	2007	max	-	Nov	Sun>=1	2:00	0	S
 
 
-# Newfoundland and Labrador
+# Newfoundland (and far southeast Labrador)
 
 # From Paul Eggert (2000-10-02):
 # Matthews and Vincent (1998) write that Labrador should use NST/NDT,
@@ -976,21 +936,20 @@ Rule	Canada	2007	max	-	Nov	Sun>=1	2:00	0	S
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	StJohns	1917	only	-	Apr	 8	2:00	1:00	D
 Rule	StJohns	1917	only	-	Sep	17	2:00	0	S
-# Whitman gives 1919 Apr 5 and 1920 Apr 5; go with Shanks & Pottenger.
+# Whitman gives 1919 Apr 5 and 1920 Apr 5; go with Shanks.
 Rule	StJohns	1919	only	-	May	 5	23:00	1:00	D
 Rule	StJohns	1919	only	-	Aug	12	23:00	0	S
-# For 1931-1935 Whitman gives Apr same date; go with Shanks & Pottenger.
+# For 1931-1935 Whitman gives Apr same date; go with Shanks.
 Rule	StJohns	1920	1935	-	May	Sun>=1	23:00	1:00	D
 Rule	StJohns	1920	1935	-	Oct	lastSun	23:00	0	S
-# For 1936-1941 Whitman gives May Sun>=8 and Oct Sun>=1; go with Shanks &
-# Pottenger.
+# For 1936-1941 Whitman gives May Sun>=8 and Oct Sun>=1; go with Shanks.
 Rule	StJohns	1936	1941	-	May	Mon>=9	0:00	1:00	D
 Rule	StJohns	1936	1941	-	Oct	Mon>=2	0:00	0	S
 # Whitman gives the following transitions:
 # 1942 03-01/12-31, 1943 05-30/09-05, 1944 07-10/09-02, 1945 01-01/10-07
-# but go with Shanks & Pottenger and assume they used Canadian rules.
+# but go with Shanks and assume they used Canadian rules.
 # For 1946-9 Whitman gives May 5,4,9,1 - Oct 1,5,3,2, and for 1950 he gives
-# Apr 30 - Sep 24; go with Shanks & Pottenger.
+# Apr 30 - Sep 24; go with Shanks.
 Rule	StJohns	1946	1950	-	May	Sun>=8	2:00	1:00	D
 Rule	StJohns	1946	1950	-	Oct	Sun>=2	2:00	0	S
 Rule	StJohns	1951	1986	-	Apr	lastSun	2:00	1:00	D
@@ -1000,12 +959,9 @@ Rule	StJohns	1960	1986	-	Oct	lastSun	2:00	0	S
 # INMS (2000-09-12) says that, since 1988 at least, Newfoundland switches
 # at 00:01 local time.  For now, assume it started in 1987.
 Rule	StJohns	1987	only	-	Apr	Sun>=1	0:01	1:00	D
-Rule	StJohns	1987	2006	-	Oct	lastSun	0:01	0	S
+Rule	StJohns	1987	max	-	Oct	lastSun	0:01	0	S
 Rule	StJohns	1988	only	-	Apr	Sun>=1	0:01	2:00	DD
-Rule	StJohns	1989	2006	-	Apr	Sun>=1	0:01	1:00	D
-Rule	StJohns	2007	max	-	Mar	Sun>=8	0:01	1:00	D
-Rule	StJohns	2007	max	-	Nov	Sun>=1	0:01	0	S
-#
+Rule	StJohns	1989	max	-	Apr	Sun>=1	0:01	1:00	D
 # St John's has an apostrophe, but Posix file names can't have apostrophes.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/St_Johns	-3:30:52 -	LMT	1884
@@ -1033,13 +989,12 @@ Zone America/Goose_Bay	-4:01:40 -	LMT	1884 # Happy Valley-Goose Bay
 
 # west Labrador, Nova Scotia, Prince Edward I
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger write that since 1970 most of this region has been like
-# Halifax.  Many locales did not observe peacetime DST until 1972;
+# From Paul Eggert (1996-06-12):
+# Shanks writes that since 1970 most of this region has been like Halifax.
+# Many locales did not observe peacetime DST until 1972;
 # Glace Bay, NS is the largest that we know of.
-# Shanks & Pottenger also write that Liverpool, NS was the only town
-# in Canada to observe DST in 1971 but not 1970; for now we'll assume
-# this is a typo.
+# Shanks also writes that Liverpool, NS was the only town in Canada to observe
+# DST in 1971 but not 1970; for now we'll assume this is a typo.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Halifax	1916	only	-	Apr	 1	0:00	1:00	D
@@ -1105,7 +1060,10 @@ Zone America/Glace_Bay	-3:59:48 -	LMT	1902 Jun 15
 #  says they change at 00:01, and
 #  makes it
 # clear that this has been the case since at least 1993.
-# For now, assume it started in 1993.
+# For now, assume it started in 1993.  The Office of the Premier announced
+#  (2005-12-23)
+# that they will bring forward proposed amendments to harmonize with the US;
+# for now assume that this will happen, but they'll still switch at 00:01.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Moncton	1933	1935	-	Jun	Sun>=8	1:00	1:00	D
@@ -1118,9 +1076,11 @@ Rule	Moncton	1940	only	-	May	19	1:00	1:00	D
 Rule	Moncton	1941	only	-	May	 4	1:00	1:00	D
 Rule	Moncton	1946	1972	-	Apr	lastSun	2:00	1:00	D
 Rule	Moncton	1946	1956	-	Sep	lastSun	2:00	0	S
-Rule	Moncton	1957	1972	-	Oct	lastSun	2:00	0	S
+Rule	Moncton	1956	1972	-	Oct	lastSun	2:00	0	S
 Rule	Moncton	1993	2006	-	Apr	Sun>=1	0:01	1:00	D
 Rule	Moncton	1993	2006	-	Oct	lastSun	0:01	0	S
+Rule	Moncton	2007	max	-	Mar	Sun>=8	0:01	1:00	D
+Rule	Moncton	2007	max	-	Nov	Sun>=1	0:01	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Moncton	-4:19:08 -	LMT	1883 Dec  9
 			-5:00	-	EST	1902 Jun 15
@@ -1129,79 +1089,13 @@ Zone America/Moncton	-4:19:08 -	LMT	1883 Dec  9
 			-4:00	Canada	A%sT	1946
 			-4:00	Moncton	A%sT	1973
 			-4:00	Canada	A%sT	1993
-			-4:00	Moncton	A%sT	2007
-			-4:00	Canada	A%sT
+			-4:00	Moncton	A%sT
 
-# Quebec
-
-# From Paul Eggert (2006-07-09):
-# Shanks & Pottenger write that since 1970 most of Quebec has been
-# like Montreal.
-
-# From Paul Eggert (2006-06-27):
-# Matthews and Vincent (1998) also write that Quebec east of the -63
-# meridian is supposed to observe AST, but residents as far east as
-# Natashquan use EST/EDT, and residents east of Natashquan use AST.
-# In "Official time in Quebec" the Quebec department of justice writes in
-# http://www.justice.gouv.qc.ca/english/publications/generale/temps-regl-1-a.htm
-# that "The residents of the Municipality of the
-# Cote-Nord-du-Golfe-Saint-Laurent and the municipalities of Saint-Augustin,
-# Bonne-Esperance and Blanc-Sablon apply the Official Time Act as it is
-# written and use Atlantic standard time all year round. The same applies to
-# the residents of the Native facilities along the lower North Shore."
-# 
-# says this common practice was codified into law as of 2007.
-# For lack of better info, guess this practice began around 1970, contra to
-# Shanks & Pottenger who have this region observing AST/ADT.
+# Ontario, Quebec
 
-# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Mont	1917	only	-	Mar	25	2:00	1:00	D
-Rule	Mont	1917	only	-	Apr	24	0:00	0	S
-Rule	Mont	1919	only	-	Mar	31	2:30	1:00	D
-Rule	Mont	1919	only	-	Oct	25	2:30	0	S
-Rule	Mont	1920	only	-	May	 2	2:30	1:00	D
-Rule	Mont	1920	1922	-	Oct	Sun>=1	2:30	0	S
-Rule	Mont	1921	only	-	May	 1	2:00	1:00	D
-Rule	Mont	1922	only	-	Apr	30	2:00	1:00	D
-Rule	Mont	1924	only	-	May	17	2:00	1:00	D
-Rule	Mont	1924	1926	-	Sep	lastSun	2:30	0	S
-Rule	Mont	1925	1926	-	May	Sun>=1	2:00	1:00	D
-# The 1927-to-1937 rules can be expressed more simply as
-# Rule	Mont	1927	1937	-	Apr	lastSat	24:00	1:00	D
-# Rule	Mont	1927	1937	-	Sep	lastSat	24:00	0	S
-# The rules below avoid use of 24:00
-# (which pre-1998 versions of zic cannot handle).
-Rule	Mont	1927	only	-	May	1	0:00	1:00	D
-Rule	Mont	1927	1932	-	Sep	lastSun	0:00	0	S
-Rule	Mont	1928	1931	-	Apr	lastSun	0:00	1:00	D
-Rule	Mont	1932	only	-	May	1	0:00	1:00	D
-Rule	Mont	1933	1940	-	Apr	lastSun	0:00	1:00	D
-Rule	Mont	1933	only	-	Oct	1	0:00	0	S
-Rule	Mont	1934	1939	-	Sep	lastSun	0:00	0	S
-Rule	Mont	1946	1973	-	Apr	lastSun	2:00	1:00	D
-Rule	Mont	1945	1948	-	Sep	lastSun	2:00	0	S
-Rule	Mont	1949	1950	-	Oct	lastSun	2:00	0	S
-Rule	Mont	1951	1956	-	Sep	lastSun	2:00	0	S
-Rule	Mont	1957	1973	-	Oct	lastSun	2:00	0	S
-
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Blanc-Sablon -3:48:28 -	LMT	1884
-			-4:00	Canada	A%sT	1970
-			-4:00	-	AST
-Zone America/Montreal	-4:54:16 -	LMT	1884
-			-5:00	Mont	E%sT	1918
-			-5:00	Canada	E%sT	1919
-			-5:00	Mont	E%sT	1942 Feb  9 2:00s
-			-5:00	Canada	E%sT	1946
-			-5:00	Mont	E%sT	1974
-			-5:00	Canada	E%sT
-
-
-# Ontario
-
-# From Paul Eggert (2006-07-09):
-# Shanks & Pottenger write that since 1970 most of Ontario has been like
-# Toronto.
+# From Paul Eggert (1996-06-12):
+# Shanks writes that since 1970 most of Ontario has been like Toronto,
+# and most of Quebec has been like Montreal.
 # Thunder Bay skipped DST in 1973.
 # Many smaller locales did not observe peacetime DST until 1974;
 # Nipigon (EST) and Rainy River (CST) are the largest that we know of.
@@ -1231,46 +1125,50 @@ Zone America/Montreal	-4:54:16 -	LMT	1884
 # says that Ontario east of 90W uses EST/EDT, and west of 90W uses CST/CDT.
 # Officially Atikokan is therefore on CST/CDT, and most likely this report
 # concerns a non-official time observed as a matter of local practice.
-#
+# For what it's worth, Shanks says that Atikokan has agreed with
+# Rainy River ever since standard time was introduced.
+
 # From Paul Eggert (2000-10-02):
 # Matthews and Vincent (1998) write that Atikokan, Pickle Lake, and
 # New Osnaburgh observe CST all year, that Big Trout Lake observes
 # CST/CDT, and that Upsala and Shebandowan observe EST/EDT, all in
 # violation of the official Ontario rules.
-#
-# From Paul Eggert (2006-07-09):
-# Chris Walton (2006-07-06) mentioned an article by Stephanie MacLellan in the
-# 2005-07-21 Chronicle-Journal, which said:
-#
-#	The clocks in Atikokan stay set on standard time year-round.
-#	This means they spend about half the time on central time and
-#	the other half on eastern time.
-#
-#	For the most part, the system works, Mayor Dennis Brown said.
-#
-#	"The majority of businesses in Atikokan deal more with Eastern
-#	Canada, but there are some that deal with Western Canada," he
-#	said.  "I don't see any changes happening here."
-#
-# Walton also writes "Supposedly Pickle Lake and Mishkeegogamang
-# [New Osnaburgh] follow the same practice."
-
-# From Garry McKinnon (2006-07-14) via Chris Walton:
-# I chatted with a member of my board who has an outstanding memory
-# and a long history in Atikokan (and in the telecom industry) and he
-# can say for certain that Atikokan has been practicing the current
-# time keeping since 1952, at least.
-
-# From Paul Eggert (2006-07-17):
-# Shanks & Pottenger say that Atikokan has agreed with Rainy River
-# ever since standard time was introduced, but the information from
-# McKinnon sounds more authoritative.  For now, assume that Atikokan
-# switched to EST immediately after WWII era daylight saving time
-# ended.  This matches the old (less-populous) America/Coral_Harbour
-# entry since our cutoff date of 1970, so we can move
-# America/Coral_Harbour to the 'backward' file.
+# They also write that Quebec east of the -63 meridian is supposed to
+# observe AST, but residents as far east as Natashquan use EST/EDT,
+# and residents east of Natashquan use AST.
+# We probably need Zones for far east Quebec and for Atikokan,
+# but we don't know when their practices started.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
+Rule	Mont	1917	only	-	Mar	25	2:00	1:00	D
+Rule	Mont	1917	only	-	Apr	24	0:00	0	S
+Rule	Mont	1919	only	-	Mar	31	2:30	1:00	D
+Rule	Mont	1919	only	-	Oct	25	2:30	0	S
+Rule	Mont	1920	only	-	May	 2	2:30	1:00	D
+Rule	Mont	1920	1922	-	Oct	Sun>=1	2:30	0	S
+Rule	Mont	1921	only	-	May	 1	2:00	1:00	D
+Rule	Mont	1922	only	-	Apr	30	2:00	1:00	D
+Rule	Mont	1924	only	-	May	17	2:00	1:00	D
+Rule	Mont	1924	1926	-	Sep	lastSun	2:30	0	S
+Rule	Mont	1925	1926	-	May	Sun>=1	2:00	1:00	D
+# The 1927-to-1937 rules can be expressed more simply as
+# Rule	Mont	1927	1937	-	Apr	lastSat	24:00	1:00	D
+# Rule	Mont	1927	1937	-	Sep	lastSat	24:00	0	S
+# The rules below avoid use of 24:00
+# (which pre-1998 versions of zic cannot handle).
+Rule	Mont	1927	only	-	May	1	0:00	1:00	D
+Rule	Mont	1927	1932	-	Sep	lastSun	0:00	0	S
+Rule	Mont	1928	1931	-	Apr	lastSun	0:00	1:00	D
+Rule	Mont	1932	only	-	May	1	0:00	1:00	D
+Rule	Mont	1933	1940	-	Apr	lastSun	0:00	1:00	D
+Rule	Mont	1933	only	-	Oct	1	0:00	0	S
+Rule	Mont	1934	1939	-	Sep	lastSun	0:00	0	S
+Rule	Mont	1946	1973	-	Apr	lastSun	2:00	1:00	D
+Rule	Mont	1945	1948	-	Sep	lastSun	2:00	0	S
+Rule	Mont	1949	1950	-	Oct	lastSun	2:00	0	S
+Rule	Mont	1951	1956	-	Sep	lastSun	2:00	0	S
+Rule	Mont	1957	1973	-	Oct	lastSun	2:00	0	S
+
 Rule	Toronto	1919	only	-	Mar	30	23:30	1:00	D
 Rule	Toronto	1919	only	-	Oct	26	0:00	0	S
 Rule	Toronto	1920	only	-	May	 2	2:00	1:00	D
@@ -1278,8 +1176,7 @@ Rule	Toronto	1920	only	-	Sep	26	0:00	0	S
 Rule	Toronto	1921	only	-	May	15	2:00	1:00	D
 Rule	Toronto	1921	only	-	Sep	15	2:00	0	S
 Rule	Toronto	1922	1923	-	May	Sun>=8	2:00	1:00	D
-# Shanks & Pottenger say 1923-09-19; assume it's a typo and that "-16"
-# was meant.
+# Shanks says 1923-09-19; assume it's a typo and that "-16" was meant.
 Rule	Toronto	1922	1926	-	Sep	Sun>=15	2:00	0	S
 Rule	Toronto	1924	1927	-	May	Sun>=1	2:00	1:00	D
 # The 1927-to-1939 rules can be expressed more simply as
@@ -1303,10 +1200,9 @@ Rule	Toronto	1949	only	-	Nov	lastSun	0:00	0	S
 Rule	Toronto	1950	1973	-	Apr	lastSun	2:00	1:00	D
 Rule	Toronto	1950	only	-	Nov	lastSun	2:00	0	S
 Rule	Toronto	1951	1956	-	Sep	lastSun	2:00	0	S
-# Shanks & Pottenger say Toronto ended DST a week early in 1971,
-# namely on 1971-10-24, but Mark Brader wrote (2003-05-31) that this
-# is wrong, and that he had confirmed it by checking the 1971-10-30
-# Toronto Star, which said that DST was ending 1971-10-31 as usual.
+# Shanks says Toronto ended DST a week early in 1971, namely on 1971-10-24,
+# but Mark Brader wrote (2003-05-31) that he checked the 1971-10-30 issue
+# of the Toronto Star, and it said that DST ended 1971-10-31 as usual.
 Rule	Toronto	1957	1973	-	Oct	lastSun	2:00	0	S
 
 # From Paul Eggert (2003-07-27):
@@ -1328,6 +1224,13 @@ Rule	Toronto	1957	1973	-	Oct	lastSun	2:00	0	S
 # months for the remainder of the war years.
 
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
+Zone America/Montreal	-4:54:16 -	LMT	1884
+			-5:00	Mont	E%sT	1918
+			-5:00	Canada	E%sT	1919
+			-5:00	Mont	E%sT	1942 Feb  9 2:00s
+			-5:00	Canada	E%sT	1946
+			-5:00	Mont	E%sT	1974
+			-5:00	Canada	E%sT
 Zone America/Toronto	-5:17:32 -	LMT	1895
 			-5:00	Canada	E%sT	1919
 			-5:00	Toronto	E%sT	1942 Feb  9 2:00s
@@ -1345,38 +1248,14 @@ Zone America/Nipigon	-5:53:04 -	LMT	1895
 			-5:00	Canada	E%sT	1940 Sep 29
 			-5:00	1:00	EDT	1942 Feb  9 2:00s
 			-5:00	Canada	E%sT
-Zone America/Rainy_River -6:18:16 -	LMT	1895
+Zone America/Rainy_River -6:17:56 -	LMT	1895
 			-6:00	Canada	C%sT	1940 Sep 29
 			-6:00	1:00	CDT	1942 Feb  9 2:00s
 			-6:00	Canada	C%sT
-Zone America/Atikokan	-6:06:28 -	LMT	1895
-			-6:00	Canada	C%sT	1940 Sep 29
-			-6:00	1:00	CDT	1942 Feb  9 2:00s
-			-6:00	Canada	C%sT	1945 Sep 30 2:00
-			-5:00	-	EST
 
 
 # Manitoba
 
-# From Rob Douglas (2006-04-06):
-# the old Manitoba Time Act - as amended by Bill 2, assented to
-# March 27, 1987 ... said ...
-# "between two o'clock Central Standard Time in the morning of
-# the first Sunday of April of each year and two o'clock Central
-# Standard Time in the morning of the last Sunday of October next
-# following, one hour in advance of Central Standard Time."...
-# I believe that the English legislation [of the old time act] had =
-# been assented to (March 22, 1967)....
-# Also, as far as I can tell, there was no order-in-council varying
-# the time of Daylight Saving Time for 2005 and so the provisions of
-# the 1987 version would apply - the changeover was at 2:00 Central
-# Standard Time (i.e. not until 3:00 Central Daylight Time).
-
-# From Paul Eggert (2006-04-10):
-# Shanks & Pottenger say Manitoba switched at 02:00 (not 02:00s)
-# starting 1966.  Since 02:00s is clearly correct for 1967 on, assume
-# it was also 02:00s in 1966.
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Winn	1916	only	-	Apr	23	0:00	1:00	D
 Rule	Winn	1916	only	-	Sep	17	0:00	0	S
@@ -1399,13 +1278,18 @@ Rule	Winn	1959	only	-	Oct	lastSun	2:00	0	S
 Rule	Winn	1960	only	-	Sep	lastSun	2:00	0	S
 Rule	Winn	1963	only	-	Apr	lastSun	2:00	1:00	D
 Rule	Winn	1963	only	-	Sep	22	2:00	0	S
-Rule	Winn	1966	1986	-	Apr	lastSun	2:00s	1:00	D
-Rule	Winn	1966	2005	-	Oct	lastSun	2:00s	0	S
-Rule	Winn	1987	2005	-	Apr	Sun>=1	2:00s	1:00	D
+Rule	Winn	1966	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	Winn	1966	1986	-	Oct	lastSun	2:00	0	S
+Rule	Winn	1987	2006	-	Apr	Sun>=1	2:00s	1:00	D
+# From Paul Eggert (2000-10-02):
+# INMS (2000-09-12) says that, since 1988 at least, Manitoba switches from
+# DST at 03:00 local time.  For now, assume it started in 1987.
+Rule	Winn	1987	2006	-	Oct	lastSun	2:00s	0	S
+Rule	Winn	2007	max	-	Mar	Sun>=8	2:00s	1:00	D
+Rule	Winn	2007	max	-	Nov	Sun>=1	2:00s	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Winnipeg	-6:28:36 -	LMT	1887 Jul 16
-			-6:00	Winn	C%sT	2006
-			-6:00	Canada	C%sT
+			-6:00	Winn	C%sT
 
 
 # Saskatchewan
@@ -1424,8 +1308,8 @@ Zone America/Winnipeg	-6:28:36 -	LMT	1887 Jul 16
 # Willett (1914-03) notes that DST "has been in operation ... in the
 # City of Moose Jaw, Saskatchewan, for one year."
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger say that since 1970 this region has mostly been as Regina.
+# From Paul Eggert (2000-10-02):
+# Shanks writes that since 1970 most of this region has been like Regina.
 # Some western towns (e.g. Swift Current) switched from MST/MDT to CST in 1972.
 # Other western towns (e.g. Lloydminster) are like Edmonton.
 # Matthews and Vincent (1998) write that Denare Beach and Creighton
@@ -1457,11 +1341,6 @@ Zone America/Winnipeg	-6:28:36 -	LMT	1887 Jul 16
 # rules any more; all other districts appear to have used CST year round
 # since sometime in the 1960s.
 
-# From Chris Walton (2006-06-26):
-# The Saskatchewan time act which was last updated in 1996 is about 30 pages
-# long and rather painful to read.
-# http://www.qp.gov.sk.ca/documents/English/Statutes/Statutes/T14.pdf
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Regina	1918	only	-	Apr	14	2:00	1:00	D
 Rule	Regina	1918	only	-	Oct	31	2:00	0	S
@@ -1516,18 +1395,17 @@ Rule	Edm	1967	only	-	Oct	lastSun	2:00	0	S
 Rule	Edm	1969	only	-	Apr	lastSun	2:00	1:00	D
 Rule	Edm	1969	only	-	Oct	lastSun	2:00	0	S
 Rule	Edm	1972	1986	-	Apr	lastSun	2:00	1:00	D
-Rule	Edm	1972	2006	-	Oct	lastSun	2:00	0	S
+Rule	Edm	1972	max	-	Oct	lastSun	2:00	0	S
+Rule	Edm	1987	max	-	Apr	Sun>=1	2:00	1:00	D
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Edmonton	-7:33:52 -	LMT	1906 Sep
-			-7:00	Edm	M%sT	1987
-			-7:00	Canada	M%sT
+			-7:00	Edm	M%sT
 
 
 # British Columbia
 
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger write that since 1970 most of this region has
-# been like Vancouver.
+# From Paul Eggert (2000-10-02):
+# Shanks writes that since 1970 most of this region has been like Vancouver.
 # Dawson Creek uses MST.  Much of east BC is like Edmonton.
 # Matthews and Vincent (1998) write that Creston is like Dawson Creek.
 
@@ -1540,11 +1418,11 @@ Rule	Vanc	1945	only	-	Sep	30	2:00	0	S
 Rule	Vanc	1946	1986	-	Apr	lastSun	2:00	1:00	D
 Rule	Vanc	1946	only	-	Oct	13	2:00	0	S
 Rule	Vanc	1947	1961	-	Sep	lastSun	2:00	0	S
-Rule	Vanc	1962	2006	-	Oct	lastSun	2:00	0	S
+Rule	Vanc	1962	max	-	Oct	lastSun	2:00	0	S
+Rule	Vanc	1987	max	-	Apr	Sun>=1	2:00	1:00	D
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Vancouver	-8:12:28 -	LMT	1884
-			-8:00	Vanc	P%sT	1987
-			-8:00	Canada	P%sT
+			-8:00	Vanc	P%sT
 Zone America/Dawson_Creek -8:00:56 -	LMT	1884
 			-8:00	Canada	P%sT	1947
 			-8:00	Vanc	P%sT	1972 Aug 30 2:00
@@ -1553,7 +1431,7 @@ Zone America/Dawson_Creek -8:00:56 -	LMT	1884
 
 # Northwest Territories, Nunavut, Yukon
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-10-29):
 # Dawson switched to PST in 1973.  Inuvik switched to MST in 1979.
 # Mathew Englander (1996-10-07) gives the following refs:
 #	* 1967. Paragraph 28(34)(g) of the Interpretation Act, S.C. 1967-68,
@@ -1562,12 +1440,7 @@ Zone America/Dawson_Creek -8:00:56 -	LMT	1884
 #	* C.O. 1973/214 switched Yukon to PST on 1973-10-28 00:00.
 #	* O.I.C. 1980/02 established DST.
 #	* O.I.C. 1987/056 changed DST to Apr firstSun 2:00 to Oct lastSun 2:00.
-# Shanks & Pottenger say Yukon's 1973-10-28 switch was at 2:00; go
-# with Englander.
-# From Chris Walton (2006-06-26):
-# Here is a link to the old daylight saving portion of the interpretation
-# act which was last updated in 1987:
-# http://www.gov.yk.ca/legislation/regs/oic1987_056.pdf
+# Shanks says Yukon's 1973-10-28 switch was at 2:00; go with Englander.
 
 # From Rives McDow (1999-09-04):
 # Nunavut ... moved ... to incorporate the whole territory into one time zone.
@@ -1676,10 +1549,6 @@ Zone America/Dawson_Creek -8:00:56 -	LMT	1884
 # For lack of better information, assume that Southampton Island observed
 # daylight saving only during wartime.
 
-# From Chris Walton (2006-07-19):
-# The government of Yukon Territory ... recently announced it will extend
-# daylight saving in 2007....  http://www.gov.yk.ca/news/2006/06-164.html
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	NT_YK	1918	only	-	Apr	14	2:00	1:00	D
 Rule	NT_YK	1918	only	-	Oct	27	2:00	0	S
@@ -1691,8 +1560,8 @@ Rule	NT_YK	1945	only	-	Sep	30	2:00	0	S
 Rule	NT_YK	1965	only	-	Apr	lastSun	0:00	2:00	DD
 Rule	NT_YK	1965	only	-	Oct	lastSun	2:00	0	S
 Rule	NT_YK	1980	1986	-	Apr	lastSun	2:00	1:00	D
-Rule	NT_YK	1980	2006	-	Oct	lastSun	2:00	0	S
-Rule	NT_YK	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	NT_YK	1980	max	-	Oct	lastSun	2:00	0	S
+Rule	NT_YK	1987	max	-	Apr	Sun>=1	2:00	1:00	D
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Pangnirtung -4:22:56 -	LMT	1884
 			-4:00	NT_YK	A%sT	1995 Apr Sun>=1 2:00
@@ -1703,11 +1572,10 @@ Zone America/Iqaluit	-4:33:52 -	LMT	1884 # Frobisher Bay before 1987
 			-5:00	NT_YK	E%sT	1999 Oct 31 2:00
 			-6:00	Canada	C%sT	2000 Oct 29 2:00
 			-5:00	Canada	E%sT
-# Now subsumed by America/Atikokan.
-#Zone America/Coral_Harbour -5:32:40 -	LMT	1884
-#			-5:00	NT_YK	E%sT	1946
-#			-5:00	-	EST
-Zone America/Rankin_Inlet -6:08:20 -	LMT	1884
+Zone America/Coral_Harbour -5:32:40 -	LMT	1884
+			-5:00	NT_YK	E%sT	1946
+			-5:00	-	EST
+Zone America/Rankin_Inlet -6:08:40 -	LMT	1884
 			-6:00	NT_YK	C%sT	2000 Oct 29 2:00
 			-5:00	-	EST	2001 Apr  1 3:00
 			-6:00	Canada	C%sT
@@ -1718,20 +1586,16 @@ Zone America/Cambridge_Bay -7:00:20 -	LMT	1884
 			-6:00	-	CST	2001 Apr  1 3:00
 			-7:00	Canada	M%sT
 Zone America/Yellowknife -7:37:24 -	LMT	1884
-			-7:00	NT_YK	M%sT	1980
-			-7:00	Canada	M%sT
-Zone America/Inuvik	-8:54:52 -	LMT	1884
+			-7:00	NT_YK	M%sT
+Zone America/Inuvik	-8:54:00 -	LMT	1884
 			-8:00	NT_YK	P%sT	1979 Apr lastSun 2:00
-			-7:00	NT_YK	M%sT	1980
-			-7:00	Canada	M%sT
+			-7:00	NT_YK	M%sT
 Zone America/Whitehorse	-9:00:12 -	LMT	1900 Aug 20
 			-9:00	NT_YK	Y%sT	1966 Jul 1 2:00
-			-8:00	NT_YK	P%sT	1980
-			-8:00	Canada	P%sT
+			-8:00	NT_YK	P%sT
 Zone America/Dawson	-9:17:40 -	LMT	1900 Aug 20
 			-9:00	NT_YK	Y%sT	1973 Oct 28 0:00
-			-8:00	NT_YK	P%sT	1980
-			-8:00	Canada	P%sT
+			-8:00	NT_YK	P%sT
 
 
 ###############################################################################
@@ -1745,12 +1609,16 @@ Zone America/Dawson	-9:17:40 -	LMT	1900 Aug 20
 # history of Mexican local time (in Spanish)
 # .
 #
-# Here are the discrepancies between Shanks & Pottenger (S&P) and the MLoC.
+# Here are the discrepancies between Shanks and the MLoC.
 # (In all cases we go with the MLoC.)
-# S&P report that Baja was at -8:00 in 1922/1923.
-# S&P say the 1930 transition in Baja was 1930-11-16.
-# S&P report no DST during summer 1931.
-# S&P report a transition at 1932-03-30 23:00, not 1932-04-01.
+# Shanks reports that Baja was at -8:00 in 1922/1923.
+# Shanks says the 1930 transition in Baja was 1930-11-16.
+# Shanks reports no DST during summer 1931.
+# Shanks reports a transition at 1932-03-30 23:00, not 1932-04-01.
+# Shanks does not report transitions for Baja in 1945 or 1948.
+# Shanks reports southern Mexico transitions on 1981-12-01, not 12-23.
+# Shanks says Quintana Roo switched to -6:00 on 1982-12-02, and to -5:00
+# on 1997-10-26 at 02:00.
 
 # From Gwillim Law (2001-02-20):
 # There are some other discrepancies between the Decrees page and the
@@ -1758,6 +1626,10 @@ Zone America/Dawson	-9:17:40 -	LMT	1900 Aug 20
 # the researchers who prepared the Decrees page failed to find some of
 # the relevant documents.
 
+# From Paul Eggert (2000-07-26):
+# Shanks gives 1942-04-01 instead of 1942-04-24, and omits the 1981
+# and 1988 DST experiments.  Go with spin.com.mx.
+
 # From Alan Perry (1996-02-15):
 # A guy from our Mexico subsidiary finally found the Presidential Decree
 # outlining the timezone changes in Mexico.
@@ -1957,8 +1829,7 @@ Zone America/Tijuana	-7:48:04 -	LMT	1922 Jan  1  0:11:56
 			-8:00	-	PST	1931 Apr  1
 			-8:00	1:00	PDT	1931 Sep 30
 			-8:00	-	PST	1942 Apr 24
-			-8:00	1:00	PWT	1945 Aug 14 23:00u
-			-8:00	1:00	PPT	1945 Nov 12 # Peace
+			-8:00	1:00	PWT	1945 Nov 12
 			-8:00	-	PST	1948 Apr  5
 			-8:00	1:00	PDT	1949 Jan 14
 			-8:00	-	PST	1954
@@ -1968,13 +1839,12 @@ Zone America/Tijuana	-7:48:04 -	LMT	1922 Jan  1  0:11:56
 			-8:00	Mexico	P%sT	2001
 			-8:00	US	P%sT	2002 Feb 20
 			-8:00	Mexico	P%sT
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2001-03-05):
 # Formerly there was an America/Ensenada zone, which differed from
 # America/Tijuana only in that it did not observe DST from 1976
-# through 1995.  This was as per Shanks (1999).  But Shanks & Pottenger say
-# Ensenada did not observe DST from 1948 through 1975.  Guy Harris reports
+# through 1995.  This was as per Shanks.  However, Guy Harris reports
 # that the 1987 OAG says "Only Ensenada, Mexicale, San Felipe and
-# Tijuana observe DST," which agrees with Shanks & Pottenger but implies that
+# Tijuana observe DST," which contradicts Shanks but does imply that
 # DST-observance was a town-by-town matter back then.  This concerns
 # data after 1970 so most likely there should be at least one Zone
 # other than America/Tijuana for Baja, but it's not clear yet what its
@@ -2018,7 +1888,7 @@ Zone America/Barbados	-3:58:28 -	LMT	1924		# Bridgetown
 			-4:00	Barb	A%sT
 
 # Belize
-# Whitman entirely disagrees with Shanks; go with Shanks & Pottenger.
+# Whitman entirely disagrees with Shanks; go with Shanks.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Belize	1918	1942	-	Oct	Sun>=2	0:00	0:30	HD
 Rule	Belize	1919	1943	-	Feb	Sun>=9	0:00	0	S
@@ -2031,20 +1901,10 @@ Zone	America/Belize	-5:52:48 -	LMT	1912 Apr
 			-6:00	Belize	C%sT
 
 # Bermuda
-
-# From Dan Jones, reporting in The Royal Gazette (2006-06-26):
-
-# Next year, however, clocks in the US will go forward on the second Sunday
-# in March, until the first Sunday in November.  And, after the Time Zone
-# (Seasonal Variation) Bill 2006 was passed in the House of Assembly on
-# Friday, the same thing will happen in Bermuda.
-# http://www.theroyalgazette.com/apps/pbcs.dll/article?AID=/20060529/NEWS/105290135
-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone Atlantic/Bermuda	-4:19:04 -	LMT	1930 Jan  1 2:00    # Hamilton
 			-4:00	-	AST	1974 Apr 28 2:00
-			-4:00	Bahamas	A%sT	1976
-			-4:00	US	A%sT
+			-4:00	Bahamas	A%sT
 
 # Cayman Is
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -2057,8 +1917,7 @@ Zone	America/Cayman	-5:25:32 -	LMT	1890		# Georgetown
 Rule	CR	1979	1980	-	Feb	lastSun	0:00	1:00	D
 Rule	CR	1979	1980	-	Jun	Sun>=1	0:00	0	S
 Rule	CR	1991	1992	-	Jan	Sat>=15	0:00	1:00	D
-# IATA SSIM (1991-09) says the following was at 1:00;
-# go with Shanks & Pottenger.
+# IATA SSIM (1991-09) says the following was at 1:00; go with Shanks.
 Rule	CR	1991	only	-	Jul	 1	0:00	0	S
 Rule	CR	1992	only	-	Mar	15	0:00	0	S
 # There are too many San Joses elsewhere, so we'll use `Costa Rica'.
@@ -2084,26 +1943,18 @@ Zone America/Costa_Rica	-5:36:20 -	LMT	1890		# San Jose
 
 # From Evert van der Veer via Steffen Thorsen (2004-10-28):
 # Cuba is not going back to standard time this year.
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2004-10-28):
 # http://www.granma.cu/ingles/2004/septiembre/juev30/41medid-i.html
 # says that it's due to a problem at the Antonio Guiteras
 # thermoelectric plant, and says "This October there will be no return
 # to normal hours (after daylight saving time)".
-# For now, let's assume that it's a temporary measure.
+# For now, let's assume that it's a one-year temporary measure.
 
 # From Carlos A. Carnero Delgado (2005-11-12):
 # This year (just like in 2004-2005) there's no change in time zone
 # adjustment in Cuba.  We will stay in daylight saving time:
 # http://www.granma.cu/espanol/2005/noviembre/mier9/horario.html
 
-# From Jesper Norgaard Welen (2006-10-21):
-# An article in GRANMA INTERNACIONAL claims that Cuba will end
-# the 3 years of permanent DST next weekend, see
-# http://www.granma.cu/ingles/2006/octubre/lun16/43horario.html
-# "On Saturday night, October 28 going into Sunday, October 29, at 01:00,
-# watches should be set back one hour -- going back to 00:00 hours -- returning
-# to the normal schedule....
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Cuba	1928	only	-	Jun	10	0:00	1:00	D
 Rule	Cuba	1928	only	-	Oct	10	0:00	0	S
@@ -2182,7 +2033,6 @@ Zone America/Santo_Domingo -4:39:36 -	LMT	1890
 			-4:00	-	AST
 
 # El Salvador
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Salv	1987	1988	-	May	Sun>=1	0:00	1:00	D
 Rule	Salv	1987	1988	-	Sep	lastSun	0:00	0	S
@@ -2203,19 +2053,6 @@ Zone America/Guadeloupe	-4:06:08 -	LMT	1911 Jun 8	# Pointe a Pitre
 			-4:00	-	AST
 
 # Guatemala
-#
-# From Gwillim Law (2006-04-22), after a heads-up from Oscar van Vlijmen:
-# Diario Co Latino, at
-# http://www.diariocolatino.com/internacionales/detalles.asp?NewsID=8079,
-# says in an article dated 2006-04-19 that the Guatemalan government had
-# decided on that date to advance official time by 60 minutes, to lessen the
-# impact of the elevated cost of oil....  Daylight saving time will last from
-# 2006-04-29 24:00 (Guatemalan standard time) to 2006-09-30 (time unspecified).
-# From Paul Eggert (2006-06-22):
-# The Ministry of Energy and Mines, press release CP-15/2006
-# (2006-04-19), says DST ends at 24:00.  See
-# .
-
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Guat	1973	only	-	Nov	25	0:00	1:00	D
 Rule	Guat	1974	only	-	Feb	24	0:00	0	S
@@ -2223,8 +2060,6 @@ Rule	Guat	1983	only	-	May	21	0:00	1:00	D
 Rule	Guat	1983	only	-	Sep	22	0:00	0	S
 Rule	Guat	1991	only	-	Mar	23	0:00	1:00	D
 Rule	Guat	1991	only	-	Sep	 7	0:00	0	S
-Rule	Guat	2006	only	-	Apr	30	0:00	1:00	D
-Rule	Guat	2006	only	-	Oct	 1	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Guatemala	-6:02:04 -	LMT	1918 Oct 5
 			-6:00	Guat	C%sT
@@ -2249,67 +2084,26 @@ Zone America/Guatemala	-6:02:04 -	LMT	1918 Oct 5
 #   October 2005.
 #
 #  "Port-au-Prince, March 31, 2005"
-#
-# From Steffen Thorsen (2006-04-04):
-# I have been informed by users that Haiti observes DST this year like
-# last year, so the current "only" rule for 2005 might be changed to a
-# "max" rule or to last until 2006. (Who knows if they will observe DST
-# next year or if they will extend their DST like US/Canada next year).
-#
-# I have found this article about it (in French):
-# http://www.haitipressnetwork.com/news.cfm?articleID=7612
-#
-# The reason seems to be an energy crisis.
-
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Haiti	1983	only	-	May	8	0:00	1:00	D
 Rule	Haiti	1984	1987	-	Apr	lastSun	0:00	1:00	D
 Rule	Haiti	1983	1987	-	Oct	lastSun	0:00	0	S
-# Shanks & Pottenger say AT is 2:00, but IATA SSIM (1991/1997) says 1:00s.
-# Go with IATA.
+# Shanks says AT is 2:00, but IATA SSIM (1991/1997) says 1:00s.  Go with IATA.
 Rule	Haiti	1988	1997	-	Apr	Sun>=1	1:00s	1:00	D
 Rule	Haiti	1988	1997	-	Oct	lastSun	1:00s	0	S
-Rule	Haiti	2005	max	-	Apr	Sun>=1	0:00	1:00	D
-Rule	Haiti	2005	max	-	Oct	lastSun	0:00	0	S
+Rule	Haiti	2005	only	-	Apr	Sun>=1	0:00	1:00	D
+Rule	Haiti	2005	only	-	Oct	lastSun	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Port-au-Prince -4:49:20 -	LMT	1890
 			-4:49	-	PPMT	1917 Jan 24 12:00 # P-a-P MT
 			-5:00	Haiti	E%sT
 
 # Honduras
-# Shanks & Pottenger say 1921 Jan 1; go with Whitman's more precise Apr 1.
-
-# From Paul Eggert (2006-05-05):
-# worldtimezone.com reports a 2006-05-02 Spanish-language AP article
-# saying Honduras will start using DST midnight Saturday, effective 4
-# months until September.  La Tribuna reported today
-#  that Manuel Zelaya, the president
-# of Honduras, refused to back down on this.
-
-# From Jesper Norgaard Welen (2006-08-08):
-# It seems that Honduras has returned from DST to standard time this Monday at
-# 00:00 hours (prolonging Sunday to 25 hours duration).
-# http://www.worldtimezone.com/dst_news/dst_news_honduras04.html
-
-# From Paul Eggert (2006-08-08):
-# Also see Diario El Heraldo, The country returns to standard time (2006-08-08)
-# .
-# It mentions executive decree 18-2006.
-
-# From Steffen Thorsen (2006-08-17):
-# Honduras will observe DST from 2007 to 2009, exact dates are not
-# published, I have located this authoritative source:
-# http://www.presidencia.gob.hn/noticia.aspx?nId=47
-
-# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Hond	1987	1988	-	May	Sun>=1	0:00	1:00	D
-Rule	Hond	1987	1988	-	Sep	lastSun	0:00	0	S
-Rule	Hond	2006	2009	-	May	Sun>=1	0:00	1:00	D
-Rule	Hond	2006	2009	-	Aug	Mon>=1	0:00	0	S
+# Shanks says 1921 Jan 1; go with Whitman's more precise Apr 1.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Tegucigalpa -5:48:52 -	LMT	1921 Apr
-			-6:00	Hond	C%sT
+			-6:00	Salv	C%sT
 #
 # Great Swan I ceded by US to Honduras in 1972
 
@@ -2321,7 +2115,7 @@ Zone America/Tegucigalpa -5:48:52 -	LMT	1921 Apr
 # From U. S. Naval Observatory (1989-01-19):
 # JAMAICA             5 H  BEHIND UTC
 
-# From Shanks & Pottenger:
+# From Shanks:
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Jamaica	-5:07:12 -	LMT	1890		# Kingston
 			-5:07:12 -	KMT	1912 Feb    # Kingston Mean Time
@@ -2338,16 +2132,18 @@ Zone America/Martinique	-4:04:20 -      LMT	1890		# Fort-de-France
 			-4:00	-	AST
 
 # Montserrat
-# From Paul Eggert (2006-03-22):
-# In 1995 volcanic eruptions forced evacuation of Plymouth, the capital.
-# world.gazetteer.com says Cork Hill is the most populous location now.
+# From Paul Eggert (1997-08-31):
+# Recent volcanic eruptions have forced evacuation of Plymouth, the capital.
+# Luckily, Olveston, the current de facto capital, has the same longitude.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Montserrat	-4:08:52 -	LMT	1911 Jul 1 0:01   # Cork Hill
+Zone America/Montserrat	-4:08:52 -	LMT	1911 Jul 1 0:01   # Olveston
 			-4:00	-	AST
 
 # Nicaragua
 #
-# This uses Shanks & Pottenger for times before 2005.
+# From Steffen Thorsen (1998-12-29):
+# Nicaragua seems to be back at -6:00 but I have not been able to find when
+# they changed from -5:00.
 #
 # From Steffen Thorsen (2005-04-12):
 # I've got reports from 8 different people that Nicaragua just started
@@ -2361,7 +2157,8 @@ Zone America/Montserrat	-4:08:52 -	LMT	1911 Jul 1 0:01   # Cork Hill
 #
 # From Paul Eggert (2005-05-01):
 # The decree doesn't say anything about daylight saving, but for now let's
-# assume that it is daylight saving....
+# assume that it is daylight saving and that they'll switch back on the
+# 3rd Sunday in September.
 #
 # From Gwillim Law (2005-04-21):
 # The Associated Press story on the time change, which can be found at
@@ -2379,35 +2176,20 @@ Zone America/Montserrat	-4:08:52 -	LMT	1911 Jul 1 0:01   # Cork Hill
 # http://www.presidencia.gob.ni/presidencia/files_index/secretaria/comunicados/2005/septiembre/26septiembre-cambio-hora.htm
 # (2005-09-26)
 #
-# From Jesper Norgaard Welen (2006-05-05):
-# http://www.elnuevodiario.com.ni/2006/05/01/nacionales/18410
-# (my informal translation)
-# By order of the president of the republic, Enrique Bolanos, Nicaragua
-# advanced by sixty minutes their official time, yesterday at 2 in the
-# morning, and will stay that way until 30.th. of september.
-#
-# From Jesper Norgaard Welen (2006-09-30):
-# http://www.presidencia.gob.ni/buscador_gaceta/BD/DECRETOS/2006/D-063-2006P-PRN-Cambio-Hora.pdf
-# My informal translation runs:
-# The natural sun time is restored in all the national territory, in that the
-# time is returned one hour at 01:00 am of October 1 of 2006.
-#
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Nic	1979	1980	-	Mar	Sun>=16	0:00	1:00	D
 Rule	Nic	1979	1980	-	Jun	Mon>=23	0:00	0	S
+Rule	Nic	1992	only	-	Jan	 1	4:00	1:00	D
+Rule	Nic	1992	only	-	Sep	24	0:00	0	S
 Rule	Nic	2005	only	-	Apr	10	0:00	1:00	D
-Rule	Nic	2005	only	-	Oct	Sun>=1	0:00	0	S
-Rule	Nic	2006	only	-	Apr	30	2:00	1:00	D
-Rule	Nic	2006	only	-	Oct	Sun>=1	1:00	0	S
+Rule	Nic	2005	only	-	Oct	 2	0:00	0	S
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Managua	-5:45:08 -	LMT	1890
 			-5:45:12 -	MMT	1934 Jun 23 # Managua Mean Time?
 			-6:00	-	CST	1973 May
 			-5:00	-	EST	1975 Feb 16
-			-6:00	Nic	C%sT	1992 Jan  1 4:00
-			-5:00	-	EST	1992 Sep 24
-			-6:00	-	CST	1993
-			-5:00	-	EST	1997
+			-6:00	Nic	C%sT	1993 Jan 1 4:00
+			-5:00	-	EST	1998 Dec
 			-6:00	Nic	C%sT
 
 # Panama
@@ -2421,7 +2203,7 @@ Zone	America/Panama	-5:18:08 -	LMT	1890
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Puerto_Rico -4:24:25 -	LMT	1899 Mar 28 12:00    # San Juan
 			-4:00	-	AST	1942 May  3
-			-4:00	US	A%sT	1946
+			-4:00	1:00	AWT	1945 Sep 30  2:00
 			-4:00	-	AST
 
 # St Kitts-Nevis
@@ -2450,8 +2232,8 @@ Zone America/St_Vincent	-4:04:56 -	LMT	1890		# Kingstown
 			-4:00	-	AST
 
 # Turks and Caicos
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger say they use US DST rules, but IATA SSIM (1991/1998)
+# From Paul Eggert (1998-08-06):
+# Shanks says they use US DST rules, but IATA SSIM (1991/1998)
 # says they switch at midnight.  Go with IATA SSIM.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	TC	1979	1986	-	Apr	lastSun	0:00	1:00	D
diff --git a/timezone/private.h b/timezone/private.h
index 2837b70c10..d9f232c8e3 100644
--- a/timezone/private.h
+++ b/timezone/private.h
@@ -21,7 +21,7 @@
 
 #ifndef lint
 #ifndef NOID
-static char	privatehid[] = "@(#)private.h	8.2";
+static char	privatehid[] = "@(#)private.h	7.55";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
@@ -89,7 +89,7 @@ static char	privatehid[] = "@(#)private.h	8.2";
 #include "stdio.h"
 #include "errno.h"
 #include "string.h"
-#include "limits.h"	/* for CHAR_BIT et al. */
+#include "limits.h"	/* for CHAR_BIT */
 #include "time.h"
 #include "stdlib.h"
 
@@ -125,51 +125,20 @@ static char	privatehid[] = "@(#)private.h	8.2";
 #define is_digit(c) ((unsigned)(c) - '0' <= 9)
 
 /*
-** Define HAVE_STDINT_H's default value here, rather than at the
-** start, since __GLIBC__'s value depends on previously-included
-** files.
-** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.)
-*/
-#ifndef HAVE_STDINT_H
-#define HAVE_STDINT_H \
-	(199901 <= __STDC_VERSION__ || \
-	2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
-#endif /* !defined HAVE_STDINT_H */
-
-#if HAVE_STDINT_H
-#include "stdint.h"
-#endif /* !HAVE_STDINT_H */
-
-#ifndef INT_FAST64_MAX
-/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX.  */
-#if defined LLONG_MAX || defined __LONG_LONG_MAX__
-typedef long long	int_fast64_t;
-#else /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
-#if (LONG_MAX >> 31) < 0xffffffff
-Please use a compiler that supports a 64-bit integer type (or wider);
-you may need to compile with "-DHAVE_STDINT_H".
-#endif /* (LONG_MAX >> 31) < 0xffffffff */
-typedef long		int_fast64_t;
-#endif /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
-#endif /* !defined INT_FAST64_MAX */
-
-#ifndef INT32_MAX
-#define INT32_MAX 0x7fffffff
-#endif /* !defined INT32_MAX */
-#ifndef INT32_MIN
-#define INT32_MIN (-1 - INT32_MAX)
-#endif /* !defined INT32_MIN */
-
-/*
 ** Workarounds for compilers/systems.
 */
 
 /*
-** If your compiler lacks prototypes, "#define P(x) ()".
+** SunOS 4.1.1 cc lacks prototypes.
 */
 
 #ifndef P
+#ifdef __STDC__
 #define P(x)	x
+#endif /* defined __STDC__ */
+#ifndef __STDC__
+#define P(x)	()
+#endif /* !defined __STDC__ */
 #endif /* !defined P */
 
 /*
@@ -242,14 +211,14 @@ extern char *	asctime_r();
 ** Private function declarations.
 */
 
-char *		icalloc P((int nelem, int elsize));
-char *		icatalloc P((char * old, const char * new));
-char *		icpyalloc P((const char * string));
-char *		imalloc P((int n));
-void *		irealloc P((void * pointer, int size));
-void		icfree P((char * pointer));
-void		ifree P((char * pointer));
-const char *	scheck P((const char * string, const char * format));
+char *	icalloc P((int nelem, int elsize));
+char *	icatalloc P((char * old, const char * new));
+char *	icpyalloc P((const char * string));
+char *	imalloc P((int n));
+void *	irealloc P((void * pointer, int size));
+void	icfree P((char * pointer));
+void	ifree P((char * pointer));
+const char *scheck P((const char *string, const char *format));
 
 /*
 ** Finally, some convenience items.
@@ -341,26 +310,6 @@ char *asctime_r P((struct tm const *, char *));
 char *ctime_r P((time_t const *, char *));
 #endif /* HAVE_INCOMPATIBLE_CTIME_R */
 
-#ifndef YEARSPERREPEAT
-#define YEARSPERREPEAT		400	/* years before a Gregorian repeat */
-#endif /* !defined YEARSPERREPEAT */
-
-/*
-** The Gregorian year averages 365.2425 days, which is 31556952 seconds.
-*/
-
-#ifndef AVGSECSPERYEAR
-#define AVGSECSPERYEAR		31556952L
-#endif /* !defined AVGSECSPERYEAR */
-
-#ifndef SECSPERREPEAT
-#define SECSPERREPEAT		((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR)
-#endif /* !defined SECSPERREPEAT */
- 
-#ifndef SECSPERREPEAT_BITS
-#define SECSPERREPEAT_BITS	34	/* ceil(log2(SECSPERREPEAT)) */
-#endif /* !defined SECSPERREPEAT_BITS */
-
 /*
 ** UNIX was a registered trademark of The Open Group in 2003.
 */
diff --git a/timezone/scheck.c b/timezone/scheck.c
index 74d9b07c14..bc156379a0 100644
--- a/timezone/scheck.c
+++ b/timezone/scheck.c
@@ -1,11 +1,6 @@
-/*
-** This file is in the public domain, so clarified as of
-** 2006-07-17 by Arthur David Olson.
-*/
-
 #ifndef lint
 #ifndef NOID
-static char	elsieid[] = "@(#)scheck.c	8.19";
+static char	elsieid[] = "@(#)scheck.c	8.17";
 #endif /* !defined lint */
 #endif /* !defined NOID */
 
diff --git a/timezone/southamerica b/timezone/southamerica
index ca6c492f3e..3a61cd717a 100644
--- a/timezone/southamerica
+++ b/timezone/southamerica
@@ -1,14 +1,14 @@
-# @(#)southamerica	8.6
+# @(#)southamerica	8.1
 # 
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # tz@elsie.nci.nih.gov for general use in the future).
 
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (1999-07-07):
 # A good source for time zone historical data outside the U.S. is
-# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
-# San Diego: ACS Publications, Inc. (2003).
+# Thomas G. Shanks, The International Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1999).
 #
 # Gwillim Law writes that a good source
 # for recent time zone data is the International Air Transport
@@ -16,8 +16,8 @@
 # published semiannually.  Law sent in several helpful summaries
 # of the IATA's data after 1990.
 #
-# Except where otherwise noted, Shanks & Pottenger is the source for
-# entries through 1990, and IATA SSIM is the source for entries afterwards.
+# Except where otherwise noted, Shanks is the source for entries through 1990,
+# and IATA SSIM is the source for entries after 1990.
 #
 # Earlier editions of these tables used the North American style (e.g. ARST and
 # ARDT for Argentine Standard and Daylight Time), but the following quote
@@ -92,6 +92,8 @@ Rule	Arg	1988	only	-	Dec	 1	0:00	1:00	S
 # obtaining the data from the:
 # Talleres de Hidrografia Naval Argentina
 # (Argentine Naval Hydrography Institute)
+#
+# Shanks stops after 1992-03-01; go with Otero.
 Rule	Arg	1989	1993	-	Mar	Sun>=1	0:00	0	-
 Rule	Arg	1989	1992	-	Oct	Sun>=15	0:00	1:00	S
 #
@@ -148,12 +150,12 @@ Rule	Arg	2000	only	-	Mar	Sun>=1	0:00	0	-
 # It's Law No. 7,210.  This change is due to a public power emergency, so for
 # now we'll assume it's for this year only.
 #
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2002-01-22):
 # 
-# Hora de verano para la Republica Argentina (2003-06-08)
+# Hora de verano para la Republica Argentina (2000-10-01)
 #  says that standard time in Argentina from 1894-10-31
 # to 1920-05-01 was -4:16:48.25.  Go with this more-precise value
-# over Shanks & Pottenger.
+# over Shanks.
 #
 # From Mariano Absatz (2004-06-05):
 # These media articles from a major newspaper mostly cover the current state:
@@ -200,8 +202,8 @@ Rule	Arg	2000	only	-	Mar	Sun>=1	0:00	0	-
 # http://www.sanjuan.gov.ar/prensa/archivo/000426.html
 # http://www.sanjuan.gov.ar/prensa/archivo/000441.html
 
-# Unless otherwise specified, data are from Shanks & Pottenger through 1992,
-# from the IATA otherwise.  As noted below, Shanks & Pottenger say that
+# Unless otherwise specified, data are from Shanks through 1992, from
+# the IATA otherwise.  As noted below, Shanks says that
 # America/Cordoba split into 6 subregions during 1991/1992, but we
 # haven't verified this yet so for now we'll keep it a single region.
 #
@@ -220,7 +222,7 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
 # Formosa (FM), Salta (SA), Santiago del Estero (SE), Cordoba (CB),
 # San Luis (SL), La Pampa (LP), Neuquen (NQ), Rio Negro (RN)
 #
-# Shanks & Pottenger also make the following claims, which we haven't verified:
+# Shanks also makes the following claims, which we haven't verified:
 # - Formosa switched to -3:00 on 1991-01-07.
 # - Misiones switched to -3:00 on 1990-12-29.
 # - Chaco switched to -3:00 on 1991-01-04.
@@ -428,7 +430,11 @@ Zone	America/La_Paz	-4:32:36 -	LMT	1890
 # The official decrees referenced below are mostly taken from
 # 
 # Decretos sobre o Horario de Verao no Brasil
-# .
+#  (2001-09-20, in Portuguese).
+# The official site for all decrees, including those not related to time, is
+# 
+# Presidencia da Republica, Subchefia para Assuntos Juridicos, Decretos
+#  (in Portuguese).
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 # Decree 20,466 (1931-10-01)
@@ -544,7 +550,7 @@ Rule	Brazil	2000	only	-	Feb	27	 0:00	0	-
 # Decree 3,916
 # (2001-09-13) reestablishes DST in AL, CE, MA, PB, PE, PI, RN, SE.
 Rule	Brazil	2000	2001	-	Oct	Sun>=8	 0:00	1:00	S
-Rule	Brazil	2001	2006	-	Feb	Sun>=15	 0:00	0	-
+Rule	Brazil	2001	max	-	Feb	Sun>=15	 0:00	0	-
 # Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE.
 # 
 Rule	Brazil	2002	only	-	Nov	 3	 0:00	1:00	S
@@ -556,14 +562,10 @@ Rule	Brazil	2003	only	-	Oct	19	 0:00	1:00	S
 Rule	Brazil	2004	only	-	Nov	 2	 0:00	1:00	S
 # Decree 5,539 (2005-09-19),
 # adopted by the same states as before.
-Rule	Brazil	2005	only	-	Oct	16	 0:00	1:00	S
-# Decree 5,920
-# (2006-10-03), adopted by the same states as before.
-Rule	Brazil	2006	max	-	Nov	Sun>=1	 0:00	1:00	S
-Rule	Brazil	2007	max	-	Feb	lastSun	 0:00	0	-
+Rule	Brazil	2005	max	-	Oct	Sun>=15	 0:00	1:00	S
 # The latest ruleset listed above says that the following states observe DST:
 # DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP.
-# For dates after mid-2007, the above rules with TO="max" are guesses
+# For dates after mid-2006, the above rules with TO="max" are guesses
 # and are quite possibly wrong, but are more likely than no DST at all.
 
 
@@ -704,64 +706,53 @@ Zone America/Rio_Branco	-4:31:12 -	LMT	1914
 # Because of the same drought, the government decided to end DST later,
 # on April 3, (one-time change).
 
-# From Oscar van Vlijmen (2006-10-08):
-# http://www.horaoficial.cl/cambio.htm
+# From Gwillim Law (2001-05-04):
+# I came across another article in "La Tercera" about Chilean DST.
+# 
+# It clearly confirms my earlier suggestion, that DST begins at 22:00
+# on Easter Island....  But it also seems to be saying that the
+# observance of DST in Chile began in 1966, rather than 1969 as
+# ... [Shanks] has it....
+#
+# My translation:
+#
+# "The Chilean Army has announced that summer time will begin tomorrow,
+# Saturday, October 14 in continental Chile, insular Chile, and
+# Antarctica, as provided by Supreme Decree 25 of January 11, 1966.
+# By the preceding, official time in continental Chile and Chilean
+# Antarctic, and official time in Western Insular Chile, which applies
+# to Easter Island and Sala y Gomez Island, will be set forward at
+# midnight and at 22:00, respectively, by 20 minutes."
 
-# From Jesper Norgaard Welen (2006-10-08):
-# I think that there are some obvious mistakes in the suggested link
-# from Oscar van Vlijmen,... for instance entry 66 says that GMT-4
-# ended 1990-09-12 while entry 67 only begins GMT-3 at 1990-09-15
-# (they should have been 1990-09-15 and 1990-09-16 respectively), but
-# anyhow it clears up some doubts too.
+# From Paul Eggert (2001-05-04):
+# Go with this article in preference to Shanks's 1969 date for modern DST.
+# Assume this rule has been used since DST was introduced in the islands.
 
-# The following data are from 
-# (2006-09-20), transcribed by Jesper Norgaard Welen.
+# From Paul Eggert (2002-10-24):
+#  gives many details that
+# disagree with the following table, but we haven't had time to compare them.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	Chile	1927	1932	-	Sep	 1	0:00	1:00	S
+Rule	Chile	1918	only	-	Sep	 1	0:00	1:00	S
+Rule	Chile	1919	only	-	Jul	 2	0:00	0	-
+Rule	Chile	1927	1931	-	Sep	 1	0:00	1:00	S
 Rule	Chile	1928	1932	-	Apr	 1	0:00	0	-
-Rule	Chile	1942	only	-	Jun	 1	4:00u	0	-
-Rule	Chile	1942	only	-	Aug	 1	5:00u	1:00	S
-Rule	Chile	1946	only	-	Jul	15	4:00u	1:00	S
-Rule	Chile	1946	only	-	Sep	 1	3:00u	0:00	-
-Rule	Chile	1947	only	-	Apr	 1	4:00u	0	-
-Rule	Chile	1968	only	-	Nov	 3	4:00u	1:00	S
-Rule	Chile	1969	only	-	Mar	30	3:00u	0	-
-Rule	Chile	1969	only	-	Nov	23	4:00u	1:00	S
-Rule	Chile	1970	only	-	Mar	29	3:00u	0	-
-Rule	Chile	1971	only	-	Mar	14	3:00u	0	-
-Rule	Chile	1970	1972	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	Chile	1972	1986	-	Mar	Sun>=9	3:00u	0	-
-Rule	Chile	1973	only	-	Sep	30	4:00u	1:00	S
-Rule	Chile	1974	1987	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	Chile	1987	only	-	Apr	12	3:00u	0	-
-Rule	Chile	1988	1989	-	Mar	Sun>=9	3:00u	0	-
-Rule	Chile	1988	only	-	Oct	Sun>=1	4:00u	1:00	S
-Rule	Chile	1989	only	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	Chile	1990	only	-	Mar	18	3:00u	0	-
-Rule	Chile	1990	only	-	Sep	16	4:00u	1:00	S
-Rule	Chile	1991	1996	-	Mar	Sun>=9	3:00u	0	-
-Rule	Chile	1991	1997	-	Oct	Sun>=9	4:00u	1:00	S
-Rule	Chile	1997	only	-	Mar	30	3:00u	0	-
-Rule	Chile	1998	only	-	Mar	Sun>=9	3:00u	0	-
+Rule	Chile	1966	1997	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1967	1998	-	Mar	Sun>=9	3:00u	0	-
 Rule	Chile	1998	only	-	Sep	27	4:00u	1:00	S
 Rule	Chile	1999	only	-	Apr	 4	3:00u	0	-
 Rule	Chile	1999	max	-	Oct	Sun>=9	4:00u	1:00	S
 Rule	Chile	2000	max	-	Mar	Sun>=9	3:00u	0	-
-# IATA SSIM anomalies: (1992-02) says 1992-03-14;
+# IATA SSIM anomalies: (1990-09) says 1990-09-16; (1992-02) says 1992-03-14;
 # (1996-09) says 1998-03-08.  Ignore these.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone America/Santiago	-4:42:46 -	LMT	1890
-			-4:42:46 -	SMT	1910 	    # Santiago Mean Time
-			-5:00	-	CLT	1916 Jul  1 # Chile Time
-			-4:42:46 -	SMT	1918 Sep  1 # Santiago Mean Time
-			-4:00	-	CLT	1919 Jul  1 # Chile Time
-			-4:42:46 -	SMT	1927 Sep  1 # Santiago Mean Time
-			-5:00	Chile	CL%sT	1947 May 22 # Chile Time
+Zone America/Santiago	-4:42:40 -	LMT	1890
+			-4:42:40 -	SMT	1910	    # Santiago Mean Time
+			-5:00	Chile	CL%sT	1932 Sep    # Chile Time
 			-4:00	Chile	CL%sT
 Zone Pacific/Easter	-7:17:28 -	LMT	1890	    # Mataveri
 			-7:17:28 -	MMT	1932 Sep    # Mataveri Mean Time
-			-7:00	Chile	EAS%sT	1982 Jan 18 21:00 # Easter I Time
+			-7:00	Chile	EAS%sT	1982 Mar 14 # Easter I Time
 			-6:00	Chile	EAS%sT
 #
 # Sala y Gomez Island is like Pacific/Easter.
@@ -769,9 +760,11 @@ Zone Pacific/Easter	-7:17:28 -	LMT	1890	    # Mataveri
 # San Felix, and Antarctic bases, are like America/Santiago.
 
 # Colombia
+# Shanks specifies 24:00 for 1992 transition times; go with IATA,
+# as it seems implausible to change clocks at midnight New Year's Eve.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-Rule	CO	1992	only	-	May	 3	0:00	1:00	S
-Rule	CO	1993	only	-	Apr	 4	0:00	0	-
+Rule	CO	1992	only	-	May	 2	0:00	1:00	S
+Rule	CO	1992	only	-	Dec	31	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Bogota	-4:56:20 -	LMT	1884 Mar 13
 			-4:56:20 -	BMT	1914 Nov 23 # Bogota Mean Time
@@ -780,21 +773,10 @@ Zone	America/Bogota	-4:56:20 -	LMT	1884 Mar 13
 # no information; probably like America/Bogota
 
 # Curacao
-#
-# From Paul Eggert (2006-03-22): 
-# Shanks & Pottenger say that The Bottom and Philipsburg have been at
-# -4:00 since standard time was introduced on 1912-03-02; and that
-# Kralendijk and Rincon used Kralendijk Mean Time (-4:33:08) from
-# 1912-02-02 to 1965-01-01.  The former is dubious, since S&P also say
-# Saba Island has been like Curacao.
-# This all predates our 1970 cutoff, though.  
-#
-# By July 2007 Curacao and St Maarten are planned to become
-# associated states within the Netherlands, much like Aruba;
-# Bonaire, Saba and St Eustatius would become directly part of the
-# Netherlands as Kingdom Islands.  This won't affect their time zones
-# though, as far as we know.
-# 
+# Shanks says that Bottom and Oranjestad have been at -4:00 since
+# standard time was introduced on 1912-03-02; and that Kralendijk and Rincon
+# used Kralendijk Mean Time (-4:33:08) from 1912-02-02 to 1965-01-01.
+# This all predates our 1970 cutoff, though.
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Curacao	-4:35:44 -	LMT	1912 Feb 12	# Willemstad
 			-4:30	-	ANT	1965 # Netherlands Antilles Time
@@ -811,9 +793,9 @@ Zone Pacific/Galapagos	-5:58:24 -	LMT	1931 # Puerto Baquerizo Moreno
 
 # Falklands
 
-# From Paul Eggert (2006-03-22):
-# Between 1990 and 2000 inclusive, Shanks & Pottenger and the IATA agree except
-# the IATA gives 1996-09-08.  Go with Shanks & Pottenger.
+# From Paul Eggert (2001-03-05):
+# Between 1990 and 2000 inclusive, Shanks and the IATA agree except
+# the IATA gives 1996-09-08.  Go with Shanks.
 
 # From Falkland Islands Government Office, London (2001-01-22)
 # via Jesper Norgaard:
@@ -896,9 +878,9 @@ Zone	America/Guyana	-3:52:40 -	LMT	1915 Mar	# Georgetown
 			-4:00	-	GYT
 
 # Paraguay
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger say that spring transitions are from 01:00 -> 02:00,
-# and autumn transitions are from 00:00 -> 23:00.  Go with pre-1999
+# From Paul Eggert (1999-10-29):
+# Shanks (1999) says that spring transitions are from 01:00 -> 02:00,
+# and autumn transitions are from 00:00 -> 23:00.  Go with earlier
 # editions of Shanks, and with the IATA, who say transitions occur at 00:00.
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Para	1975	1988	-	Oct	 1	0:00	1:00	S
@@ -929,10 +911,13 @@ Rule	Para	1996	only	-	Mar	 1	0:00	0	-
 # year, the time will change on the first Sunday of October; likewise, the
 # clock will be set back on the first Sunday of March.
 #
+# From Jesper Norgaard (2001-03-06) [an official URL saying similar things]:
+# http://gateway.abc.com.py:8000/pub/pag04.mbr/artic?FHA=2001-03-03-02.24.52.900592
+#
 Rule	Para	1996	2001	-	Oct	Sun>=1	0:00	1:00	S
-# IATA SSIM (1997-09) says Mar 1; go with Shanks & Pottenger.
+# IATA SSIM (1997-09) says Mar 1; go with Shanks.
 Rule	Para	1997	only	-	Feb	lastSun	0:00	0	-
-# Shanks & Pottenger say 1999-02-28; IATA SSIM (1999-02) says 1999-02-27, but
+# Shanks says 1999-02-28; IATA SSIM (1999-02) says 1999-02-27, but
 # (1999-09) reports no date; go with above sources and Gerd Knops (2001-02-27).
 Rule	Para	1998	2001	-	Mar	Sun>=1	0:00	0	-
 # From Rives McDow (2002-02-28):
@@ -946,9 +931,7 @@ Rule	Para	2002	2003	-	Sep	Sun>=1	0:00	1:00	S
 # There are several sources that claim that Paraguay made
 # a timezone rule change in autumn 2004.
 # From Steffen Thorsen (2005-01-05):
-# Decree 1,867 (2004-03-05)
-# From Carlos Raul Perasso via Jesper Norgaard Welen (2006-10-13)
-# 
+# Decree 1,867 (2004-03-05) 
 Rule	Para	2004	max	-	Oct	Sun>=15	0:00	1:00	S
 Rule	Para	2005	max	-	Mar	Sun>=8	0:00	0	-
 
@@ -966,8 +949,8 @@ Zone America/Asuncion	-3:50:40 -	LMT	1890
 # When we were in Peru in 1985-1986, they apparently switched over
 # sometime between December 29 and January 3 while we were on the Amazon.
 #
-# From Paul Eggert (2006-03-22):
-# Shanks & Pottenger don't have this transition.  Assume 1986 was like 1987.
+# From Paul Eggert (2003-11-02):
+# Shanks doesn't have this transition.  Assume 1986 was like 1987.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Peru	1938	only	-	Jan	 1	0:00	1:00	S
@@ -978,7 +961,7 @@ Rule	Peru	1986	1987	-	Jan	 1	0:00	1:00	S
 Rule	Peru	1986	1987	-	Apr	 1	0:00	0	-
 Rule	Peru	1990	only	-	Jan	 1	0:00	1:00	S
 Rule	Peru	1990	only	-	Apr	 1	0:00	0	-
-# IATA is ambiguous for 1993/1995; go with Shanks & Pottenger.
+# IATA is ambiguous for 1993/1995; go with Shanks.
 Rule	Peru	1994	only	-	Jan	 1	0:00	1:00	S
 Rule	Peru	1994	only	-	Apr	 1	0:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1011,23 +994,23 @@ Zone America/Port_of_Spain -4:06:04 -	LMT	1912 Mar 2
 # Uruguay
 # From Paul Eggert (1993-11-18):
 # Uruguay wins the prize for the strangest peacetime manipulation of the rules.
-# From Shanks & Pottenger:
+# From Shanks:
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
-# Whitman gives 1923 Oct 1; go with Shanks & Pottenger.
+# Whitman gives 1923 Oct 1; go with Shanks.
 Rule	Uruguay	1923	only	-	Oct	 2	 0:00	0:30	HS
 Rule	Uruguay	1924	1926	-	Apr	 1	 0:00	0	-
 Rule	Uruguay	1924	1925	-	Oct	 1	 0:00	0:30	HS
 Rule	Uruguay	1933	1935	-	Oct	lastSun	 0:00	0:30	HS
-# Shanks & Pottenger give 1935 Apr 1 0:00 & 1936 Mar 30 0:00; go with Whitman.
+# Shanks gives 1935 Apr 1 0:00 and 1936 Mar 30 0:00; go with Whitman.
 Rule	Uruguay	1934	1936	-	Mar	Sat>=25	23:30s	0	-
 Rule	Uruguay	1936	only	-	Nov	 1	 0:00	0:30	HS
 Rule	Uruguay	1937	1941	-	Mar	lastSun	 0:00	0	-
-# Whitman gives 1937 Oct 3; go with Shanks & Pottenger.
+# Whitman gives 1937 Oct 3; go with Shanks.
 Rule	Uruguay	1937	1940	-	Oct	lastSun	 0:00	0:30	HS
 # Whitman gives 1941 Oct 24 - 1942 Mar 27, 1942 Dec 14 - 1943 Apr 13,
-# and 1943 Apr 13 ``to present time''; go with Shanks & Pottenger.
-Rule	Uruguay	1941	only	-	Aug	 1	 0:00	0:30	HS
-Rule	Uruguay	1942	only	-	Jan	 1	 0:00	0	-
+# and 1943 Apr 13 ``to present time''; go with Shanks.
+Rule	Uruguay	1941	only	-	Aug	 1	 0:00	0	-
+Rule	Uruguay	1942	only	-	Jan	 1	 0:00	0:30	HS
 Rule	Uruguay	1942	only	-	Dec	14	 0:00	1:00	S
 Rule	Uruguay	1943	only	-	Mar	14	 0:00	0	-
 Rule	Uruguay	1959	only	-	May	24	 0:00	1:00	S
@@ -1053,7 +1036,7 @@ Rule	Uruguay	1988	only	-	Mar	14	 0:00	0	-
 Rule	Uruguay	1988	only	-	Dec	11	 0:00	1:00	S
 Rule	Uruguay	1989	only	-	Mar	12	 0:00	0	-
 Rule	Uruguay	1989	only	-	Oct	29	 0:00	1:00	S
-# Shanks & Pottenger say no DST was observed in 1990/1 and 1991/2,
+# Shanks says no DST was observed in 1990/1 and 1991/2,
 # and that 1992/3's DST was from 10-25 to 03-01.  Go with IATA.
 Rule	Uruguay	1990	1992	-	Mar	Sun>=1	 0:00	0	-
 Rule	Uruguay	1990	1991	-	Oct	Sun>=21	 0:00	1:00	S
@@ -1074,10 +1057,6 @@ Rule	Uruguay	2005	only	-	Mar	27	 2:00	0	-
 # 02:00 local time, official time in Uruguay will be at GMT -2.
 Rule	Uruguay	2005	only	-	Oct	 9	 2:00	1:00	S
 Rule	Uruguay	2006	only	-	Mar	12	 2:00	0	-
-# From Jesper Norgaard Welen (2006-09-06):
-# http://www.presidencia.gub.uy/_web/decretos/2006/09/CM%20210_08%2006%202006_00001.PDF
-Rule	Uruguay	2006	max	-	Oct	Sun>=1	 2:00	1:00	S
-Rule	Uruguay	2007	max	-	Mar	Sun>=8	 2:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone America/Montevideo	-3:44:44 -	LMT	1898 Jun 28
 			-3:44:44 -	MMT	1920 May  1	# Montevideo MT
diff --git a/timezone/tzfile.h b/timezone/tzfile.h
index 3a9eee305a..fb6ca9880f 100644
--- a/timezone/tzfile.h
+++ b/timezone/tzfile.h
@@ -21,7 +21,7 @@
 
 #ifndef lint
 #ifndef NOID
-static char	tzfilehid[] = "@(#)tzfile.h	8.1";
+static char	tzfilehid[] = "@(#)tzfile.h	7.18";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
@@ -49,8 +49,7 @@ static char	tzfilehid[] = "@(#)tzfile.h	8.1";
 
 struct tzhead {
 	char	tzh_magic[4];		/* TZ_MAGIC */
-	char	tzh_version[1];		/* '\0' or '2' as of 2005 */
-	char	tzh_reserved[15];	/* reserved--must be zero */
+	char	tzh_reserved[16];	/* reserved for future use */
 	char	tzh_ttisgmtcnt[4];	/* coded number of trans. time flags */
 	char	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
 	char	tzh_leapcnt[4];		/* coded number of leap seconds */
@@ -85,22 +84,18 @@ struct tzhead {
 */
 
 /*
-** If tzh_version is '2' or greater, the above is followed by a second instance
-** of tzhead and a second instance of the data in which each coded transition
-** time uses 8 rather than 4 chars,
-** then a POSIX-TZ-environment-variable-style string for use in handling
-** instants after the last transition time stored in the file
-** (with nothing between the newlines if there is no POSIX representation for
-** such instants).
-*/
-
-/*
 ** In the current implementation, "tzset()" refuses to deal with files that
 ** exceed any of the limits below.
 */
 
 #ifndef TZ_MAX_TIMES
-#define TZ_MAX_TIMES	1200
+/*
+** The TZ_MAX_TIMES value below is enough to handle a bit more than a
+** year's worth of solar time (corrected daily to the nearest second) or
+** 138 years of Pacific Presidential Election time
+** (where there are three time zone transitions every fourth year).
+*/
+#define TZ_MAX_TIMES	370
 #endif /* !defined TZ_MAX_TIMES */
 
 #ifndef TZ_MAX_TYPES
diff --git a/timezone/tzselect.ksh b/timezone/tzselect.ksh
index b99af8273b..f6e28bfdab 100644
--- a/timezone/tzselect.ksh
+++ b/timezone/tzselect.ksh
@@ -1,6 +1,6 @@
 #! @KSH@
 
-# '@(#)tzselect.ksh	8.1'
+# '@(#)tzselect.ksh	1.8'
 
 # Ask the user about the time zone, and output the resulting TZ value to stdout.
 # Interact with the user via stderr and stdin.
diff --git a/timezone/zdump.c b/timezone/zdump.c
index ae4d286b12..d525da1bae 100644
--- a/timezone/zdump.c
+++ b/timezone/zdump.c
@@ -1,4 +1,4 @@
-static char	elsieid[] = "@(#)zdump.c	8.2";
+static char	elsieid[] = "@(#)zdump.c	7.74";
 
 /*
 ** This code has been made independent of the rest of the time
@@ -15,7 +15,7 @@ static char	elsieid[] = "@(#)zdump.c	8.2";
 #include "ctype.h"	/* for isalpha et al. */
 #ifndef isascii
 #define isascii(x) 1
-#endif /* !defined isascii */
+#endif
 
 #ifndef ZDUMP_LO_YEAR
 #define ZDUMP_LO_YEAR	(-500)
@@ -130,7 +130,11 @@ static char	elsieid[] = "@(#)zdump.c	8.2";
 #endif /* !defined TZ_DOMAIN */
 
 #ifndef P
+#ifdef __STDC__
 #define P(x)	x
+#else /* !defined __STDC__ */
+#define P(x)	()
+#endif /* !defined __STDC__ */
 #endif /* !defined P */
 
 extern char **	environ;
@@ -414,21 +418,14 @@ _("%s: use of -v on system with floating time_t other than float or double\n"),
 		}
 	} else if (0 > (time_t) -1) {
 		/*
-		** time_t is signed.  Assume overflow wraps around.
+		** time_t is signed.
 		*/
-		time_t t = 0;
-		time_t t1 = 1;
+		register time_t	hibit;
 
-		while (t < t1) {
-			t = t1;
-			t1 = 2 * t1 + 1;
-		}
-
-		absolute_max_time = t;
-		t = -t;
-		absolute_min_time = t - 1;
-		if (t < absolute_min_time)
-			absolute_min_time = t;
+		for (hibit = 1; (hibit * 2) != 0; hibit *= 2)
+			continue;
+		absolute_min_time = hibit;
+		absolute_max_time = -(hibit + 1);
 	} else {
 		/*
 		** time_t is unsigned.
@@ -471,7 +468,10 @@ const long	y;
 }
 
 static time_t
-hunt(char *name, time_t lot, time_t hit)
+hunt(name, lot, hit)
+char *	name;
+time_t	lot;
+time_t	hit;
 {
 	time_t			t;
 	long			diff;
@@ -541,7 +541,10 @@ struct tm *	oldp;
 }
 
 static void
-show(char *zone, time_t t, int v)
+show(zone, t, v)
+char *	zone;
+time_t	t;
+int	v;
 {
 	register struct tm *	tmp;
 
diff --git a/timezone/zic.c b/timezone/zic.c
index f7393ea7ba..acb76fb3ba 100644
--- a/timezone/zic.c
+++ b/timezone/zic.c
@@ -1,18 +1,15 @@
+static char	elsieid[] = "@(#)zic.c	7.128";
+
 /*
-** This file is in the public domain, so clarified as of
-** 2006-07-17 by Arthur David Olson.
+** Regardless of the type of time_t, we do our work using this type.
 */
 
-static char	elsieid[] = "@(#)zic.c	8.7";
+typedef int	zic_t;
 
 #include "private.h"
 #include "locale.h"
 #include "tzfile.h"
 
-#define	ZIC_VERSION	'2'
-
-typedef int_fast64_t	zic_t;
-
 #ifndef ZIC_MAX_ABBR_LEN_WO_WARN
 #define ZIC_MAX_ABBR_LEN_WO_WARN	6
 #endif /* !defined ZIC_MAX_ABBR_LEN_WO_WARN */
@@ -39,11 +36,6 @@ typedef int_fast64_t	zic_t;
 #define isascii(x) 1
 #endif
 
-#define OFFSET_STRLEN_MAXIMUM	(7 + INT_STRLEN_MAXIMUM(long))
-#define RULE_STRLEN_MAXIMUM	8	/* "Mdd.dd.d" */
-
-#define end(cp)	(strchr((cp), '\0'))
-
 struct rule {
 	const char *	r_filename;
 	int		r_linenum;
@@ -52,8 +44,6 @@ struct rule {
 	int		r_loyear;	/* for example, 1986 */
 	int		r_hiyear;	/* for example, 1986 */
 	const char *	r_yrtype;
-	int		r_lowasnum;
-	int		r_hiwasnum;
 
 	int		r_month;	/* 0..11 */
 
@@ -113,10 +103,9 @@ static void	adjleap P((void));
 static void	associate P((void));
 static int	ciequal P((const char * ap, const char * bp));
 static void	convert P((long val, char * buf));
-static void	convert64 P((zic_t val, char * buf));
 static void	dolink P((const char * fromfile, const char * tofile));
 static void	doabbr P((char * abbr, const char * format,
-			const char * letters, int isdst, int doquotes));
+			const char * letters, int isdst));
 static void	eat P((const char * name, int num));
 static void	eats P((const char * name, int num,
 			const char * rname, int rnum));
@@ -132,7 +121,6 @@ static void	inrule P((char ** fields, int nfields));
 static int	inzcont P((char ** fields, int nfields));
 static int	inzone P((char ** fields, int nfields));
 static int	inzsub P((char ** fields, int nfields, int iscont));
-static int	is32 P((zic_t x));
 static int	itsabbr P((const char * abbr, const char * word));
 static int	itsdir P((const char * name));
 static int	lowerit P((int c));
@@ -142,22 +130,16 @@ static void	newabbr P((const char * abbr));
 static long	oadd P((long t1, long t2));
 static void	outzone P((const struct zone * zp, int ntzones));
 static void	puttzcode P((long code, FILE * fp));
-static void	puttzcode64 P((zic_t code, FILE * fp));
 static int	rcomp P((const void * leftp, const void * rightp));
 static zic_t	rpytime P((const struct rule * rp, int wantedy));
 static void	rulesub P((struct rule * rp,
 			const char * loyearp, const char * hiyearp,
 			const char * typep, const char * monthp,
 			const char * dayp, const char * timep));
-static int 	stringoffset P((char * result, long offset));
-static int	stringrule P((char * result, const struct rule * rp,
-			long dstoff, long gmtoff));
-static void 	stringzone P((char * result,
-			const struct zone * zp, int ntzones));
 static void	setboundaries P((void));
 static zic_t	tadd P((zic_t t1, long t2));
 static void	usage P((void));
-static void	writezone P((const char * name, const char * string));
+static void	writezone P((const char * name));
 static int	yearistype P((int year, const char * type));
 
 #if !HAVE_STRERROR
@@ -168,16 +150,13 @@ static int		charcnt;
 static int		errors;
 static const char *	filename;
 static int		leapcnt;
-static int		leapseen;
-static int		leapminyear;
-static int		leapmaxyear;
 static int		linenum;
-static int		max_abbrvar_len;
-static int		max_format_len;
 static zic_t		max_time;
 static int		max_year;
+static int		max_year_representable;
 static zic_t		min_time;
 static int		min_year;
+static int		min_year_representable;
 static int		noise;
 static const char *	rfilename;
 static int		rlinenum;
@@ -474,7 +453,7 @@ static void
 usage P((void))
 {
 	(void) fprintf(stderr, _("%s: usage is %s \
-[ --version ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\
+[ --version ] [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\
 \t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"),
 		progname, progname);
 	exit(EXIT_FAILURE);
@@ -485,6 +464,7 @@ static const char *	lcltime;
 static const char *	directory;
 static const char *	leapsec;
 static const char *	yitcommand;
+static int		sflag = FALSE;
 
 int
 main(argc, argv)
@@ -506,11 +486,6 @@ char *	argv[];
 	(void) textdomain(TZ_DOMAIN);
 #endif /* HAVE_GETTEXT */
 	progname = argv[0];
-	if (TYPE_BIT(zic_t) < 64) {
-		(void) fprintf(stderr, "%s: %s\n", progname,
-			_("wild compilation-time specification of zic_t"));
-		exit(EXIT_FAILURE);
-	}
 	for (i = 1; i < argc; ++i)
 		if (strcmp(argv[i], "--version") == 0) {
 			(void) printf("%s\n", elsieid);
@@ -574,7 +549,7 @@ _("%s: More than one -L option specified\n"),
 				noise = TRUE;
 				break;
 			case 's':
-				(void) printf("%s: -s ignored\n", progname);
+				sflag = TRUE;
 				break;
 		}
 	if (optind == argc - 1 && strcmp(argv[optind], "=") == 0)
@@ -696,17 +671,54 @@ warning(_("hard link failed, symbolic link used"));
 	ifree(toname);
 }
 
-#define TIME_T_BITS_IN_FILE	64
+#ifndef INT_MAX
+#define INT_MAX	((int) (((unsigned)~0)>>1))
+#endif /* !defined INT_MAX */
+
+#ifndef INT_MIN
+#define INT_MIN	((int) ~(((unsigned)~0)>>1))
+#endif /* !defined INT_MIN */
+
+/*
+** The tz file format currently allows at most 32-bit quantities.
+** This restriction should be removed before signed 32-bit values
+** wrap around in 2038, but unfortunately this will require a
+** change to the tz file format.
+*/
+
+#define MAX_BITS_IN_FILE	32
+#define TIME_T_BITS_IN_FILE	((TYPE_BIT(zic_t) < MAX_BITS_IN_FILE) ? \
+					TYPE_BIT(zic_t) : MAX_BITS_IN_FILE)
 
 static void
 setboundaries P((void))
 {
 	register int	i;
 
-	min_time = -1;
-	for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
-		min_time *= 2;
-	max_time = -(min_time + 1);
+	if (TYPE_SIGNED(zic_t)) {
+		min_time = -1;
+		for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
+			min_time *= 2;
+		max_time = -(min_time + 1);
+		if (sflag)
+			min_time = 0;
+	} else {
+		min_time = 0;
+		max_time = 2 - sflag;
+		for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
+			max_time *= 2;
+		--max_time;
+	}
+	{
+		time_t	t;
+
+		t = (time_t) min_time;
+		min_year = TM_YEAR_BASE + gmtime(&t)->tm_year;
+		t = (time_t) max_time;
+		max_year = TM_YEAR_BASE + gmtime(&t)->tm_year;
+	}
+	min_year_representable = min_year;
+	max_year_representable = max_year;
 }
 
 static int
@@ -981,8 +993,6 @@ const int		nfields;
 		fields[RF_MONTH], fields[RF_DAY], fields[RF_TOD]);
 	r.r_name = ecpyalloc(fields[RF_NAME]);
 	r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
-	if (max_abbrvar_len < strlen(r.r_abbrvar))
-		max_abbrvar_len = strlen(r.r_abbrvar);
 	rules = (struct rule *) (void *) erealloc((char *) rules,
 		(int) ((nrules + 1) * sizeof *rules));
 	rules[nrules++] = r;
@@ -1088,8 +1098,6 @@ const int		iscont;
 	}
 	z.z_rule = ecpyalloc(fields[i_rule]);
 	z.z_format = ecpyalloc(fields[i_format]);
-	if (max_format_len < strlen(z.z_format))
-		max_format_len = strlen(z.z_format);
 	hasuntil = nfields > i_untilyear;
 	if (hasuntil) {
 		z.z_untilrule.r_filename = filename;
@@ -1151,11 +1159,6 @@ const int		nfields;
 		error(_("invalid leaping year"));
 		return;
 	}
-	if (!leapseen || leapmaxyear < year)
-		leapmaxyear = year;
-	if (!leapseen || leapminyear > year)
-		leapminyear = year;
-	leapseen = TRUE;
 	j = EPOCH_YEAR;
 	while (j != year) {
 		if (year > j) {
@@ -1310,8 +1313,7 @@ const char * const		timep;
 	*/
 	cp = loyearp;
 	lp = byword(cp, begin_years);
-	rp->r_lowasnum = lp == NULL;
-	if (!rp->r_lowasnum) switch ((int) lp->l_value) {
+	if (lp != NULL) switch ((int) lp->l_value) {
 		case YR_MINIMUM:
 			rp->r_loyear = INT_MIN;
 			break;
@@ -1326,11 +1328,14 @@ const char * const		timep;
 	} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1) {
 		error(_("invalid starting year"));
 		return;
+	} else if (noise) {
+		if (rp->r_loyear < min_year_representable)
+			warning(_("starting year too low to be represented"));
+		else if (rp->r_loyear > max_year_representable)
+			warning(_("starting year too high to be represented"));
 	}
 	cp = hiyearp;
-	lp = byword(cp, end_years);
-	rp->r_hiwasnum = lp == NULL;
-	if (!rp->r_hiwasnum) switch ((int) lp->l_value) {
+	if ((lp = byword(cp, end_years)) != NULL) switch ((int) lp->l_value) {
 		case YR_MINIMUM:
 			rp->r_hiyear = INT_MIN;
 			break;
@@ -1348,6 +1353,11 @@ const char * const		timep;
 	} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1) {
 		error(_("invalid ending year"));
 		return;
+	} else if (noise) {
+		if (rp->r_loyear < min_year_representable)
+			warning(_("ending year too low to be represented"));
+		else if (rp->r_loyear > max_year_representable)
+			warning(_("ending year too high to be represented"));
 	}
 	if (rp->r_loyear > rp->r_hiyear) {
 		error(_("starting year greater than ending year"));
@@ -1362,6 +1372,8 @@ const char * const		timep;
 		}
 		rp->r_yrtype = ecpyalloc(typep);
 	}
+	if (rp->r_loyear < min_year && rp->r_loyear > 0)
+		min_year = rp->r_loyear;
 	/*
 	** Day work.
 	** Accept things such as:
@@ -1415,25 +1427,13 @@ const long	val;
 char * const	buf;
 {
 	register int	i;
-	register int	shift;
+	register long	shift;
 
 	for (i = 0, shift = 24; i < 4; ++i, shift -= 8)
 		buf[i] = val >> shift;
 }
 
 static void
-convert64(val, buf)
-const zic_t	val;
-char * const	buf;
-{
-	register int	i;
-	register int	shift;
-
-	for (i = 0, shift = 56; i < 8; ++i, shift -= 8)
-		buf[i] = val >> shift;
-}
-
-static void
 puttzcode(val, fp)
 const long	val;
 FILE * const	fp;
@@ -1444,50 +1444,28 @@ FILE * const	fp;
 	(void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
 }
 
-static void
-puttzcode64(val, fp)
-const zic_t	val;
-FILE * const	fp;
-{
-	char	buf[8];
-
-	convert64(val, buf);
-	(void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
-}
-
 static int
 atcomp(avp, bvp)
-const void *	avp;
-const void *	bvp;
+void *	avp;
+void *	bvp;
 {
-	const zic_t	a = ((const struct attype *) avp)->at;
-	const zic_t	b = ((const struct attype *) bvp)->at;
-
-	return (a < b) ? -1 : (a > b);
-}
-
-static int
-is32(x)
-const zic_t	x;
-{
-	return INT32_MIN <= x && x <= INT32_MAX;
+	if (((struct attype *) avp)->at < ((struct attype *) bvp)->at)
+		return -1;
+	else if (((struct attype *) avp)->at > ((struct attype *) bvp)->at)
+		return 1;
+	else	return 0;
 }
 
 static void
-writezone(name, string)
+writezone(name)
 const char * const	name;
-const char * const	string;
 {
-	register FILE *			fp;
-	register int			i, j;
-	register int			leapcnt32, leapi32;
-	register int			timecnt32, timei32;
-	register int			pass;
-	static char *			fullname;
-	static const struct tzhead	tzh0;
-	static struct tzhead		tzh;
-	zic_t				ats[TZ_MAX_TIMES];
-	unsigned char			types[TZ_MAX_TIMES];
+	register FILE *		fp;
+	register int		i, j;
+	static char *		fullname;
+	static struct tzhead	tzh;
+	zic_t			ats[TZ_MAX_TIMES];
+	unsigned char		types[TZ_MAX_TIMES];
 
 	/*
 	** Sort.
@@ -1531,36 +1509,6 @@ const char * const	string;
 		ats[i] = attypes[i].at;
 		types[i] = attypes[i].type;
 	}
-	/*
-	** Correct for leap seconds.
-	*/
-	for (i = 0; i < timecnt; ++i) {
-		j = leapcnt;
-		while (--j >= 0)
-			if (ats[i] > trans[j] - corr[j]) {
-				ats[i] = tadd(ats[i], corr[j]);
-				break;
-			}
-	}
-	/*
-	** Figure out 32-bit-limited starts and counts.
-	*/
-	timecnt32 = timecnt;
-	timei32 = 0;
-	leapcnt32 = leapcnt;
-	leapi32 = 0;
-	while (timecnt32 > 0 && !is32(ats[timecnt32 - 1]))
-		--timecnt32;
-	while (timecnt32 > 0 && !is32(ats[timei32])) {
-		--timecnt32;
-		++timei32;
-	}
-	while (leapcnt32 > 0 && !is32(trans[leapcnt32 - 1]))
-		--leapcnt32;
-	while (leapcnt32 > 0 && !is32(trans[leapi32])) {
-		--leapcnt32;
-		++leapi32;
-	}
 	fullname = erealloc(fullname,
 		(int) (strlen(directory) + 1 + strlen(name) + 1));
 	(void) sprintf(fullname, "%s/%s", directory, name);
@@ -1585,150 +1533,67 @@ const char * const	string;
 			exit(EXIT_FAILURE);
 		}
 	}
-	for (pass = 1; pass <= 2; ++pass) {
-		register int	thistimei, thistimecnt;
-		register int	thisleapi, thisleapcnt;
-		register int	thistimelim, thisleaplim;
-		int		writetype[TZ_MAX_TIMES];
-		int		typemap[TZ_MAX_TYPES];
-		register int	thistypecnt;
-		char		thischars[TZ_MAX_CHARS];
-		char		thischarcnt;
-		int 		indmap[TZ_MAX_CHARS];
-
-		if (pass == 1) {
-			thistimei = timei32;
-			thistimecnt = timecnt32;
-			thisleapi = leapi32;
-			thisleapcnt = leapcnt32;
-		} else {
-			thistimei = 0;
-			thistimecnt = timecnt;
-			thisleapi = 0;
-			thisleapcnt = leapcnt;
-		}
-		thistimelim = thistimei + thistimecnt;
-		thisleaplim = thisleapi + thisleapcnt;
-		for (i = 0; i < typecnt; ++i)
-			writetype[i] = thistimecnt == timecnt;
-		if (thistimecnt == 0) {
-			/*
-			** No transition times fall in the current
-			** (32- or 64-bit) window.
-			*/
-			if (typecnt != 0)
-				writetype[typecnt - 1] = TRUE;
-		} else {
-			for (i = thistimei - 1; i < thistimelim; ++i)
-				if (i >= 0)
-					writetype[types[i]] = TRUE;
-			/*
-			** For America/Godthab and Antarctica/Palmer
-			*/
-			if (thistimei == 0)
-				writetype[0] = TRUE;
-		}
-		thistypecnt = 0;
-		for (i = 0; i < typecnt; ++i)
-			typemap[i] = writetype[i] ?  thistypecnt++ : -1;
-		for (i = 0; i < sizeof indmap / sizeof indmap[0]; ++i)
-			indmap[i] = -1;
-		thischarcnt = 0;
-		for (i = 0; i < typecnt; ++i) {
-			register char *	thisabbr;
-
-			if (!writetype[i])
-				continue;
-			if (indmap[abbrinds[i]] >= 0)
-				continue;
-			thisabbr = &chars[abbrinds[i]];
-			for (j = 0; j < thischarcnt; ++j)
-				if (strcmp(&thischars[j], thisabbr) == 0)
-					break;
-			if (j == thischarcnt) {
-				(void) strcpy(&thischars[(int) thischarcnt],
-					thisabbr);
-				thischarcnt += strlen(thisabbr) + 1;
-			}
-			indmap[abbrinds[i]] = j;
-		}
+	convert(eitol(typecnt), tzh.tzh_ttisgmtcnt);
+	convert(eitol(typecnt), tzh.tzh_ttisstdcnt);
+	convert(eitol(leapcnt), tzh.tzh_leapcnt);
+	convert(eitol(timecnt), tzh.tzh_timecnt);
+	convert(eitol(typecnt), tzh.tzh_typecnt);
+	convert(eitol(charcnt), tzh.tzh_charcnt);
+	(void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
 #define DO(field)	(void) fwrite((void *) tzh.field, \
 				(size_t) sizeof tzh.field, (size_t) 1, fp)
-		tzh = tzh0;
-		(void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
-		tzh.tzh_version[0] = ZIC_VERSION;
-		convert(eitol(thistypecnt), tzh.tzh_ttisgmtcnt);
-		convert(eitol(thistypecnt), tzh.tzh_ttisstdcnt);
-		convert(eitol(thisleapcnt), tzh.tzh_leapcnt);
-		convert(eitol(thistimecnt), tzh.tzh_timecnt);
-		convert(eitol(thistypecnt), tzh.tzh_typecnt);
-		convert(eitol(thischarcnt), tzh.tzh_charcnt);
-		DO(tzh_magic);
-		DO(tzh_version);
-		DO(tzh_reserved);
-		DO(tzh_ttisgmtcnt);
-		DO(tzh_ttisstdcnt);
-		DO(tzh_leapcnt);
-		DO(tzh_timecnt);
-		DO(tzh_typecnt);
-		DO(tzh_charcnt);
+	DO(tzh_magic);
+	DO(tzh_reserved);
+	DO(tzh_ttisgmtcnt);
+	DO(tzh_ttisstdcnt);
+	DO(tzh_leapcnt);
+	DO(tzh_timecnt);
+	DO(tzh_typecnt);
+	DO(tzh_charcnt);
 #undef DO
-		for (i = thistimei; i < thistimelim; ++i)
-			if (pass == 1)
-				puttzcode((long) ats[i], fp);
-			else	puttzcode64(ats[i], fp);
-		for (i = thistimei; i < thistimelim; ++i) {
-			unsigned char	uc;
-
-			uc = typemap[types[i]];
-			(void) fwrite((void *) &uc,
-				(size_t) sizeof uc,
-				(size_t) 1,
-				fp);
-		}
-		for (i = 0; i < typecnt; ++i)
-			if (writetype[i]) {
-				puttzcode(gmtoffs[i], fp);
-				(void) putc(isdsts[i], fp);
-				(void) putc((unsigned char) indmap[abbrinds[i]], fp);
+	for (i = 0; i < timecnt; ++i) {
+		j = leapcnt;
+		while (--j >= 0)
+			if (ats[i] >= trans[j]) {
+				ats[i] = tadd(ats[i], corr[j]);
+				break;
 			}
-		if (thischarcnt != 0)
-			(void) fwrite((void *) thischars,
-				(size_t) sizeof thischars[0],
-				(size_t) thischarcnt, fp);
-		for (i = thisleapi; i < thisleaplim; ++i) {
-			register zic_t	todo;
-
-			if (roll[i]) {
-				if (timecnt == 0 || trans[i] < ats[0]) {
-					j = 0;
-					while (isdsts[j])
-						if (++j >= typecnt) {
-							j = 0;
-							break;
-						}
-				} else {
-					j = 1;
-					while (j < timecnt &&
-						trans[i] >= ats[j])
-							++j;
-					j = types[j - 1];
-				}
-				todo = tadd(trans[i], -gmtoffs[j]);
-			} else	todo = trans[i];
-			if (pass == 1)
-				puttzcode((long) todo, fp);
-			else	puttzcode64(todo, fp);
-			puttzcode(corr[i], fp);
-		}
-		for (i = 0; i < typecnt; ++i)
-			if (writetype[i])
-				(void) putc(ttisstds[i], fp);
-		for (i = 0; i < typecnt; ++i)
-			if (writetype[i])
-				(void) putc(ttisgmts[i], fp);
-	}
-	(void) fprintf(fp, "\n%s\n", string);
+		puttzcode((long) ats[i], fp);
+	}
+	if (timecnt > 0)
+		(void) fwrite((void *) types, (size_t) sizeof types[0],
+			(size_t) timecnt, fp);
+	for (i = 0; i < typecnt; ++i) {
+		puttzcode((long) gmtoffs[i], fp);
+		(void) putc(isdsts[i], fp);
+		(void) putc(abbrinds[i], fp);
+	}
+	if (charcnt != 0)
+		(void) fwrite((void *) chars, (size_t) sizeof chars[0],
+			(size_t) charcnt, fp);
+	for (i = 0; i < leapcnt; ++i) {
+		if (roll[i]) {
+			if (timecnt == 0 || trans[i] < ats[0]) {
+				j = 0;
+				while (isdsts[j])
+					if (++j >= typecnt) {
+						j = 0;
+						break;
+					}
+			} else {
+				j = 1;
+				while (j < timecnt && trans[i] >= ats[j])
+					++j;
+				j = types[j - 1];
+			}
+			puttzcode((long) tadd(trans[i], -gmtoffs[j]), fp);
+		} else	puttzcode((long) trans[i], fp);
+		puttzcode((long) corr[i], fp);
+	}
+	for (i = 0; i < typecnt; ++i)
+		(void) putc(ttisstds[i], fp);
+	for (i = 0; i < typecnt; ++i)
+		(void) putc(ttisgmts[i], fp);
 	if (ferror(fp) || fclose(fp)) {
 		(void) fprintf(stderr, _("%s: Error writing %s\n"),
 			progname, fullname);
@@ -1737,223 +1602,21 @@ const char * const	string;
 }
 
 static void
-doabbr(abbr, format, letters, isdst, doquotes)
+doabbr(abbr, format, letters, isdst)
 char * const		abbr;
 const char * const	format;
 const char * const	letters;
 const int		isdst;
-const int		doquotes;
 {
-	register char *	cp;
-	register char *	slashp;
-	register int	len;
-
-	slashp = strchr(format, '/');
-	if (slashp == NULL) {
+	if (strchr(format, '/') == NULL) {
 		if (letters == NULL)
 			(void) strcpy(abbr, format);
 		else	(void) sprintf(abbr, format, letters);
-	} else if (isdst) {
-		(void) strcpy(abbr, slashp + 1);
-	} else {
-		if (slashp > format)
-			(void) strncpy(abbr, format,
-				(unsigned) (slashp - format));
-		abbr[slashp - format] = '\0';
-	}
-	if (!doquotes)
-		return;
-	for (cp = abbr; *cp != '\0'; ++cp)
-		if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", *cp) == NULL &&
-			strchr("abcdefghijklmnopqrstuvwxyz", *cp) == NULL)
-				break;
-	len = strlen(abbr);
-	if (len > 0 && *cp == '\0')
-		return;
-	abbr[len + 2] = '\0';
-	abbr[len + 1] = '>';
-	for ( ; len > 0; --len)
-		abbr[len] = abbr[len - 1];
-	abbr[0] = '<';
-}
-
-static void
-updateminmax(x)
-const int	x;
-{
-	if (min_year > x)
-		min_year = x;
-	if (max_year < x)
-		max_year = x;
-}
-
-static int
-stringoffset(result, offset)
-char *	result;
-long	offset;
-{
-	register int	hours;
-	register int	minutes;
-	register int	seconds;
-
-	result[0] = '\0';
-	if (offset < 0) {
-		(void) strcpy(result, "-");
-		offset = -offset;
-	}
-	seconds = offset % SECSPERMIN;
-	offset /= SECSPERMIN;
-	minutes = offset % MINSPERHOUR;
-	offset /= MINSPERHOUR;
-	hours = offset;
-	if (hours >= HOURSPERDAY) {
-		result[0] = '\0';
-		return -1;
-	}
-	(void) sprintf(end(result), "%d", hours);
-	if (minutes != 0 || seconds != 0) {
-		(void) sprintf(end(result), ":%02d", minutes);
-		if (seconds != 0)
-			(void) sprintf(end(result), ":%02d", seconds);
-	}
-	return 0;
-}
-
-static int
-stringrule(result, rp, dstoff, gmtoff)
-char *				result;
-const struct rule * const	rp;
-const long			dstoff;
-const long			gmtoff;
-{
-	register long	tod;
-
-	result = end(result);
-	if (rp->r_dycode == DC_DOM) {
-		register int	month, total;
-
-		if (rp->r_dayofmonth == 29 && rp->r_month == TM_FEBRUARY)
-			return -1;
-		total = 0;
-		for (month = 0; month < rp->r_month; ++month)
-			total += len_months[0][month];
-		(void) sprintf(result, "J%d", total + rp->r_dayofmonth);
-	} else {
-		register int	week;
-
-		if (rp->r_dycode == DC_DOWGEQ) {
-			week = 1 + rp->r_dayofmonth / DAYSPERWEEK;
-			if ((week - 1) * DAYSPERWEEK + 1 != rp->r_dayofmonth)
-				return -1;
-		} else if (rp->r_dycode == DC_DOWLEQ) {
-			if (rp->r_dayofmonth == len_months[1][rp->r_month])
-				week = 5;
-			else {
-				week = 1 + rp->r_dayofmonth / DAYSPERWEEK;
-				if (week * DAYSPERWEEK - 1 != rp->r_dayofmonth)
-					return -1;
-			}
-		} else	return -1;	/* "cannot happen" */
-		(void) sprintf(result, "M%d.%d.%d",
-			rp->r_month + 1, week, rp->r_wday);
-	}
-	tod = rp->r_tod;
-	if (rp->r_todisgmt)
-		tod += gmtoff;
-	if (rp->r_todisstd && rp->r_stdoff == 0)
-		tod += dstoff;
-	if (tod < 0) {
-		result[0] = '\0';
-		return -1;
-	}
-	if (tod != 2 * SECSPERMIN * MINSPERHOUR) {
-		(void) strcat(result, "/");
-		if (stringoffset(end(result), tod) != 0)
-			return -1;
-	}
-	return 0;
-}
-
-static void
-stringzone(result, zpfirst, zonecount)
-char *				result;
-const struct zone * const	zpfirst;
-const int			zonecount;
-{
-	register const struct zone *	zp;
-	register struct rule *		rp;
-	register struct rule *		stdrp;
-	register struct rule *		dstrp;
-	register int			i;
-	register const char *		abbrvar;
-
-	result[0] = '\0';
-	zp = zpfirst + zonecount - 1;
-	stdrp = dstrp = NULL;
-	for (i = 0; i < zp->z_nrules; ++i) {
-		rp = &zp->z_rules[i];
-		if (rp->r_hiwasnum || rp->r_hiyear != INT_MAX)
-			continue;
-		if (rp->r_yrtype != NULL)
-			continue;
-		if (rp->r_stdoff == 0) {
-			if (stdrp == NULL)
-				stdrp = rp;
-			else	return;
-		} else {
-			if (dstrp == NULL)
-				dstrp = rp;
-			else	return;
-		}
-	}
-	if (stdrp == NULL && dstrp == NULL) {
-		/*
-		** There are no rules running through "max".
-		** Let's find the latest rule.
-		*/
-		for (i = 0; i < zp->z_nrules; ++i) {
-			rp = &zp->z_rules[i];
-			if (stdrp == NULL || rp->r_hiyear > stdrp->r_hiyear ||
-				(rp->r_hiyear == stdrp->r_hiyear &&
-				rp->r_month > stdrp->r_month))
-					stdrp = rp;
-		}
-		if (stdrp != NULL && stdrp->r_stdoff != 0)
-			return;	/* We end up in DST (a POSIX no-no). */
-		/*
-		** Horrid special case: if year is 2037,
-		** presume this is a zone handled on a year-by-year basis;
-		** do not try to apply a rule to the zone.
-		*/
-		if (stdrp != NULL && stdrp->r_hiyear == 2037)
-			return;
-	}
-	if (stdrp == NULL && zp->z_nrules != 0)
-		return;
-	abbrvar = (stdrp == NULL) ? "" : stdrp->r_abbrvar;
-	doabbr(result, zp->z_format, abbrvar, FALSE, TRUE);
-	if (stringoffset(end(result), -zp->z_gmtoff) != 0) {
-		result[0] = '\0';
-		return;
-	}
-	if (dstrp == NULL)
-		return;
-	doabbr(end(result), zp->z_format, dstrp->r_abbrvar, TRUE, TRUE);
-	if (dstrp->r_stdoff != SECSPERMIN * MINSPERHOUR)
-		if (stringoffset(end(result),
-			-(zp->z_gmtoff + dstrp->r_stdoff)) != 0) {
-				result[0] = '\0';
-				return;
-		}
-	(void) strcat(result, ",");
-	if (stringrule(result, dstrp, dstrp->r_stdoff, zp->z_gmtoff) != 0) {
-		result[0] = '\0';
-		return;
-	}
-	(void) strcat(result, ",");
-	if (stringrule(result, stdrp, dstrp->r_stdoff, zp->z_gmtoff) != 0) {
-		result[0] = '\0';
-		return;
+	} else if (isdst)
+		(void) strcpy(abbr, strchr(format, '/') + 1);
+	else {
+		(void) strcpy(abbr, format);
+		*strchr(abbr, '/') = '\0';
 	}
 }
 
@@ -1974,17 +1637,8 @@ const int			zonecount;
 	register int			startttisstd;
 	register int			startttisgmt;
 	register int			type;
-	register char *			startbuf;
-	register char *			ab;
-	register char *			envvar;
-	register int			max_abbr_len;
-	register int			max_envvar_len;
-
-	max_abbr_len = 2 + max_format_len + max_abbrvar_len;
-	max_envvar_len = 2 * max_abbr_len + 5 * 9;
-	startbuf = emalloc(max_abbr_len + 1);
-	ab = emalloc(max_abbr_len + 1);
-	envvar = emalloc(max_envvar_len + 1);
+	char				startbuf[BUFSIZ];
+
 	INITIALIZE(untiltime);
 	INITIALIZE(starttime);
 	/*
@@ -1999,48 +1653,6 @@ const int			zonecount;
 	*/
 	startttisstd = FALSE;
 	startttisgmt = FALSE;
-	min_year = max_year = EPOCH_YEAR;
-	if (leapseen) {
-		updateminmax(leapminyear);
-		updateminmax(leapmaxyear);
-	}
-	for (i = 0; i < zonecount; ++i) {
-		zp = &zpfirst[i];
-		updateminmax(zp->z_untilrule.r_loyear);
-		for (j = 0; j < zp->z_nrules; ++j) {
-			rp = &zp->z_rules[j];
-			if (rp->r_lowasnum)
-				updateminmax(rp->r_loyear);
-			if (rp->r_hiwasnum)
-				updateminmax(rp->r_hiyear);
-		}
-	}
-	/*
-	** Generate lots of data if a rule can't cover all future times.
-	*/
-	stringzone(envvar, zpfirst, zonecount);
-	if (noise && envvar[0] == '\0') {
-		register char *	wp;
-
-wp = ecpyalloc(_("no POSIX environment variable for zone"));
-		wp = ecatalloc(wp, " ");
-		wp = ecatalloc(wp, zpfirst->z_name); 
-		warning(wp);
-		ifree(wp);
-	}
-	if (envvar[0] == '\0') {
-		if (min_year >= INT_MIN + YEARSPERREPEAT)
-			min_year -= YEARSPERREPEAT;
-		else	min_year = INT_MIN;
-		if (max_year <= INT_MAX - YEARSPERREPEAT)
-			max_year += YEARSPERREPEAT;
-		else	max_year = INT_MAX;
-	}
-	/*
-	** For the benefit of older systems, generate data through 2037.
-	*/
-	if (max_year < 2037)
-		max_year = 2037;
 	for (i = 0; i < zonecount; ++i) {
 		/*
 		** A guess that may well be corrected later.
@@ -2058,7 +1670,7 @@ wp = ecpyalloc(_("no POSIX environment variable for zone"));
 		if (zp->z_nrules == 0) {
 			stdoff = zp->z_stdoff;
 			doabbr(startbuf, zp->z_format,
-				(char *) NULL, stdoff != 0, FALSE);
+				(char *) NULL, stdoff != 0);
 			type = addtype(oadd(zp->z_gmtoff, stdoff),
 				startbuf, stdoff != 0, startttisstd,
 				startttisgmt);
@@ -2088,6 +1700,7 @@ wp = ecpyalloc(_("no POSIX environment variable for zone"));
 				register int	k;
 				register zic_t	jtime, ktime;
 				register long	offset;
+				char		buf[BUFSIZ];
 
 				INITIALIZE(ktime);
 				if (useuntil) {
@@ -2143,27 +1756,24 @@ wp = ecpyalloc(_("no POSIX environment variable for zone"));
 							stdoff);
 						doabbr(startbuf, zp->z_format,
 							rp->r_abbrvar,
-							rp->r_stdoff != 0,
-							FALSE);
+							rp->r_stdoff != 0);
 						continue;
 					}
 					if (*startbuf == '\0' &&
 						startoff == oadd(zp->z_gmtoff,
-						stdoff)) {
+						stdoff))
 							doabbr(startbuf,
 								zp->z_format,
 								rp->r_abbrvar,
 								rp->r_stdoff !=
-								0,
-								FALSE);
-					}
+								0);
 				}
 				eats(zp->z_filename, zp->z_linenum,
 					rp->r_filename, rp->r_linenum);
-				doabbr(ab, zp->z_format, rp->r_abbrvar,
-					rp->r_stdoff != 0, FALSE);
+				doabbr(buf, zp->z_format, rp->r_abbrvar,
+					rp->r_stdoff != 0);
 				offset = oadd(zp->z_gmtoff, rp->r_stdoff);
-				type = addtype(offset, ab, rp->r_stdoff != 0,
+				type = addtype(offset, buf, rp->r_stdoff != 0,
 					rp->r_todisstd, rp->r_todisgmt);
 				addtt(ktime, type);
 			}
@@ -2196,10 +1806,7 @@ error(_("can't determine time zone abbreviation to use just after until time"));
 				starttime = tadd(starttime, -gmtoff);
 		}
 	}
-	writezone(zpfirst->z_name, envvar);
-	ifree(startbuf);
-	ifree(ab);
-	ifree(envvar);
+	writezone(zpfirst->z_name);
 }
 
 static void
@@ -2578,6 +2185,8 @@ register const int			wantedy;
 will not work with pre-2004 versions of zic"));
 		}
 	}
+	if (dayoff < 0 && !TYPE_SIGNED(zic_t))
+		return min_time;
 	if (dayoff < min_time / SECSPERDAY)
 		return min_time;
 	if (dayoff > max_time / SECSPERDAY)
diff --git a/timezone/zone.tab b/timezone/zone.tab
index aecb5bb94c..09cdf6940a 100644
--- a/timezone/zone.tab
+++ b/timezone/zone.tab
@@ -1,4 +1,4 @@
-# @(#)zone.tab	8.5
+# @(#)zone.tab	8.1
 #
 # TZ zone descriptions
 #
@@ -44,7 +44,7 @@ AQ	-690022+0393524	Antarctica/Syowa	Syowa Station, E Ongul I
 AR	-3436-05827	America/Argentina/Buenos_Aires	Buenos Aires (BA, CF)
 AR	-3124-06411	America/Argentina/Cordoba	most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL)
 AR	-2411-06518	America/Argentina/Jujuy	Jujuy (JY)
-AR	-2649-06513	America/Argentina/Tucuman	Tucuman (TM)
+AR	-3124-06411	America/Argentina/Tucuman	Tucuman (TM)
 AR	-2828-06547	America/Argentina/Catamarca	Catamarca (CT), Chubut (CH)
 AR	-2926-06651	America/Argentina/La_Rioja	La Rioja (LR)
 AR	-3132-06831	America/Argentina/San_Juan	San Juan (SJ)
@@ -99,28 +99,27 @@ BT	+2728+08939	Asia/Thimphu
 BW	-2545+02555	Africa/Gaborone
 BY	+5354+02734	Europe/Minsk
 BZ	+1730-08812	America/Belize
-CA	+4734-05243	America/St_Johns	Newfoundland Time, including SE Labrador
-CA	+4439-06336	America/Halifax	Atlantic Time - Nova Scotia (most places), PEI
+CA	+4734-05243	America/St_Johns	Newfoundland Island
+CA	+4439-06336	America/Halifax	Atlantic Time - Nova Scotia (most places), W Labrador, E Quebec & PEI
 CA	+4612-05957	America/Glace_Bay	Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
 CA	+4606-06447	America/Moncton	Atlantic Time - New Brunswick
-CA	+5320-06025	America/Goose_Bay	Atlantic Time - Labrador - most locations
-CA	+5125-05707	America/Blanc-Sablon	Atlantic Standard Time - Quebec - Lower North Shore
+CA	+5320-06025	America/Goose_Bay	Atlantic Time - E Labrador
 CA	+4531-07334	America/Montreal	Eastern Time - Quebec - most locations
 CA	+4339-07923	America/Toronto	Eastern Time - Ontario - most locations
 CA	+4901-08816	America/Nipigon	Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
 CA	+4823-08915	America/Thunder_Bay	Eastern Time - Thunder Bay, Ontario
 CA	+6608-06544	America/Pangnirtung	Eastern Time - Pangnirtung, Nunavut
 CA	+6344-06828	America/Iqaluit	Eastern Time - east Nunavut
-CA	+484531-0913718	America/Atikokan	Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut
-CA	+624900-0920459	America/Rankin_Inlet	Central Time - central Nunavut
+CA	+6408-08310	America/Coral_Harbour	Eastern Standard Time - Southampton Island
+CA	+6245-09210	America/Rankin_Inlet	Central Time - central Nunavut
 CA	+4953-09709	America/Winnipeg	Central Time - Manitoba & west Ontario
-CA	+4843-09434	America/Rainy_River	Central Time - Rainy River & Fort Frances, Ontario
+CA	+4843-09429	America/Rainy_River	Central Time - Rainy River & Fort Frances, Ontario
 CA	+6903-10505	America/Cambridge_Bay	Central Time - west Nunavut
 CA	+5024-10439	America/Regina	Central Standard Time - Saskatchewan - most locations
 CA	+5017-10750	America/Swift_Current	Central Standard Time - Saskatchewan - midwest
 CA	+5333-11328	America/Edmonton	Mountain Time - Alberta, east British Columbia & west Saskatchewan
 CA	+6227-11421	America/Yellowknife	Mountain Time - central Northwest Territories
-CA	+682059-1334300	America/Inuvik	Mountain Time - west Northwest Territories
+CA	+6825-11330	America/Inuvik	Mountain Time - west Northwest Territories
 CA	+5946-12014	America/Dawson_Creek	Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia
 CA	+4916-12307	America/Vancouver	Pacific Time - west British Columbia
 CA	+6043-13503	America/Whitehorse	Pacific Time - south Yukon
@@ -137,12 +136,13 @@ CL	-3327-07040	America/Santiago	most locations
 CL	-2710-10927	Pacific/Easter	Easter Island & Sala y Gomez
 CM	+0403+00942	Africa/Douala
 CN	+3114+12128	Asia/Shanghai	east China - Beijing, Guangdong, Shanghai, etc.
-CN	+4545+12641	Asia/Harbin	Heilongjiang (except Mohe), Jilin
-CN	+2934+10635	Asia/Chongqing	central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
-CN	+4348+08735	Asia/Urumqi	most of Tibet & Xinjiang
-CN	+3929+07559	Asia/Kashgar	west Tibet & Xinjiang
+CN	+4545+12641	Asia/Harbin	Heilongjiang
+CN	+2934+10635	Asia/Chongqing	central China - Gansu, Guizhou, Sichuan, Yunnan, etc.
+CN	+4348+08735	Asia/Urumqi	Tibet & most of Xinjiang Uyghur
+CN	+3929+07559	Asia/Kashgar	southwest Xinjiang Uyghur
 CO	+0436-07405	America/Bogota
 CR	+0956-08405	America/Costa_Rica
+CS	+4450+02030	Europe/Belgrade
 CU	+2308-08222	America/Havana
 CV	+1455-02331	Atlantic/Cape_Verde
 CX	-1025+10543	Indian/Christmas
@@ -177,12 +177,11 @@ GB	+512830-0001845	Europe/London
 GD	+1203-06145	America/Grenada
 GE	+4143+04449	Asia/Tbilisi
 GF	+0456-05220	America/Cayenne
-GG	+4927-00232	Europe/Guernsey
 GH	+0533-00013	Africa/Accra
 GI	+3608-00521	Europe/Gibraltar
 GL	+6411-05144	America/Godthab	most locations
 GL	+7646-01840	America/Danmarkshavn	east coast, north of Scoresbysund
-GL	+7029-02158	America/Scoresbysund	Scoresbysund / Ittoqqortoormiit
+GL	+7030-02215	America/Scoresbysund	Scoresbysund / Ittoqqortoormiit
 GL	+7634-06847	America/Thule	Thule / Pituffik
 GM	+1328-01639	Africa/Banjul
 GN	+0931-01343	Africa/Conakry
@@ -205,14 +204,12 @@ ID	-0507+11924	Asia/Makassar	east & south Borneo, Celebes, Bali, Nusa Tengarra,
 ID	-0232+14042	Asia/Jayapura	Irian Jaya & the Moluccas
 IE	+5320-00615	Europe/Dublin
 IL	+3146+03514	Asia/Jerusalem
-IM	+5409-00428	Europe/Isle_of_Man
 IN	+2232+08822	Asia/Calcutta
 IO	-0720+07225	Indian/Chagos
 IQ	+3321+04425	Asia/Baghdad
 IR	+3540+05126	Asia/Tehran
 IS	+6409-02151	Atlantic/Reykjavik
 IT	+4154+01229	Europe/Rome
-JE	+4912-00237	Europe/Jersey
 JM	+1800-07648	America/Jamaica
 JO	+3157+03556	Asia/Amman
 JP	+353916+1394441	Asia/Tokyo
@@ -247,7 +244,6 @@ LY	+3254+01311	Africa/Tripoli
 MA	+3339-00735	Africa/Casablanca
 MC	+4342+00723	Europe/Monaco
 MD	+4700+02850	Europe/Chisinau
-ME	+4247+01928	Europe/Podgorica
 MG	-1855+04731	Indian/Antananarivo
 MH	+0709+17112	Pacific/Majuro	most locations
 MH	+0905+16720	Pacific/Kwajalein	Kwajalein
@@ -261,7 +257,7 @@ MO	+2214+11335	Asia/Macau
 MP	+1512+14545	Pacific/Saipan
 MQ	+1436-06105	America/Martinique
 MR	+1806-01557	Africa/Nouakchott
-MS	+1643-06213	America/Montserrat
+MS	+1644-06213	America/Montserrat
 MT	+3554+01431	Europe/Malta
 MU	-2010+05730	Indian/Mauritius
 MV	+0410+07330	Indian/Maldives
@@ -312,11 +308,9 @@ PY	-2516-05740	America/Asuncion
 QA	+2517+05132	Asia/Qatar
 RE	-2052+05528	Indian/Reunion
 RO	+4426+02606	Europe/Bucharest
-RS	+4450+02030	Europe/Belgrade
 RU	+5443+02030	Europe/Kaliningrad	Moscow-01 - Kaliningrad
 RU	+5545+03735	Europe/Moscow	Moscow+00 - west Russia
-RU	+4844+04425	Europe/Volgograd	Moscow+00 - Caspian Sea
-RU	+5312+05009	Europe/Samara	Moscow+01 - Samara, Udmurtia
+RU	+5312+05009	Europe/Samara	Moscow+01 - Caspian Sea
 RU	+5651+06036	Asia/Yekaterinburg	Moscow+02 - Urals
 RU	+5500+07324	Asia/Omsk	Moscow+03 - west Siberia
 RU	+5502+08255	Asia/Novosibirsk	Moscow+03 - Novosibirsk
@@ -382,11 +376,10 @@ US	+382232-0862041	America/Indiana/Marengo	Eastern Time - Indiana - Crawford Cou
 US	+411745-0863730	America/Indiana/Knox	Eastern Time - Indiana - Starke County
 US	+384452-0850402	America/Indiana/Vevay	Eastern Time - Indiana - Switzerland County
 US	+415100-0873900	America/Chicago	Central Time
-US	+384038-0873143	America/Indiana/Vincennes	Central Time - Indiana - Daviess, Dubois, Knox, Martin, Perry & Pulaski Counties
+US	+384038-0873143	America/Indiana/Vincennes	Central Time - Indiana - Daviess, Dubois, Knox, Martin, Perry & Pulaski
 US	+382931-0871643	America/Indiana/Petersburg	Central Time - Indiana - Pike County
 US	+450628-0873651	America/Menominee	Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties
 US	+470659-1011757	America/North_Dakota/Center	Central Time - North Dakota - Oliver County
-US	+465042-1012439	America/North_Dakota/New_Salem	Central Time - North Dakota - Morton County (except Mandan area)
 US	+394421-1045903	America/Denver	Mountain Time
 US	+433649-1161209	America/Boise	Mountain Time - south Idaho & east Oregon
 US	+364708-1084111	America/Shiprock	Mountain Time - Navajo
diff --git a/tls.make.c b/tls.make.c
index 6bcd2479c6..778d8ef0be 100644
--- a/tls.make.c
+++ b/tls.make.c
@@ -2,6 +2,12 @@
 
 #include 
 
+#if USE_TLS
+@@@ use-tls = yes @@@
+#else
+@@@ use-tls = no @@@
+#endif
+
 #if USE___THREAD
 @@@ use-thread = yes @@@
 #else
diff --git a/version.h b/version.h
index acd0ed11eb..5428240d43 100644
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
 /* This file just defines the current version number of libc.  */
 
-#define RELEASE "development"
-#define VERSION "2.5.90"
+#define RELEASE "stable"
+#define VERSION "2.5.1"
-- 
2.11.4.GIT